次の方法で共有


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

ファイル システム ドライバーは、このフィールドを使用します。このフィールドは、すべてのドライバーに対して読み取り専用です。 ネットワークと、場合によっては、最上位レベルのデバイス ドライバーも、このフィールドを読み取る可能性があります。 このフィールドは、次の 1 つ以上のシステム定義フラグ ビットの 0 またはビットごとの 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 が完了すると想定できません。

要件

要件
Header wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む)

こちらもご覧ください