Я новичек в разработке драйверов, и у меня возникла такая проблема: Мне нужно сигнализировать приложению что произошло прерывание из драйвера. Я делаю вот так: Драйвер: KEvent * m_event; DeviceIOcontrol(KIrp I) { ..... case SET_EVENT: //METHOD_BUFFERED HANDLE m_handle = *(HANDLE)* I.IoctlBuffer(); m_event = new KEvent(m_handle); ...... } Interrupt(..) { m_event->Set(); } Программа: ..... HANDLE m_handle = CreateEvent(NULL,FALSE,FALSE,NULL) if (handle) { DeviceIoControl (hDevice,SET_EVENT,m_handle,0,NULL,0,&sz,NULL); ..... WaitForSingleObject(m_handle,1000); //Ждем прерывание ...... } Когда выполняю DeviceIoControl в програме, вылетает синий экран. Пробовал остановливать io запрос через STATUS_PENDING тоже вылетает ошибка вроде: ERROR_IRP_COMPLETE_... Но мне нужен первый вариан т.к. мне нужно оюрабатывать другие IRP запросы... Возможно обект Event нужно создать в самом драйвере а потом по имени открывать? как вообще правильно обрабатывать прерывания?
Porolon я не шарю в драйверах вообще, но мне кажется, что m_handle = CreateEvent() создаст тебе евент, хэндл которого будет валиден в адресном пространстве процесса, а не драйвера. так что, как ты сам и сказал, попробуй создавать именованный евент и в процессе, и в драйвере, через CreateEvent. Если имя заранее неизвестно, то процесс может передать имя евента через DeviceIOcontrol, а драйвер уже сделает CreateEvent.
Читай http://www.wasm.ru/article.php?article=drvw2k13 и http://www.wasm.ru/article.php?article=drvw2k12
Max дейтвительно. Проще посмотреть статью 14 от four-f. Объект события надо создавать дравиной, а ещё мона просто отображаемым файлом побаловаться.