WriteProcessMemory ERROR_PARTIAL_COPY 299

时间:2010-09-26 18:21:03

标签: windows winapi memory

我正在尝试写入另一个进程的内存,我使用权限38h(VM_OPERATION,VM_READ,VM_WRITE)打开它,然后我使用VirtualProtectEx权限4h(PAGE_READWRITE),但我也尝试了PAGE_EXECUTEREADWRITE - 稍后同样的错误。

然后我调用ReadProcessMemory,并成功读出修复地址的值。 但是当我尝试使用WriteProcessMemory写入该地址时,我得到错误代码299 - ERROR_PARTIAL_COPY。

有谁知道如何解决这个问题?

EDIT:已解决 - 没有通过缓冲区写入作为参考但作为值

1 个答案:

答案 0 :(得分:0)

WriteProcessMemory给出错误ERROR_PARTIAL_COPY 299,因为第三个参数lpBuffer必须是一个指针。特别是指向包含要写入目标进程的数据的本地缓冲区的指针。例如,如果缓冲区是一个整数,例如:

int x = 5;

然后,您将使用&x作为lpBuffer参数。 &是“运算符的地址,它返回指向变量的指针。

通常,如果您不为此参数传递指针,则会出现编译器错误。无论如何,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);
}