한 걸음씩..

[Device Driver] IRP Dispatch Routine 본문

프로그래밍

[Device Driver] IRP Dispatch Routine

반엘 2013. 9. 3. 09:30


       IRP Dispatch Routine


1. 외부로부터 명령어(IRP)를 받는 곳

2. PnP Manager로부터 전달되는 IRP를 처리하는 함수


NTSTATUS SamplePnpDispatch(

PDEVICE_OBJECT pDeviceObject,

PIRP pIrp)

{

PIO_STACK_LOCATION pIoStackLocation;

PDEVICE_EXTENSION pDeviceExtension;

NTSTATUS status;

PDEVICE_OBJECT pTargetDevice;

pDeviceExtension = ( PDEVICE_EXTENSION )pDeviceObject->DeviceExtension;

//DeviceExtension 구조체에 저장해 놓은 DeviceStack 상의 하위 DeviceObject 

pTargetDevice = pDeviceExtension->pLowerDeviceObject;

//IRP 내부에 존재하는 IO Stack 포인터 위치( CurrentStackLocation이 가리키는 값 )를 리턴받음

pIoStackLocation = IoGetCurrentIrpStackLocation( pIrp );


switch( pIoStackLocation->MinorFunction )

{

case IRP_MN_START_DEVICE:

//...

break;

case IRP_MN_REMOVE_DEVICE:

IoDetachDevice( pTargetDevice ); // Device Stack에서 현재 Device Object와의 연결을 끊음

IoDeleteDevice( pDeviceObject ); // 현재 Device Object를 제거

break;

// 기타 다른 IRP_MN_.... 처리 

default:

break;

}

// 현재 IRP에 대해서 더 이상 간섭하지 않겠다는 의미

IoSkipCurrentIrpStackLocation( pIRP );

// 현재 IRP를 Device Stack상의 하위 Device Object로 전달

return IoCallDriver ( pTargetDevice, pIrp );

}


출처 : 디바이스 드라이버 구조와 원리 그리고 제작 노하우