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 제어 코드에 대한 버퍼 설명을 참조하세요.
버퍼는 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가 취소된 경우 호출할 드라이버 제공 Cancel 루틴의 진입점을 포함합니다. NULL 은 IRP가 현재 취소할 수 없음을 나타냅니다.
UserBuffer
다음 조건이 모두 적용되는 경우 출력 버퍼의 주소를 포함합니다.
- I/O 스택 위치의 주요 함수 코드는 IRP_MJ_DEVICE_CONTROL 또는 IRP_MJ_INTERNAL_DEVICE_CONTROL.
- I/O 제어 코드는 METHOD_NEITHER 또는 METHOD_BUFFERED 정의되었습니다.
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 구조를 참조하세요.
요구 사항
헤더 | wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함) |