컴파일러중에는 이를 위해서 특정 섹션(Paged 영역등)에 코드를 둘 수 있게 pragma를 지원(ALLOC_PRAGMA)하기도 한다. 아래와 같이 DriverUnload등의 함수를 Paged 영역에 할당되게 설정한다.
#ifdef ALLOC_PRAGMA
#pragma alloc_text(INIT, DriverEntry)
#pragma alloc_text(PAGE, DriverUnload)
:
:
#endif
하지만 위와 같이 사용하였을 경우 IRQL이 DISPATCH_LEVEL 이상인 상태에서 해당 함수가 불릴 경우 페이지 폴트가 발생하여 블루스크린이 발생할 수도 있다. 이것을 방지하기 위해서 해당 함수 앞에 PAGED_CODE() 매크로 를 두어 위 상황에서 바로 시스템 크래쉬를 일으켜 더 복잡한 문제를 방지할 수 있게 해준다.
PAGED_CODE() 매크로는 아래와 같이 wdm.h에 정의되있다.
#define PAGED_CODE() PAGED_ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
댓글 없음:
댓글 쓰기