Почему HANDLE, созданный CreateEvent, недопустим в другом процессе?

Я пишу анти-читерский загрузчик 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)

По какой-то странной причине — кто-нибудь может объяснить, почему это?

1

Решение

Ручки похожи на указатели в том смысле, что они обычно зависят от процесса. Требуются специальные действия (например, использование DuplicateHandle), чтобы поделиться ими.

В зависимости от ситуации может быть проще назвать объект, а затем получить доступ к нему другим процессом. Смотрите четвертый параметр Создать событие.

6

Другие решения


По вопросам рекламы [email protected]