Поделиться через


Присоединение объекта filter device к целевому объекту устройства

Примечание

Для оптимальной надежности и производительности используйте драйверы минифильтров файловой системы с поддержкой диспетчера фильтров вместо устаревших драйверов фильтров файловой системы. Сведения о переносе устаревшего драйвера в драйвер мини-фильтра см. в статье Рекомендации по переносу устаревших драйверов фильтров.

Устаревший драйвер фильтра файловой системы вызывает IoAttachDeviceToDeviceStackSafe , чтобы подключить объект устройства фильтра к стеку драйвера фильтра для целевой файловой системы или тома.

devExt = myLegacyFilterDeviceObject->DeviceExtension;

status = IoAttachDeviceToDeviceStackSafe(
           myLegacyFilterDeviceObject,        //SourceDevice
           DeviceObject,                      //TargetDevice
           &devext->AttachedToDeviceObject);  //AttachedToDeviceObject

Указатель объекта устройства, полученный выходным параметром AttachedToDeviceObject , может отличаться от TargetDevice , если какие-либо другие фильтры уже были связаны над объектом устройства, на который указывает (TargetDevice).

Присоединение к файловой системе по имени

Каждая файловая система необходима для создания одного или нескольких именованных объектов управляющего устройства. Чтобы подключиться к определенной файловой системе напрямую, драйвер фильтра файловой системы передает имя соответствующего объекта устройства управления файловой системой в IoGetDeviceObjectPointer , чтобы получить указатель на объект устройства. В следующем фрагменте кода показано, как получить такой указатель на один из двух объектов управляющего устройства для файловой системы RAW:

RtlInitUnicodeString(&nameString, L"\\Device\\RawDisk");

status = IoGetDeviceObjectPointer(
            &nameString,                    //ObjectName
            FILE_READ_ATTRIBUTES,           //DesiredAccess
            &fileObject,                    //FileObject
            &rawDeviceObject);              //DeviceObject

if (NT_SUCCESS(status)) {
            ObDereferenceObject(fileObject);
}

Если вызов IoGetDeviceObjectPointer завершается успешно, драйвер фильтра файловой системы может вызвать IoAttachDeviceToDeviceStackSafe для подключения к возвращенным объекту управляющего устройства.

Помимо указателя объекта управляющего устройства (rawDeviceObject), IoGetDeviceObjectPointer возвращает указатель на объект файла (fileObject), представляющий объект устройства в пользовательском режиме. В фрагменте кода объект file не требуется, поэтому он закрывается путем вызова ObDereferenceObject. Важно отметить, что уменьшение количества ссылок на объект файла, возвращаемого IoGetDeviceObjectPointer , также приводит к уменьшению количества ссылок в объекте устройства. Таким образом, указатели fileObject и rawDeviceObject должны считаться недопустимыми после приведенного выше вызова ObDereferenceObject, если только число ссылок в объекте устройства не увеличивается при другом вызове ObReferenceObject до вызова Объекта файла ObDereferenceObject .