WriteProcessMemory выдает ошибку ERROR_PARTIAL_COPY
299, поскольку третий аргумент, lpBuffer
, должен быть указателем.В частности, указатель на локальный буфер, который содержит данные, которые вы намереваетесь записать в целевой процесс.Если, например, буфер, скажем, целое число вроде:
int x = 5;
Тогда вы бы использовали &x
в качестве аргумента lpBuffer
.&
- это оператор "address of`, который возвращает указатель на переменную.
Обычно, если вы не передадите указатель для этого аргумента, вы получите ошибку компилятора. Независимо от того, ERROR_PARTIAL_COPY означает, что не всебайты из исходного буфера были записаны в целевой процесс. Это может произойти по нескольким причинам, особенно если аргумент lpBuffer не указывает на адрес выделенной памяти с правильными разрешениями. То же самое происходит, если вы испортили второй аргумент WriteProcessMemory.
Использование VirtualProtectEx для получения разрешений на запись на целевую страницу памяти также рекомендуется, как я здесь:
void PatchEx(HANDLE hProcess, char* dst, char* src, int size)
{
DWORD oldprotect;
VirtualProtectEx(hProcess, dst, size, PAGE_EXECUTE_READWRITE, &oldprotect);
WriteProcessMemory(hProcess, dst, src, size, NULL);
VirtualProtectEx(hProcess, dst, size, oldprotect, &oldprotect);
}