Всем хорошо известен экспортируемый символ ядра 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.
ΞρεΤΙκ