Как присвоить значение буферу LPVOID для чтения файла

#c #pointers #winapi #buffer #easyhook

#c #указатели #winapi #буфер #easyhook

Вопрос:

Я разрабатываю программу перехвата 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  ] = '';
 

Определение GetCurrentDirectory:

 DWORD GetCurrentDirectory(
  DWORD  nBufferLength,
  LPTSTR lpBuffer
);
 

Как выполнить аналогичное присвоение значения для ReadFile (LPVOID lpBuffer)?

Комментарии:

1. Обрабатывайте его как указатель на первый элемент массива байтов, длиной не менее nNumberOfBytesToRead байта. Точно так же, как вы делаете для GetCurrentDirectory переопределения. Однако вам нужно привести указатель.

2. LPVOID является указателем на void . void ничего. Вы не можете создать void , но вы можете привести ЧТО-ЛИБО к указателю на void , поэтому вам не нужно ничего делать, кроме как получить указатель на string символьный буфер ‘s: ReadFile(handle, b.data(), ...) . К сожалению, логически это не имеет никакого смысла.

Ответ №1:

Вот LPVOID typedef:

 #define far
typedef void far *LPVOID;
 

far Макрос определяется как ничто, я думаю, это из-за некоторых исторических причин (багаж).
Таким образом, вы можете почти напрямую обрабатывать LPVOID as void* .

А теперь предположим, что у вас есть std::vector<uint8_t> имя 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;
 

Комментарии:

1. Я думаю, что здесь вы движетесь в правильном направлении, но если я не уверен на 100%, вы, вероятно, недостаточно объясняете спрашивающему.

2. @user4581301 Да, я отредактировал ответ для дальнейшего объяснения.

3. string content = "altered content"; memcpy(lpBuffer, content, content.length()); Могу ли я сделать что-то подобное? Я думаю, нужно указать содержимое в const void

4. @MdSajid Вы можете сделать это для текстовых файлов, не рекомендуется для двоичных файлов. И это должно быть memcpy(lpBuffer, content.c_str(), content.length());

5. Я выполняю это действие только для файлов такого типа, как «txt»