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
次の条件の両方が適用される場合は、出力バッファーのアドレスを格納します。
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 が完了すると想定することはできません。
必要条件
要件 | 価値 |
---|---|
ヘッダー | wdm.h (Wdm.h、Ntddk.h、Ntifs.h を含む) |
関連項目
- IO_STACK_LOCATION
- IO_STATUS_BLOCK
- IoCreateDevice の
- IoGetCurrentIrpStackLocation
- IoGetNextIrpStackLocation の
- IoSetCancelRoutine の
- IoSetNextIrpStackLocation の