Вопросы по IoRegisterFsRegistrationChange

Тема в разделе "WASM.NT.KERNEL", создана пользователем Alever, 15 апр 2010.

  1. Alever

    Alever New Member

    Публикаций:
    0
    Регистрация:
    6 дек 2008
    Сообщения:
    4
    Здравствуйте.

    Интересуют такие вопросы:

    1. В MSDN написано:
    Вызываю данную функцию в функции DriverEntry, т.е. при загрузке драйвера. При этом уведомления об изменении файловой системы приходят только непосредственно после вызова этой функции (10 уведомлений подряд). Далее при подключении или отключении usb-диска уведомления не приходят. Вопрос: как отследить на уровне ядра подключение/отключение usb-дисков, и почему для этих целей не подходит IoRegisterFsRegistrationChange, ведь при подключении usb-диска должна регистрироваться файловая система?

    2. В функцию DriverNotificationRoutine, передаваемую в IoRegisterFsRegistrationChange ядро передаёт первым аргументом указатель на устройство DeviceObject, для которого вызывается уведомление. Как можно узнать тип тома, с которым оно связано, т.е. элемент из списка
    DRIVE_UNKNOWN
    DRIVE_NO_ROOT_DIR
    DRIVE_REMOVABLE
    DRIVE_FIXED
    DRIVE_REMOTE
    DRIVE_CDROM
    DRIVE_RAMDISK
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Всё немного не так, на самом деле. Файловая система регистрирует себя только один раз и делает это, по сути, только для того, чтобы менеджер ввода/вывода знал, к кому обращаться при обнаружении ещё ни кем не смонтированного тома. А то, о чём говоришь ты сейчас, это фильтрация запросов на монтирование, т.е. как раз те самые запросы, которые посылает ядро, когда обнаруживает безхозный ещё не смонтированный том. И вот уже этот процесс выполняется для каждого нового тома (и при подключении флешки в том числе), в отличие от регистрации файловой системы, которая выполняется обычно только один раз.

    Для флешек тип тома всегда будет DRIVE_REMOVABLE, здесь можно даже и не думать ничего. Но если требуется решить задачу в общем случае, то прежде чем ответить на этот вопрос, необходимо определиться, как минимум, с двумя вопросами:

    * Требуется ли узнать тип тома до подключения устройство или после? Т.е. другими словами, нужна ли возможность, например, запретить подключение устройства и т.д.
    * Требуется ли какая-либо работа с файлами на подключаемых томах? Например, планируется ли писать файловый фильтр для реализации какого-либо другого file-related функционала?
     
  3. Sav1or

    Sav1or New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2008
    Сообщения:
    52
    Как вариант , перехватить AddDevice usbstor'a.
     
  4. Alever

    Alever New Member

    Публикаций:
    0
    Регистрация:
    6 дек 2008
    Сообщения:
    4
    Требуется установить фильтр на usb-диски (DRIVE_REMOVABLE) и при этом динамически устанавливать фильтр на подключаемые флешки. Пробовал 2 способа:
    1. Получить с помощью ZwQueryInformationProcess карту дисков и устанавливать фильтр только на диски типа DRIVE_REMOVABLE, но тогда не фильтруются подключаемые после этого флешки.
    2. Устанавливать фильтр при вызове DriverNotificationRoutine, но тогда фильтр устанавливается на все подключённые в данный момент диски, и тоже, как выяснилось, оповещений при подключении флешек не происходит.

    Запрещать подключение не требуется.
     
  5. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Ну ладно уже ахинею-то советовать, какой ещё перехват в 2010 году?
     
  6. x64

    x64 New Member

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

    Разумеется, потому что, как я уже написал выше, одного этого нотификатора мало, необходимо фильтровать операции монтирования. Об этом есть в документации к WDK, в исходниках sfilter в том же WDK, на страничке фильтров, и немного у меня в блоге.

    Ну дальше, дальше пиши, я из тебя клещами что ли всё вытаскивать должен? Зачем требуется вообще фильтровать диски? Какова цель конечная? Пока непонятно, какие средства лучше всего подойдут тебе в данном случае. Может быть файловый фильтр, а может быть и нет.
     
  7. Sav1or

    Sav1or New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2008
    Сообщения:
    52
    не модно уже да?))
     
  8. Alever

    Alever New Member

    Публикаций:
    0
    Регистрация:
    6 дек 2008
    Сообщения:
    4
    Спасибо за ссылки.

    Конечная цель - запретить доступ к файлам на флешках заранее заданному списку программ либо наоборот разрешить его только определённым программам.
     
  9. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    В таком случае, прямая дорога к реализации файлового (мини-)фильтра. Аминь.
     
  10. deshiko

    deshiko New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2009
    Сообщения:
    42
    а вот и небольшой работающий пример: фильтра
    http://www.codeproject.com/KB/system/fs-filter-driver-tutorial.aspx
     
  11. Alever

    Alever New Member

    Публикаций:
    0
    Регистрация:
    6 дек 2008
    Сообщения:
    4
    Остался вопрос об определении типа тома уже примонтированных устройств.

    В обработчике IRP_MN_MOUNT_VOLUME я проверяю, содержит ли Vpb->RealDevice->Characteristics флаг FILE_REMOVABLE_MEDIA. Если содержит, тогда приаттачиваю к Vpb->DeviceObject своё устройство фильтра, и всё работает. RealDevice имеет тип FILE_DEVICE_DISK, а DeviceObject - FILE_DEVICE_DISK_FILE_SYSTEM. Получается, что чтобы проверить, является ли монтируемый том томом на флешке, нужно проверять Characteristics в одном устройстве, а фильтр устанавливать на другое.

    Если файловая система уже примонтирована, фильтр устанавливается в обработке нотификатора. С помощью полученного CDO определяется объект драйвера ФС и с помощью IoEnumerateDeviceObjectList перечисляются все его устройства. Но как в нём получить связку FILE_DEVICE_DISK - FILE_DEVICE_DISK_FILE_SYSTEM или проверить, что том находится на флешке?