Собственно, вопрос заключается в следущем. Возникла необходимость реализовать следущую схему взаимодействия драйвера и юзермодной программы. Драйвер во время инициализации создает именованный Notification Event, устанавливая его в несигнальное состояние. После запуска юзермодной программы последней необходимо открыть этот евент по имени с правами EVENT_MODIFY_STATE. Логика понятна. Но на прктике получаю ACCESS_DENIED. Собственно, каким образом возможно это ограничение обойти? Предполагаю, что нужно копать в сторону настройки SECURITY_DESCRIPTOR прежде чем вызвать ZwCreateEvent(...). У кого какие соображения и видимые решения проблемы?
Да ну что ты говоришь, это как же у тебя приложение открывало событие, созданное процессом ядра, у которого в DACL на модификацию разрешение только SYSTEM'у, м?
из кода драйвера: Код (Text): #define OBJECT_NUM_FOR_WAIT 1 ... // -1= инициализируем Notification Event PVOID pvWaitEvents[OBJECT_NUM_FOR_WAIT]; RtlInitUnicodeString(&usUserEventName, L"\\BaseNamedObjects\\scatch_us"); InitializeObjectAttributes(&oaUserEvent, &usUserEventName, OBJ_INHERIT, NULL, NULL); ZwCreateEvent(&hUserEvent, EVENT_ALL_ACCESS, &oaUserEvent, NotificationEvent, FALSE); if (hUserEvent == NULL) { DbgPrint("[Thread] ERR: cann't create 'scatch_us'-event \n"); PsTerminateSystemThread(STATUS_UNSUCCESSFUL); } if (STATUS_SUCCESS != ObReferenceObjectByHandle(hUserEvent, EVENT_ALL_ACCESS, *ExEventObjectType, KernelMode, &pkUserEvent,NULL)) { DbgPrint("[Thread] cann't get KPEVENT of 'scatch_us'\n"); ZwClose(hUserEvent); PsTerminateSystemThread(STATUS_UNSUCCESSFUL); } while(1) { KeWaitForMultipleObjects(OBJECT_NUM_FOR_WAIT, pvWaitEvents, WaitAny, Executive, KernelMode, FALSE, NULL, NULL); // TODO дальнейшие действия } из кода программы: Код (Text): hUserEvent = OpenEventA(EVENT_MODIFY_STATE, FALSE, (LPCSTR)("scatch_us")); if (hUserEvent == NULL) { printf("[ERR] cann't open event. Err: %X\n", GetLastError()); return 0; } GetLastError() возвращает ERROR_ACCESS_DENIED
hUserEvent = OpenEventA(EVENT_MODIFY_STATE, FALSE, (LPCSTR)("Global\\scatch_us")); так же ERROR_ACCESS_DENIED
Конечно, потому что нужно правильно навесить DACL на объект-событие. Проще всего его тупо обнулить, код здесь. Учти только, что в этом случае доступ к объект получит любое приложение с любым уровнем привилегий.
amisto0x07, кста, решение с event-ом кривоватое. Что ты будешь делать в user-mode после возвращения WaitFor..()? ога, deviceIOcontrol() или XxxFile(). Так их можно сделать сразу а в драйвере пометить IRP как pending и положить в очередь. Усё.