| 
 | 
 | 
Материала для написания этой статьи было собрано достаточно еще два года назад, когда писалась первая часть о реестре 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)
В скобках варианты расшифровки сигнатур.