Kernel mode2014. 12. 10. 18:41

최근 핸들 테이블 검사 코드를 다시 보다가 잘못된 부분이 있어 수정도 할겸 확인한 내용이다.


직접 확인한 OS 목록

 Windows XP                                x86/x64

 Windows 2008(VISTA)                  x86

 Windows 7                                  x86/x64

 Windows 8                                  x86

 Windows 8.1                               x86/x64

 Windows 10 Technical Preview      x86/x64



핸들 테이블의 구조는 핸들 개수에 따라 Top/Middle/Sub Level 3가지로 나뉜다.

핸들 테이블은 하나의 Page 크기(PAGE_SIZE)를 가지며,

Page의 크기는 x86, x64 Processor 모두 0x1000의 크기를 가진다.

(http://msdn.microsoft.com/en-us/library/windows/hardware/ff554138(v=vs.85).aspx)

각 Level은 아래와 같은 개수를 가진다.


Sub 핸들 테이블의 핸들 개수

x86 : (PAGE_SIZE / sizeof(HANDLE_TABLE_ENTRY)) - 1 = 511

x64 : (PAGE_SIZE / sizeof(HANDLE_TABLE_ENTRY)) - 1 = 255


Middle 테이블의 Sub 테이블 포인터 개수

x86 : PAGE_SIZE / sizeof(ULONG_PTR) = 1024

x64 : PAGE_SIZE / sizeof(ULONG_PTR) = 512


Top 테이블의 Middle 테이블 포인터 개수

x86 : 32

x64 : 128


x86과 x64의 테이블 크기나 모양은 차이가 있지만 결국 총 개수는 같다.

32 * 1024 * 512 = 16,777,216

128 * 512 * 256 = 16,777,216


다만 실제 핸들 개수는 차이가 좀 있을 것 같다.

32 * 1024 * 511 = 16,744,448

128 * 512 * 255 = 16,711,680



아래는 프로세스 목록에 있는 프로세스를 오픈한 후,

핸들을 닫지 않는 테스트 프로그램을 켜둔 상태의 핸들 테이블 모양 및 어떤 핸들인지 보는 순서이다.



이렇게 한번 찾아가면서 정리하고 나니 확실히 정리가 되는듯.

Posted by hswang