Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
IMHO это очень плохая идея, не нужно уподобляться китайцам и... 17.03.05 15:58 Число просмотров: 2030
Автор: leo <Леонид Юрьев> Статус: Elderman
|
> SoftICE нету, есть WinDbg, но слишком долго разбираться как > с ним работать (а сегодня я должен все закончить) IMHO это очень плохая идея, не нужно уподобляться китайцам и делать как-помало.
Очень советую включить проверку всей ветки стека драйверов (verifier.exe).
> По быстрому разобраться с WinDbg по документации не > получилось, понял что надо соединить два ПК нулмодемным > кабелем, а дальше? Там все очень хорошо описано, буквально в трех разделах.
Если есть второй комп и кабель, это хорошо, еще лучше через FireWire.
Если нет, то можно отлаживаться на виртуальной машине (Virtual PC 2004), на форуме это обсуждалось.
> не знаю, я тут немного переписал процедуру зажигания > светодиодов клавиатуры (заменил > IoBuildDeviceIoControlRequest на IoAllocateIrp, думал > поможет, ... не помогло) > Cейчас на экране - KMODE_EXCEPCION_NOT_HANDLED > Главное этот же самый код, перенесенный один в один в мой > KbFilter_IoCtl, нормально создает новый IRP и зажигает > светодиоды, если я вызываю KbFilter_IoCtl с помощью > DeviceIoControl из user mode. Конечно, можно сделать таймер > в Win32 и оттуда мигать светодиодами, но приложение могут > например случайно или специально выгрузить.
В DDK всё достаточно хорошо описано, я не уверен что у кого-то найдется достаточно времени желяния чтобы анализировать и спвравлять ваш код.
> Поэтому хотелось бы сделать по таймеру драйвера, но если > переношу вызов процедуры из KbFilter_IoCtl в TimerRoutine > драйвера, вызываемую раз в секунду, то появляется > KMODE_EXCEPCION_NOT_HANDLED. Можно как-нибудь сделать в > драйвере периодический вызов процедуры зажигания > светодиодов чтобы данная ошибка не появлялась? > Как писал amirul Таймеры "срабатывают" на DPC уровне, можно обойтись без них, создав thread в режиме ядра, или цикличеки ставя WorkItem в очередь (IoQueueWorkItem) и просто делая паузу в обработчике (KeDelayThreadExecution или KeWaitFor...).
Самый правильный путь IMHO - в процедуре таймера использовать отложенную очередь (IoQueueWorkItem) и уже потом, на PASSIVE_LEVEL делать что нужно.
> В начале процедуры AddDevice я инициализирую переменную > IsKeyboard, анализируя ClassGuid возвращаемый при вызове > мной IoGetDeviceProperty() > может лучше там-же вызвать IoCreateDevice с соответствующим > FILE_DEVICE_KEYBOARD или FILE_DEVICE_MOUSE?
ClassGuid независим от типа устройства (FILE_DEVICE_KEYBOARD или FILE_DEVICE_MOUSE). Тип устройств - это по-сути устаревшее наследство от NT4, а ClassGuid как-раз новая замена. Но тип устройств еще где-то используется, точнее я уже не помню.
|
|
|