0

我正在开发一个 win32 API 挂钩程序。据我了解,当程序为特定文件调用 ReadFile 时,该文件的内容被复制到 lpBuffer(参见下面的定义),

读取文件定义:

BOOL ReadFile(
  HANDLE       hFile,
  LPVOID       lpBuffer,
  DWORD        nNumberOfBytesToRead,
  LPDWORD      lpNumberOfBytesRead,
  LPOVERLAPPED lpOverlapped
);

现在,我的目标是改变这个 lpBuffer 并用我提供的内容填充它!我正在使用 EasyHook 来挂钩 ReadFile。我不熟悉 LPVOID 类型。我能够使用以下代码更改 GetCurrentDirectory 的内容。

 string b = "C:\\my\\altered\\directory";
 DWORD returnLength  = b.length();
 int i;
 for (i = 0; i<b.length(); i++)
 {
    lpBuffer[i] = b[i];
 }
 lpBuffer[i++] = '\0';

GetCurrentDirectory 定义:

DWORD GetCurrentDirectory(
  DWORD  nBufferLength,
  LPTSTR lpBuffer
);

如何为 ReadFile (LPVOID lpBuffer) 做类似的赋值?

4

1 回答 1

0

这是LPVOID类型定义:

#define far
typedef void far *LPVOID;

宏被定义为无far,我猜是因为一些历史原因(行李)。因此,您几乎可以直接将LPVOIDas 视为void*

现在,假设您有一个std::vector<uint8_t>named FakeData,只需:

if (nNumberOfBytesToRead < FakeData.size()) {
    SetLastError(ERROR_INSUFFICIENT_BUFFER);
    return FALSE;
}

memcpy(lpBuffer, FakeData.data(), FakeData.size());
*lpNumberOfBytesRead = FakeData.size();

SetLastError(ERROR_SUCCESS);
return TRUE;
于 2020-12-22T19:47:25.667 回答