Есть драйвер-фильтр для классового драйвера клавиатур kbdclass. Написал на WiX с помощью DIFxAPP инсталлер, который успешно ставит драйвер на 32 и 64 разрядные WinXP, Win2003, а также на 32 разрядные Vista и Win2008. Однако при установке на 64 разрядные Vista и Win2008 драйвер не загружается и вешает клавиатуру с мышью. В диспетчере устройств написан код ошибки 37 (не удалось загрузить драйвер устройства). WinDBG к драйверу прицепиться не может. Драйвер должен писать в GlobalLogger через WPP трассировку, но лог тоже пуст. Драйвер, коинсталлер и cat-файл подписаны тестовым сертификатом. cat-файл причем создается уже по подписанным файлам. Тестовый сертификат добавляется как Root и TrustedPublisher на машину куда устанавливается (если не добавлять, то инсталлер не отрабатывает, и выдает ошибку, что не доверяет сертификату). В чем может быть проблема? В Digital Signatures for Kernel Modules on Systems Running Windows Vista (http://www.microsoft.com/whdc/winlogo/drvsign/kmsigning.mspx) написано: "The load-time signature check does not have access to the Trusted Root Certificate Authorities certificate store. Instead, it must depend on the root authorities that are built into the Windows Vista kernel. The Microsoft Code Verification Root is one of the root authorities trusted by the Windows Vista kernel and operating system loader:" Означает ли это что даже в режиме тестирования (Bcdedit.exe –set TESTSIGNING ON) драйвер-фильтр, подписанный тестовым сертификатом, будет всегда отклоняться? Как в таком случае вообще тестировать драйвер?
По F8 она тоже должна пропускаться. Однако вот все равно не загружает. Есть какие-то хитрости с цеплянием WinDBG к стартующему при загрузке драйверу? Я отлаживал драйвер до этого по логам, а отладчик цеплял к уже загруженной системе. Правильно понимаю - нужно прописать пути к pdb файлам и сырцам, остановить систему, поставить брейк на DebugEntry, пустить систему, сделать ребут. И после ребута система должна остановиться на брейкпоинте. У меня она при этом не останавливается на брейке.
ну с бутовыми дровами могут быть хитрости, реально, они могут стартовать раньше чем но ты же говоришь что у тебя фильтр на клаву-класс поставь его в мануал, грузи машину, цепляй дебагер, потом стартуй свой фильтр при такой последовательности 100% проверка дигитал-сигна скипается с брейкпойнтами там сложнее и я бы сказал рандомнее - то останавливается, то нет в доке написано что это зависит от старта дебагера, если он стартовал во время загрузки то тогда аппаратные бряки в ядре будут работать, если он подцеплен потом - то нет по моим наблюдениям - рандомно, то работают то нет а у тебя железная машина или вара?
Машина железная. Похоже там проблема не в подписи: Загружаю машину: - в обычном режиме: в диспетчере устройств пишет код ошибки 39 (Не удалось загрузить драйвер устройства. Возможно он поврежден или отсутсвует. Также возникает если не прошла проверка подписи) - TESTSIGNING ON / F8 + отключениепроверки подписей / с прицепленым ядерным отладчиком: в диспетчере устройств пишет код ошибки 37 (Не удалось инициализировать драйвер устройства. Возможно провален DriverEntry.) Если в WinDBG поставить отображение загружаемых модулей, то пишет что драйвер грузился: ModLoad: fffff980`03c09000 fffff980`03c1f000 i8042prt.sys ModLoad: fffff980`03d67000 fffff980`03d75000 kbdclass.sys (class driver) ModLoad: fffff980`04620000 fffff980`0465f000 suppressor.sys (мой filter driver) Бряк на DriverEntry не останавливает. Ставлю его так: бряк в рабочую ОС, открываю сурс файл, ставлю бряк на первую строчку кода DriverEntry, отпускаю ОС, перезагружаю ее. Думал поставить бряк на адрес памяти, но в Vista рандомизация адресов загрузки модулей. От ребута к ребуту адрес загрузки драйвера меняется. Как остановить машину в таком случае - ХЗ.
Поставил чтобы WinDBG делал бряк при перезагрузке (Ctrl+Alt+K): Код (Text): Loading symbols for fffff800`01c00000 ntkrnlmp.exe -> ntkrnlmp.exe nt!DbgBreakPointWithStatus: fffff800`01c473c0 cc int 3 kd> bl 0 eu 0001 (0001) (DriverEntry!suppressor) 1 eu 0001 (0001) (suppressor!DriverEntry) 2 eu 0001 (0001) (@@masm(`suppressor.c:78+`)) Тоже не останавливает. Причем модуль драйвера грузится: Код (Text): ... ModLoad: fffff980`04298000 fffff980`042ae000 i8042prt.sys ModLoad: fffff980`0427f000 fffff980`0428d000 kbdclass.sys ModLoad: fffff980`04419000 fffff980`04458000 suppressor.sys ... ModLoad: fffff980`0616e000 fffff980`06177000 hidusb.sys ModLoad: fffff980`0431e000 fffff980`04328000 kbdhid.sys ModLoad: fffff980`064e5000 fffff980`06524000 suppressor.sys ...
Причем если брякать на kbdclass!DriverEntry, то останавливается! Вопрос - почему модуль моего драйвера грузится но на DriverEntry не останавливается бряк? Возможно действительно DriverEntry из-за KMDF отрабатывает не первым и ощибка возникает до входа в код самомго драйвера? Как тогда на нее попасть-то?
FallenGameR да, похоже что дело не в подписи че-то не нравится висте в процессе загрузки твоего драйвера, driverentry не вызывается: выложы свой бинарник - посмотрю у себя на варной лабе
z0mailbox, спасибо большое за помощь. Ошибка оказалась не в самом драйвере, а в INF файле к нему. Драйвер написан KMDF и как подсказали на OSR online, сначала срабатывает FxDriverEntry, где происходит инициализация KMDF и в случае успеха вызов DriverEntry самого драйвера. Действительно, на bu suppressor!FxDriverEntry WinDBG стопит. Оказалось, что грузился KMDF не той версии под которую собран драйвер. !wdfkd.wdfldr выводит 1.5, а нужно 1.7. Сейчас копаю что нужно подправить в INF файле чтобы цеплялся нужный CoInstaller.