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_CONTROLIRP_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_CONTROLIRP_MJ_INTERNAL_DEVICE_CONTROL

    緩衝區代表提供給 DeviceIoControl 和 IoBuildDeviceIoControlRequest 的輸入和輸出緩衝區。 輸出數據會覆寫輸入數據。

針對輸入,緩衝區的長度是由驅動程式IO_STACK_LOCATION結構中的Parameters.DeviceIoControl.InputBufferLength所指定。

針對輸出,緩衝區的長度是由驅動程式IO_STACK_LOCATION結構中的Parameters.DeviceIoControl.OutputBufferLength所指定。

如需詳細資訊,請參閱 I/O 控件代碼的緩衝區描述

緩衝區代表提供給 DeviceIoControlIoBuildDeviceIoControlRequest 的輸入緩衝區。

緩衝區的長度是由驅動程式IO_STACK_LOCATION結構中的Parameters.DeviceIoControl.InputBufferLength所指定。

如需詳細資訊,請參閱 I/O 控件代碼的緩衝區描述

如果驅動程式使用直接 I/O,緩衝區的用途是由 IRP 主要函式程式碼所決定,如下所示:

ThreadListEntry

保留供內部系統使用。

IoStatus

包含驅動程式在呼叫IoCompleteRequest之前儲存狀態和資訊的IO_STATUS_BLOCK結構。

RequestorMode

指出作業原始要求者的執行模式,也就是 UserModeKernelMode 的其中一個。

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

如果適用下列兩個條件,則包含輸出緩衝區的位址:

針對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)

另請參閱