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
次の条件の両方が適用される場合は、出力バッファーのアドレスを格納します。
I/O スタックの場所の主要な関数コードは 、IRP_MJ_DEVICE_CONTROL または IRP_MJ_INTERNAL_DEVICE_CONTROLです。
I/O 制御コードは、METHOD_NEITHERまたはMETHOD_BUFFEREDで定義されています。
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 を含む) |