共用方式為


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 必須是驅動程式 的 DispatchCleanup 和DispatchClose 例程可存取的記憶體位置。

規格需求

需求
目標平台 Universal
標頭 wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h)
程式庫 NtosKrnl.lib
Dll NtosKrnl.exe
IRQL PASSIVE_LEVEL
DDI 合規性規則 HwStorPortProhibitedDIS (storport) IrqlIoPassive1 (wdm)

另請參閱

DEVICE_OBJECT

IoAttachDeviceToDeviceStack

IoAttachDeviceToDeviceStackSafe

IoCreateDevice

IoDetachDevice

IoGetRelatedDeviceObject