IRP_MJ_DEVICE_CONTROL (FS およびフィルター ドライバー)

送信時

I/O マネージャー、他のオペレーティング システム コンポーネント、および他のカーネル モード ドライバーは、IRP_MJ_DEVICE_CONTROL 要求を送信します。 通常この IRP は、Win32 の DeviceIoControl 関数を呼び出したユーザーモードアプリケーションの代理として、また はZwDeviceIoControlFile を呼び出したカーネルモード コンポーネントの代理として送信されます。

操作: ファイル システム ドライバー

ファイル システム ドライバーは、ファイル オブジェクトを抽出およびデコードして、ボリュームがオープンされているハンドルに対して要求が発行されたかどうかを判断する必要があります。 その場合、ファイル システム ドライバーは、ボリュームがマウントされているストレージ デバイスのデバイス ドライバーに IRP を渡す必要があります。 そうでない場合、ドライバーは IRP に失敗するはずです。

操作: レガシー ファイル システム フィルター ドライバー

フィルター ドライバーは必要な処理を実行し、フィルターの性質に応じて IRP を完了するか、スタック上の 1 つ下のドライバーに IRP を渡します。

パラメーター

ファイル システムまたはフィルター ドライバーは、指定された IRP で IoGetCurrentIrpStackLocation を呼び出して、IRP 内の独自のスタックの場所へのポインターを取得します。 次のパラメーターでは、IrpIRP を指し、IrpSpIO_STACK_LOCATION を指します。 ドライバーは、IRP の次のメンバーと IRP スタックの場所に設定されている情報を使用して、デバイス制御要求を処理できます。

  • DeviceObject ターゲット デバイス オブジェクトへのポインターです。

  • Irp->AssociatedIrp.SystemBuffer は、ターゲット デバイスのデバイス ドライバーに渡されるシステム提供の入力バッファーを指します。 METHOD_BUFFERED または METHOD_DIRECT I/O に使用されます。 このパラメータが必要かどうかは、特定の I/O 制御コードによって異なります。

  • Irp->Ioステータス は、最終的な完了ステータスと要求された操作に関する情報を受け取る IO_STATUS_BLOCK構造体を指します。 詳細については、ZwDeviceIoControlFileIoStatusBlock パラメータの説明を参照してください。

  • 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 fFILE_OBJECT 構造体のフィールドは、IRP_MJ_DEVICE_CONTROL の処理中は無効であるため、使用しないでください。i

  • IrpSp->主要機能 は、IRP_MJ_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 を使用するカーネル モード リクエストの入力バッファです。

関連項目

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoBuildDeviceIoControlRequest

IoGetCurrentIrpStackLocation

IoGetFunctionCodeFromCtlCode

IRP

IRP_MJ_DEVICE_CONTROL (WDK カーネル リファレンス)

I/O 制御コードの使用

ZwDeviceIoControlFile