IoAttachDeviceToDeviceStackSafe 函数 (ntddk.h)

IoAttachDeviceToDeviceStackSafe 例程将调用方的设备对象附加到驱动程序堆栈中最顶层的设备对象。

语法

NTSTATUS IoAttachDeviceToDeviceStackSafe(
  [in]  PDEVICE_OBJECT SourceDevice,
  [in]  PDEVICE_OBJECT TargetDevice,
  [out] PDEVICE_OBJECT *AttachedToDeviceObject
);

参数

[in] SourceDevice

指向调用方创建的设备对象的指针。

[in] TargetDevice

指向 堆栈中 SourceDevice 对象要附加到的设备对象的指针。

[out] AttachedToDeviceObject

输入时,此参数指定 SourceDevice-DeviceExtension-AttachedToDeviceObject>> 的地址,该地址必须包含 NULL 指针。 在输出时,此参数接收指向 SourceDevice 所附加到的设备对象的指针。

返回值

如果 SourceDevice 成功附加到 TargetDevice 上方,IoAttachDeviceToDeviceStackSafe 将返回STATUS_SUCCESS;否则返回STATUS_NO_SUCH_DEVICE。

注解

IoAttachDeviceToDeviceStack 一样, IoAttachDeviceToDeviceStackSafe 在驱动程序之间建立分层,以便将相同的 IRP 发送到堆栈中的每个驱动程序。 但是,与 IoAttachDeviceToDeviceStack 不同, IoAttachDeviceToDeviceStackSafe 具有附加参数 AttachedToDeviceObject,筛选器驱动程序使用该参数传递 SourceDevice 对象的 AttachedToDeviceObject 字段的地址。 IoAttachDeviceToDeviceStackSafe 在保留 I/O 系统数据库锁时更新此字段。 由于它持有此锁, IoAttachDeviceToDeviceStackSafe 可避免在 SourceDevice 对象在其 AttachedToDeviceObject 字段更新之前收到 IRP 时可能出现的争用条件。

文件系统筛选器驱动程序调用 IoAttachDeviceToDeviceStackSafe 以将自己的筛选器设备对象 (SourceDevice) 附加到属于文件系统或其他筛选器驱动程序的设备对象 (TargetDevice) 上方。 发送到 AttachedToDeviceObject 的后续 I/O 请求首先由筛选器驱动程序接收,筛选器驱动程序会处理这些请求,并通过调用 IoCallDriver 将它们转发到堆栈中的下一个驱动程序。

如果 TargetDevice 指定的设备对象当前位于驱动程序堆栈的顶部,则 SourceDevice 将直接附加到 TargetDevice。 在这种情况下, TargetDevice 和返回的 AttachedToDeviceObject 指针相等。

如果驱动程序堆栈中的 TargetDevice 上方已附加了一个或多个筛选器设备对象, IoAttachDeviceToDeviceStackSafe 会将 SourceDevice 附加到最顶层的筛选器设备对象。 在 AttachedToDeviceObject 中返回指向后者的指针。

在附加到堆栈顶部后, SourceDevice 立即占据驱动程序堆栈的顶部。 但请注意,这并不一定意味着 SourceDevice 将保留在驱动程序堆栈的顶部。 其他筛选器可以在堆栈中的 SourceDevice 上方附加其自己的筛选器设备对象。

IoAttachDeviceToDeviceStackSafeSourceDevice 指向的设备对象的 AlignmentRequirement 成员设置为下一个下限设备对象中相应的 值,并将 SourceDevice 中的 StackSize 设置为下一个下限对象中的值加 1。

要求

要求
最低受支持的客户端 此例程适用于 Windows 2000 Service Pack 4 (SP4) 以及 Windows XP 及更高版本的更新汇总。
目标平台 通用
标头 ntddk.h (包括 Ntddk.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= DISPATCH_LEVEL
DDI 符合性规则 HwStorPortProhibitedDDI (storport)

另请参阅

IoAttachDeviceToDeviceStack

IoCallDriver