가상 디바이스 드라이버를 작성하고 있습니다.
디바이스 드라이버를 공부하기 시작한지 얼마되지 않아서 코드가 문제가 생겨도
어디서 문제가 생기는지를 가늠할 수가 없네요
문제는 HID Miniport드라이버를 작성했습니다.
IOCTL_READ_REPORT 을 처리할때 등록했던 DPC루틴에서
IRQL 에러가 나면서 블루스크린이 뜨는데요.
여기서 제가 한 행동은 전역으로 작성한 배열에 값을 쓰니까 메모리 이런 에러가 납니다.
일단 IRQL문제가 아닐까 생각이 되서
IRQL을 어떻게 확인하고 어떻게 다뤄야 하는지 알아보려고 하는데 아직 잘 모르겠네요.
해당 코드가 실행되는 위치에 IRQL은 그 코드위치에서 KeGetCurrentIrql 함수를 호출해주시면 됩니다.
이 함수는 현재의 IRQL을 리턴해줍니다.
IRQL은 다음과 같이 #define 되어 있습니다. ( x86에 경우 )
#if defined(_X86_)
//
// Interrupt Request Level definitions
//
#define PASSIVE_LEVEL 0 // Passive release level
#define LOW_LEVEL 0 // Lowest interrupt level
#define APC_LEVEL 1 // APC interrupt level
#define DISPATCH_LEVEL 2 // Dispatcher level
#define CMCI_LEVEL 5 // CMCI handler level
#define PROFILE_LEVEL 27 // timer used for profiling.
#define CLOCK1_LEVEL 28 // Interval clock 1 level - Not used on x86
#define CLOCK2_LEVEL 28 // Interval clock 2 level
#define IPI_LEVEL 29 // Interprocessor interrupt level
#define POWER_LEVEL 30 // Power failure level
#define HIGH_LEVEL 31 // Highest interrupt level
#define CLOCK_LEVEL (CLOCK2_LEVEL)
#endif
KdPrint 함수로 출력해보시면 해당 위치에 IRQL를 바로 아실 수 있을것입니다.