Материала для написания этой статьи было собрано достаточно еще два года назад, когда писалась первая часть о реестре Win9x. Но за отсутствием времени, впрочем как и желания, весь накопленный материал был сложен в папку и забыт до поры до времени. Вернувшись к нему в нынешнем апреле в процессе написания очередной версии прогрраммы Registry Viewer с поддержкой WinNT/2000, я обнаружил, что он далеко не полон. Мне пришлось вновь углубиться в исследование, результат которого - эта статья.
Начну с того, что в отличие от Win9x/Me файлов составляющих реестр WinNT/2000, не два и не три, а ни как не меньше шести. Перечислю их: DEFAULT, SAM, SECURITY, SOFTWARE, SYSTEM, ntuser.dat. В Win2000 добавился UsrClass.dat. По названиям файлов не трудно догадаться, какие ветви реестра они содержат. Есть не мало ресурсов описывающих их содержание и назначение, и я не буду вдаваться в эти подробности, а пожалуй уже приступлю к описанию внутреннего строения реестра WinNT/2000.
Реестр состоит из двух типов блоков: заголовочного и блоков данных. Всю информационную нагрузку несут блоки второго типа. Но давайте попорядку.
Все блоки в реестре кратны 4К, видимо в силу 32-х разрядности системы, а потому и единственный заголовочный блок несущий информации на копейку занимает эти 4К на всю катушку. Вот его структура:
0000: dword 'regf' - сигнатура файла реестра WinNT/2000
0004: 8 dword - набор двойных слов непонятного назначения
0024: dword 20h - возможно размер заголовка блока 'hbin'
0028: dword - размер области данных (кратно 4К)
002C: dword - двойное слово непонятного назначения
0030: 1CCh bytes - мусор
01FC: dword - контрольная сумма предыдущих слов
0200: E00h bytes - не используется
Далее один за одним (может быть и один) следуют блоки данных следующего вида (опять же кратные 4К):
n000: dword 'hbin' - сигнатура блока данных
n004: dword - относительное смещение адресов в блоке (обычно n000h-1000h)
n008: dword - размер блока (указатель на следующий блок)
n00C: Some bytes
n020: Начало данных текущего блока
Данные распределены по блокам различной структуры и длины, которые могут иметь обозначение типа данных, которые содержат, а могут и не иметь. Идем дальше.
Все типизированные блоки какие мне встречались содержат одну из ниже перечисленных сигнатур:
'nk' - элемент дерева (node key ?)
'lf' - короткий индекс, "оглавление" (location field ? labels field ? list field)
'sk' - элемент защиты (security key ?)
'vk' - параметр (value key ?)
'ri' - связка индексов (relation index ?)
'li' - индекс (labels index ? list index)
В скобках варианты расшифровки сигнатур.