次の方法で共有


IRP_MJ_DEVICE_CONTROLとIRP_MJ_INTERNAL_DEVICE_CONTROL共用体のFLT_PARAMETERS

操作のFLT_IO_PARAMETER_BLOCK構造体の MajorFunction フィールドがIRP_MJ_DEVICE_CONTROLまたはIRP_MJ_INTERNAL_DEVICE_CONTROLされるときに使用される共用体コンポーネント。

構文

typedef union _FLT_PARAMETERS {
  ...   ;
  union {
    struct {
      ULONG                   OutputBufferLength;
      ULONG POINTER_ALIGNMENT InputBufferLength;
      ULONG POINTER_ALIGNMENT IoControlCode;
    } Common;
    struct {
      ULONG                   OutputBufferLength;
      ULONG POINTER_ALIGNMENT InputBufferLength;
      ULONG POINTER_ALIGNMENT IoControlCode;
      PVOID                   InputBuffer;
      PVOID                   OutputBuffer;
      PMDL                    OutputMdlAddress;
    } Neither;
    struct {
      ULONG                   OutputBufferLength;
      ULONG POINTER_ALIGNMENT InputBufferLength;
      ULONG POINTER_ALIGNMENT IoControlCode;
      PVOID                   SystemBuffer;
    } Buffered;
    struct {
      ULONG                   OutputBufferLength;
      ULONG POINTER_ALIGNMENT InputBufferLength;
      ULONG POINTER_ALIGNMENT IoControlCode;
      PVOID                   InputSystemBuffer;
      PVOID                   OutputBuffer;
      PMDL                    OutputMdlAddress;
    } Direct;
    struct {
      ULONG                   OutputBufferLength;
      ULONG POINTER_ALIGNMENT InputBufferLength;
      ULONG POINTER_ALIGNMENT IoControlCode;
      PVOID                   InputBuffer;
      PVOID                   OutputBuffer;
    } FastIo;
  } DeviceIoControl;
  ...   ;
} FLT_PARAMETERS, *PFLT_PARAMETERS;

