Windows句柄始终返回INVALID_HANDLE_VALUE

时间:2018-02-16 08:06:43

标签: c++ winapi

HANDLE process = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, PID);
    if (process = INVALID_HANDLE_VALUE)
    {
        printf("Failed to open PID %d, error code %d",
            PID, GetLastError());
    }

我试过这个功能,但它总是返回“无法打开PID(数字)错误代码0”。即使只有 PROCESS_VM_READ

当我输出此代码中的内存地址值

ReadProcessMemory(process, (LPVOID)0x14AC1BC, &value, sizeof(DWORD), NULL);
cout << value << endl;

它返回垃圾值。

3 个答案:

答案 0 :(得分:7)

OpenProcess在失败时返回NULL而不是INVALID_HANDLE_VALUE。如果您使用=,也可以使用==。代码应该是

HANDLE process = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, PID);
if (process == NULL)
{
}

答案 1 :(得分:3)

process = INVALID_HANDLE_VALUE执行赋值覆盖进程句柄值,而不是比较。如果出现错误,OpenProcess将返回NULL。像这样重写检查:

if(NULL == process)

答案 2 :(得分:3)

您错误地将process变量分配了两次。一旦你打电话给OpenProcess然后再打电话

if (process = INVALID_HANDLE_VALUE)

这会将INVALID_HANDLE_VALUE分配给process并测试process是否为非零。情况总是如此,因为INVALID_HANDLE_VALUE不为零。当您打算使用=时,您犯了经典错误,即使用==。因此,您完全忽略OpenProcess返回的值。

请注意OpenProcess表示因返回NULL而失败。所以你的代码应该是

if (process == NULL)