есть субж, который цепляется ко всем замонтированным разделам, цепляется во время загрузки перехватывая сообщение IRP...MOUNT на девайсы файловых систем. надо теперь сделать загрузку фильтра на лету без ребута. моя идея такая: перебрать все загруженные драйвера файловых систем и прицепиться ко всем их девайсам, т.к. если я правильно понял, то для каждого раздела ставится в соответствие девайс файловой системы к которому цепляется какойто sr, а к нему уже мой фильтр (это если фильтр цепляется во время загрузки) + еще один девайс управляющий на него например MOUNT приходит.
вопросы у меня такие
1. есть ли другие варианты подключения фильтра на лету
2. что за драйвер sr
3. как из драйвера перебрать все используемые драйвера файловых систем, и как перебрать их девайсы (кроме варианта пройти по связанному списку из DRIVER_OBJECT)
Здравствуйте, isolp, Вы писали:
I>есть субж, который цепляется ко всем замонтированным разделам, цепляется во время загрузки перехватывая сообщение IRP...MOUNT на девайсы файловых систем. надо теперь сделать загрузку фильтра на лету без ребута. моя идея такая: перебрать все загруженные драйвера файловых систем и прицепиться ко всем их девайсам, т.к. если я правильно понял, то для каждого раздела ставится в соответствие девайс файловой системы к которому цепляется какойто sr, а к нему уже мой фильтр (это если фильтр цепляется во время загрузки) + еще один девайс управляющий на него например MOUNT приходит. I>вопросы у меня такие I>1. есть ли другие варианты подключения фильтра на лету
странно, уже вчера постил ответ — но его не вижу, попробую еще раз...
I>2. что за драйвер sr
System Restore, always present on driver stack starting from XP
I>3. как из драйвера перебрать все используемые драйвера файловых систем, и как перебрать их девайсы (кроме варианта пройти по связанному списку из DRIVER_OBJECT)
лучше пользоваться нотификациями через свою ф-ю обратного вызова, там где это возможно (на НТ4 есть трудности)
перебор — плохо, потеряете новые события
... << RSDN@Home 1.0 beta 7a >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Здравствуйте, Valerio, Вы писали:
V>Здравствуйте, isolp, Вы писали:
I>>есть субж, который цепляется ко всем замонтированным разделам, цепляется во время загрузки перехватывая сообщение IRP...MOUNT на девайсы файловых систем. надо теперь сделать загрузку фильтра на лету без ребута. моя идея такая: перебрать все загруженные драйвера файловых систем и прицепиться ко всем их девайсам, т.к. если я правильно понял, то для каждого раздела ставится в соответствие девайс файловой системы к которому цепляется какойто sr, а к нему уже мой фильтр (это если фильтр цепляется во время загрузки) + еще один девайс управляющий на него например MOUNT приходит. I>>вопросы у меня такие I>>1. есть ли другие варианты подключения фильтра на лету
V>странно, уже вчера постил ответ — но его не вижу, попробую еще раз...
V>1.
это я использую. но если я правильно понимаю колбек вызывается при регистрации файловой системы, т.е. если грузится новая файловая система, то я узнаю о ней от FilterFSDNotification. а как узнать об уже загруженных ?
V>3.Помогает жестко прицепиться к FAT по имени
I>>2. что за драйвер sr V>System Restore, always present on driver stack starting from XP
I>>3. как из драйвера перебрать все используемые драйвера файловых систем, и как перебрать их девайсы (кроме варианта пройти по связанному списку из DRIVER_OBJECT)
V>лучше пользоваться нотификациями через свою ф-ю обратного вызова, там где это возможно (на НТ4 есть трудности) V>перебор — плохо, потеряете новые события
имеется в виду IoRegisterFsRegistrationChange или есть еще что-то ? нт4 не интересует
I>это я использую. но если я правильно понимаю колбек вызывается при регистрации файловой системы, т.е. если грузится новая файловая система, то я узнаю о ней от FilterFSDNotification. а как узнать об уже загруженных ?
просто Вам нужно успеть быть загруженным вперед всех файловых систем
Иначе действительно перебирать чего там до Вас и аттачиться по ситуации останется...
V>>Помогает жестко прицепиться к FAT по имени
это будет работать ТОЛЬКО для FAT
просто есть ситуации, когда использование 2 не дает эффекта и FAT успевает загрузиться раньше
к этому имеет смысл быть готовым
I>>>3. как из драйвера перебрать все используемые драйвера файловых систем, и как перебрать их девайсы (кроме варианта пройти по связанному списку из DRIVER_OBJECT)
V>>лучше пользоваться нотификациями через свою ф-ю обратного вызова, там где это возможно (на НТ4 есть трудности) V>>перебор — плохо, потеряете новые события I>имеется в виду IoRegisterFsRegistrationChange или есть еще что-то ? нт4 не интересует
да этого вполне хватает, если Вы будете вести свои списки всех девайсов, attached devices, etc.
имея такой список, всегда можно пробежаться по нему и получить ответы на все поставленные вопросы
стоит отметить что создать такой список _правильно_ может быть довольно сложным занятием
и еще сложнее поддерживать в актуальном состоянии (есть много ситуаций, когда устройства размонтируются
и монтируются обратно, а также стоит отслеживать возможность повторного монтирования и т.п.)
к тому же здесь весьма актуальны вопросы правильной работы с ресурсами и синхронизацией как своих
списков, так и соотв. объектов файловых систем, с которыми работаете (например target device objects)
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
V>просто Вам нужно успеть быть загруженным вперед всех файловых систем V>Иначе действительно перебирать чего там до Вас и аттачиться по ситуации останется...
у меня как раз ситуация когда фильтр грузится последним
Вы не можете подсказать как получить список всех загруженных драйверов ?
I>>>>3. как из драйвера перебрать все используемые драйвера файловых систем, и как перебрать их девайсы (кроме варианта пройти по связанному списку из DRIVER_OBJECT)
V>>>лучше пользоваться нотификациями через свою ф-ю обратного вызова, там где это возможно (на НТ4 есть трудности) V>>>перебор — плохо, потеряете новые события I>>имеется в виду IoRegisterFsRegistrationChange или есть еще что-то ? нт4 не интересует
V>да этого вполне хватает, если Вы будете вести свои списки всех девайсов, attached devices, etc. V>имея такой список, всегда можно пробежаться по нему и получить ответы на все поставленные вопросы
какие девайсы должны быть в списке ?
если не сложно прокоментируйте пожалуйста или ссылку
V>Иначе действительно перебирать чего там до Вас и аттачиться по ситуации останется... I>у меня как раз ситуация когда фильтр грузится последним I>Вы не можете подсказать как получить список всех загруженных драйверов ?
так Вам именно список загруженных ДРАЙВЕРОВ?
Если интересует, загрузился ли скажем FAT или NTFS — просто попробуйте по имени открыть соотв. драйвер:
список всех OS-supplied файловых драйверов в системе можно увидеть с помощью WinObj в разделе \FileSystem
но если Вам все же нужен список устройств, то, в принципе, если не особо напрягаться, возьмите код из filemon и так же как там, в цикле приаттачевайтесь по букве к каждому диску (\\DosDevices\\A:, ...\\DosDevices\\Z.
V>да этого вполне хватает, если Вы будете вести свои списки всех девайсов, attached devices, etc. V>имея такой список, всегда можно пробежаться по нему и получить ответы на все поставленные вопросы I>какие девайсы должны быть в списке ? I>если не сложно прокоментируйте пожалуйста или ссылку
я не знаю те, которые Вас интересуют, вероятно (с которыми работаете)
... << RSDN@Home 1.0 beta 7a >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Здравствуйте, Valerio, Вы писали:
V>>Иначе действительно перебирать чего там до Вас и аттачиться по ситуации останется... I>>у меня как раз ситуация когда фильтр грузится последним I>>Вы не можете подсказать как получить список всех загруженных драйверов ?
V>так Вам именно список загруженных ДРАЙВЕРОВ?
да
V>Если интересует, загрузился ли скажем FAT или NTFS — просто попробуйте по имени открыть соотв. драйвер: V>
такой вариант имеет недостаток он дает указатель не на девайс, а на самый верхний фильтр к нему прицепленный
следовательно я не могу получить список всех подобных (принадлежащих тому же драйверу) девайсов в системе
V>список всех OS-supplied файловых драйверов в системе можно увидеть с помощью WinObj в разделе \FileSystem
а как можно по имени драйвера получить его DRIVER_OBJECT ?
V>но если Вам все же нужен список устройств, то, в принципе, если не особо напрягаться, возьмите код из filemon и так же как там, в цикле приаттачевайтесь по букве к каждому диску (\\DosDevices\\A:, ...\\DosDevices\\Z.
этот вариант я имею в виду
и все же как получить список всех DRIVER_OBJECT в системе ?
I>такой вариант имеет недостаток он дает указатель не на девайс, а на самый верхний фильтр к нему прицепленный
на XP для этого есть спец ф-ия IoGetLowerDeviceObject
I>следовательно я не могу получить список всех подобных (принадлежащих тому же драйверу) девайсов в системе
все можно, если задаться целью, опять же на XP для этого есть другая ф-я IoEnumerateDeviceObjectList
у себя мне хватило IoGetDeviceObjectPointer IoCreateDevice IoAttachDeviceToDeviceStack
имея device object всегда можно получить DriverObject — одно из полей DO
V>>список всех OS-supplied файловых драйверов в системе можно увидеть с помощью WinObj в разделе \FileSystem I>а как можно по имени драйвера получить его DRIVER_OBJECT ?
выше вызываем IoGetDeviceObjectPointer и получаем fileObject, если хватает прав
потом fileObject->DeviceObject->DriverObject->DriverName?
V>>но если Вам все же нужен список устройств, то, в принципе, если не особо напрягаться, возьмите код из filemon и так же как там, в цикле приаттачевайтесь по букве к каждому диску (\\DosDevices\\A:, ...\\DosDevices\\Z.
I>этот вариант я имею в виду I>и все же как получить список всех DRIVER_OBJECT в системе ?
Кстати совсем забыл, Вам можно получить список всех драйверов в системе через NtQueryInformation — подробности на сайте Сергея Васкецова вполне могут быть или в известных книгах (ссылки на них там же). Соотв. получив список загруженных драйверов, можно их опрашивать на предмет поиска в DeviceObject->DeviceType одного из значений FILE_DEVICE_XXX_FILE_SYSTEM (FILE_DEVICE_DISK_FILE_SYSTEM, FILE_DEVICE_CD_ROM_FILE_SYSTEM, etc.)
доп-но проверку по полю Characteristics можно проводить (флаг FILE_REMOTE_DEVICE для сетевых устройств например)
и таким образом получите список всех файловых драйверов
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
а на сколько надежно использование строк типа L"\\Fat", L"\\Ntfs" и т.д. ?
т.е. какова вероятность, что эти имена изменятся после очередного сервис пака ?
I>>такой вариант имеет недостаток он дает указатель не на девайс, а на самый верхний фильтр к нему прицепленный V>на XP для этого есть спец ф-ия IoGetLowerDeviceObject
I>>следовательно я не могу получить список всех подобных (принадлежащих тому же драйверу) девайсов в системе V>все можно, если задаться целью, опять же на XP для этого есть другая ф-я IoEnumerateDeviceObjectList
а на w2k ?
и еще. есть ли способ получить DRIVER_OBJECT по имени драйвера ?
Здравствуйте, isolp, Вы писали:
I>Здравствуйте, Valerio, Вы писали:
V>>> RtlInitUnicodeString(&uniString, L"\\Fat"); V>>> ntStatus = IoGetDeviceObjectPointer( V>>> &uniString, V>>> FILE_READ_ATTRIBUTES, V>>> &fileObject, V>>> &fatDeviceObject);
I>а на сколько надежно использование строк типа L"\\Fat", L"\\Ntfs" и т.д. ? I>т.е. какова вероятность, что эти имена изменятся после очередного сервис пака ?
это зависит от МС конечно
но не думаю, что они будут без серьезных причин менять такие базовые вещи,
у них самих код на эти имена заточен прилично ИМХО
I>>>такой вариант имеет недостаток он дает указатель не на девайс, а на самый верхний фильтр к нему прицепленный V>>на XP для этого есть спец ф-ия IoGetLowerDeviceObject
I>>>следовательно я не могу получить список всех подобных (принадлежащих тому же драйверу) девайсов в системе V>>все можно, если задаться целью, опять же на XP для этого есть другая ф-я IoEnumerateDeviceObjectList
I>а на w2k ? I>и еще. есть ли способ получить DRIVER_OBJECT по имени драйвера ?
я же только что написал как это делается,
из IoGetDeviceObjectPointer получаете fileObject и через него
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[10]: загрузка драйвера фильтра файловой системы
Здравствуйте, Valerio, Вы писали:
I>>а на w2k ? I>>и еще. есть ли способ получить DRIVER_OBJECT по имени драйвера ? V>я же только что написал как это делается, V>из IoGetDeviceObjectPointer получаете fileObject и через него
извиняюсь пропустил
спасибо
Re[11]: загрузка драйвера фильтра файловой системы
От:
Аноним
Дата:
20.05.03 10:38
Оценка:
Здравствуйте, isolp, Вы писали:
[skip]
Эх если-бы без флейма — цены бы не было, а так
Re[12]: загрузка драйвера фильтра файловой системы
Дарагой, если бы без флейма, это бы стоило уж никак не меньше половины IFS Kit?
... << RSDN@Home 1.0 beta 7a >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[13]: загрузка драйвера фильтра файловой системы
От:
Аноним
Дата:
20.05.03 11:37
Оценка:
Здравствуйте, Valerio, Вы писали:
А>>Эх если-бы без флейма — цены бы не было, а так
V>Дарагой, если бы без флейма, это бы стоило уж никак не меньше половины IFS Kit?
Согласен — какраз бутылка — рублей 35 — так как IFS Kit за 70 моджно достать, но об этом шшшшшш...
Re[10]: загрузка драйвера фильтра файловой системы
Здравствуйте, Valerio, Вы писали:
V>Здравствуйте, isolp, Вы писали:
I>>Здравствуйте, Valerio, Вы писали:
I>>и еще. есть ли способ получить DRIVER_OBJECT по имени драйвера ? V>я же только что написал как это делается, V>из IoGetDeviceObjectPointer получаете fileObject и через него
первый параметр в IoGetDeviceObjectPointer имя девайса, а не драйвера
так что вопрос все еще актуален
Re[11]: загрузка драйвера фильтра файловой системы
I>>и еще. есть ли способ получить DRIVER_OBJECT по имени драйвера ? V>я же только что написал как это делается, V>из IoGetDeviceObjectPointer получаете fileObject и через него
I>первый параметр в IoGetDeviceObjectPointer имя девайса, а не драйвера I>так что вопрос все еще актуален
подразумевалось, что Вам нужны известные драйвера вроде fastfat/ntfs/cdfs
соотв. и имена девайсов у них тоже известные вроде Fat в примере кода выше по ветке
поэтому тут можно вооружиться утилитой от OSR типа devicetree и выяснить все нужные имена девайсов?
Если же не годится — ну можно перечислить все загруженные драйвера в системе и по характеристикам и имени получить что нужно
Конкретно такую задачу я не решал — но думаю утилита от OSR натолкнет еще на какие-то мысли, возможно. Попробуйте !
... << RSDN@Home 1.0 beta 7a >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Здравствуйте, Valerio, Вы писали:
V>но если Вам все же нужен список устройств, то, в принципе, если не особо напрягаться, возьмите код из filemon и так же как там, в цикле приаттачевайтесь по букве к каждому диску (\\DosDevices\\A:, ...\\DosDevices\\Z.
У меня вопрос, а как быть в случае когда съемное устройство (н-р) floppy отсутствует в данный момент, просто в этом случае вылетает диалог с собщением об его отсутствии и просьбой его вставить
В FileMon Они предварительно использовали API функцию (GetTypeDrive()) для определения типа тома, а как быть если драйвер работает без взаимодействия с user-mode?
Особо интересует как приатачиться ко всем устройствам и для всех томов, при условии, что в данный момент некоторые из них не вставлены?
Y>В FileMon Они предварительно использовали API функцию (GetTypeDrive()) для определения типа тома, а как быть если драйвер работает без взаимодействия с user-mode?
я такого за файлмоном (c исходниками который 4.34) не припоминаю — если в user mode filemon что-то и делает, то эту инфу он не передает в драйвер, если не ошибаюсь
если нужно аналогично спросить из драйвера, можно попробовать использовать IRP_MJ_QUERY_VOLUME_INFORMATION или ZwQueryVolumeInformationFile
Y>Особо интересует как приатачиться ко всем устройствам и для всех томов, при условии, что в данный момент некоторые из них не вставлены?
I can't answer this in two words. See Sfilter sample from IFS Kit, it contains requested service
FYI, removable media devices deleted when media (ex: floppy or CD disk) is removed
so, nothing to attach here yet
... << RSDN@Home 1.0 beta 7a >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[12]: загрузка драйвера фильтра файловой системы
Здравствуйте, Valerio, Вы писали:
I>>>и еще. есть ли способ получить DRIVER_OBJECT по имени драйвера ? V>>я же только что написал как это делается, V>>из IoGetDeviceObjectPointer получаете fileObject и через него
I>>первый параметр в IoGetDeviceObjectPointer имя девайса, а не драйвера I>>так что вопрос все еще актуален V>подразумевалось, что Вам нужны известные драйвера вроде fastfat/ntfs/cdfs V>соотв. и имена девайсов у них тоже известные вроде Fat в примере кода выше по ветке V>
V>поэтому тут можно вооружиться утилитой от OSR типа devicetree и выяснить все нужные имена девайсов?
V>Если же не годится — ну можно перечислить все загруженные драйвера в системе и по характеристикам и имени получить что нужно
V>Конкретно такую задачу я не решал — но думаю утилита от OSR натолкнет еще на какие-то мысли, возможно. Попробуйте !
я для себя проблему решил так:
перебираю все драйвера в \FileSystem и для них