メンバー

  • 共通: すべてのバッファリング メソッドに使用される和集合コンポーネント (どちらもバッファーなしFastIo)。

  • OutputBufferLength: どちらの .OutputBuffer、Direct.OutputBuffer、または FastIo.OutputBuffer メンバーも指していないバッファーの長さ (バイト単位)。

  • InputBufferLength: どちらの .InputBuffer、Buffered.SystemBufferDirect.InputSystemBuffer、または FastIo.InputBuffer メンバーが指すバッファーの長さ (バイト単位)。

  • IoControlCode: ターゲット デバイスのデバイス ドライバーに渡される IOCTL 関数コード。 IOCTL 要求の詳細については、Microsoft Windows SDK ドキュメントの 「I/O 制御コードの使用 」および「デバイス入力および出力制御コード」を参照してください。 (このリソースは、一部の言語や国では使用できない場合があります)。

  • どちらも、バッファリング メソッドがMETHOD_NEITHERされるときに使用される共用体コンポーネントです。 バッファリング メソッドの詳細については、「カーネル モード アーキテクチャ ガイド」の「I/O コントロール コードの定義」を参照してください。

  • どちらの場合も、InputBuffer: 操作の元の要求元が指定した入力バッファーのユーザー モードの仮想アドレス。 I/O マネージャーとフィルター マネージャーでは、これらのアドレスは検証されません。 ユーザー空間アドレスが有効であることを確認するには、ミニフィルターで ProbeForReadProbeForWriteFltLockUserBuffer などのルーチンを使用し、 try/except ブロック内のすべてのバッファー参照を囲む必要があります。 詳細については、「User-Space アドレスを参照する際の バッファー I/O とダイレクト I/O の使用」 および 「エラー」を参照してください。

  • どちらの出力バッファー: 操作の元の要求元が指定した出力バッファーのユーザー モードの仮想アドレス。 I/O マネージャーとフィルター マネージャーでは、これらのアドレスは検証されません。 ユーザー空間アドレスが有効であることを確認するには、ミニフィルターで ProbeForReadProbeForWriteFltLockUserBuffer などのルーチンを使用し、 try/except ブロック内のすべてのバッファー参照を囲む必要があります。 詳細については、「カーネル モード アーキテクチャ ガイド」の「User-Space アドレスを参照する際のバッファー I/O とダイレクト I/O の使用とエラーの使用」を参照してください。

  • N.OutputMdlAddress: N.OutputBuffer メンバーが指していないバッファーを記述するメモリ記述子リスト (MDL) のアドレス。 このメンバーは省略可能であり、NULLできます。

  • Buffered: バッファリング メソッドがMETHOD_BUFFEREDされるときに使用される和集合コンポーネント。 バッファリング メソッドの詳細については、「 I/O コントロール コードの定義」を参照してください。

  • Buffered.SystemBuffer: 操作のシステム割り当てバッファーのアドレス。 METHOD_BUFFERED I/O では、このバッファーは入力と出力の両方に使用されます。 詳細については、「 データ バッファーにアクセスするためのメソッド」を参照してください

  • ダイレクト: バッファリング メソッドがMETHOD_IN_DIRECTまたはMETHOD_OUT_DIRECTされるときに使用される和集合コンポーネント。 バッファリング メソッドの詳細については、「 I/O コントロール コードの定義」を参照してください。

  • Direct.InputSystemBuffer: 操作の入力バッファーのアドレス。 このバッファーは、カーネル モードから安全にアクセスできるように、オペレーティング システムによってロックダウンされます。 詳細については、「 データ バッファーにアクセスするためのメソッド」を参照してください

  • Direct.OutputBuffer: 操作の元の要求元が指定した出力バッファーのユーザー モード仮想アドレス。 ダイレクト I/O では、METHOD_NEITHER I/O とは異なり、ミニフィルターが I/O 操作の元の要求元と同じプロセス コンテキストにある限り、オペレーティング システムはこのバッファーをロックダウンしてカーネル モードから安全にアクセスできるようにします。 (それ以外の場合は 、MmGetSystemAddressForMdlSafe を呼び出して、 OutputMdlAddress メンバーが指すメモリ記述子リスト (MDL) からシステム アドレスを取得する必要があります)。 詳細については、「 ダイレクト I/O でのダイレクト I/Oエラーの使用」を参照してください。

  • Direct.OutputMdlAddress: Direct.OutputBuffer メンバーが指すバッファーを記述する MDL のアドレス。 このメンバーは必須であり、NULL することはできません。

  • FastIo: FLT_CALLBACK_DATA 構造体が高速 I/O IRP_MJ_DEVICE_CONTROL操作を表す場合に使用される和集合コンポーネント。

  • FastIo.InputBuffer: 操作の元の要求元が指定した入力バッファーのユーザー モード仮想アドレス。 I/O マネージャーとフィルター マネージャーでは、これらのアドレスは検証されません。 ユーザー空間アドレスが有効であることを確認するには、ミニフィルターで ProbeForReadProbeForWriteFltLockUserBuffer などのルーチンを使用し、 try/except ブロック内のすべてのバッファー参照を囲む必要があります。 詳細については、「ユーザー空間アドレスを参照する際のエラー」を参照してください。

  • FastIo.OutputBuffer: 操作の元の要求元が指定した出力バッファーのユーザー モード仮想アドレス。 I/O マネージャーとフィルター マネージャーでは、これらのアドレスは検証されません。 ユーザー空間アドレスが有効であることを確認するには、ミニフィルターで ProbeForReadProbeForWriteFltLockUserBuffer などのルーチンを使用し、 try/except ブロック内のすべてのバッファー参照を囲む必要があります。 詳細については、「ユーザー空間アドレスを参照する際のエラー」を参照してください。

注釈

IRP_MJ_DEVICE_CONTROLおよびIRP_MJ_INTERNAL_DEVICE_CONTROL操作のFLT_PARAMETERS構造体には、コールバック データ (FLT_CALLBACK_DATA) 構造体で表される IRP ベースのデバイス I/O コントロール情報操作のパラメーターが含まれています。 これは、 FLT_IO_PARAMETER_BLOCK 構造体に含まれています。

IRP_MJ_DEVICE_CONTROL IRP ベースの操作または高速 I/O 操作を指定できます。

IRP_MJ_INTERNAL_DEVICE_CONTROLは、IRP ベースの I/O 操作です。

必要条件

要件タイプ 要件
ヘッダ Fltkernel.h ( Fltkernel.h を含む)

こちらもご覧ください

FLT_CALLBACK_DATA

FLT_IO_PARAMETER_BLOCK

FLT_IS_FASTIO_OPERATION

FLT_IS_FS_FILTER_OPERATION

FLT_IS_IRP_OPERATION

FLT_PARAMETERS

FltDeviceIoControlFile の

FltLockUserBuffer

IoBuildDeviceIoControlRequest

IRP_MJ_DEVICE_CONTROL

IRP_MJ_INTERNAL_DEVICE_CONTROL

MmGetSystemAddressForMdlSafe

MmProbeAndLockPages

ProbeForRead

ProbeForWrite

ZwDeviceIoControlFile