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 を次の下位オブジェクトの値に 1 を加えた値に設定します。
警告
AttachedDevice は、ドライバーのデバイス拡張機能などのグローバル メモリの場所を指す必要があります。 IoAttachDevice ターゲット デバイスのファイル オブジェクトを開き、AttachedDevice 更新してアタッチを実行し、ファイル オブジェクトを閉じます。 したがって、ソース デバイスは、IoAttachDevice が返 前に、ファイル オブジェクトの IRP_MJ_CLEANUP および IRP_MJ_CLOSE 要求を受け取ります。 ドライバーは、ターゲット デバイスにこれらの要求を転送する必要があります、AttachedDevice は、ドライバーの DispatchCleanup と DispatchClose ルーチンにアクセスできるメモリの場所である必要があります。
要件 | 価値 |
---|---|
ターゲット プラットフォーム の | 万国 |
ヘッダー | wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む) |
ライブラリ | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL |
DDI コンプライアンス規則 を する | HwStorPortProhibitedDDIs(storport), IrqlIoPassive1(wdm) |
IoAttachDeviceToDeviceStack の
IoAttachDeviceToDeviceStackSafe
IoCreateDevice の
IoDetachDevice の
IoGetRelatedDeviceObject の