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

AnA*_*ons 1 c++ winapi handle win32-process

我正在写一个反作弊的Win32加载器,在其中我需要创建一个事件,等待它通过我存储它的另一个进程发出信号 - 但是它失败了ERROR_INVALID_HANDLE.我正在创建一个未命名的事件,只是将它的HANDLE值传递给另一个进程,该进程应该在某种情况下将其设置为信号状态.任何想法为什么 - 这不是'CreateEvent'创建的HANDLE对所有过程都有效.伪代码说明了这一点:

Process1,Thread1:

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);
Run Code Online (Sandbox Code Playgroud)

Process2,Thread1:

EIP->

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

//Other code
Run Code Online (Sandbox Code Playgroud)

编辑:我使用'DuplicateHandle'来解决问题,但现在'第二个进程'SetEvent'调用失败,出现'ERROR_ACCESS_DENIED'.

编辑1:解决了问题 - 它是'DuplicateHandle'函数调用,它应该是

DuplicateHandle(GetCurrentProcess(), hEvent, hExternalProcess, &hEventDuplicate, 0, false, DUPLICATE_SAME_ACCESS)
Run Code Online (Sandbox Code Playgroud)

出于某种奇怪的原因 - 任何人都可以解释为什么这样?

The*_*ish 6

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

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