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 を受け取ります。
IoCompletion ルーチンを IRP に提供する場合、ドライバーは IoSkipCurrentIrpStackLocation ではなく、IoCopyCurrentIrpStackLocationToNext呼び出す必要があります。 不適切に記述されたドライバーが、IoSkipCurrentIrpStackLocation 呼び出し、完了ルーチンを設定する間違いを犯した場合、このドライバーは、その上のドライバーによって設定された完了ルーチンを上書きする可能性があります。
ドライバーが IRP をペンドしている場合、ドライバーは、次の下位のドライバーに IRP を渡す前に、IoSkipCurrentIrpStackLocation を呼び出すべきではありません。 ドライバーは、次の下位のドライバーに渡す前に、ペンド IRP IoSkipCurrentIrpStackLocation を呼び出す場合、SL_PENDING_RETURNED フラグは、次のドライバーの I/O スタックの場所の コントロール メンバーに設定されます。 次のドライバーはそのスタックの場所を所有し、変更する可能性があるため、保留中のフラグをクリアする可能性があります。 この状況により、オペレーティング システムがバグ チェックを発行したり、IRP の処理が完了しなくなる可能性があります。
代わりに、IRP をペンドしたドライバーは、IoCopyCurrentIrpStackLocationToNext を呼び出して、IoCallDriver呼び出す前に、次の下位ドライバーの新しいスタックの場所を設定する必要があります。
ドライバーが IoSkipCurrentIrpStackLocation 呼び出す場合は、そのドライバーに関する下位ドライバーまたはシステムの動作に意図せず影響を与える可能性のある方法で IO_STACK_LOCATION 構造を変更しないように注意してください。 たとえば、IO_STACK_LOCATION 構造体の Parameters 共用体を変更したり、IoMarkIrpPending呼び出したりします。
必要条件
| 要件 | 価値 |
|---|---|
| サポートされる最小クライアント | Windows 2000 |
| ヘッダー | wdm.h |
| IRQL | 任意のレベル |