Hi all! я новичок в разработке драйверов, по сути это мой первый WDM драйвер-фильтр HID клавиатуры, хотелось бы узнать несколько ответов на терзающие меня вопросы: 1. Что лучше - использовать глобальные переменные или лучше структуру DEVICE_EXTENSION для размещения внутренних данных(переменных)? 2. Может ли система самопроизвольно повышать уровень IRQL в процессе выполнения функции драйвера? (в частности меня интересует callback функция KeyboardClassServiceCallback) 3. Могу ли я передавать данные (небольшая порция 64 байта) напрямую в реестр (на уровне PASSIVE_LEVEL), никаких проблем с записью в реестр не будет? 4. Доступны ли созданные события (CreateEvent) пользовательского режима в режиме ядра?
1. DEVICE_EXTENSION - клав может быть несколько. 2. самопроизвольно - нет. дял колбеков обычно указывается IRQL в DDK. 3. не должно. 4. да.
Странно в DDK прочитал KeyboardClassServiceCallback работает под IRQL == DISPATCH_LEVEL в этой функции я использую IoCreateNotificationEvent которая, судя по докам должна работать при IRQL == PASSIVE_LEVEL но у меня она прекрастно работает!!! (и другие функции событий тоже) чем такое обьяснить? возможны ли проблемы если функции выполняются на уровнях выше требуемых?
Да, проблемы будут. То, что работает щас, не значит, что работать будет всегда. ПОэтому и полчаются кривые драйвера ))) Ограничение специально поставлено - те функции, для которых написан IRQL >= 2, должны выполняться очень быстро, поскольку потоки не переключаются. длительные операции там приведут к ожиданию. (есть и другие ограничения - нельзя обращаться к подкачиваемой памяти) Юзай ExQueueWorkItem для добавления work item'а, который будте выполнен на passive как только понизится irql и управление дойдет до одного из worker thread'ов
Включите драйвер верифаер и удивитесь насколько прекрасно она работает. Кроме того, украсьте код праздничным макросом PAGED_CODE ( как только вызовете функцию требующую PASSIVE_LEVEL ).
еще вопрос в догонку: как узнать из kernel mode существует ли определенный процесс запущенный из пользовательского режима?
Что подразумевается под "определённый"? С определённым пидом, запущенный из указанного файла, или что ещё?
хочу что бы процесс пользовательского режима сигнализировал драйверу о своем присутствии без IOCTL запросов, мона такое сделать? (или обратно, драйвер отслеживал наличие процесса с определенными именем)
а как узнать из процедуры драйвера существует ли определенный объект события созданный в пользовательском режиме или нет? IoCreateNotificationEvent зараза если объекта нет - создает новый