Как объяснить системе, что я создал диск?

Тема в разделе "WASM.NT.KERNEL", создана пользователем Shadowraptor, 26 июн 2025.

  1. Shadowraptor

    Shadowraptor New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2021
    Сообщения:
    2
    Давно хотел попробовать 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. Что нужно сделать чтобы система признала в моем устройстве диск?
     
  2. Marylin

    Marylin Active Member

    Публикаций:
    0
    Регистрация:
    17 фев 2023
    Сообщения:
    298
    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):
    1. 0: kd> !drvobj http 7
    2. Driver Object   fffffa8005855060  is for:  \Driver\HTTP
    3. Device Object   fffffa8005858060  fffffa800585a060
    4.  
    5. DriverEntry  :  fffff8800276206c  HTTP
    6. DriverStartIo:  00000000
    7. DriverUnload :  fffff8800275b570  HTTP
    8. AddDevice    :  00000000    <-------------------------//
    9.  
    10. Dispatch routines:
    11. [00] IRP_MJ_CREATE               fffff8800275aff0    HTTP+0xa2ff0
    12. [02] IRP_MJ_CLOSE                fffff8800275b3e0    HTTP+0xa33e0
    13. [0e] IRP_MJ_DEVICE_CONTROL       fffff880026b9dc0    HTTP+0x1dc0
    14. [12] IRP_MJ_CLEANUP              fffff8800275dcd0    HTTP+0xa5cd0
    15. [14] IRP_MJ_QUERY_SECURITY       fffff88002735210    HTTP+0x7d210
    16. [15] IRP_MJ_SET_SECURITY         fffff88002735300    HTTP+0x7d300   <--- Нет "MJ_POWER/PNP" = Legacy
    17.  
    18. Fast I/O routines:
    19. FastIoDeviceControl              fffff88002709600    HTTP+0x51600
    20.  
    21. 0: kd> !devstack fffffa8005858060
    22.   !DevObj            !DrvObj         !DevExt    ObjectName
    23. > fffffa8005858060   Driver\HTTP     00000000   ReqQueue      <--------- В стеке пусто = Legacy
    24.  
    25. Device queue is not busy.
    26. 0: kd>
     
  3. FoxB

    FoxB Member

    Публикаций:
    0
    Регистрация:
    10 июл 2003
    Сообщения:
    121
    когда-то делал эмулятор усб-флешки sandisk - диск+cdrom. там надо поднимать минимум SCSI команды.
     
  4. Shadowraptor

    Shadowraptor New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2021
    Сообщения:
    2
    Сделал INF файл повесил на неипользуемое PCI устройство. И доделал всяких PNP. Так добился того что partmanager начел падать в BSOD.
    Дальше ковырять пока времени нет.
    Но чтото без INF и PNP функций результат получить не удалось. Как время появится надо ещё поковырять.