· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› обработка прерываний и драйвер от NuMega Driver Studio

Посл.отвђт Сообщенiе


Дата: Окт 28, 2004 19:24:06 · Поправил: Porolon

Я новичек в разработке драйверов, и у меня возникла такая проблема: Мне нужно сигнализировать приложению что произошло прерывание из драйвера. Я делаю вот так:
Драйвер:
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 нужно создать в самом драйвере а потом по имени открывать? как вообще правильно обрабатывать прерывания?


Дата: Окт 28, 2004 19:52:31

Porolon
я не шарю в драйверах вообще, но мне кажется, что m_handle = CreateEvent() создаст тебе евент, хэндл которого будет валиден в адресном пространстве процесса, а не драйвера.

так что, как ты сам и сказал, попробуй создавать именованный евент и в процессе, и в драйвере, через CreateEvent. Если имя заранее неизвестно, то процесс может передать имя евента через DeviceIOcontrol, а драйвер уже сделает CreateEvent.


Дата: Окт 28, 2004 21:12:01


Дата: Ноя 1, 2004 12:47:51

Max

дейтвительно. Проще посмотреть статью 14 от four-f. Объект события надо создавать дравиной, а ещё мона просто отображаемым файлом побаловаться.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.071