본문 바로가기

Programming/Windows&C#

[Windows/WDM] IRP란

728x90
반응형

윈도우 프로그래밍은 일반 콘솔 프로그램과 다르게 메세지 구동 방식이다. 즉 콘솔 프로그램이 함수들이 순차적으로 진행이 된다면, 윈도우 프로그램은 사용자가 특정한 작업을 하게되면 그에 해당하는 윈도우 메세지가 발생하고 그러한 메세지를 현재 활성화 되어있는 프로그램의 메세지 큐에 집어 넣게된다. 그러면 크로그램은 메시지 큐에서 메세지를 가져와서 그에 해당하는 작업을 한다.

 

이처럼 드라이버 역시 이와 비슷하게 작동을 하는데 드라이버는 로딩이 성공적으로 이루어지면 할당된 메모리에 대기하고 있다가 자신이 컨트롤하고 있는 디바이스에 특정한 요청이 왔을 때 윈도우에서 보내주는 특정 요청 정보를 토대로 적절한 동작을 처리한다. 이 때 윈도우 프로그램이 특정 메세지를 처리하기 위해 해당 메세지 값과 그에 관련된 정보들이 MSG라고 하는 구조체를 파라미터로 받아 처리하듯 드라이버 역시 이와 가은 특정 요청에 관련된 정보들을 함수의 파라미터로 받게 된다.

이러한 정보를 담은 미리 정의된 구조체가 바로 IRP이다. IRP에는 많은 정보를 포항하고 있으며 IRP의 종류에 따라 다른 형식의 정보를 가지고 있도록 여러개의 union을 정의하고 있는 구초제이다.

 

 

typedef struct _IRP
{
CSHORT Type;
USHORT Size;
PMDL MdlAddress;
ULONG Flags;
union
{
struct _IRP *MasterIrp;
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;
PIO_STATUS_BLOCK UserIosb;
PKEVENT UserEvent;
union
{
struct
{
PIO_APC_ROUTINE UserApcRoutine;
PVOID UserApcContext;
} AsynchronousParameters;
LARGE_INTEGER AllocationSize;
} Overlay;
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, *PIRP

출처 :

IRP.pdf

pds4.egloos.com/pds/200705/02/63/chapter1.pdf

반응형