IoAttachDevice 函数 (wdm.h)

IoAttachDevice 例程将调用方的设备对象附加到命名的目标设备对象,以便首先将绑定到目标设备的 I/O 请求路由到调用方。

语法

NTSTATUS IoAttachDevice(
  [in]  PDEVICE_OBJECT  SourceDevice,
  [in]  PUNICODE_STRING TargetDevice,
  [out] PDEVICE_OBJECT  *AttachedDevice
);

参数

[in] SourceDevice

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

[in] TargetDevice

指向缓冲区的指针,该缓冲区包含指定 SourceDevice 要附加到的设备对象的名称。

[out] AttachedDevice

指向指针的调用方分配存储的指针。 返回时,如果附件成功,则包含指向目标设备对象的指针。

返回值

IoAttachDevice 可以返回以下 NTSTATUS 值之一:

注解

IoAttachDevice 在驱动程序之间建立分层,以便可以将相同的 IRP 发送到链中的每个驱动程序。

此例程由中间驱动程序在初始化期间使用。 它允许此类驱动程序将其自己的设备对象附加到另一个设备,这样,对原始设备发出的任何请求都首先提供给中间驱动程序。

调用方只能在现有分层驱动程序链的顶部分层。 IoAttachDevice 搜索 在 TargetDevice 上分层的最高设备对象,并附加到该对象 (,该对象可以是 TargetDevice) 。 因此,如果必须更高级别的驱动程序已在目标设备上分层,则不得调用此例程。

请注意,对于存储堆栈中的文件系统驱动程序和驱动程序, IoAttachDevice 使用 FILE_READ_ATTRIBUTES打开目标设备,然后调用 IoGetRelatedDeviceObject。 这不会导致装载文件系统。 因此,成功调用 IoAttachDevice 会返回存储驱动程序的设备对象,而不是文件系统驱动程序的设备对象。

此例程将 SourceDevice 中的 AlignmentRequirement 设置为下一个较低级别的设备对象中的值,并将 StackSize 设置为下一个较低对象中的值。

警告

AttachedDevice 必须指向全局内存位置,例如驱动程序的设备扩展。 IoAttachDevice 打开目标设备的文件对象,更新 AttachedDevice,执行附加,然后关闭文件对象。 因此,在 IoAttachDevice 返回之前,源设备接收对文件对象的IRP_MJ_CLEANUPIRP_MJ_CLOSE请求。 驱动程序必须将这些请求转发到目标设备, 而 AttachedDevice 必须是驱动程序的 DispatchCleanupDispatchClose 例程可访问的内存位置。

要求

要求
目标平台 通用
标头 wdm.h(包括 Wdm.h、Ntddk.h、Ntifs.h)
Library NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI 符合性规则 HwStorPortProhibitedDDI (storport) IrqlIoPassive1 (wdm)

另请参阅

DEVICE_OBJECT

IoAttachDeviceToDeviceStack

IoAttachDeviceToDeviceStackSafe

IoCreateDevice

IoDetachDevice

IoGetRelatedDeviceObject