Объект устройства

Тема в разделе "WASM.NT.KERNEL", создана пользователем movdqu, 11 сен 2011.

  1. movdqu

    movdqu New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2009
    Сообщения:
    33
    Подскажите, как имея букву тома, получить указателя на PDEVICE_OBJECT и PDRIVER_OBJECT.
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
  3. movdqu

    movdqu New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2009
    Сообщения:
    33
    IoCreateFileSpecifyDeviceObjectHint возвращает STATUS_INVALID_DEVICE_OBJECT_PARAMETER для Device Object полученного таким путем.
     
  4. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Потому что ей нужен FS device object, т.е. девайс, созданный драйвером файловой системы, а IoGetDeviceObjectPointer() возвращает disk device object (или по-другому VDO, т.е. volume device object), т.е. девайс, созданный драйвером, отвечающим за тома (ftdisk.sys обычно). Чтобы получить FSVDO из VDO, необходимо взять его адрес из pVdo -> Vpb -> DeviceObject, при этом необходимо выполнить ряд обязательных проверок, а именно: во-первых, что pVdo -> Vpb не равно NULL, во-вторых, что файловая система смонтирована на томе (флаг VPB_MOUNTED в VPB). Кроме того, перед использованием FSVDO необходимо добавить ссылку на него. И, наконец, всё вышесказанное необходимо делать под локом, отпускать который следует только после добавления ссылки на FSVDO.
     
  5. rttgedt

    rttgedt Антон

    Публикаций:
    0
    Регистрация:
    12 окт 2010
    Сообщения:
    85
    movdqu из символьной ссылки (буквы тома) получить имя устройства проблем не составит. Потом применить к нему не документированную функцию ObReferenceObjectByName.
     
  6. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Это не поможет. Во-первых, функция ObReferenceObjectByName() в принципе не работает с объектами-устройствами, - вернёт ошибку. Во-вторых, ещё раз повторяю, в итоге получите адрес VDO, который не будет пригоден для того, чтобы использовать его в IoCreateFileSpecifyDeviceObjectHint(), т.к. для обращений к FSD требуется именно FSVDO, т.е. девайс, который расположен в том же стеке, что и целевой драйвер. Как получить FSVDO из VDO я написал выше.
     
  7. rttgedt

    rttgedt Антон

    Публикаций:
    0
    Регистрация:
    12 окт 2010
    Сообщения:
    85
    x64, спасибо, я как раз тоже бьюсь над этой проблемой (из VDO в FSDO) :)
     
  8. rttgedt

    rttgedt Антон

    Публикаций:
    0
    Регистрация:
    12 окт 2010
    Сообщения:
    85
    А это касается драйверов - фильтров? При получении IRP_MN_MOUNT_VOLUME пытаюсь приаттачиться к FSDO, но у меня VPB всегда не проходит проверку на флаг VPB_MOUNTED (после возвращения из функции завершения и ожидании на событии). Может как-то по-другому надо?
     
  9. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Посмотри исходник sfilter в более ранних WDK, там всё правильно сделано.
    А где ты там взял проверку на VPB_MOUNTED? У меня в коде ничего такого нет.
     
  10. rttgedt

    rttgedt Антон

    Публикаций:
    0
    Регистрация:
    12 окт 2010
    Сообщения:
    85
    Я ориентировался на #4.
     
  11. rttgedt

    rttgedt Антон

    Публикаций:
    0
    Регистрация:
    12 окт 2010
    Сообщения:
    85
    Ага, все заработало, спс.. изначально брал VPB не оттуда.
     
  12. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Я писал для другого случая.
     
  13. movdqu

    movdqu New Member

    Публикаций:
    0
    Регистрация:
    16 сен 2009
    Сообщения:
    33
    Спасибо, большое :)

    У меня появилось еще 2 вопроса:
    1. в нотификаторе IoRegisterFsRegistrationChange, не приходят уведомления о присоединенных usb носителях, так и задумано? как быть?
    2. по логу, я присоединяюсь к следующим устройствам:
    Attach to: \Device\RdpDr
    Attach to: \Device\WebDavRedirector
    Attach to: \Device\LanmanRedirector
    Attach to: \FatCdrom
    Attach to: \FileSystem\FatCdRomRecognizer
    Attach to: \FileSystem\UdfsCdRomRecognizer
    Attach to: \FileSystem\CdfsRecognizer
    Attach to: \Fat
    Attach to: \FileSystem\UdfsDiskRecognizer
    Attach to: \Ntfs
    И все бы хорошо, все отлично работает, но вот стоит запустить FileMon как тут же перестают работать сетевые папки.
    Если запустить только мой драйвер или только FileMon, то все в порядке.
    Специально поставил на запросы обычные заглушки:
    Код (Text):
    1. IoSkipCurrentIrpStackLocation( aIrp );
    2.  
    3. return IoCallDriver( device_extension->AttachedToDeviceObject, aIrp );
    Но результат тот же.
     
  14. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Да, именно так и должно быть.
    Почему так - читать документацию.

    Ловить монтирование тома, очевидно же.

    Нормальный лог, в общем-то.

    Ну откуда же я знаю, что за хрень вы там с Руссиновичем понаписали. Смотреть надо.