Если вдруг кто-то не знает, то Microsoft уже сделала (в Windows 10 версии 1607) твердый шаг в сторону запрета Legacy-фильтров файловых систем: Blocking legacy file system filter drivers.
Так как же реализован этот запрет? В качестве целевой системы рассмотрим 32-х разрядную Windows 10 с номером сборки 16299.
Для начала найдем перемененную, в которую читается значение IoBlockLegacyFsFilters ключа реестра HKLM\SYSTEM\CurrentControlSet\Control\SessionManager\I/O System. Это глобальная переменная IopBlockLegacyFsFilters:
Затем взглянем на использование IopBlockLegacyFsFilters:
Рассмотрим в начале функцию IoRegisterFsRegistrationChangeMountAware, которая является реализацией экспортируемой функции IoRegisterFsRegistrationChange(...). В ней мы обнаружим следующий псевдо-код:
if ( IopBlockLegacyFsFilters && !IopIsKnownGoodLegacyFsFilter(&DriverObject->DriverName) ) {
То есть для "встроенных" Legacy-фильтров файловых систем оставлено старое API. И, как видно из листинга, хороший драйвер распознается по имени:
bool IopIsKnownGoodLegacyFsFilter(_UNICODE_STRING *DriverObjectName) { ULONG i = 0; USHORT DriverObjectNameLength = DriverObjectName->Length; do { if ( g_KnownGoodLegacyFsFilter[i].Length == DriverObjectNameLength && !memcmp(g_KnownGoodLegacyFsFilter[i].Buffer, DriverObjectName->Buffer, g_KnownGoodLegacyFsFilter[i].Length) ) { break; } ++i; } while ( i < 3 ); return i < 3; }
Глобальный массив, названный мной g_KnownGoodLegacyFsFilter:
То есть банальный белый список по имени обьекта драйвера.
Microsoft не ограничилась контролем функции IoRegisterFsRegistrationChange: еще одна проверка была вставлена в код функциии IopAttachDeviceToDeviceStackSafe, которая является реализацией IoAttachDeviceToDeviceStackSafe(...). Взглянем на псевдо-код:
TargetDeviceAttachmentBase = IopGetDeviceAttachmentBase(TargetDevice); TargetDeviceType = TargetDeviceAttachmentBase->DeviceType; if ( (TargetDeviceType == FILE_DEVICE_DISK_FILE_SYSTEM || TargetDeviceType == FILE_DEVICE_CD_ROM_FILE_SYSTEM || TargetDeviceType == FILE_DEVICE_NETWORK_FILE_SYSTEM || TargetDeviceType == FILE_DEVICE_TAPE_FILE_SYSTEM || TargetDeviceType == FILE_DEVICE_DFS_FILE_SYSTEM) && (TargetDeviceAttachmentBase->Flags & 0x10000000 || IopBlockLegacyFsFilters) )// DO_DAX_VOLUME (0x10000000) { if ( IopIsKnownGoodLegacyFsFilter(&SourceDevice_->DriverObject->DriverName) ) {
Тут мы видим реализацию уточнения по DAX-томам, которое содержится в Blocking legacy file system filter drivers:
Стоит отметить, что в IopAttachDeviceToDeviceStackSafe Legacy-фильтрами файловых систем считаются все, кто пытается при-attach'иться к устройствам с типом файловой системы.
ΞρεΤΙκ