IoAttachDeviceToDeviceStack 関数 (wdm.h)

IoAttachDeviceToDeviceStack ルーチンは、呼び出し元のデバイス オブジェクトをチェーン内の最も高いデバイス オブジェクトにアタッチし、以前に最も高いデバイス オブジェクトへのポインターを返します。

構文

PDEVICE_OBJECT IoAttachDeviceToDeviceStack(
  [in] PDEVICE_OBJECT SourceDevice,
  [in] PDEVICE_OBJECT TargetDevice
);

パラメーター

[in] SourceDevice

呼び出し元によって作成されたデバイス オブジェクトへのポインター。

[in] TargetDevice

IoGetDeviceObjectPointer の前の呼び出しによって返されるポインターなど、別のドライバーのデバイス オブジェクトへのポインター。

戻り値

IoAttachDeviceToDeviceStack は、 SourceDevice がアタッチされたデバイス オブジェクトへのポインターを返します。 TargetDevice の上に追加のドライバーが階層化されている場合、返されるデバイス オブジェクト ポインターは TargetDevice とは異なる場合があります。

IoAttachDeviceToDeviceStack は、ターゲット デバイスがアンロードされていたなどの理由で、デバイス オブジェクトをアタッチできなかった場合に NULL を 返します。

注釈

IoAttachDeviceToDeviceStack は、同じ IRP がチェーン内の各ドライバーに送信されるように、ドライバー間の階層化を確立します。

中間ドライバーは、初期化中にこのルーチンを使用して、別のドライバーのデバイス オブジェクトに独自のデバイス オブジェクトをアタッチできます。 TargetDevice に送信された後続の I/O 要求は、最初に中間ドライバーに送信されます。

このルーチンは、SourceDeviceAlignmentRequirement を次の下位のデバイス オブジェクトの値に設定し、StackSize を次の下位オブジェクトの値に 1 を加えた値に設定します。

ドライバーライターは、ドライバーの上に重ねなければならないドライバーの 前に 、このルーチンを呼び出すように注意する必要があります。 IoAttachDeviceToDeviceStack、チェーン 内で現在レイヤー化されている最も高いデバイス オブジェクトに SourceDevice をアタッチし、ドライバーが正しい順序で階層化されているかどうかを判断する方法はありません。

IoGetDeviceObjectPointer を呼び出してターゲット デバイスへのポインターを取得したドライバーは、IoGetDeviceObjectPointer によって返されたファイル オブジェクト ポインターを使用して ObDereferenceObject を呼び出して、独自のデバイス オブジェクトをデタッチする前にファイル オブジェクトへの参照を解放する必要があります (たとえば、このような上位レベルのドライバーがアンロードされたとき)。

要件

要件
サポートされている最小のクライアント Windows 2000 以降で使用できます。
対象プラットフォーム ユニバーサル
Header wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)
Library NtosKrnl.lib
[DLL] NtosKrnl.exe
IRQL <= DISPATCH_LEVEL
DDI コンプライアンス規則 AddDevice(wdm)HwStorPortProhibitedDDIs(storport)PnpSameDeviceObject(wdm)

こちらもご覧ください

IoAttachDevice

IoDetachDevice

IoGetDeviceObjectPointer

ObDereferenceObject