IRP 구조체(wdm.h)

IRP 구조체는 I/O 요청 패킷을 나타내는 부분적으로 불투명한 구조체입니다. 드라이버는 IRP 구조체의 다음 멤버를 사용할 수 있습니다.

구문

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로 지정됩니다.

NULL.

SystemBuffer.IRP_MJ_WRITE

버퍼는 디바이스 또는 드라이버에 대한 데이터를 제공합니다. 버퍼의 길이는 드라이버의 IO_STACK_LOCATION 구조에서 Parameters.Write.Length로 지정됩니다.

NULL.

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에서 부울 취소 값을 검사 수 있지만 해당 드라이버는 값이 TRUE인 경우에도 하위 수준 드라이버에서 STATUS_CANCELLED IRP가 완료된다고 가정할 수 없습니다.

요구 사항

   
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함)

추가 정보

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoCreateDevice

IoGetCurrentIrpStackLocation

IoGetNextIrpStackLocation

IoSetCancelRoutine

IoSetNextIrpStackLocation