Давно хотел попробовать wdm драйверы. Появилась минутка и решил поэкспериментировать. Создал драйвер накидал базовых функций (IRP_MJ_CREATE, IRP_MJ_CLOSE, IRP_MJ_READ, IRP_MJ_WRITE, IRP_MJ_DEVICE_CONTROL) Через IoCreateDevice с параметром FILE_DEVICE_UNKNOWN создаю девайс, делаю симлинк. И всё работает, из пользовательского пространства функции дергаются параметры передаются и принимаются. Дальше захотелось чтобы для системы это был не непонятный девайс, а допустим диск поменял тип FILE_DEVICE_DISK. И вот изменения есть IRP_MJ_CREATE/IRP_MJ_CLOSE перестали вызываться. Чтение запись стала возможно только блоками по 512 байт, и посыпались IRP_MJ_DEVICE_CONTROL с запросами геометрии диска и прочими параметрами(которые я добавил). Но система не хочет видеть это устройство как диск в девайс менеджере. Отсюда вопросы: 1. Я гружу драйвер через sc create / sc start может ли это быть проблемой 2. Везде пишут что нужно делать функцию AddDevice но у меня её система дергать не хочет, но после её добавление sc stop не отрабатывает. 3. Что нужно сделать чтобы система признала в моем устройстве диск?
1. Ваш драйвер это Legacy (не PnP), а для WDM нужны ещё как минимум обработчики MJ_POWER/PNP. 2. В архитектуре WDM имеется стек-драйверов, и соответственно девайсы PDO и FDO (Phy/Func DevObj). 3. Чтобы в WDM отработал "sc stop", для MJ_PNP нужны ещё миноры _START/STOP_DEVICE 4. Чтобы ваш драйвер был виден как диск, он должен иметь файл *.inf 5. AddDevice() нужна только для WDM. Она создаёт девайс IoCreateDevice() и цепляет его к стеку IoAttachDeviceToDeviceStack(). Win7 в диспетчере устройств отображает список Legacy драйверов: Вид --> Показать скрытые. (в бесятке уже спрятали) Они все именованные (Null, Beep, Http.sys), но не имеют функций AddDevice(), что подтверждают логи WinDBG: Код (Text): 0: kd> !drvobj http 7 Driver Object fffffa8005855060 is for: \Driver\HTTP Device Object fffffa8005858060 fffffa800585a060 DriverEntry : fffff8800276206c HTTP DriverStartIo: 00000000 DriverUnload : fffff8800275b570 HTTP AddDevice : 00000000 <-------------------------// Dispatch routines: [00] IRP_MJ_CREATE fffff8800275aff0 HTTP+0xa2ff0 [02] IRP_MJ_CLOSE fffff8800275b3e0 HTTP+0xa33e0 [0e] IRP_MJ_DEVICE_CONTROL fffff880026b9dc0 HTTP+0x1dc0 [12] IRP_MJ_CLEANUP fffff8800275dcd0 HTTP+0xa5cd0 [14] IRP_MJ_QUERY_SECURITY fffff88002735210 HTTP+0x7d210 [15] IRP_MJ_SET_SECURITY fffff88002735300 HTTP+0x7d300 <--- Нет "MJ_POWER/PNP" = Legacy Fast I/O routines: FastIoDeviceControl fffff88002709600 HTTP+0x51600 0: kd> !devstack fffffa8005858060 !DevObj !DrvObj !DevExt ObjectName > fffffa8005858060 Driver\HTTP 00000000 ReqQueue <--------- В стеке пусто = Legacy Device queue is not busy. 0: kd>
Сделал INF файл повесил на неипользуемое PCI устройство. И доделал всяких PNP. Так добился того что partmanager начел падать в BSOD. Дальше ковырять пока времени нет. Но чтото без INF и PNP функций результат получить не удалось. Как время появится надо ещё поковырять.