次の方法で共有


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 任意のレベル