Какой там нужно код прописать в инф-файле? Я прописал тот, который для "Ports Com&LPT", драйвер вроде запустился.. Так я его сначала отключил, а потом только нажал на "включить" - синий экран появилсяМожет, это потому, что этот драйвер сильно много ресурсов на себя брать пытается(есть же и драйверы для com портов, которым тоже ресурсы выделены)... Код, который для Принтера не подходит...
Похоже, дело не в инсталейшн коде.. Повторный эксперимент показал, что проиходит ошибка DRIVER_UNLOADED_WITHOUT_CANCELLING_PENDING_OPERATIONS А я почти чистую болванку запускал, которую выдает Wizard из W2kdriverbook...
ну и что, это не значит, что ошибок быть не может, значит в момент выгрузки драйвера какой либо из его обработчиков не был завершен, вот ты и получил свое заслуженное исключение, пытаясь выполнять код в уже несуществующей памяти. Посмотри внимательнее, в обработчиках выставь флаги завершения операций какие нить придумай, и всё должно быть ок .
Странно, почему именно ханг происходит когда я нажимаю "включить" после "выключить"? Было бы более понятно, если бы это происходило сразу после отключения драйвера. И еще, судя по тому, что выдавал driver monitor, в результате нажатия "отключить"(в Device Manager), драйверу приходит сообщение xxx_REMOVE_DEVICE, хотя было бы логично, если бы приходило xxx_STOP_DEVICE. При этом удаляется ссылка, отсоединяется прерывание, выгружается драйвер, возможно, даже device object удаляется. Жаль, что у меня сейчас нет под рукой w2kdriverbook, там все эти схемки сообщений нарисованы... Я даже запускал пример из книги - то же самое... Ща я может исходник небольшой пришлю...
Вот... Посмотрите если кому не влом Весь проект лежит тут: http://www.w2kdriverbook.com/Downloads.htm К главе 9, MinPnP... 930443757__Driver.cpp
Я нашел ответ на свой вопрос! Итак, когда я нажимаю "отключить", Драйверу приходит сообщение IRP_MN_REMOVE_DEVICE. Его правильный обработчик должен быть примерно такой: NTSTATUS HandleRemoveDevice(IN PDEVICE_OBJECT pDO, IN PIRP pIrp ) { PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION) pDO->DeviceExtension; if (pDevExt->state == Started) { if (pDevExt->pIntObj) IoDisconnectInterrupt( pDevExt->pIntObj ); pDevExt->pIntObj = NULL; } UNICODE_STRING pLinkName = pDevExt->ustrSymLinkName; IoDeleteSymbolicLink(&pLinkName); if (pDevExt->pLowerDevice) IoDetachDevice(pDevExt->pLowerDevice); IoDeleteDevice( pDO ); pDevExt->state = Removed; return PassDownPnP( pDO, pIrp ); } А в коде из исходников к моей любимой книжке нет if (pDevExt->pLowerDevice) IoDetachDevice(pDevExt->pLowerDevice); Вот из-за этого вся проблема и была Интересно, автор-то о ней когда узнал?