Помогите реализовать задуманное. Статью "Sharing Events Between Kernel and User Mode" прочитал. IoCreateNotificationEvent не подходит мне, потому как создает Event если приложение не создало его. В статье так же правильно подмечено, что создавать Event лучше в приложении, а открывать в ядре. Поэтому хотел реализовать такую схему, где программа создаёт Event, и тут же ожидает свободного состояния его. Драйвер открыл Event, сделал определенную работу, просигналил об этом программе, и тут же переходит в ожидающее состояние. После чего уже программа сигналит драйверу. Код (Text): hInitEvent = CreateEvent(NULL, FALSE, FALSE, sInitEvent); if(hInitEvent) { dw=WaitForSingleObject(hInitEvent,10000); // 10 sec if(dw==WAIT_OBJECT_0) { ........... ........... SetEvent(hInitEvent); Sleep(1000); } CloseHandle(hInitEvent); } Код (Text): ........... RtlAppendUnicodeToString(&usInitEvent, L"\\BaseNamedObjects\\"); ........... for(;;) { InitializeObjectAttributes(&ObjectAttributes, &usInitEvent, OBJ_KERNEL_HANDLE, NULL, NULL); ns = ZwOpenEvent(hInitEvent, SYNCHRONIZE | EVENT_MODIFY_STATE, &ObjectAttributes); if(ns == STATUS_SUCCESS) { ........... ........... ZwSetEvent(hInitEvent, NULL); KeWaitForSingleObject(&hInitEvent, Executive, KernelMode, FALSE, &TimeoutWaitUserThread); ........... ........... ZwClose(hInitEvent); } Результат такой:
Функция ZwOpenEvent открывает обьект "Событие" и возвращает его хэндл. У тебя hInitEvent=NULL, а должен быть указатель на переменную, принимающую хэндл. Поэтому и возникает исключение STATUS_ACCESS_VIOLATION.
Подобная схема реализуется с помощью механизма "inverted call". http://www.osronline.com/custom.cfm?name=articlePrint.cfm&id=94