Вот некоторые хитрости, которые необходимо учитывать при работе с реестром.
Обычно в первом же блоке данных первым идет блок содержащий корневой элемент дерева. Для такого элемента значение поля флага равно 2Ch, хотя возможно только установленные 2-й и 3-й биты флага, т.к. 9-й бит флага отвечает за использование unicode в имени ключа (установлен - не используется, сброшен - используется). Значения других битов флага неизвестно.
Если у ключа есть параметр с нулевой длиной имени, то это параметр 'Default' (при экспорте обозначается символом '@').
Если длина значения параметра отрицательная, то значение параметра хранится в самом блоке параметра на месте указателя на значение параметра. Реальный размер значения параметра в таком случае получается путем сброса старшего бита в 0 и обычно не превышает 4 байт.
Указатель на предка ссылается непосредственно на nk-блок.
Указатель на индекс по потомкам может ссылаться либо на lf-блок, либо на ri-блок. Надо проверять при работе.
Если размер блока отрицательный, значит блок используется (надо брать абсолютную величину), если положительный, то это просто выравнивание (свободное место).
Самый распространенный размер hbin-блока 1000h байт (4К). Обычно их размер не превышает F000h, но бывают исключения. Мне попался блок размером 46000h байт (280К). Не стоит упускать это из виду.
ПРИЛОЖЕНИЕ 1