Вопрос по файловой системе и стеку драйверов.

Тема в разделе "WASM.NT.KERNEL", создана пользователем Marik, 23 апр 2007.

  1. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Доброго времени суток!
    Пишу драйвер-фильтр файловой системы. Никак не могу осилить стек драйверов. Суть вопросов в следующем:
    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.
    Может кто сталкивался с похожей задачей, помогите......
     
  2. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Может кто нить подскажет хоть в каком направлении копать......... :dntknw:
     
  3. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Спрошу по другому ;))
    Диск флешки у меня в системе определяется как \Device\Harddisk2\DP(1)0-0+5 - это DevObj раздела. Далее irp передается DevObj класса дисков который имеет вид \Device\Harddisk2\DR4.
    Как "\Device\Harddisk2\DP(1)0-0+5" узнает что irp надо передать именно "\Device\Harddisk2\DR4" (сразу скажу что они не приаттачены)
     
  4. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    По стеку PnP. В WinDbg можно перейти с помощью n-ного количества команд !devnode и хождения по спискам Parent, Sibling и Child
     
  5. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    К сожалению никогда не пользовался kd
    С помощью каких именно? Точнее через какую цепочку можно узнать??
     
  6. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    "!devnode 0 1" - показывает все PnP дерево. Для всех устройств там будет поле "DevNode <address>". Для интересующего устройства (например, того же DP(1)0-0+5) пишешь "!devnode <address>" и там будет более подробная информация. Кроме того, можно посмотреть FDO и PDO с помощью !devobj (их адреса тоже в выводе !devnode есть)
     
  7. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Попробовал я kd!!! Давно хотел просто все не знал как;))
    Вот только успеха не принесло (или ручки настолько кривые.....) Команда !devnode вывела мне pnp дерево, т.е. те драйвера которые принимают участие в выстравивании стека драйверов. Вообщем вид такой
    kd> !devnode 812b0008 1
    Код (Text):
    1. DevNode 0x812b0008 for PDO 0x812bccf8
    2.   InstancePath is "PCI\VEN_8086&DEV_7112&SUBSYS_197615AD&REV_00\3&61aaa01&0&3A"
    3.   ServiceName is "usbuhci"
    4.   State = DeviceNodeStarted (0x308)
    5.   Previous State = DeviceNodeEnumerateCompletion (0x30d)
    6.   DevNode 0x811cc8d8 for PDO 0x81176548
    7.     InstancePath is "USB\ROOT_HUB\4&3788cc09&0"
    8.     ServiceName is "usbhub"
    9.     State = DeviceNodeStarted (0x308)
    10.     Previous State = DeviceNodeEnumerateCompletion (0x30d)
    11.     DevNode 0xffb52738 for PDO 0xffbc7210
    12.       InstancePath is "USB\Vid_1307&Pid_0163\4f30271296f5b5"
    13.       ServiceName is "USBSTOR"
    14.       State = DeviceNodeStarted (0x308)
    15.       Previous State = DeviceNodeEnumerateCompletion (0x30d)
    16.       DevNode 0xffb50408 for PDO 0x81198228
    17.         InstancePath is "USBSTOR\Disk&Ven_JetFlash&Prod_TS4GJF160&Rev_0.00\4f302
    18. 71296f5b5&0"
    19.         ServiceName is "disk"
    20.         State = DeviceNodeStarted (0x308)
    21.         Previous State = DeviceNodeEnumerateCompletion (0x30d)
    22.         DevNode 0xffb50928 for PDO 0x81176030
    23.           InstancePath is "STORAGE\RemovableMedia\7&1b3095d9&0&RM"
    24.           ServiceName is "VolSnap"
    25.           TargetDeviceNotify List - f 0xe1435528  b 0xe1435528
    26.           State = DeviceNodeStarted (0x308)
    27.           Previous State = DeviceNodeEnumerateCompletion (0x30d)
    А мне как я пониаю нужен именно стек драйверов, чтобы спуститься от верхнего PDO к нижнему.
    Или может я что то не так понимаю......
     
  8. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Marik
    Упс... прошу прощения за дезинформацию :) Таким образом можно добраться снизу до \Device\Harddisk2\DR4. Только от этого толку в данном случае нет.

    PDO для \Device\Harddisk2\DP(1)0-0+5 (будет DEVICE_OBJECT *obj1) связан с PDO для \Device\Harddisk2\DR4 (будет DEVICE_OBJECT *obj2) через VPB. Т.е.:
    Код (Text):
    1. obj1->Vpb->DeviceObject == obj2
    2. obj2->Vpb->RealDevice == obj1
    ЗЫ: Если obj2->Vpb == NULL, значит устройство еще не замонтировано; obj1->Vpb != NULL всегда
     
  9. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Восрользовался утилиткой DeviceTree, так как она очень наглядно все показывает. Получил следующее
    Код (Text):
    1. obj1->Vpb->DeviceObject == obj (от FastFat) , т.е. на файловую систему
    2. obj2->Vpb->RealDevice == obj2  (тот же самый devobj)
    :dntknw:(
     
  10. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    а в obj2->Vpb->DeviceObject == NULL
     
  11. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    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.
     
  12. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Four-F
    Спасибо большое вам за совет. Посмотрел исходники (вот только из DDK), которые вы посоветовали и сделал определенные вывод:
    Вначале создается FDO а потом только PDO. (хотя вроде должно быть наоборот, хотя ладно не суть важно).
    PDO сохраняет ссылку на FDO в DeviceExtension, т.е. в поле свободной для программиста :dntknw:(( Структура в принципе там документирована и упорядоченна согласно структуре FUNCTIONAL_DEVICE_EXTENSION.
    НО можно ли положиться на то что будет стоять стандартный драйвер от MicroSoft, при написано продукта??? Там конечно есть поле по которому можно идентифицировать его, но все же хотелось бы как нить по граммотному подойти к решению проблемы......
     
  13. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    В любом стеке сначала создается его корень, т.е. PDO. Затем достраивется весь стек: фильтры и FDO. Затем драйвер FDO смотрит нет ли дочернего девайса. Если есть, то делает для него PDO - получается дочерний стек. Если девайсов несколько, то для каждого свой PDO. Затем достраивется весь стек: фильтры и FDO. Затем драйвер FDO смотрит нет ли....

    Так и строится PnP дерево. http://msdn2.microsoft.com/en-us/library/aa489859.aspx

    Нет конечно. Даже если он и будет стоять, то гарантии, что его DEVICE_EXTENSION именно та что ты ожидаешь естественно нет.
     
  14. Marik

    Marik New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2006
    Сообщения:
    166
    Адрес:
    Russia
    Сорри за некректное мое последнее сообщение....
    Я имел ввиду что в функции ADDDevice создается вначале FDO, Ну а если вызывается ADDDevice, то соответственно один DeviceObject уже создан;)))) (он то наверное и есть PDO)
    Может есть какие нить API функции что бы по ним как то косвенно получить ссылку на объект драйвера порта (я имею ввиду usbstor или usbhub)
     
  15. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    хз