Я пишу анти-читерский загрузчик Win32, и в нем мне нужно создать событие, подождать, пока оно не будет сигнализировано другим процессом, в котором я его сохранил — но оно завершается с ошибкой ERROR_INVALID_HANDLE. Я создаю безымянное событие и просто передаю его значение HANDLE в другой процесс, который должен установить его в сигнальное состояние в определенных условиях. Любые идеи, почему это так — не РУЧКА, созданная CreateEvent, действительна для всех процессов. Псевдокод, иллюстрирующий это:
Процесс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».
РЕДАКТИРОВАТЬ1: Решил проблему — это было с вызовом функции DuplicateHandle, это должно быть
DuplicateHandle(GetCurrentProcess(), hEvent, hExternalProcess, &hEventDuplicate, 0, false, DUPLICATE_SAME_ACCESS)
По какой-то странной причине — кто-нибудь может объяснить, почему это?
Ручки похожи на указатели в том смысле, что они обычно зависят от процесса. Требуются специальные действия (например, использование DuplicateHandle), чтобы поделиться ими.
В зависимости от ситуации может быть проще назвать объект, а затем получить доступ к нему другим процессом. Смотрите четвертый параметр Создать событие.