IoAttachDeviceToDeviceStackSafe 関数 (ntddk.h)
IoAttachDeviceToDeviceStackSafe ルーチンは、呼び出し元のデバイス オブジェクトをドライバー スタックの最上位のデバイス オブジェクトにアタッチします。
構文
NTSTATUS IoAttachDeviceToDeviceStackSafe(
[in] PDEVICE_OBJECT SourceDevice,
[in] PDEVICE_OBJECT TargetDevice,
[out] PDEVICE_OBJECT *AttachedToDeviceObject
);
パラメーター
[in] SourceDevice
呼び出し元によって作成されたデバイス オブジェクトへのポインター。
[in] TargetDevice
SourceDevice オブジェクトがアタッチされるスタック内のデバイス オブジェクトへのポインター。
[out] AttachedToDeviceObject
入力時に、このパラメーターは SourceDevice-DeviceExtension-AttachedToDeviceObject>> のアドレスを指定します。このアドレスには NULL ポインターを含める必要があります。 出力時に、このパラメーターは SourceDevice がアタッチされたデバイス オブジェクトへのポインターを受け取ります。
戻り値
SourceDevice が TargetDevice の上に正常にアタッチされている場合、IoAttachDeviceToDeviceStackSafe はSTATUS_SUCCESSを返します。それ以外の場合は、STATUS_NO_SUCH_DEVICEを返します。
注釈
IoAttachDeviceToDeviceStack と同様に、IoAttachDeviceToDeviceStackSafe は、同じ IRP がスタック内の各ドライバーに送信されるように、ドライバー間の階層化を確立します。 ただし、IoAttachDeviceToDeviceStack とは異なり、IoAttachDeviceToDeviceStackSafe には、フィルター ドライバーが SourceDevice オブジェクトの AttachedToDeviceObject フィールドのアドレスを渡すために使用する追加のパラメーター AttachedToDeviceObject があります。 IoAttachDeviceToDeviceStackSafe は、I/O システム データベース ロックを保持しながら、このフィールドを更新します。 このロックを保持するため、 IoAttachDeviceToDeviceStackSafe は、AttachedToDeviceObject フィールドが更新される前に SourceDevice オブジェクトが IRP を受け取った場合に発生する可能性がある競合状態を回避します。
ファイル システム フィルター ドライバーは、IoAttachDeviceToDeviceStackSafe を呼び出して、ファイル システムまたは別のフィルター ドライバーに属するデバイス オブジェクト (TargetDevice) の上に独自のフィルター デバイス オブジェクト (SourceDevice) をアタッチします。 AttachedToDeviceObject に送信された後続の I/O 要求は、最初にフィルター ドライバーによって受信されます。この要求はフィルター ドライバーによって処理され、IoCallDriver を呼び出してスタック内の次のドライバーに転送されます。
TargetDevice で指定されたデバイス オブジェクトが現在ドライバー スタックの上部にある場合、SourceDevice は TargetDevice に直接アタッチされます。 この場合、 TargetDevice と返 される AttachedToDeviceObject ポインターは等しくなります。
ドライバー スタック内の TargetDevice の上に 1 つ以上のフィルター デバイス オブジェクトが既にアタッチされている場合、 IoAttachDeviceToDeviceStackSafe は SourceDevice を最上位のフィルター デバイス オブジェクトにアタッチします。 後者へのポインターは 、AttachedToDeviceObject で返されます。
スタックの上部にアタッチされた直後の時点で、 SourceDevice はドライバー スタックの最上位を占有します。 ただし、これは必ずしも SourceDevice がドライバー スタックの一番上に残ることを意味するわけではないことに注意してください。 他のフィルターは、スタック内の SourceDevice の上に独自のフィルター デバイス オブジェクトをアタッチできます。
IoAttachDeviceToDeviceStackSafe は、SourceDevice が指すデバイス オブジェクトの AlignmentRequirement メンバーを、次の下位のデバイス オブジェクト内の対応する の値に設定し、SourceDevice の StackSize を次の下位オブジェクトの値に 1 を加えた値に設定します。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | このルーチンは、Windows 2000 Service Pack 4 (SP4) の更新プログラムのロールアップおよび Windows XP 以降で使用できます。 |
対象プラットフォーム | ユニバーサル |
Header | ntddk.h (Ntddk.h を含む) |
Library | NtosKrnl.lib |
[DLL] | NtosKrnl.exe |
IRQL | <= DISPATCH_LEVEL |
DDI コンプライアンス規則 | HwStorPortProhibitedDDIs(storport) |