[Device Driver] 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 );
}
출처 : 디바이스 드라이버 구조와 원리 그리고 제작 노하우