次の方法で共有


IRP 構造体 (wdm.h)

IRP 構造体は、I/O 要求パケットを表す部分的に不透明な構造体です。 IRP 構造体の文書化されていないメンバーは、I/O マネージャーまたは場合によってはファイル システム ドライバー (FSD) によってのみ使用され、予約されています。

構文

typedef struct _IRP {
  CSHORT                    Type;
  USHORT                    Size;
  PMDL                      MdlAddress;
  ULONG                     Flags;
  union {
    struct _IRP     *MasterIrp;
    __volatile LONG IrpCount;
    PVOID           SystemBuffer;
  } AssociatedIrp;
  LIST_ENTRY                ThreadListEntry;
  IO_STATUS_BLOCK           IoStatus;
  KPROCESSOR_MODE           RequestorMode;
  BOOLEAN                   PendingReturned;
  CHAR                      StackCount;
  CHAR                      CurrentLocation;
  BOOLEAN                   Cancel;
  KIRQL                     CancelIrql;
  CCHAR                     ApcEnvironment;
  UCHAR                     AllocationFlags;
  union {
    PIO_STATUS_BLOCK UserIosb;
    PVOID            IoRingContext;
  };
  PKEVENT                   UserEvent;
  union {
    struct {
      union {
        PIO_APC_ROUTINE UserApcRoutine;
        PVOID           IssuingProcess;
      };
      union {
        PVOID                 UserApcContext;
#if ...
        _IORING_OBJECT        *IoRing;
#else
        struct _IORING_OBJECT *IoRing;
#endif
      };
    } AsynchronousParameters;
    LARGE_INTEGER AllocationSize;
  } Overlay;
  __volatile PDRIVER_CANCEL CancelRoutine;
  PVOID                     UserBuffer;
  union {
    struct {
      union {
        KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
        struct {
          PVOID DriverContext[4];
        };
      };
      PETHREAD     Thread;
      PCHAR        AuxiliaryBuffer;
      struct {
        LIST_ENTRY ListEntry;
        union {
          struct _IO_STACK_LOCATION *CurrentStackLocation;
          ULONG                     PacketType;
        };
      };
      PFILE_OBJECT OriginalFileObject;
    } Overlay;
    KAPC  Apc;
    PVOID CompletionKey;
  } Tail;
} IRP;

メンバーズ

Type

内部システム用に予約されています。

Size

内部システム用に予約されています。

MdlAddress

ドライバーがダイレクト I/O を使用していて、IRP の主要な関数コードが次のいずれかである場合は、ユーザー バッファーを記述する MDL へのポインター。

  • IRP_MJ_READ

    MDL は、デバイスまたはドライバーが入力する空のバッファーを記述します。

  • IRP_MJ_WRITE

    MDL は、デバイスまたはドライバーのデータを含むバッファーを記述します。

  • IRP_MJ_DEVICE_CONTROL または IRP_MJ_INTERNAL_DEVICE_CONTROL

    IOCTL コードがMETHOD_IN_DIRECT転送の種類を指定する場合、MDL は、デバイスまたはドライバーのデータを含むバッファーを記述します。

IOCTL コードでMETHOD_OUT_DIRECT転送の種類が指定されている場合、MDL は、デバイスまたはドライバーが入力する空のバッファーを記述します。

IOCTL コードのMETHOD_IN_DIRECTおよびMETHOD_OUT_DIRECT転送の種類に関連付けられているバッファーの詳細については、「I/O コントロール コードのバッファーの説明を参照してください。

ドライバーが直接 I/O を使用していない場合、このポインターは NULL

Flags

ファイル システム ドライバーは、このフィールドを使用します。このフィールドは、すべてのドライバーに対して読み取り専用です。 ネットワークと、場合によっては、最上位のデバイス ドライバーもこのフィールドを読み取る可能性があります。 このフィールドは、0 または次のシステム定義フラグ ビットの 1 つ以上のビットごとの OR に設定されます。

  • IRP_NOCACHE
  • IRP_PAGING_IO
  • IRP_MOUNT_COMPLETION
  • IRP_SYNCHRONOUS_API
  • IRP_ASSOCIATED_IRP
  • IRP_BUFFERED_IO
  • IRP_DEALLOCATE_BUFFER
  • IRP_INPUT_OPERATION
  • IRP_SYNCHRONOUS_PAGING_IO
  • IRP_CREATE_OPERATION
  • IRP_READ_OPERATION
  • IRP_WRITE_OPERATION
  • IRP_CLOSE_OPERATION
  • IRP_DEFER_IO_COMPLETION
  • IRP_OB_QUERY_NAME
  • IRP_HOLD_DEVICE_QUEUE
  • IRP_UM_DRIVER_INITIATED_IO

