跳转至

使用 OpenProcess()

现在让我们走一遍 OpenProcess() 的示例调用,它使用具有读写内存访问权限的句柄:

DWORD PID = getGamePID();
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());
}

首先,对 getGamePID() 的调用获取你要找的 PID。(这个函数需要你自己编写,不过它可以是清单 6-1 和 6-2 中某个片段展开成的完整函数。)然后,代码用三个标志调用 OpenProcess():PROCESS_VM_OPERATION 标志给这个句柄内存访问权限,另外两个组合起来给它读写权限。这个示例还包含一个错误处理分支①,但只要你有正确的 PID、有效的访问标志,并且代码以与游戏相同或更高的权限运行(例如,如果你用「以管理员身份运行」启动机器人),这个调用应该永远不会失败。

使用完句柄后,用 CloseHandle() 清理它,如下所示:

CloseHandle(process);

你可以随意重复使用句柄,所以可让句柄保持打开,直到完全用完它或机器人退出。

现在你已经看到了如何为操纵游戏内存准备进程句柄,让我们深入探讨如何实际访问该进程的内存。