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_CLEANUP和IRP_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) |