AssociatedIrp

内部システム用に予約されています。

AssociatedIrp.MasterIrp

IoMakeAssociatedIrp する最上位レベルのドライバーの呼び出しによって作成された IRP のマスター IRP へのポインター。

AssociatedIrp.IrpCount

内部システム用に予約されています。

AssociatedIrp.SystemBuffer

システム空間バッファーへのポインター。

ドライバーがバッファー I/O を使用している場合、バッファーの目的は、次のように IRP メジャー関数コードによって決定されます。

  • SystemBuffer.IRP_MJ_READ

    バッファーは、デバイスまたはドライバーからデータを受信します。 バッファーの長さは、ドライバーの IO_STACK_LOCATION 構造体 Parameters.Read.Length によって指定されます。

  • SystemBuffer.IRP_MJ_WRITE

    バッファーは、デバイスまたはドライバーのデータを提供します。 バッファーの長さは、ドライバーの IO_STACK_LOCATION 構造体 Parameters.Write.Length によって指定されます。

  • SystemBuffer.IRP_MJ_DEVICE_CONTROL または IRP_MJ_INTERNAL_DEVICE_CONTROL

    このバッファーは、DeviceIoControl および IoBuildDeviceIoControlRequest に提供される入力バッファーと出力バッファーの両方を表します。 出力データは入力データを上書きします。

入力の場合、バッファーの長さは、ドライバーの IO_STACK_LOCATION 構造体 Parameters.DeviceIoControl.InputBufferLength によって指定されます。

出力の場合、バッファーの長さは、ドライバーの IO_STACK_LOCATION 構造体 Parameters.DeviceIoControl.OutputBufferLength によって指定されます。

詳細については、「I/O 制御コード のバッファーの説明をする」を参照してください。

このバッファーは、DeviceIoControl および IoBuildDeviceIoControlRequest に提供される入力バッファーを表します。

バッファーの長さは、ドライバーの IO_STACK_LOCATION 構造体 Parameters.DeviceIoControl.InputBufferLength によって指定されます。

詳細については、「I/O 制御コード のバッファーの説明をする」を参照してください。

ドライバーが直接 I/O を使用している場合、バッファーの目的は、次のように IRP の主要な関数コードによって決定されます。

ThreadListEntry

内部システム用に予約されています。

IoStatus

IoCompleteRequest を呼び出す前にドライバーが状態と情報格納する IO_STATUS_BLOCK 構造体を格納します。

RequestorMode

操作の元の要求元の実行モードを示します。UserMode または KernelMode のいずれかです。

PendingReturned

TRUE に設定すると、ドライバーは保留中の IRP をマークしています。 IoCompletion ルーチン ごとに、このフラグの値を確認する必要があります。 フラグが TRUE 場合、および IoCompletion ルーチンがSTATUS_MORE_PROCESSING_REQUIREDを返さない場合、ルーチンは IoMarkIrpPending 呼び出して、保留中の状態をデバイス スタックの上のドライバーに伝達する必要があります。

StackCount

内部システム用に予約されています。

CurrentLocation

内部システム用に予約されています。

Cancel

TRUEに設定すると、IRP は取り消されるか取り消されます。

CancelIrql

IoAcquireCancelSpinLock が呼び出されたときにドライバーが実行されている IRQL 格納されます。

ApcEnvironment

内部システム用に予約されています。

AllocationFlags

内部システム用に予約されています。

UserIosb

内部システム用に予約されています。

IoRingContext

内部システム用に予約されています。

UserEvent

内部システム用に予約されています。

Overlay

内部システム用に予約されています。

Overlay.AsynchronousParameters

内部システム用に予約されています。

Overlay.AsynchronousParameters.UserApcRoutine

内部システム用に予約されています。

