Доброго времени суток! Пишу драйвер-фильтр файловой системы. Никак не могу осилить стек драйверов. Суть вопросов в следующем: 1) У меня есть DEVICE_OBJECT драйвера файловой системы(например драйвера fastfat.sys). Чтобы фильтровать запросы мне надо знать на какой диск пришел запрос на запись/чтение. Как я могу узнать какой DEVICE_OBJECT находится под ним (от драйвера disk.sys). В DEVICE_OBJECT > DeviceObjectExtension > AttachedTo ничего нету. Но при этом утилита все же отображает связь с DevObj от драйвера disk!!!! 2) Драйвер disk.sys для каждого диска создает как минимум два DEV_OBJ(PDO, FDO) в зависимости от того сколько на диске разделов. Какая связь между между PDO и FDO. Вопрос похож на первый только уровнем чуть ниже. Как я могу спуститься от FDO до PDO. Может кто сталкивался с похожей задачей, помогите......
Спрошу по другому ) Диск флешки у меня в системе определяется как \Device\Harddisk2\DP(1)0-0+5 - это DevObj раздела. Далее irp передается DevObj класса дисков который имеет вид \Device\Harddisk2\DR4. Как "\Device\Harddisk2\DP(1)0-0+5" узнает что irp надо передать именно "\Device\Harddisk2\DR4" (сразу скажу что они не приаттачены)
По стеку PnP. В WinDbg можно перейти с помощью n-ного количества команд !devnode и хождения по спискам Parent, Sibling и Child
К сожалению никогда не пользовался kd С помощью каких именно? Точнее через какую цепочку можно узнать??
"!devnode 0 1" - показывает все PnP дерево. Для всех устройств там будет поле "DevNode <address>". Для интересующего устройства (например, того же DP(1)0-0+5) пишешь "!devnode <address>" и там будет более подробная информация. Кроме того, можно посмотреть FDO и PDO с помощью !devobj (их адреса тоже в выводе !devnode есть)
Попробовал я kd!!! Давно хотел просто все не знал как) Вот только успеха не принесло (или ручки настолько кривые.....) Команда !devnode вывела мне pnp дерево, т.е. те драйвера которые принимают участие в выстравивании стека драйверов. Вообщем вид такой kd> !devnode 812b0008 1 Код (Text): DevNode 0x812b0008 for PDO 0x812bccf8 InstancePath is "PCI\VEN_8086&DEV_7112&SUBSYS_197615AD&REV_00\3&61aaa01&0&3A" ServiceName is "usbuhci" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeEnumerateCompletion (0x30d) DevNode 0x811cc8d8 for PDO 0x81176548 InstancePath is "USB\ROOT_HUB\4&3788cc09&0" ServiceName is "usbhub" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeEnumerateCompletion (0x30d) DevNode 0xffb52738 for PDO 0xffbc7210 InstancePath is "USB\Vid_1307&Pid_0163\4f30271296f5b5" ServiceName is "USBSTOR" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeEnumerateCompletion (0x30d) DevNode 0xffb50408 for PDO 0x81198228 InstancePath is "USBSTOR\Disk&Ven_JetFlash&Prod_TS4GJF160&Rev_0.00\4f302 71296f5b5&0" ServiceName is "disk" State = DeviceNodeStarted (0x308) Previous State = DeviceNodeEnumerateCompletion (0x30d) DevNode 0xffb50928 for PDO 0x81176030 InstancePath is "STORAGE\RemovableMedia\7&1b3095d9&0&RM" ServiceName is "VolSnap" TargetDeviceNotify List - f 0xe1435528 b 0xe1435528 State = DeviceNodeStarted (0x308) Previous State = DeviceNodeEnumerateCompletion (0x30d) А мне как я пониаю нужен именно стек драйверов, чтобы спуститься от верхнего PDO к нижнему. Или может я что то не так понимаю......
Marik Упс... прошу прощения за дезинформацию Таким образом можно добраться снизу до \Device\Harddisk2\DR4. Только от этого толку в данном случае нет. PDO для \Device\Harddisk2\DP(1)0-0+5 (будет DEVICE_OBJECT *obj1) связан с PDO для \Device\Harddisk2\DR4 (будет DEVICE_OBJECT *obj2) через VPB. Т.е.: Код (Text): obj1->Vpb->DeviceObject == obj2 obj2->Vpb->RealDevice == obj1 ЗЫ: Если obj2->Vpb == NULL, значит устройство еще не замонтировано; obj1->Vpb != NULL всегда
Восрользовался утилиткой DeviceTree, так как она очень наглядно все показывает. Получил следующее Код (Text): obj1->Vpb->DeviceObject == obj (от FastFat) , т.е. на файловую систему obj2->Vpb->RealDevice == obj2 (тот же самый devobj) (
FDO родительского стека и PDO дочернего, как правило, управляются одним и тем же драйвером. Дочерний стек (том) DP(1)0-0+5 PDO рулит драйвер disk Родительский стек (диск) ??? FiDO рулит драйвер Diskperf ??? FiDO рулит драйвер PartMgr Disk FDO рулит драйвер disk ??? PDO рулит драйвер usbstor драйвер disk видимо передает irp с дочернего на родительский стек, но деталей не знаю. См. "Device Object Example for a USB Mass Storage Device" в ддк. Исходники драйвера disk IFSKit\src\storage\class\disk. Он использует ядерную dll classpnp.sys, но исходники тоже имеются IFSKit\src\storage\class\classpnp.
Four-F Спасибо большое вам за совет. Посмотрел исходники (вот только из DDK), которые вы посоветовали и сделал определенные вывод: Вначале создается FDO а потом только PDO. (хотя вроде должно быть наоборот, хотя ладно не суть важно). PDO сохраняет ссылку на FDO в DeviceExtension, т.е. в поле свободной для программиста (( Структура в принципе там документирована и упорядоченна согласно структуре FUNCTIONAL_DEVICE_EXTENSION. НО можно ли положиться на то что будет стоять стандартный драйвер от MicroSoft, при написано продукта??? Там конечно есть поле по которому можно идентифицировать его, но все же хотелось бы как нить по граммотному подойти к решению проблемы......
В любом стеке сначала создается его корень, т.е. PDO. Затем достраивется весь стек: фильтры и FDO. Затем драйвер FDO смотрит нет ли дочернего девайса. Если есть, то делает для него PDO - получается дочерний стек. Если девайсов несколько, то для каждого свой PDO. Затем достраивется весь стек: фильтры и FDO. Затем драйвер FDO смотрит нет ли.... Так и строится PnP дерево. http://msdn2.microsoft.com/en-us/library/aa489859.aspx Нет конечно. Даже если он и будет стоять, то гарантии, что его DEVICE_EXTENSION именно та что ты ожидаешь естественно нет.
Сорри за некректное мое последнее сообщение.... Я имел ввиду что в функции ADDDevice создается вначале FDO, Ну а если вызывается ADDDevice, то соответственно один DeviceObject уже создан))) (он то наверное и есть PDO) Может есть какие нить API функции что бы по ним как то косвенно получить ссылку на объект драйвера порта (я имею ввиду usbstor или usbhub)