将筛选设备对象附加到目标设备对象

注意

为了获得最佳可靠性和性能,请使用支持筛选器管理器的 文件系统微筛选器驱动程序 ,而不是旧版文件系统筛选器驱动程序。 若要将旧驱动程序移植到微筛选器驱动程序,请参阅 移植旧筛选器驱动程序的指南

旧文件系统筛选器驱动程序调用 IoAttachDeviceToDeviceStackSafe ,以将筛选器设备对象附加到目标文件系统或卷的筛选器驱动程序堆栈。

devExt = myLegacyFilterDeviceObject->DeviceExtension;

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

如果 附加ToDeviceObject 输出参数收到的设备对象指针可能不同于 TargetDevice ,如果其他筛选器已链接到 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) 表示用户模式下的设备对象。 在代码片段中,不需要文件对象,因此通过调用 ObDereferenceObject 将其关闭。 请务必注意,递减 IoGetDeviceObjectPointer 返回的文件对象的引用计数也会导致设备对象上的引用计数也递减。 因此,在上述调用 ObDereferenceObject 之后,fileObjectrawDeviceObject 指针都应被视为无效,除非设备对象上的引用计数在为文件对象调用 ObDereferenceObject 之前通过另一次调用 ObReferenceObject 递增。