Overlay.AsynchronousParameters.IssuingProcess

内部システム用に予約されています。

Overlay.AsynchronousParameters.UserApcContext

内部システム用に予約されています。

Overlay.AsynchronousParameters.IoRing

内部システム用に予約されています。

Overlay.AllocationSize

内部システム用に予約されています。

CancelRoutine

IRP が取り消された場合に呼び出されるドライバー指定 キャンセル ルーチンのエントリ ポイントを格納します。 NULL は、IRP が現在取り消し不可能であることを示します。

UserBuffer

次の条件の両方が適用される場合は、出力バッファーのアドレスを格納します。

METHOD_BUFFEREDの場合、ドライバーは、出力バッファーとして Irp->AssociatedIrp.SystemBuffer が指すバッファーを使用する必要があります。 ドライバーが要求を完了すると、I/O マネージャーは、Irp->UserBufferによって指されている出力バッファーにこのバッファーの内容をコピーします。 ドライバーは、Irp->UserBufferによって指されるバッファーに直接書き込むべきではありません。 詳細については、「I/O 制御コード のバッファーの説明をする」を参照してください。

Tail

内部システム用に予約されています。

Tail.Overlay

内部システム用に予約されています。

Tail.Overlay.DeviceQueueEntry

ドライバーのデバイス オブジェクトに関連付けられているデバイス キューに IRP がキューに入っている場合、このフィールドはデバイス キュー内の IRP をリンクします。 これらのリンクは、ドライバーが IRP を処理している間にのみ使用できます。

Tail.Overlay.DriverContext[4]

ドライバーのデバイス オブジェクトに関連付けられているデバイス キューに IRP がキューに入っていない場合、このフィールドは、ドライバーが最大 4 つのポインターを格納するために使用できます。 このフィールドは、ドライバーが IRP を所有している間にのみ使用できます。

Tail.Overlay.Thread

呼び出し元のスレッド制御ブロック (TCB) へのポインター。 ユーザー モードで送信された要求の場合、I/O マネージャーは常に、要求を発行したスレッドの TCB を指すようにこのフィールドを設定します。

Tail.Overlay.AuxiliaryBuffer

内部システム用に予約されています。

Tail.Overlay.ListEntry

ドライバーが IRP の独自の内部キューを管理する場合は、このフィールドを使用して、1 つの IRP を次の IRP にリンクします。 これらのリンクは、ドライバーがキューに IRP を保持している間、または IRP を処理している間にのみ使用できます。

Tail.Overlay.CurrentStackLocation

内部システム用に予約されています。

Tail.Overlay.PacketType

内部システム用に予約されています。

Tail.Overlay.OriginalFileObject

内部システム用に予約されています。

Tail.Apc

内部システム用に予約されています。

Tail.CompletionKey

内部システム用に予約されています。

備考

IRP 構造体の文書化されていないメンバーは予約されており、I/O マネージャーによってのみ、または場合によってはファイル システム ドライバー (FSD) によってのみ使用されます。

IRP は、ドライバーと通信し、ドライバーが相互に通信できるようにするために使用される基本的な I/O マネージャー構造です。 パケットは、次の 2 つの異なる部分で構成されます。

  • ヘッダー、またはパケット の固定部分— これは、呼び出し元のデバイスに依存しないパラメーター、ファイルが開かれているデバイス オブジェクトのアドレスなど、元の要求に関する情報を格納するために I/O マネージャーによって使用されます。 また、要求の最終的な状態などの情報を格納するために、ドライバーによっても使用されます。

  • I/O スタックの場所 — ヘッダーの後には、要求がバインドされている階層化されたドライバーのチェーン内のドライバーごとに 1 つずつ、I/O スタックの場所のセットがあります。 各スタックの場所には、対応するドライバーが何を行うかを判断するために使用されるパラメーター、関数コード、コンテキストが含まれています。 詳細については、IO_STACK_LOCATION 構造を参照してください。

上位レベルのドライバーは、IRP の キャンセル ブール値の値を確認することがありますが、そのドライバーは、値が TRUE 場合でも、下位レベルのドライバーによってSTATUS_CANCELLEDで IRP が完了すると想定することはできません。

必要条件

要件 価値
ヘッダー wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)

関連項目