본문 바로가기

reversing/Windows Driver

PAGED_CODE()

SMALL

드라이버를 제작하면서 여기저기 코드를 찾다보면

PAGED_CODE()위와 같은 함수들이 DriverEntry 시작부분에 등록되어 있다.

뭐지 하면서 찾아보았다.

#define PAGED_CODE() {   if (KeGetCurrentIrql() > APC_LEVEL) {KdPrint(("EX: Pageable code called at IRQL %d\n", KeGetCurrentIrql()));PAGED_ASSERT(FALSE); } }


보통 메크로 함수로 사용된다고 한다.

현재 IRQL을 확인하고 APC LEVEL보다 높으면 종료하는 코드이다.

*IRQL[Interrupt Request Level]


인터럽트의 우선순위? Level이 현재 코드의 우선순위 보다 높으면 쫓겨나기 때문에? 인거 같다.


만약에 코드를 PAGE 풀 하게 할려면 alloc_text를 사용하는 것 같다.

#ifdef ALLOC_PRAGMA #pragma alloc_text( INIT, DriverEntry ) #pragma alloc_text( PAGE, SioctlCreateClose) #pragma alloc_text( PAGE, SioctlDeviceControl) #pragma alloc_text( PAGE, SioctlUnloadDriver) #pragma alloc_text( PAGE, PrintIrpInfo) #pragma alloc_text( PAGE, PrintChars) #endif // ALLOC_PRAGMA
위와 같이.

추가.

#if (NTDDI_VERSION >= NTDDI_VISTA)

#define PAGED_ASSERT( exp ) NT_ASSERT( exp )

#else

#define PAGED_ASSERT( exp ) ASSERT( exp )

#endif

참고 : http://osronline.com/showThread.CFM?link=195247







LIST

'reversing > Windows Driver' 카테고리의 다른 글

[Device Stack] 디바이스 스택  (0) 2017.07.25
MDL(Memory Descriptor List)  (0) 2017.07.21
DPC (Deferred Procedure Calls)  (0) 2017.07.20
[PAE] Linear Address to Physical Address  (0) 2016.12.04
DRIVER OBJECT 구조체  (0) 2016.08.11