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의 마스터 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
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가 큐에 대기되지 않는 경우 드라이버에서 이 필드를 사용하여 최대 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 경우에도 하위 수준 드라이버에서 IRP가 STATUS_CANCELLED 완료된다고 가정할 수 없습니다.
요구 사항
요구 | 값 |
---|---|
헤더 | wdm.h(Wdm.h, Ntddk.h, Ntifs.h 포함) |