c++ - 为什么 'CreateEvent' 创建的 HANDLE 在另一个进程中无效?

标签 c++ winapi handle win32-process

我正在编写一个 ant-cheat Win32 加载程序,我需要在其中创建一个事件,等待它收到我存储它的另一个进程的信号 - 但它因 ERROR_INVALID_HANDLE 而失败。我正在创建一个未命名的事件,只是将它的 HANDLE 值传递给另一个进程,该进程应该在特定条件下将其设置为信号状态。任何想法为什么会这样 - 不是由“CreateEvent”创建的 HANDLE 对所有过程都有效。说明这一点的伪代码:

进程 1,线程 1:

extern LPVOID pExternalMemory;

extern HANDLE hExternalProcess; //Process2 Handle

extern HANDLE hExternalThread; //In suspended state (Thread1)

extern HANDLE hEventDuplicate;

HANDLE hEvent = CreateEvent(nullptr, true, false, nullptr);

DuplicateHandle(GetCurrentProcess(), hEvent, hExternalProcess, &hEventDuplicate, STANDARD_RIGHTS_ALL, false, 0); //Wrong, check EDIT1

WriteProcessMemory(hProcess, pExternalMemory, &hEventDuplicate, sizeof(HANDLE), nullptr);

ResumeThread(hExternalThread);

WaitForSingleObject(hEvent, INFINITE);

进程 2,线程 1:

EIP->

if(SomeCondition) SetEvent((HANDLE)ExternalMemory); //fails with 'ERROR_INVALID_HANDLE'

//Other code

编辑:我使用“DuplicateHandle”来解决问题,但现在对第二个进程的“SetEvent”调用失败并显示“ERROR_ACCESS_DENIED”。

EDIT1:解决了问题 - 它是通过“DuplicateHandle”函数调用,它应该是

DuplicateHandle(GetCurrentProcess(), hEvent, hExternalProcess, &hEventDuplicate, 0, false, DUPLICATE_SAME_ACCESS)

出于某些奇怪的原因 - 谁能解释这是为什么?

最佳答案

句柄有点像指针,因为它们通常是特定于进程的。它需要特殊操作(例如使用 DuplicateHandle)来共享它们。

根据具体情况,命名对象然后让其他进程以这种方式访问​​它可能更容易。见CreateEvent的第四个参数.

关于c++ - 为什么 'CreateEvent' 创建的 HANDLE 在另一个进程中无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27712681/

相关文章:

c++ - 了解非静态类成员访问

windows - 如何检测 Windows 安装是否为 RTL

matlab - 如何从函数句柄中获取函数子集,函数句柄是 Matlab 中的函数向量

winforms - 如何从 System.Windows.Forms.Form 中获取 HWND 句柄

C++ 设置 : No match for - operator

c++ - 什么时候需要指定模板的类型

函数中的 C++ 指针和引用

c++ - 处理 GetSidIdentifierAuthority 函数的返回值

python - 通过 CPython/pywin32 使用 Windows UI 自动化?

c - 多个 CreateFileA 调用返回相同的文件句柄