From b3539e78178bb84136f8cb5d0748bd2d589e261f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=80=E7=BA=B8=E5=BF=98=E5=BF=A7?= Date: Sun, 22 Mar 2026 23:27:25 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=20RPC=20?= =?UTF-8?q?=E5=A4=84=E7=90=86=E5=B9=B6=E9=9B=86=E6=88=90=20node-vlmcs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- binaries/vlmcs-darwin-arm64 | Bin 88392 -> 0 bytes binaries/vlmcs-darwin-x64 | Bin 56964 -> 0 bytes binaries/vlmcs-linux-arm64 | Bin 48424 -> 0 bytes binaries/vlmcs-linux-x64 | Bin 54331 -> 0 bytes node-vlmcs/package.json | 11 +- node-vlmcs/src/index.ts | 377 ++++++++++++++++++++++++ node-vlmcs/src/rpc.ts | 573 ++++++++++++++++++++---------------- package.json | 3 +- pnpm-lock.yaml | 3 + server/api/check.ts | 1 + server/utils/kms.ts | 39 +-- shared/types/kms.ts | 1 + 12 files changed, 718 insertions(+), 290 deletions(-) delete mode 100755 binaries/vlmcs-darwin-arm64 delete mode 100755 binaries/vlmcs-darwin-x64 delete mode 100755 binaries/vlmcs-linux-arm64 delete mode 100755 binaries/vlmcs-linux-x64 create mode 100644 node-vlmcs/src/index.ts diff --git a/binaries/vlmcs-darwin-arm64 b/binaries/vlmcs-darwin-arm64 deleted file mode 100755 index 604724d46f724422691b33f04badd0e0c6d205a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88392 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%0A|jd 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 diff --git a/binaries/vlmcs-darwin-x64 b/binaries/vlmcs-darwin-x64 deleted file mode 100755 index 414b4fc043aa75ead04f4fbb3071b15654e74ed0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56964 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 diff --git a/binaries/vlmcs-linux-arm64 b/binaries/vlmcs-linux-arm64 deleted file mode 100755 index ebcc6033042e33b27a720afcd85638541b8af11f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48424 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 T)VO*0Z*&L2yFV%H1K0lnP^02_ diff --git a/binaries/vlmcs-linux-x64 b/binaries/vlmcs-linux-x64 deleted file mode 100755 index 9a08a9a32d61715dc8f50628363ec437238514b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54331 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 UHC8>`H@YI=-QO_qBO)U5e+4i*0{{R3 diff --git a/node-vlmcs/package.json b/node-vlmcs/package.json index 82e2021f..655ef829 100644 --- a/node-vlmcs/package.json +++ b/node-vlmcs/package.json @@ -2,7 +2,16 @@ "name": "node-vlmcs", "version": "1.0.0", "description": "Node.js implementation of vlmcs KMS client", - "main": "dist/cli.js", + "main": "dist/index.js", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "require": "./dist/index.js" + }, + "./cli": "./dist/cli.js" + }, + "types": "dist/index.d.ts", "bin": { "vlmcs": "dist/cli.js" }, diff --git a/node-vlmcs/src/index.ts b/node-vlmcs/src/index.ts new file mode 100644 index 00000000..94585089 --- /dev/null +++ b/node-vlmcs/src/index.ts @@ -0,0 +1,377 @@ +import * as net from 'net' +import { KmsData } from './data' +import { + guidToBuffer, + stringToGuidLE, + utf8ToUcs2, + ucs2ToUtf8, + unixTimeToFileTime, + PID_BUFFER_SIZE, + WORKSTATION_NAME_BUFFER, +} from './types' +import { + createRequestV4, + createRequestV6, + decryptResponseV4, + decryptResponseV6, +} from './kms' +import { rpcBindClient, rpcSendRequest } from './rpc' +import { get16RandomBytes } from './crypto' +import { connectToAddress } from './network' +import { logRequestVerbose, logResponseVerbose } from './output' + +const DEFAULT_TIMEOUT_MS = 5 * 1000 + +export interface VlmcsCheckParams { + host: string + port?: number + protocol?: number + edition?: number + timeout?: number + verbose?: boolean +} + +export interface VlmcsCheckResult { + host: string + content: string + delay: number + status: boolean +} + +function connectSocket( + host: string, + port: number, + timeout: number, +): Promise { + return new Promise((resolve, reject) => { + const socket = net.createConnection({ host, port }) + + const cleanup = () => { + socket.removeAllListeners('connect') + socket.removeAllListeners('error') + socket.removeAllListeners('timeout') + } + + socket.once('connect', () => { + cleanup() + socket.pause() + resolve(socket) + }) + + socket.once('error', err => { + cleanup() + socket.destroy() + reject(err) + }) + + socket.setTimeout(timeout, () => { + cleanup() + socket.destroy() + reject(new Error(`Connection timeout after ${timeout}ms`)) + }) + }) +} + +function normalizeEdition(edition: number): number { + const raw = Number(edition) + if (!Number.isFinite(raw)) return 1 + const normalized = Math.floor(raw) + if (normalized < 1 || normalized > KmsData.skuItems.length) return 1 + return normalized +} + +function normalizeProtocol( + protocol: number | undefined, + fallback: number, +): number { + const raw = Number(protocol) + if (!Number.isFinite(raw)) return fallback + const normalized = Math.floor(raw) + if (normalized < 4 || normalized > 6) return fallback + return normalized +} + +function randomWorkstationName(): string { + const alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' + const size = Math.floor(Math.random() * 12) + 6 + let name = 'KMS-' + for (let i = 0; i < size; i++) { + name += alphabet[Math.floor(Math.random() * alphabet.length)] + } + return name.slice(0, 63) +} + +function buildRequest({ + protocol, + edition, +}: { + protocol: number + edition: number +}): Buffer { + const sku = KmsData.skuItems[edition - 1] + const kms = KmsData.kmsItems[sku.kmsIndex] + const app = KmsData.appItems[sku.appIndex] + + const request = Buffer.alloc(236) + request.writeUInt16LE(0, 0) + request.writeUInt16LE(protocol, 2) + request.writeUInt32LE(0, 4) + request.writeUInt32LE(0x02, 8) + request.writeUInt32LE(43200, 12) + + guidToBuffer(stringToGuidLE(app.guid)!).copy(request, 16) + guidToBuffer(stringToGuidLE(sku.guid)!).copy(request, 32) + guidToBuffer(stringToGuidLE(kms.guid)!).copy(request, 48) + + const cmid = get16RandomBytes() + cmid[8] = (cmid[8] & 0x3f) | 0x80 + const d3 = cmid.readUInt16LE(6) + cmid.writeUInt16LE((d3 & 0x0fff) | 0x4000, 6) + cmid.copy(request, 64) + + request.writeUInt32LE(sku.nCountPolicy, 80) + unixTimeToFileTime().copy(request, 84) + request.fill(0, 92, 108) + + utf8ToUcs2(randomWorkstationName(), WORKSTATION_NAME_BUFFER).copy( + request, + 108, + ) + return request +} + +interface ParsedKmsResult { + status: boolean + summary: string + ePID: string + hwid: Buffer + response: any +} + +function parseKmsResponse( + rawResponse: Buffer, + rawRequest: Buffer, +): ParsedKmsResult { + const responseMajorVersion = rawResponse.readUInt16LE(2) + + if (responseMajorVersion === 4) { + const { response, result } = decryptResponseV4(rawResponse, rawRequest) + if (!result.decryptSuccess || !result.hashOK || !result.versionOK) { + return { + summary: 'Invalid KMS V4 response', + status: false, + ePID: '', + hwid: Buffer.alloc(8), + response, + } + } + const ePID = ucs2ToUtf8(response.kmsPID, PID_BUFFER_SIZE) + return { + summary: ePID, + status: true, + ePID, + hwid: Buffer.alloc(8), + response, + } + } + + const { response, result, hwid } = decryptResponseV6(rawResponse, rawRequest) + if (!result.decryptSuccess || !result.hashOK || !result.versionOK) { + return { + summary: 'Invalid KMS V5/V6 response', + status: false, + ePID: '', + hwid, + response, + } + } + + const ePID = ucs2ToUtf8(response.kmsPID, PID_BUFFER_SIZE) + if (response.majorVer > 5) { + const hwidHex = Array.from(hwid.subarray(0, 8)) + .map(b => b.toString(16).toUpperCase().padStart(2, '0')) + .join('') + return { + summary: `${ePID} (${hwidHex})`, + status: true, + ePID, + hwid, + response, + } + } + + return { + summary: ePID, + status: true, + ePID, + hwid, + response, + } +} + +function chunkToString(chunk: unknown): string { + if (typeof chunk === 'string') return chunk + if (Buffer.isBuffer(chunk)) return chunk.toString('utf8') + return String(chunk) +} + +async function captureVerboseOutput(fn: () => Promise): Promise<{ + result: T + output: string +}> { + let output = '' + + const originalStdoutWrite = process.stdout.write + const originalStderrWrite = process.stderr.write + const originalConsoleLog = console.log + const originalConsoleError = console.error + + ;(process.stdout.write as any) = ((chunk: unknown, ...args: unknown[]) => { + output += chunkToString(chunk) + const callback = args.find(arg => typeof arg === 'function') as + | ((error?: Error | null) => void) + | undefined + callback?.(null) + return true + }) as typeof process.stdout.write + ;(process.stderr.write as any) = ((chunk: unknown, ...args: unknown[]) => { + output += chunkToString(chunk) + const callback = args.find(arg => typeof arg === 'function') as + | ((error?: Error | null) => void) + | undefined + callback?.(null) + return true + }) as typeof process.stderr.write + + console.log = (...args: unknown[]) => { + output += `${args.map(chunkToString).join(' ')}\n` + } + + console.error = (...args: unknown[]) => { + output += `${args.map(chunkToString).join(' ')}\n` + } + + try { + const result = await fn() + return { result, output: output.trimEnd() } + } finally { + process.stdout.write = originalStdoutWrite + process.stderr.write = originalStderrWrite + console.log = originalConsoleLog + console.error = originalConsoleError + } +} + +export async function runVlmcs( + params: VlmcsCheckParams, +): Promise { + const { host, timeout = DEFAULT_TIMEOUT_MS, verbose = false } = params + const portRaw = Number(params.port ?? 1688) + const port = Number.isFinite(portRaw) ? Math.floor(portRaw) : 1688 + const edition = normalizeEdition(Number(params.edition ?? 1)) + + const sku = KmsData.skuItems[edition - 1] + const protocol = normalizeProtocol(params.protocol, sku.protocolVersion) + + const startedAt = Date.now() + let socket: net.Socket | null = null + + const executeCheck = async (): Promise => { + try { + const requestBase = buildRequest({ protocol, edition }) + + if (verbose) { + logRequestVerbose(requestBase) + } + + socket = verbose + ? await connectToAddress(`${host}:${port}`, 0, false) + : await connectSocket(host, port, timeout) + + if (verbose) { + process.stdout.write('\nPerforming RPC bind ...\n') + } + + const bind = await rpcBindClient(socket, verbose, true, true, true) + if (bind.status !== 0) { + return { + host, + status: false, + delay: -1, + content: `RPC bind failed: ${bind.status}`, + } + } + + if (verbose) { + process.stdout.write('... successful\n') + } + + const request = + protocol < 5 + ? createRequestV4(requestBase) + : createRequestV6(requestBase) + + if (verbose) { + process.stdout.write( + `Sending activation request (KMS V${protocol}) 1 of 1 `, + ) + } + + const rpcResult = await rpcSendRequest( + socket, + request, + bind.rpcFlags, + true, + false, + ) + + if (rpcResult.status !== 0 || !rpcResult.kmsResponse) { + return { + host, + status: false, + delay: -1, + content: `KMS request failed: 0x${(rpcResult.status >>> 0).toString(16).toUpperCase().padStart(8, '0')}`, + } + } + + const parsed = parseKmsResponse(rpcResult.kmsResponse, request) + + if (verbose && parsed.status) { + logResponseVerbose( + parsed.ePID, + parsed.hwid, + parsed.response, + rpcResult.kmsResponse.length, + ) + } + + return { + host, + status: parsed.status, + delay: parsed.status ? Date.now() - startedAt : -1, + content: parsed.summary, + } + } catch (error) { + return { + host, + status: false, + delay: -1, + content: error instanceof Error ? error.message : String(error), + } + } finally { + if (socket) { + socket.destroy() + } + } + } + + if (!verbose) { + return executeCheck() + } + + const { result, output } = await captureVerboseOutput(executeCheck) + return { + ...result, + content: output || result.content, + } +} diff --git a/node-vlmcs/src/rpc.ts b/node-vlmcs/src/rpc.ts index ed7ac8e1..d42e7aa6 100644 --- a/node-vlmcs/src/rpc.ts +++ b/node-vlmcs/src/rpc.ts @@ -6,82 +6,82 @@ * - src/rpc.h (RPC_HEADER, RPC_BIND_REQUEST, RPC_RESPONSE 等结构定义) */ -import * as net from 'net'; -import { sendData, recvData } from './network'; +import * as net from 'net' +import { sendData, recvData } from './network' // ─── 数据包类型 (参考 src/rpc.h 中的 RPC_PT_* 常量) ──────────────────────── -const RPC_PT_REQUEST = 0; // 请求 -const RPC_PT_RESPONSE = 2; // 响应 -const RPC_PT_FAULT = 3; // 错误 -const RPC_PT_BIND_REQ = 11; // 绑定请求 -const RPC_PT_BIND_ACK = 12; // 绑定确认 -const RPC_PT_ALTERCONTEXT_REQ = 14; // 修改上下文请求 -const RPC_PT_ALTERCONTEXT_ACK = 15; // 修改上下文确认 +const RPC_PT_REQUEST = 0 // 请求 +const RPC_PT_RESPONSE = 2 // 响应 +const RPC_PT_FAULT = 3 // 错误 +const RPC_PT_BIND_REQ = 11 // 绑定请求 +const RPC_PT_BIND_ACK = 12 // 绑定确认 +const RPC_PT_ALTERCONTEXT_REQ = 14 // 修改上下文请求 +const RPC_PT_ALTERCONTEXT_ACK = 15 // 修改上下文确认 // ─── 数据包标志 ───────────────────────────────────────────────────────────── -const RPC_PF_FIRST = 1; // 分片的第一个包 -const RPC_PF_LAST = 2; // 分片的最后一个包 -const RPC_PF_MULTIPLEX = 16; // 多路复用 +const RPC_PF_FIRST = 1 // 分片的第一个包 +const RPC_PF_LAST = 2 // 分片的最后一个包 +const RPC_PF_MULTIPLEX = 16 // 多路复用 // ─── 绑定确认结果码 (参考 src/rpc.h) ─────────────────────────────────────── -const RPC_BIND_ACCEPT = 0; // 接受 -const RPC_BIND_NACK = 2; // 拒绝 -const RPC_BIND_ACK = 3; // 确认(用于 BTFN 绑定时间特性协商) +const RPC_BIND_ACCEPT = 0 // 接受 +const RPC_BIND_NACK = 2 // 拒绝 +const RPC_BIND_ACK = 3 // 确认(用于 BTFN 绑定时间特性协商) // ─── RPC 头部大小 ─────────────────────────────────────────────────────────── /** RPC 头部固定大小: 16 字节 */ -const RPC_HEADER_SIZE = 16; +const RPC_HEADER_SIZE = 16 // ─── GUID 常量 (原始线路字节,无字节序转换) ───────────────────────────────── /** NDR32 传输语法 GUID */ const TransferSyntaxNDR32 = Buffer.from([ - 0x04, 0x5D, 0x88, 0x8A, 0xEB, 0x1C, 0xC9, 0x11, - 0x9F, 0xE8, 0x08, 0x00, 0x2B, 0x10, 0x48, 0x60, -]); + 0x04, 0x5d, 0x88, 0x8a, 0xeb, 0x1c, 0xc9, 0x11, 0x9f, 0xe8, 0x08, 0x00, 0x2b, + 0x10, 0x48, 0x60, +]) /** KMS 接口 UUID */ const InterfaceUuid = Buffer.from([ - 0x75, 0x21, 0xC8, 0x51, 0x4E, 0x84, 0x50, 0x47, - 0xB0, 0xD8, 0xEC, 0x25, 0x55, 0x55, 0xBC, 0x06, -]); + 0x75, 0x21, 0xc8, 0x51, 0x4e, 0x84, 0x50, 0x47, 0xb0, 0xd8, 0xec, 0x25, 0x55, + 0x55, 0xbc, 0x06, +]) /** NDR64 传输语法 GUID */ const TransferSyntaxNDR64 = Buffer.from([ - 0x33, 0x05, 0x71, 0x71, 0xBA, 0xBE, 0x37, 0x49, - 0x83, 0x19, 0xB5, 0xDB, 0xEF, 0x9C, 0xCC, 0x36, -]); + 0x33, 0x05, 0x71, 0x71, 0xba, 0xbe, 0x37, 0x49, 0x83, 0x19, 0xb5, 0xdb, 0xef, + 0x9c, 0xcc, 0x36, +]) /** 绑定时间特性协商 GUID (BTFN) */ const BindTimeFeatureNegotiation = Buffer.from([ - 0x2C, 0x1C, 0xB7, 0x6C, 0x12, 0x98, 0x40, 0x45, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -]); + 0x2c, 0x1c, 0xb7, 0x6c, 0x12, 0x98, 0x40, 0x45, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, +]) // ─── 导出接口 ─────────────────────────────────────────────────────────────── /** RPC 已协商的能力标志 */ export interface RpcFlags { - hasNDR32: boolean; // 是否支持 NDR32 传输语法 - hasNDR64: boolean; // 是否支持 NDR64 传输语法 - hasBTFN: boolean; // 是否支持绑定时间特性协商 + hasNDR32: boolean // 是否支持 NDR32 传输语法 + hasNDR64: boolean // 是否支持 NDR64 传输语法 + hasBTFN: boolean // 是否支持绑定时间特性协商 } /** RPC 诊断信息 */ export interface RpcDiag { - hasRpcDiag: boolean; // 是否有 RPC 诊断信息 - hasBTFN: boolean; // 服务器是否支持 BTFN - hasNDR64: boolean; // 服务器是否支持 NDR64 + hasRpcDiag: boolean // 是否有 RPC 诊断信息 + hasBTFN: boolean // 服务器是否支持 BTFN + hasNDR64: boolean // 服务器是否支持 NDR64 } // ─── 状态 ─────────────────────────────────────────────────────────────────── /** 调用 ID,从 2 开始(与微软实现一致) */ -let callId = 2; +let callId = 2 // ─── 工具函数: 写入 RPC 头部 ─────────────────────────────────────────────── @@ -94,29 +94,29 @@ function writeRpcHeader( packetType: number, packetFlags: number, fragLength: number, - currentCallId: number + currentCallId: number, ): void { - buf.writeUInt8(5, 0); // VersionMajor = 5 - buf.writeUInt8(0, 1); // VersionMinor = 0 - buf.writeUInt8(packetType, 2); // PacketType - buf.writeUInt8(packetFlags, 3); // PacketFlags - buf.writeUInt32LE(0x00000010, 4); // DataRepresentation: LE, ASCII, IEEE - buf.writeUInt16LE(fragLength, 8); // FragLength - buf.writeUInt16LE(0, 10); // AuthLength - buf.writeUInt32LE(currentCallId, 12); // CallId + buf.writeUInt8(5, 0) // VersionMajor = 5 + buf.writeUInt8(0, 1) // VersionMinor = 0 + buf.writeUInt8(packetType, 2) // PacketType + buf.writeUInt8(packetFlags, 3) // PacketFlags + buf.writeUInt32LE(0x00000010, 4) // DataRepresentation: LE, ASCII, IEEE + buf.writeUInt16LE(fragLength, 8) // FragLength + buf.writeUInt16LE(0, 10) // AuthLength + buf.writeUInt32LE(currentCallId, 12) // CallId } // ─── 工具函数: 解析 RPC 头部 ─────────────────────────────────────────────── interface RpcHeader { - versionMajor: number; - versionMinor: number; - packetType: number; - packetFlags: number; - dataRepresentation: number; - fragLength: number; - authLength: number; - callId: number; + versionMajor: number + versionMinor: number + packetType: number + packetFlags: number + dataRepresentation: number + fragLength: number + authLength: number + callId: number } /** 从 Buffer 解析 RPC 头部 */ @@ -130,28 +130,36 @@ function parseRpcHeader(buf: Buffer): RpcHeader { fragLength: buf.readUInt16LE(8), authLength: buf.readUInt16LE(10), callId: buf.readUInt32LE(12), - }; + } } /** 获取数据包类型的可读名称(用于调试输出) */ function packetTypeName(type: number): string { switch (type) { - case RPC_PT_REQUEST: return 'Request'; - case RPC_PT_RESPONSE: return 'Response'; - case RPC_PT_FAULT: return 'Fault'; - case RPC_PT_BIND_REQ: return 'Bind'; - case RPC_PT_BIND_ACK: return 'Bind Ack'; - case RPC_PT_ALTERCONTEXT_REQ: return 'Alter Context'; - case RPC_PT_ALTERCONTEXT_ACK: return 'Alter Context Ack'; - default: return `Unknown(${type})`; + case RPC_PT_REQUEST: + return 'Request' + case RPC_PT_RESPONSE: + return 'Response' + case RPC_PT_FAULT: + return 'Fault' + case RPC_PT_BIND_REQ: + return 'Bind' + case RPC_PT_BIND_ACK: + return 'Bind Ack' + case RPC_PT_ALTERCONTEXT_REQ: + return 'Alter Context' + case RPC_PT_ALTERCONTEXT_ACK: + return 'Alter Context Ack' + default: + return `Unknown(${type})` } } // ─── 构建 Bind/AlterContext 数据包 ────────────────────────────────────────── interface CtxItem { - transferSyntax: Buffer; // 传输语法 GUID - syntaxVersion: number; // 语法版本 + transferSyntax: Buffer // 传输语法 GUID + syntaxVersion: number // 语法版本 } /** @@ -165,44 +173,44 @@ function buildBindPacket( packetType: number, packetFlags: number, currentCallId: number, - ctxItems: CtxItem[] + ctxItems: CtxItem[], ): Buffer { - const ctxItemSize = 44; + const ctxItemSize = 44 // 绑定体: MaxXmitFrag(2) + MaxRecvFrag(2) + AssocGroup(4) + NumCtxItems(4) + 上下文项数组 - const bindBodySize = 2 + 2 + 4 + 4 + ctxItems.length * ctxItemSize; - const totalSize = RPC_HEADER_SIZE + bindBodySize; - const buf = Buffer.alloc(totalSize); + const bindBodySize = 2 + 2 + 4 + 4 + ctxItems.length * ctxItemSize + const totalSize = RPC_HEADER_SIZE + bindBodySize + const buf = Buffer.alloc(totalSize) - writeRpcHeader(buf, packetType, packetFlags, totalSize, currentCallId); + writeRpcHeader(buf, packetType, packetFlags, totalSize, currentCallId) - let offset = RPC_HEADER_SIZE; - buf.writeUInt16LE(5840, offset); // MaxXmitFrag - buf.writeUInt16LE(5840, offset + 2); // MaxRecvFrag - buf.writeUInt32LE(0, offset + 4); // AssocGroup - buf.writeUInt32LE(ctxItems.length, offset + 8); // NumCtxItems - offset += 12; + let offset = RPC_HEADER_SIZE + buf.writeUInt16LE(5840, offset) // MaxXmitFrag + buf.writeUInt16LE(5840, offset + 2) // MaxRecvFrag + buf.writeUInt32LE(0, offset + 4) // AssocGroup + buf.writeUInt32LE(ctxItems.length, offset + 8) // NumCtxItems + offset += 12 for (let i = 0; i < ctxItems.length; i++) { - buf.writeUInt16LE(i, offset); // ContextId - buf.writeUInt16LE(1, offset + 2); // NumTransItems - InterfaceUuid.copy(buf, offset + 4); // InterfaceUUID - buf.writeUInt16LE(1, offset + 20); // InterfaceVerMajor - buf.writeUInt16LE(0, offset + 22); // InterfaceVerMinor - ctxItems[i].transferSyntax.copy(buf, offset + 24); // TransferSyntax - buf.writeUInt32LE(ctxItems[i].syntaxVersion, offset + 40); // SyntaxVersion - offset += ctxItemSize; + buf.writeUInt16LE(i, offset) // ContextId + buf.writeUInt16LE(1, offset + 2) // NumTransItems + InterfaceUuid.copy(buf, offset + 4) // InterfaceUUID + buf.writeUInt16LE(1, offset + 20) // InterfaceVerMajor + buf.writeUInt16LE(0, offset + 22) // InterfaceVerMinor + ctxItems[i].transferSyntax.copy(buf, offset + 24) // TransferSyntax + buf.writeUInt32LE(ctxItems[i].syntaxVersion, offset + 40) // SyntaxVersion + offset += ctxItemSize } - return buf; + return buf } // ─── 解析绑定响应 ─────────────────────────────────────────────────────────── interface BindResult { - ackResult: number; // 确认结果码 - ackReason: number; // 确认原因 - transferSyntax: Buffer; // 传输语法 - syntaxVersion: number; // 语法版本 + ackResult: number // 确认结果码 + ackReason: number // 确认原因 + transferSyntax: Buffer // 传输语法 + syntaxVersion: number // 语法版本 } /** @@ -211,54 +219,63 @@ interface BindResult { */ function parseBindResponse( body: Buffer, - verbose: boolean + verbose: boolean, ): { results: BindResult[]; maxRecvFrag: number } { - let offset = 0; + let offset = 0 - const maxXmitFrag = body.readUInt16LE(offset); - const maxRecvFrag = body.readUInt16LE(offset + 2); - const assocGroup = body.readUInt32LE(offset + 4); - offset += 8; + const maxXmitFrag = body.readUInt16LE(offset) + const maxRecvFrag = body.readUInt16LE(offset + 2) + const assocGroup = body.readUInt32LE(offset + 4) + offset += 8 - const secondaryAddressLength = body.readUInt16LE(offset); - offset += 2; + const secondaryAddressLength = body.readUInt16LE(offset) + offset += 2 if (verbose) { - console.log(` Max Xmit/Recv Frag: ${maxXmitFrag}/${maxRecvFrag}, AssocGroup: 0x${assocGroup.toString(16).padStart(8, '0')}`); - console.log(` Secondary Address Length: ${secondaryAddressLength}`); + console.log( + ` Max Xmit/Recv Frag: ${maxXmitFrag}/${maxRecvFrag}, AssocGroup: 0x${assocGroup.toString(16).padStart(8, '0')}`, + ) + console.log(` Secondary Address Length: ${secondaryAddressLength}`) } // 跳过二级地址和对齐填充到 4 字节边界 - offset += secondaryAddressLength; - const totalOff = offset; - offset += ((4 - (totalOff % 4)) % 4); + offset += secondaryAddressLength + const totalOff = offset + offset += (4 - (totalOff % 4)) % 4 - const numResults = body.readUInt32LE(offset); - offset += 4; + const numResults = body.readUInt32LE(offset) + offset += 4 if (verbose) { - console.log(` Num Results: ${numResults}`); + console.log(` Num Results: ${numResults}`) } - const results: BindResult[] = []; + const results: BindResult[] = [] for (let i = 0; i < numResults; i++) { - const ackResult = body.readUInt16LE(offset); - const ackReason = body.readUInt16LE(offset + 2); - const transferSyntax = Buffer.from(body.subarray(offset + 4, offset + 20)); - const syntaxVersion = body.readUInt32LE(offset + 20); - offset += 24; + const ackResult = body.readUInt16LE(offset) + const ackReason = body.readUInt16LE(offset + 2) + const transferSyntax = Buffer.from(body.subarray(offset + 4, offset + 20)) + const syntaxVersion = body.readUInt32LE(offset + 20) + offset += 24 if (verbose) { - const resultStr = ackResult === RPC_BIND_ACCEPT ? 'Accept' : - ackResult === RPC_BIND_NACK ? 'Nack' : - ackResult === RPC_BIND_ACK ? 'Ack' : `Unknown(0x${ackResult.toString(16)})`; - console.log(` Result[${i}]: ${resultStr} (reason: 0x${ackReason.toString(16)})`); + const resultStr = + ackResult === RPC_BIND_ACCEPT + ? 'Accept' + : ackResult === RPC_BIND_NACK + ? 'Nack' + : ackResult === RPC_BIND_ACK + ? 'Ack' + : `Unknown(0x${ackResult.toString(16)})` + console.log( + ` Result[${i}]: ${resultStr} (reason: 0x${ackReason.toString(16)})`, + ) } - results.push({ ackResult, ackReason, transferSyntax, syntaxVersion }); + results.push({ ackResult, ackReason, transferSyntax, syntaxVersion }) } - return { results, maxRecvFrag }; + return { results, maxRecvFrag } } // ─── 绑定/修改上下文 ─────────────────────────────────────────────────────── @@ -279,82 +296,96 @@ async function rpcBindOrAlterContext( rpcDiag: RpcDiag, ): Promise { // AlterContext 只发送 NDR32;Bind 发送 NDR32 + 可选 NDR64 + BTFN - const isBind = packetType === RPC_PT_BIND_REQ; + const isBind = packetType === RPC_PT_BIND_REQ const ctxItems: CtxItem[] = [ { transferSyntax: TransferSyntaxNDR32, syntaxVersion: 2 }, - ]; + ] - let ctxNDR64 = -1; - let ctxBTFN = -1; + let ctxNDR64 = -1 + let ctxBTFN = -1 if (isBind && useClientRpcNDR64) { - ctxNDR64 = ctxItems.length; - ctxItems.push({ transferSyntax: TransferSyntaxNDR64, syntaxVersion: 1 }); + ctxNDR64 = ctxItems.length + ctxItems.push({ transferSyntax: TransferSyntaxNDR64, syntaxVersion: 1 }) } if (isBind && useClientRpcBTFN) { - ctxBTFN = ctxItems.length; - ctxItems.push({ transferSyntax: BindTimeFeatureNegotiation, syntaxVersion: 1 }); + ctxBTFN = ctxItems.length + ctxItems.push({ + transferSyntax: BindTimeFeatureNegotiation, + syntaxVersion: 1, + }) } - const packetFlags = RPC_PF_FIRST | RPC_PF_LAST | (useMultiplexedRpc ? RPC_PF_MULTIPLEX : 0); - const currentCallId = callId++; - const bindPacket = buildBindPacket(packetType, packetFlags, currentCallId, ctxItems); + const packetFlags = + RPC_PF_FIRST | RPC_PF_LAST | (useMultiplexedRpc ? RPC_PF_MULTIPLEX : 0) + const currentCallId = callId++ + const bindPacket = buildBindPacket( + packetType, + packetFlags, + currentCallId, + ctxItems, + ) - await sendData(sock, bindPacket); + await sendData(sock, bindPacket) // 接收响应头 - const headerBuf = await recvData(sock, RPC_HEADER_SIZE); - const header = parseRpcHeader(headerBuf); + const headerBuf = await recvData(sock, RPC_HEADER_SIZE) + const header = parseRpcHeader(headerBuf) if (verbose) { - console.log(`Received RPC ${packetTypeName(header.packetType)} (FragLength=${header.fragLength}, CallId=${header.callId})`); + console.log( + `Received RPC ${packetTypeName(header.packetType)} (FragLength=${header.fragLength}, CallId=${header.callId})`, + ) } - const expectedAckType = isBind ? RPC_PT_BIND_ACK : RPC_PT_ALTERCONTEXT_ACK; + const expectedAckType = isBind ? RPC_PT_BIND_ACK : RPC_PT_ALTERCONTEXT_ACK - if (header.packetType === RPC_PT_FAULT || header.packetType !== expectedAckType) { - const bodySize = header.fragLength - RPC_HEADER_SIZE; - if (bodySize > 0) await recvData(sock, bodySize); - return 1; + if ( + header.packetType === RPC_PT_FAULT || + header.packetType !== expectedAckType + ) { + const bodySize = header.fragLength - RPC_HEADER_SIZE + if (bodySize > 0) await recvData(sock, bodySize) + return 1 } // 读取响应体 - const bodySize = header.fragLength - RPC_HEADER_SIZE; - const body = await recvData(sock, bodySize); - const { results } = parseBindResponse(body, verbose); + const bodySize = header.fragLength - RPC_HEADER_SIZE + const body = await recvData(sock, bodySize) + const { results } = parseBindResponse(body, verbose) // 处理每个上下文项的结果 for (let i = 0; i < results.length; i++) { - const result = results[i]; + const result = results[i] if (i === ctxBTFN) { // BTFN 上下文:结果码为 RPC_BIND_ACK(3) 表示支持 if (result.ackResult === RPC_BIND_ACK) { - rpcFlags.hasBTFN = true; - rpcDiag.hasBTFN = true; - if (verbose) process.stdout.write('... BTFN '); + rpcFlags.hasBTFN = true + rpcDiag.hasBTFN = true + if (verbose) process.stdout.write('... BTFN ') } - continue; + continue } if (result.ackResult === RPC_BIND_NACK) { - continue; // 被拒绝,跳过 + continue // 被拒绝,跳过 } if (result.ackResult === RPC_BIND_ACCEPT) { if (i === ctxNDR64) { - rpcFlags.hasNDR64 = true; - rpcDiag.hasNDR64 = true; - if (verbose) process.stdout.write('... NDR64 '); + rpcFlags.hasNDR64 = true + rpcDiag.hasNDR64 = true + if (verbose) process.stdout.write('... NDR64 ') } else if (i === 0) { - rpcFlags.hasNDR32 = true; - if (verbose) process.stdout.write('... NDR32 '); + rpcFlags.hasNDR32 = true + if (verbose) process.stdout.write('... NDR32 ') } } } - return 0; + return 0 } /** @@ -370,42 +401,62 @@ export async function rpcBindClient( verbose: boolean, useClientRpcNDR64: boolean, useClientRpcBTFN: boolean, - useMultiplexedRpc: boolean + useMultiplexedRpc: boolean, ): Promise<{ status: number; rpcDiag: RpcDiag; rpcFlags: RpcFlags }> { - const rpcFlags: RpcFlags = { hasNDR32: false, hasNDR64: false, hasBTFN: false }; - const rpcDiag: RpcDiag = { hasRpcDiag: false, hasBTFN: false, hasNDR64: false }; + const rpcFlags: RpcFlags = { + hasNDR32: false, + hasNDR64: false, + hasBTFN: false, + } + const rpcDiag: RpcDiag = { + hasRpcDiag: false, + hasBTFN: false, + hasNDR64: false, + } // 第一步: 发送 Bind 请求 let status = await rpcBindOrAlterContext( - sock, RPC_PT_BIND_REQ, verbose, - useClientRpcNDR64, useClientRpcBTFN, useMultiplexedRpc, - rpcFlags, rpcDiag - ); - - if (status) return { status, rpcDiag, rpcFlags }; + sock, + RPC_PT_BIND_REQ, + verbose, + useClientRpcNDR64, + useClientRpcBTFN, + useMultiplexedRpc, + rpcFlags, + rpcDiag, + ) + + if (status) return { status, rpcDiag, rpcFlags } // 第二步: 如果 NDR32 未被接受,发送 AlterContext 单独协商 if (!rpcFlags.hasNDR32) { status = await rpcBindOrAlterContext( - sock, RPC_PT_ALTERCONTEXT_REQ, verbose, - false, false, useMultiplexedRpc, - rpcFlags, rpcDiag - ); - if (status) return { status, rpcDiag, rpcFlags }; + sock, + RPC_PT_ALTERCONTEXT_REQ, + verbose, + false, + false, + useMultiplexedRpc, + rpcFlags, + rpcDiag, + ) + if (status) return { status, rpcDiag, rpcFlags } } if (!rpcFlags.hasNDR32 && !rpcFlags.hasNDR64) { - process.stderr.write('\nFatal: Could neither negotiate NDR32 nor NDR64 with the RPC server\n'); - return { status: 1, rpcDiag, rpcFlags }; + process.stderr.write( + '\nFatal: Could neither negotiate NDR32 nor NDR64 with the RPC server\n', + ) + return { status: 1, rpcDiag, rpcFlags } } - rpcDiag.hasRpcDiag = true; + rpcDiag.hasRpcDiag = true if (verbose) { - process.stdout.write('\n'); + process.stdout.write('\n') } - return { status: 0, rpcDiag, rpcFlags }; + return { status: 0, rpcDiag, rpcFlags } } // ─── 发送 RPC 请求 (参考 src/rpc.c 中的 rpcSendRequest) ──────────────────── @@ -422,150 +473,154 @@ export async function rpcSendRequest( kmsRequest: Buffer, rpcFlags: RpcFlags, useClientRpcNDR64: boolean, - firstPacketSent: boolean -): Promise<{ status: number; kmsResponse: Buffer | null; responseSize: number }> { - const requestSize = kmsRequest.length; - const useNDR64 = useClientRpcNDR64 && rpcFlags.hasNDR64 && firstPacketSent; - - let requestBody: Buffer; + firstPacketSent: boolean, +): Promise<{ + status: number + kmsResponse: Buffer | null + responseSize: number +}> { + const requestSize = kmsRequest.length + const useNDR64 = useClientRpcNDR64 && rpcFlags.hasNDR64 && firstPacketSent + + let requestBody: Buffer if (useNDR64) { // NDR64 格式: AllocHint(4) + ContextId(2) + Opnum(2) + DataLength(8) + DataSizeIs(8) + Data - const bodySize = 4 + 2 + 2 + 8 + 8 + requestSize; - requestBody = Buffer.alloc(bodySize); - let offset = 0; - requestBody.writeUInt32LE(requestSize + 16, offset); // AllocHint - offset += 4; - requestBody.writeUInt16LE(1, offset); // ContextId (NDR64 = 1) - offset += 2; - requestBody.writeUInt16LE(0, offset); // Opnum - offset += 2; - requestBody.writeBigUInt64LE(BigInt(requestSize), offset); // Ndr64.DataLength - offset += 8; - requestBody.writeBigUInt64LE(BigInt(requestSize), offset); // Ndr64.DataSizeIs - offset += 8; - kmsRequest.copy(requestBody, offset); + const bodySize = 4 + 2 + 2 + 8 + 8 + requestSize + requestBody = Buffer.alloc(bodySize) + let offset = 0 + requestBody.writeUInt32LE(requestSize + 16, offset) // AllocHint + offset += 4 + requestBody.writeUInt16LE(1, offset) // ContextId (NDR64 = 1) + offset += 2 + requestBody.writeUInt16LE(0, offset) // Opnum + offset += 2 + requestBody.writeBigUInt64LE(BigInt(requestSize), offset) // Ndr64.DataLength + offset += 8 + requestBody.writeBigUInt64LE(BigInt(requestSize), offset) // Ndr64.DataSizeIs + offset += 8 + kmsRequest.copy(requestBody, offset) } else { // NDR32 格式: AllocHint(4) + ContextId(2) + Opnum(2) + DataLength(4) + DataSizeIs(4) + Data - const bodySize = 4 + 2 + 2 + 4 + 4 + requestSize; - requestBody = Buffer.alloc(bodySize); - let offset = 0; - requestBody.writeUInt32LE(requestSize + 8, offset); // AllocHint - offset += 4; - requestBody.writeUInt16LE(0, offset); // ContextId (NDR32 = 0) - offset += 2; - requestBody.writeUInt16LE(0, offset); // Opnum - offset += 2; - requestBody.writeUInt32LE(requestSize, offset); // Ndr.DataLength - offset += 4; - requestBody.writeUInt32LE(requestSize, offset); // Ndr.DataSizeIs - offset += 4; - kmsRequest.copy(requestBody, offset); + const bodySize = 4 + 2 + 2 + 4 + 4 + requestSize + requestBody = Buffer.alloc(bodySize) + let offset = 0 + requestBody.writeUInt32LE(requestSize + 8, offset) // AllocHint + offset += 4 + requestBody.writeUInt16LE(0, offset) // ContextId (NDR32 = 0) + offset += 2 + requestBody.writeUInt16LE(0, offset) // Opnum + offset += 2 + requestBody.writeUInt32LE(requestSize, offset) // Ndr.DataLength + offset += 4 + requestBody.writeUInt32LE(requestSize, offset) // Ndr.DataSizeIs + offset += 4 + kmsRequest.copy(requestBody, offset) } - const totalSize = RPC_HEADER_SIZE + requestBody.length; - const packet = Buffer.alloc(totalSize); - const currentCallId = callId++; + const totalSize = RPC_HEADER_SIZE + requestBody.length + const packet = Buffer.alloc(totalSize) + const currentCallId = callId++ writeRpcHeader( packet, RPC_PT_REQUEST, RPC_PF_FIRST | RPC_PF_LAST, totalSize, - currentCallId - ); - requestBody.copy(packet, RPC_HEADER_SIZE); + currentCallId, + ) + requestBody.copy(packet, RPC_HEADER_SIZE) - await sendData(sock, packet); + await sendData(sock, packet) // ── 接收响应 ────────────────────────────────────────────────────────── - const headerBuf = await recvData(sock, RPC_HEADER_SIZE); - const header = parseRpcHeader(headerBuf); + const headerBuf = await recvData(sock, RPC_HEADER_SIZE) + const header = parseRpcHeader(headerBuf) // 处理 Fault 响应 if (header.packetType === RPC_PT_FAULT) { - const bodySize = header.fragLength - RPC_HEADER_SIZE; + const bodySize = header.fragLength - RPC_HEADER_SIZE if (bodySize >= 4) { - const faultBody = await recvData(sock, bodySize); - const faultStatus = faultBody.readUInt32LE(0); - return { status: faultStatus || 1, kmsResponse: null, responseSize: 0 }; + const faultBody = await recvData(sock, bodySize) + const faultStatus = faultBody.readUInt32LE(0) + return { status: faultStatus || 1, kmsResponse: null, responseSize: 0 } } - if (bodySize > 0) await recvData(sock, bodySize); - return { status: 1, kmsResponse: null, responseSize: 0 }; + if (bodySize > 0) await recvData(sock, bodySize) + return { status: 1, kmsResponse: null, responseSize: 0 } } // 验证响应类型 if (header.packetType !== RPC_PT_RESPONSE) { - const bodySize = header.fragLength - RPC_HEADER_SIZE; - if (bodySize > 0) await recvData(sock, bodySize); - return { status: 1, kmsResponse: null, responseSize: 0 }; + const bodySize = header.fragLength - RPC_HEADER_SIZE + if (bodySize > 0) await recvData(sock, bodySize) + return { status: 1, kmsResponse: null, responseSize: 0 } } // 读取完整响应体 - const bodySize = header.fragLength - RPC_HEADER_SIZE; - const body = await recvData(sock, bodySize); + const bodySize = header.fragLength - RPC_HEADER_SIZE + const body = await recvData(sock, bodySize) // 解析 NDR 响应头 // 参考: src/rpc.h 中的 RPC_RESPONSE / RPC_RESPONSE64 结构 - let offset = 0; - const allocHint = body.readUInt32LE(offset); // AllocHint - offset += 4; - const contextId = body.readUInt16LE(offset); // ContextId - offset += 2; - const cancelCount = body.readUInt8(offset); // CancelCount - offset += 1; - offset += 1; // Pad1 + let offset = 0 + const allocHint = body.readUInt32LE(offset) // AllocHint + offset += 4 + const contextId = body.readUInt16LE(offset) // ContextId + offset += 2 + const cancelCount = body.readUInt8(offset) // CancelCount + offset += 1 + offset += 1 // Pad1 - const responseUsesNDR64 = contextId === 1; + const responseUsesNDR64 = contextId === 1 - let dataLength: number; - let dataSizeMax: bigint | number; - let dataSizeIs: bigint | number; + let dataLength: number + let dataSizeMax: bigint | number + let dataSizeIs: bigint | number if (responseUsesNDR64) { // NDR64 响应: DataLength(8) + DataSizeMax(8) + DataSizeIs(8) - dataLength = Number(body.readBigUInt64LE(offset)); - offset += 8; - dataSizeMax = body.readBigUInt64LE(offset); - offset += 8; - dataSizeIs = body.readBigUInt64LE(offset); - offset += 8; + dataLength = Number(body.readBigUInt64LE(offset)) + offset += 8 + dataSizeMax = body.readBigUInt64LE(offset) + offset += 8 + dataSizeIs = body.readBigUInt64LE(offset) + offset += 8 } else { // NDR32 响应: DataLength(4) + DataSizeMax(4) + DataSizeIs(4) - dataLength = body.readUInt32LE(offset); - offset += 4; - dataSizeMax = body.readUInt32LE(offset); - offset += 4; - dataSizeIs = body.readUInt32LE(offset); - offset += 4; + dataLength = body.readUInt32LE(offset) + offset += 4 + dataSizeMax = body.readUInt32LE(offset) + offset += 4 + dataSizeIs = body.readUInt32LE(offset) + offset += 4 } // 如果 dataSizeMax 为 0,说明 RPC 调用返回了错误状态 if (dataSizeMax === 0 || dataSizeMax === 0n) { - const errorStatus = Number(dataSizeIs); - return { status: errorStatus || 1, kmsResponse: null, responseSize: 0 }; + const errorStatus = Number(dataSizeIs) + return { status: errorStatus || 1, kmsResponse: null, responseSize: 0 } } if (dataLength <= 0 || offset + dataLength > body.length) { - return { status: 1, kmsResponse: null, responseSize: 0 }; + return { status: 1, kmsResponse: null, responseSize: 0 } } // 提取 KMS 响应数据 - const kmsResponse = Buffer.from(body.subarray(offset, offset + dataLength)); - offset += dataLength; + const kmsResponse = Buffer.from(body.subarray(offset, offset + dataLength)) + offset += dataLength // 4 字节对齐填充 - const padBytes = (4 - (dataLength % 4)) % 4; - offset += padBytes; + const padBytes = (4 - (dataLength % 4)) % 4 + offset += padBytes // 读取 ReturnCode (HRESULT) - let returnCode = 0; + let returnCode = 0 if (offset + 4 <= body.length) { - returnCode = body.readUInt32LE(offset); + returnCode = body.readUInt32LE(offset) } if (returnCode !== 0) { - return { status: returnCode, kmsResponse, responseSize: dataLength }; + return { status: returnCode, kmsResponse, responseSize: dataLength } } - return { status: 0, kmsResponse, responseSize: dataLength }; + return { status: 0, kmsResponse, responseSize: dataLength } } diff --git a/package.json b/package.json index a0432d99..e8591df6 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "dev": "nuxt dev", "generate": "nuxt generate", "preview": "nuxt preview", - "postinstall": "nuxt prepare" + "postinstall": "pnpm -C node-vlmcs build && nuxt prepare" }, "dependencies": { "@iconify-json/flag": "^1.2.11", @@ -21,6 +21,7 @@ "arco-design-nuxt-module": "^0.2.1", "echarts": "^6.0.0", "motion-v": "^2.0.1", + "node-vlmcs": "workspace:*", "nuxt": "^4.4.2", "nuxt-echarts": "^1.0.1", "prettier": "^3.8.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 841e4f66..6d53547d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,6 +35,9 @@ importers: motion-v: specifier: ^2.0.1 version: 2.0.1(@vueuse/core@14.2.1(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)) + node-vlmcs: + specifier: workspace:* + version: link:node-vlmcs nuxt: specifier: ^4.4.2 version: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.6)(@types/node@22.15.19)(@vue/compiler-sfc@3.5.30)(cac@6.7.14)(db0@0.3.4)(eslint@9.17.0(jiti@2.6.1))(ioredis@5.10.0)(magicast@0.5.2)(optionator@0.9.4)(rollup-plugin-visualizer@6.0.11(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(tsx@4.19.2)(typescript@5.9.3)(vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.0)(tsx@4.19.2)(yaml@2.8.2))(yaml@2.8.2) diff --git a/server/api/check.ts b/server/api/check.ts index 9f94b913..edd9986d 100644 --- a/server/api/check.ts +++ b/server/api/check.ts @@ -11,6 +11,7 @@ export default defineEventHandler(async event => { port, protocol, edition, + verbose: true, }) return result diff --git a/server/utils/kms.ts b/server/utils/kms.ts index 8ee3acdb..6c9f4ece 100644 --- a/server/utils/kms.ts +++ b/server/utils/kms.ts @@ -1,5 +1,4 @@ -import { execFile } from 'child_process' -import { arch, platform } from 'os' +import { runVlmcs as runNodeVlmcs } from 'node-vlmcs' const defaultMonitorList = [ 'kms.8b5.cn', @@ -27,8 +26,7 @@ export const getMonitorList = (() => { return () => { if (cached) return cached const config = useRuntimeConfig() - const listStr = - (config.monitorList as string) || process.env.MONITOR_LIST + const listStr = (config.monitorList as string) || process.env.MONITOR_LIST cached = listStr?.split(',').filter(Boolean) || defaultMonitorList return cached } @@ -39,30 +37,13 @@ export const runVlmcs = ({ port = 1688, protocol = 6, edition = 26, + verbose = false, }: RunVlmcsParams) => { - return new Promise((resolve, reject) => { - const before = Date.now() - const vlmcs = execFile( - `./binaries/vlmcs-${platform()}-${arch()}`, - [`${host}:${port}`, `-${protocol}`, `-l ${edition}`], - { timeout: 5 * 1000 }, - (err, stdout) => { - resolve({ - host, - delay: err ? -1 : Date.now() - before, - content: stdout.trim(), - status: err ? false : true, - }) - }, - ) - - vlmcs.on('error', err => { - reject(err) - }) - - vlmcs.on('close', () => { - vlmcs.removeAllListeners() - vlmcs.kill() - }) - }) + return runNodeVlmcs({ + host, + port: Number(port), + protocol: Number(protocol), + edition: Number(edition), + verbose, + }) as Promise } diff --git a/shared/types/kms.ts b/shared/types/kms.ts index 57739fe2..723e92e9 100644 --- a/shared/types/kms.ts +++ b/shared/types/kms.ts @@ -3,6 +3,7 @@ export interface RunVlmcsParams { port?: number protocol?: number edition?: number + verbose?: boolean } export interface RunVlmcsResult {