Присоединение объекта 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 .