使用 js-ctypes,如何从 Windows ReadFile 检索输出

Using js-ctypes, how do I retrieve output from Windows ReadFile?

本文关键字:Windows ReadFile 检索 输出 js-ctypes 使用      更新时间:2023-09-26

我正在使用(虽然不太确定lpBuffer -> char.ptr)

  let readFile = kernel32.declare(
    "ReadFile",
    ctypes.winapi_abi,
    ctypes.int32_t,     //bool  // return type: 1 indicates success, 0 failure
    ctypes.voidptr_t,   // in: hObject
    ctypes.char.ptr,  // out: lpBuffer
    ctypes.uint32_t,    // in: lpNumberOfBytesRead
    ctypes.uint32_t.ptr,    // out: lpNumberOfBytesWritten
    ctypes.voidptr_t.ptr    // inout: lpOverlapped
  );

BOOL WINAPI ReadFile(
  _In_        HANDLE       hFile,
  _Out_       LPVOID       lpBuffer,
  _In_        DWORD        nNumberOfBytesToRead,
  _Out_opt_   LPDWORD      lpNumberOfBytesRead,
  _Inout_opt_ LPOVERLAPPED lpOverlapped
);

但是,当我尝试时

  let output = ctypes.char.array(1024);
  let isRead = readFile(hFile, output, 1024, bytesWritten.address())

我得到

JPM [错误] 消息: 类型错误: 无法传递 ctypes.char.array(1024) 到int32_t读取文件的参数 2(void*, char*, uint32_t, void**)

更多尝试。

  let output = ctypes.char.array(1024);
  let isRead = readFile(hFile, output.ptr, 1024, bytesWritten.address())

JPM [错误] 消息:类型错误:无法传递 ctypes.char.array(1024).ptr 到 int32_t ReadFile(void*, 字符*、uint32_t、无效**

  let output = ctypes.char.array(1024);
  let isRead = readFile(hFile, output.address(), 1024, bytesWritten.address())

JPM [错误] 消息:类型错误:输出地址不是函数

  let output = ctypes.char.ptr;
  let isRead = readFile(hFile, output, 1024, bytesWritten.address())

JPM [错误] 消息:类型错误:无法将 ctypes.char.ptr 传递给 int32_t读取文件的参数 2(void*, char*, uint32_t, v oid**)

这使它起作用

  let outputType = ctypes.char.array(1024);
  let output = outputType();
  let isRead = readFile(hFile, output, 1024, bytesWritten.address(), null);