한 걸음씩..

PCI Driver - IRP_MN_START_DEVICE 에서 주의 할 점 본문

프로그래밍

PCI Driver - IRP_MN_START_DEVICE 에서 주의 할 점

반엘 2013. 7. 20. 21:00
DTM 테스트를 진행하다 보면 드라이버가 동작하고 있는 도중에 갑자기 

IRP_MN_START_DEVICE 명령이 한 번더 오는 경우가 발생합니다.

PCI 드라이버의 IRP_MN_START_DEVICE  부분은

메모리 할당 및 ISR 등록 등의 작업을 진행하게 될 텐데

이때 예외처리를 정확히 해줘야 인증에 통과할 수 있습니다.

IoConnectInterrupt()를 사용해서 ISR을 등록하는 부분에서

if ( pDeviceExtension->InterruptObject != NULL )
{

IoDisconnectInterrupt(pDeviceExtension->InterruptObject );
pDeviceExtension->InterruptObject = NULL;

}


ntStatus =  IoConnectInterrupt( &pDeviceExtension->InterruptObject, ......... );


위와 같이 예외처리를 해 줘야 합니다.


이미 ISR이 등록되어져 있는 상태일 수 있기 때문 입니다.


위와 같은 예외처리 없이 DTM 테스트 또는 PnP 테스트를 진행하다 보면


아래와 같은 메모리 덤프가 발생하는 것을 볼 수 있습니다.


8d15d2fc 82b14e71 00000003 cfb9ff4e 00000065 nt!RtlpBreakWithStatusInstruction

8d15d34c 82b1596d 00000003 9992d000 9992d000 nt!KiBugCheckDebugBreak+0x1c

8d15d710 82a7e7eb 0000000a 9992d000 00000009 nt!KeBugCheck2+0x68b

8d15d710 9992d000 0000000a 9992d000 00000009 nt!KiTrap0E+0x2cf

WARNING: Frame IP not in any known module. Following frames may be wrong.

8d15d7cc 82a77489 85dfaa02 000000a2 8d15d87c nt!KiChainedDispatch2ndLvl+0x60

8d15d7cc 82a9f8a1 85dfaa02 000000a2 8d15d87c nt!KiChainedDispatch+0x29

8d15d87c 82ac66ce 807c2120 00000000 00000002 nt!KiExitDispatcher+0x11a

...

...

...


그냥... 드라이버가 사라졌다고 하니... 이걸 어떻게 잡을 수 있겠습니까?