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

Why HANDLE created by 'CreateEvent' isn't valid in another process?

本文关键字:进程 另一个 无效 CreateEvent 创建 为什么 HANDLE      更新时间:2023-10-16

我正在编写一个 ant-cheat Win32 加载器,我需要在其中创建一个事件,等待它被我存储它的另一个进程发出信号 - 但它ERROR_INVALID_HANDLE失败了。我正在创建一个未命名的事件,只是将其 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:

弹性公网IP>

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)来共享它们。

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