Share via


ドライバーの I/O スタック位置を確認すべき場合

主要な I/O 関数コードは、各受信 IRP のドライバーの I/O スタックの場所 に設定されます。

ドライバーのディスパッチ ルーチンは、IRP のドライバーの I/O スタックの場所をチェックし、次のいずれかの条件が保持されている場合の処理を決定する必要があります。

  • ディスパッチ ルーチンは、複数の主要な I/O ファンクション コードを処理します。

  • ディスパッチ ルーチンは、特定のメジャー ファンクション コードの一連のマイナー ファンクション コードを処理する必要があります。 マイナー ファンクション コードを持つ IRP には、 IRP_MJ_PNPIRP_MJ_POWER、 ポート ドライバーとファイル システム ドライバーで処理する必要がある特定の IRP が含まれます。

  • デバイス ドライバーまたは密接に結合された上位レベルのドライバーのディスパッチ ルーチンは、I/O 制御コードのセットが関連付けられている IRP_MJ_DEVICE_CONTROL または IRP_MJ_INTERNAL_DEVICE_CONTROL 要求を処理します。

ドライバーの I/O スタックの場所へのポインターを取得するには、そのディスパッチ ルーチンは IoGetCurrentIrpStackLocationを呼び出します。

上位ドライバのディスパッチ ルーチンは、 IoGetCurrentIrpStackLocation を常に呼び出し、 IoGetNextIrpStackLocation も呼び出して、 passing IRPs down the driver stackに IRP を渡すときに、次の下位ドライバー用に設定した IRP のための、次の下位のドライバーの I/O スタック位置へのポインターを取得します。

デバイス ドライバーの DispatchDeviceControl ルーチンまたは DispatchInternalDeviceControl ルーチン、またはその密接に結合されたクラス ドライバーの場合は、要求ごとに Parameters.DeviceIoControl.IoControlCode のドライバーの I/O スタックの場所に設定されている I/O コントロール コードを決定する必要があります。 I/O コントロール コードは、ドライバーの I/O スタックの場所に含まれています。

ほとんどの場合、上位レベルのドライバーの DispatchDeviceControl または DispatchInternalDeviceControl ルーチンは、IRP でスタック位置を設定した後、次の下位ドライバーに IRP_MJ_DEVICE_CONTROL または IRP_MJ_INTERNAL_DEVICE_CONTROL 要求を渡すだけです。 ただし、SCSI クラス ドライバーは、これらの要求を渡す前に SCSI ポート ドライバーの I/O スタックの場所を正しく設定できるように、特定の SCSI ポート I/O 制御 コード に対してチェックする必要があります。