Есть драйвер. Включаю проверку Verifier'ом и при старте драйвера наблюдаю BSOD: WDM Driver Error 0x21f. Адрес падения указывает на первую иструкцию DriverEntry. Вот код: Код (Text): #pragma alloc_text(INIT,DriverEntry) NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriver, IN PUNICODE_STRING pRegPath) { #if DBG DbgPrint("DriverEntry routine"); #endif pDriver->MajorFunction[IRP_MJ_CREATE] = USBSrv_CreateClose; pDriver->MajorFunction[IRP_MJ_CLOSE] = USBSrv_CreateClose; pDriver->MajorFunction[IRP_MJ_READ] = USBSrv_Read; pDriver->MajorFunction[IRP_MJ_WRITE] = USBSrv_Write; pDriver->MajorFunction[IRP_MJ_PNP] = USBSrv_PnP; pDriver->MajorFunction[IRP_MJ_POWER] = USBSrv_Power; pDriver->MajorFunction[IRP_MJ_DEVICE_CONTROL] = USBSrv_IoControl; pDriver->MajorFunction[IRP_MJ_SHUTDOWN] = USBSrv_Shutdown; pDriver->DriverExtension->AddDevice = USBSrv_AddDevice; pDriver->DriverUnload = USBSrv_Unload; return STATUS_SUCCESS; } Что не так?
kelz Есть отдельная тема про "анализ крэшей", зачем еще разводить? Прикрепи туды дровину и минидамп,если можешь сурец
DDK: "0x21F - A driver has not filled out a dispatch routine for a required IRP major function. (IRP specified.)" Точно не знаю, но предположу, что раз драйвер имеет дело с USB, должен уметь ловить IRP_MJ_INTERNAL_DEVICE_CONTROL.
Поставил заглушку на IRP_MJ_INTERNAL_DEVICE_CONTROL. Не помогло. Без верифайера работает нормально, но с ним ни в какую. Поставил DDK 2k3, перекомпилировал - ничего, да и драйвер у меня самый верхний в стеке, поэтому internal device control ему ловить не придется.
Кто знает, по какому смещению в IRP пакете лежит его IRP_MJ_xxx? Сейчас ковыряю дамп памяти ядра. Должен же один из параметров BSODа указывать на "неправильный" IRP? Где взять его major function? 2 Kola Сейчас проверю
Всем большое спасибо. Проблема была именно в IRP_MJ_SYSTEM_CONTROL. Этот пакет нужно было передать вниз по стеку. Странно, сколько примеров драйверов под USB смотрел, нигде про этот диспетчер даже не упоминалось. Может я первый кто вообще верифайером воспользовался?
Если у тебя фильтр, то ты по-любому должен передавать вниз весь спектр IRP. Ну, конечно, если не хочешь что-то блокировать. Т.е. во всех слотах MajorFunction должен быть обработчик, который просто форвардит IRP вниз. Для тех, которые ты фильтруешь - отдельные обработчики.
kelz /offtop: УРА! Рад за тебя! А если у тебя код юзает и регистриуется через ГУИД можешь поделиться, а то в примерах ДДК, пока слабо понял че-либо, да и есть тут один товарищ, отвлекалку дал, шо ашь я сломя за дебуггинг засел ))