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

파일 시스템 드라이버는 모든 드라이버에 대해 읽기 전용인 이 필드를 사용합니다. 네트워크 및 최고 수준의 디바이스 드라이버도 이 필드를 읽을 수 있습니다. 이 필드는 다음 시스템 정의 플래그 비트 중 하나 이상의 비트 OR 또는 0으로 설정됩니다.

  • 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의 master 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 제어 코드에 대한 버퍼 설명을 참조하세요.

버퍼는 DeviceIoControlIoBuildDeviceIoControlRequest에 제공되는 입력 버퍼를 나타냅니다.

버퍼의 길이는 드라이버의 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가 취소된 경우 호출할 드라이버 제공 Cancel 루틴의 진입점을 포함합니다. 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의 내부 큐를 관리하는 경우 이 필드를 사용하여 하나의 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 포함)

추가 정보