IRP_MJ_INTERNAL_DEVICE_CONTROL (FS およびフィルター ドライバー)
送信時
I/O マネージャー、他のオペレーティング システム コンポーネント、および他のカーネル モード ドライバーは、IRP_MJ_INTERNAL_DEVICE_CONTROL 要求を送信します。
違いIRP_MJ_DEVICE_CONTROL IRP_MJ_INTERNAL_DEVICE_CONTROL リクエストは、カーネル モード コンポーネント間の通信にのみ使用されます。 IRP_MJ_DEVICE_CONTROL リクエストは通常、DeviceIoControl もしくは ZwDeviceIoControlFile、これらのルーチンは IRP_MJ_INTERNAL_DEVICE_CONTROL リクエストを作成できません。 ただし、両方のタイプの IRP は、IoBuildDeviceIoControlRequest を呼び出すことによって作成できます。
操作: ファイル システム ドライバー
ファイル システム ドライバーは、ファイル オブジェクトを抽出してデコードし、ボリューム オープンを表すハンドルに対して要求が発行されたかどうかを判断する必要があります。 その場合、ファイル システム ドライバーは、ボリュームがマウントされているストレージ デバイスのデバイス ドライバーに IRP を渡す必要があります。 そうでない場合、ドライバーは IRP に失敗するはずです。
操作: レガシー ファイル システム フィルター ドライバー
フィルター ドライバーは必要な処理を実行し、フィルターの性質に応じて IRP を完了するか、スタック上の 1 つ下のドライバーに IRP を渡します。
パラメーター
ファイル システムまたはフィルター ドライバーの呼び出し IoGetCurrentIrpStackLocation 指定された IRP を使用して、独自の IRP へのポインターを取得します。stack location IRP では、次のリストに示されています。IrpSp. (IRP は次のように表示されますIrp.) ドライバーは、デバイス制御要求を処理する際に、IRP の次のメンバーと IRP スタックの場所に設定されている情報を使用できます。
DeviceObject ターゲット デバイス オブジェクトへのポインターです。
Irp->AssociatedIrp.SystemBuffer は、ターゲット デバイスのデバイス ドライバーに渡されるシステム提供の入力バッファーを指します。 METHOD_BUFFERED または METHOD_DIRECT I/O に使用されます。 このパラメータが必要かどうかは、特定の I/O 制御コードによって異なります。
Irp->Ioステータス は、最終的な完了ステータスと要求された操作に関する情報を受け取る IO_STATUS_BLOCK構造体を指します。 詳細については、ZwDeviceIoControlFile の IoStatusBlock パラメータの説明を参照してください。
Irp->MdlAddressターゲット デバイスのデバイス ドライバーに渡される出力バッファーを記述するメモリ記述子リスト (MDL) のアドレスです。 METHOD_DIRECT I/O に使用されます。 このパラメータが必要かどうかは、特定の I/O 制御コードによって異なります。
Irp->RequestorMode は、操作を要求したプロセスの実行モード (KernelMode または UserMode) を示します。
Irp->ユーザーバッファ は、ターゲット デバイスのデバイス ドライバーに渡される、呼び出し元が提供する出力バッファーを指します。 このパラメータは METHOD_BUFFERED または METHOD_NEITHER I/O に使用されます。 このパラメータがオプションであるか必須であるかは、特定の I/O 制御コードによって異なります。
IrpSp->FileObject は、DeviceObject に関連付けられているファイル オブジェクトを指します。
IrpSp->FileObject パラメーターには、FILE_OBJECT構造体でもある RelatedFileObject フィールドへのポインターが含まれています。 RelatedFileObject FILE_OBJECT 構造体のフィールドは、IRP_MJ_INTERNAL_DEVICE_CONTROL の処理中は無効であるため、使用しないでください。
IrpSp->MajorFunctionは IRP_MJ_INTERNAL_DEVICE_CONTROL に設定されます。
IrpSp->Parameters.DeviceIoControl.InputBufferLength は、Irp->AssociatedIrp.SystemBufferが指すバッファのバイト単位のサイズです。
IrpSp->Parameters.DeviceIoControl.IoControlCode は、ターゲット デバイスのデバイス ドライバーに渡される IOCTL 関数コードです。
IOCTL リクエストの詳細については、I/O 制御コードの使用 と Windows SDK ドキュメントの「デバイスの入出力制御コード」を参照してください。。
IrpSp->Parameters.DeviceIoControl.OutputBufferLength は、Irp->UserBuffer が指すバッファのバイト単位のサイズです。
IrpSp->Parameters.DeviceIoControl.Type3InputBuffer METHOD_NEITHER を使用するカーネル モード リクエストの入力バッファです。
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示