IoCreateFileSpecifyDeviceObjectHint возвращает STATUS_INVALID_DEVICE_OBJECT_PARAMETER для Device Object полученного таким путем.
Потому что ей нужен 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.
movdqu из символьной ссылки (буквы тома) получить имя устройства проблем не составит. Потом применить к нему не документированную функцию ObReferenceObjectByName.
Это не поможет. Во-первых, функция ObReferenceObjectByName() в принципе не работает с объектами-устройствами, - вернёт ошибку. Во-вторых, ещё раз повторяю, в итоге получите адрес VDO, который не будет пригоден для того, чтобы использовать его в IoCreateFileSpecifyDeviceObjectHint(), т.к. для обращений к FSD требуется именно FSVDO, т.е. девайс, который расположен в том же стеке, что и целевой драйвер. Как получить FSVDO из VDO я написал выше.
А это касается драйверов - фильтров? При получении IRP_MN_MOUNT_VOLUME пытаюсь приаттачиться к FSDO, но у меня VPB всегда не проходит проверку на флаг VPB_MOUNTED (после возвращения из функции завершения и ожидании на событии). Может как-то по-другому надо?
Посмотри исходник sfilter в более ранних WDK, там всё правильно сделано. А где ты там взял проверку на VPB_MOUNTED? У меня в коде ничего такого нет.
Спасибо, большое У меня появилось еще 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): IoSkipCurrentIrpStackLocation( aIrp ); return IoCallDriver( device_extension->AttachedToDeviceObject, aIrp ); Но результат тот же.
Да, именно так и должно быть. Почему так - читать документацию. Ловить монтирование тома, очевидно же. Нормальный лог, в общем-то. Ну откуда же я знаю, что за хрень вы там с Руссиновичем понаписали. Смотреть надо.