wdm.h (IRP 結構)
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
描述使用者緩衝區的 MDL 指標,如果驅動程式使用直接 I/O,而 IRP 主要函式程式代碼為下列其中一項:
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
文件系統驅動程式會使用此欄位,這是所有驅動程式的唯讀。 網路和可能的最高層級設備驅動器也可能讀取此欄位。 此欄位設定為零,或設定為下列一或多個系統定義旗標位的位 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
包含驅動程式提供的 Cancel 例程的進入點,如果取消 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 未排入與驅動程式裝置對象相關聯的裝置佇列中,驅動程式可以使用此欄位來儲存最多四個指標。 此欄位只能在驅動程式擁有 IRP 時使用。
Tail.Overlay.Thread
呼叫端線程控制區塊的指標, (TCB) 。 對於源自使用者模式的要求,I/O 管理員一律會將此欄位設定為指向發出要求之線程的 TCB。
Tail.Overlay.AuxiliaryBuffer
保留供內部系統使用。
Tail.Overlay.ListEntry
如果驅動程式管理自己的內部 IRP 佇列,它會使用此欄位將一個 IRP 連結到下一個。 只有在驅動程式在其佇列中保存 IRP 或正在處理 IRP 時,才能使用這些連結。
Tail.Overlay.CurrentStackLocation
保留供內部系統使用。
Tail.Overlay.PacketType
保留供內部系統使用。
Tail.Overlay.OriginalFileObject
保留供內部系統使用。
Tail.Apc
保留供內部系統使用。
Tail.CompletionKey
保留供內部系統使用。
備註
IRP 結構的未記載成員是保留的,僅供 I/O 管理員使用,或在某些情況下,由文件系統驅動程式 (FSD) 使用。
IRP 是用來與驅動程序通訊的基本 I/O 管理員結構,並允許驅動程式彼此通訊。 封包包含兩個不同的部分:
封包的標頭或固定部分— I/O 管理員會使用此標頭來儲存原始要求的相關信息,例如呼叫端的裝置獨立參數、開啟檔案所在之裝置對象的位址等等。 驅動程式也會使用它來儲存資訊,例如要求的最終狀態。
I/O 堆疊位置 - 在標頭之後是一組 I/O 堆棧位置,每個驅動程式在要求系結的分層驅動程式鏈結中各一個驅動程式。 每個堆疊位置都包含對應驅動程式所使用的參數、函式程式代碼和內容,以判斷其應該執行的動作。 如需詳細資訊,請參閱 IO_STACK_LOCATION 結構。
雖然較高層級的驅動程式可能會在 IRP 中檢查 Cancel Boolean 的值,但該驅動程式無法假設即使值為 TRUE,該驅動程式仍會以較低層級驅動程式STATUS_CANCELLED完成 IRP。
規格需求
需求 | 值 |
---|---|
標頭 | wdm.h (包括 Wdm.h、Ntddk.h、Ntifs.h) |