Здравствуйте. Интересуют такие вопросы: 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
Всё немного не так, на самом деле. Файловая система регистрирует себя только один раз и делает это, по сути, только для того, чтобы менеджер ввода/вывода знал, к кому обращаться при обнаружении ещё ни кем не смонтированного тома. А то, о чём говоришь ты сейчас, это фильтрация запросов на монтирование, т.е. как раз те самые запросы, которые посылает ядро, когда обнаруживает безхозный ещё не смонтированный том. И вот уже этот процесс выполняется для каждого нового тома (и при подключении флешки в том числе), в отличие от регистрации файловой системы, которая выполняется обычно только один раз. Для флешек тип тома всегда будет DRIVE_REMOVABLE, здесь можно даже и не думать ничего. Но если требуется решить задачу в общем случае, то прежде чем ответить на этот вопрос, необходимо определиться, как минимум, с двумя вопросами: * Требуется ли узнать тип тома до подключения устройство или после? Т.е. другими словами, нужна ли возможность, например, запретить подключение устройства и т.д. * Требуется ли какая-либо работа с файлами на подключаемых томах? Например, планируется ли писать файловый фильтр для реализации какого-либо другого file-related функционала?
Требуется установить фильтр на usb-диски (DRIVE_REMOVABLE) и при этом динамически устанавливать фильтр на подключаемые флешки. Пробовал 2 способа: 1. Получить с помощью ZwQueryInformationProcess карту дисков и устанавливать фильтр только на диски типа DRIVE_REMOVABLE, но тогда не фильтруются подключаемые после этого флешки. 2. Устанавливать фильтр при вызове DriverNotificationRoutine, но тогда фильтр устанавливается на все подключённые в данный момент диски, и тоже, как выяснилось, оповещений при подключении флешек не происходит. Запрещать подключение не требуется.
Разумеется, в данном сценарии ты о них ничего не знаешь и не делаешь попыток узнать. Разумеется, потому что, как я уже написал выше, одного этого нотификатора мало, необходимо фильтровать операции монтирования. Об этом есть в документации к WDK, в исходниках sfilter в том же WDK, на страничке фильтров, и немного у меня в блоге. Ну дальше, дальше пиши, я из тебя клещами что ли всё вытаскивать должен? Зачем требуется вообще фильтровать диски? Какова цель конечная? Пока непонятно, какие средства лучше всего подойдут тебе в данном случае. Может быть файловый фильтр, а может быть и нет.
Спасибо за ссылки. Конечная цель - запретить доступ к файлам на флешках заранее заданному списку программ либо наоборот разрешить его только определённым программам.
а вот и небольшой работающий пример: фильтра http://www.codeproject.com/KB/system/fs-filter-driver-tutorial.aspx
Остался вопрос об определении типа тома уже примонтированных устройств. В обработчике 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 или проверить, что том находится на флешке?