为什么'CreateEvent'创建的 HANDLE 在另一个进程中无效?
Why HANDLE created by 'CreateEvent' isn't valid in another process?
我正在编写一个 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)来共享它们。
根据具体情况,命名对象,然后让其他进程以这种方式访问它可能更容易。参见创建事件的第四个参数。
相关文章:
- 如何在C++中将函数发送到另一个进程
- 如何从另一个进程解开全局钩子?
- 如何使用带有矢量的 winapi 读取进程内存从另一个进程读取缓冲区?
- 从不同进程中的另一个线程挂起/恢复线程或进程
- 是否可以将子进程的 stdout 重定向到父进程中的另一个文件?
- 如何在MPI中将矩阵从一个进程转移到另一个进程
- 将vector<vector<double>>从x86平台中创建的一个进程发送到x64中构建的另一个进程的最快方法是什么
- 通过 c++ 中的 udp 套接字将派生类对象从一个进程发送到另一个进程
- C++ 减慢另一个正在运行的进程
- 与 Python 中子进程中的另一个应用程序的交互式会话
- 如何:监视Windows中另一个进程的文件访问?
- 是否可以注入一个进程并获取给定的句柄,然后使用它们注入另一个进程
- 尝试启动另一个进程并通过 MPI 加入它,但获得访问冲突
- 将窗口句柄从一个进程使用到另一个进程(插件 vst 音频)
- 启动另一个进程的最佳方式C++?
- 异步是否总是在C++中使用另一个线程/内核/进程
- Win32/Gdigrab - 如何将另一个进程窗口设置为无边框
- 为什么我不能用这个函数在Qt框架中打开另一个进程?
- 如何使用 C# 在 Windows 中获取另一个进程库地址
- 如何在没有窗口类的情况下编写QT系统托盘应用程序,并将其与另一个进程集成