IoSkipCurrentIrpStackLocation 関数 (wdm.h)
IoSkipCurrentIrpStackLocation マクロは、システムのIO_STACK_LOCATION配列ポインターを変更して、現在のドライバーが次の下位ドライバーを呼び出すときに、そのドライバーが現在のドライバーが受け取ったのと同じIO_STACK_LOCATION構造を受け取るようにします。
構文
void IoSkipCurrentIrpStackLocation(
[in, out] PIRP Irp
);
パラメーター
[in, out] Irp
IRP へのポインター。
戻り値
なし
解説
ドライバーで次に下位のドライバーに IRP を送信するとき、IoCompletion ルーチン (そのアドレスがドライバーの IO_STACK_LOCATION 構造体に格納されている) を指定しない場合は、ドライバーで IoSkipCurrentIrpStackLocation を呼び出すことができます。 IoCallDriver を呼び出す前に IoSkipCurrentIrpStackLocation を呼び出すと、次に下位のドライバーは、ドライバーが受け取ったのと同じ IO_STACK_LOCATION を受け取ります。
IRP に IoCompletion ルーチンを指定する場合、ドライバーで IoSkipCurrentIrpStackLocation ではなく、IoCopyCurrentIrpStackLocationToNext を呼び出す必要があります。 不適切に記述されたドライバーが IoSkipCurrentIrpStackLocation を呼び出し、完了ルーチンを設定する間違いを犯した場合、このドライバーは、その上のドライバーによって設定された完了ルーチンを上書きする可能性があります。
ドライバーで IRP を保留した場合は、IRP を次に下位のドライバーに渡す前に IoSkipCurrentIrpStackLocation を呼び出さないでください。 保留した IRP に対してドライバーで IoSkipCurrentIrpStackLocation を呼び出してから、それを次に下位のドライバーに渡した場合、次のドライバーに対して I/O スタックの場所を表す Control メンバーに、SL_PENDING_RETURNED フラグが設定されたままになります。 そのスタックの場所は次のドライバーが所有しており、変更される可能性があるため、保留中のフラグがクリアされる可能性があります。 このような状況が発生すると、オペレーティング システムによってバグ チェックが発行されたり、IRP の処理が完了しなくなったりすることがあります。
代わりに、IRP を保留にしたドライバーで IoCallDriver を呼び出す前に IoCopyCurrentIrpStackLocationToNext を呼び出し、次に下位のドライバーに対して新しいスタックの場所を設定する必要があります。
ドライバーで IoSkipCurrentIrpStackLocation を呼び出す場合は、そのドライバーに関連して下位のドライバーやシステムの動作が意図せず影響を受けるような方法で IO_STACK_LOCATION 構造体を変更しないように注意してください。 例としては、IO_STACK_LOCATION 構造体の Parameters 共用体を変更することや、IoMarkIrpPending を呼び出すことがあります。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 2000 |
Header | wdm.h |
IRQL | 任意のレベル |