Всем хорошо известен экспортируемый символ ядра CCHAR KeNumberProcessors - переменная, содержащая количество процессоров. Так же не является тайной, что последние версии Windows поддерживают количество процессоров, выходящее за пределы разрядной сетки одного байта. Так а что же стало с переменной? Документация гласит, что переменная стала obsolete. Но взглянем на использование этой переменной в Windows 2008 R2 (начало функции nt!ExSizeOfRundownProtectionCacheAware):
mov ecx,[KeNumberProcessors]
cmp ecx,1
По приведенному коду сразу становится видно, что глобальная переменная nt!KeNumberProcessors стала четыре байта. И тут возник вопрос: когда это произошло? Можно, конечно, пройтись дизассемблером по коллекции файлов ядра, если она под рукой. Но мне пришла в голову другая идея - отладчик. Ведь он умеет определять количество процессоров, и делает он это точно не вызовом KeGetCurrentProcessorNumber(). Ответ можно найти в коде функции kdexts!GetProcessorCount:
cmp d,[g_BuildNo],000001900 ; == 6400
push esi
jnc .0100EEEB9 --1
mov esi,01004A508 ;'nt!KeNumberProcessors'
push esi
call d,[01013D2F8]
mov ecx,eax
or ecx,edx
jnz .0100EEEAD --3
push esi
push 01004A378 ;'unable to get %s'
call d,[01013D2F4]
pop ecx
pop ecx
xor al,al
jmp .0100EEEB4 --5
3 push edx
push eax
call GetByteFromAddress
5 movzx eax,al
pop esi
retn ; -^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-
1 push 01004A508 ;'nt!KeNumberProcessors'
call GetUlongValue
pop esi
retn ; -^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-
Сразу становится понятно, что nt!KeNumberProcessors стала ULONG'ом в ядре с номером сборки 6400. Так что отладчик может пригодится не только как средство, но и как объект изучения ядра Windows.
P.S. Файл kdexts.dll является реализацией основных встроенных расширений отладки ядра. Сам файл можно найти в поддиректории winxp директории WinDbg.
ΞρεΤΙκ