Содержание · Работа · Меню · Режим

## Шаблоны редактора дисков

Дисковый редактор, кроме встроенных шаблонов, поддерживает пользовательские шаблоны для просмотра и редактирования различных дисковых структур. В шаблонах могут использоваться условия, операторы перехода, переменные для разбора сложных дисковых структур, таких как записи MFT.

По умолчанию шаблоны загружаются из файла template.txt. Для использования других файлов можно изменить параметр editortemplates= ini-файла, допускаются символы подстановки (например, editortemplates=template*).

### Структура файла шаблонов

Каждый шаблон начинается с указания имени в квадратных скобках [Template Name], за которым следуют параметры и инструкции шаблона (по одной на строку файла).

### Параметры шаблона

guid:{GUID} - идентификатор шаблона.
o:1 - шаблон может применяться к невыровненным по секторам сктруктурам (может применяться смещение).
fuse:0 - не использовать шаблон.
flow:0 - отображение по одной записи.
flow:1 - отображение записей одна за другой.
big-endian:1 - определяет порядок байт "big-endian".
h:Header - отображение постоянного заголовка Header.

### Константы

Константы указываются в виде десятичных и шестнадцатеричных (с префиксом 0x) целых чисел.

### Переменные

$RECSIZE - размер записи шаблона
$RECDEVOFS - позиция текущей записи на диске (в байтах от начала диска)
$NEXTOFS - смещение, применяемое к блокам данных (см. далее)
$OFFSET - дополнительное относительное смещение, применяемое к блокам данных
$XOFS - дополнительное смещение столбца для вывода (см. ниже x:X)
$1 ... $4 - глобальные пользовательские переменные (64-битные целые со знаком)
$varname - локальная переменная (64-битное целое со знаком), где varname чувствительна к регистру и может содержать цифры, латинские буквы и символы подчеркивания. Локальная переменная должна быть инициализирована с помощью оператора присваивания := и действительна только внутри блока инструкций, в котором она инициализирована.

### Блоки данных

Блок данных - это, обычно, отдельный байт/слово/двойное слово в указанной позиции, но также допустимы диапазоны байтов/бит, обрабатываемых как одна переменная. Блок данных заключается в фигурные скобки {...}.

{Z} определяет диапазон Z байт, начиная со смещения $NEXTOFS (при этом $NEXTOFS будет увеличен на Z байт);
{X,Z} определяет диапазон Z байт, начиная со смещения X,
{X:Y,Z} определяет диапазон Z бит, начиная со смещения X байт Y бит,
где X, Y и Z - любые переменные или константы;
несколько диапазонов разделяются точкой с запятой, например, {0x00,4;$1:$2,4}.

### Форматы данных

Формат определяет способ отображения и редактирования блока данных (например, целое число / символ / строка).

Поддерживаются следующие форматы:
%u - беззнаковое целое (до 64 бит)
%d - целое со знаком (до 64 бит)
%X / %x - шестнадцатеричное число (до 64 бит)
%c - символ ANSI (8 бит)
C - строка ANSI
U - строка в Юникоде (UTF-16)
u - строка в кодировке utf-8
T - текстовая строка (в зависимости от таблицы кодировки)
CXm - побайтовый шестнадцатеричный вывод в несколько строк
UNIXDATE - дата в формате Unix (секунды с 1980)
FILETIME - дата в формате Windows file time (наносекунды с 1601)
F:ABCD.. - флаги (где A отображается, если выставлен бит 0, и B - если снят, и т.д.)

### Вывод

Инструкция вывода определяет положение на экране и формат блока данных или переменной или просто выводит текст.

{...},x:X,w:W,c:C,Format выводит блок данных {...} в колонке X максимальной ширины W цветом С в формате Format.
x:X,w:W,c:C,Text выводит Text в колонке X максимальной ширины W. Text может быть заключен в кавычки ("Text").

Параметры w:W и c:C опциональны (0 - цвет по умолчанию, 1 - заголовок, 8 - красный, 10 - серый).

Вывод производится в текущую строку, инструкция = (знак равенства) выполняет переход к следующей строке.

### Операторы и выражения

Выражение - это комбинация переменных, констант, блоков данных и операторов (~, NOT; *, /, %; +, -; <<, >>; <, <=, >, >=; =, !=; &; ^; |; AND; OR), например:
$2+{0x08:$1,5}

Оператор присваивания := используется для копирования результата выражения в переменную, например:
$1:=$2+{0x08:$1,5}
$2:=$OFFSET & 8

### Условия, циклы и переходы

#### Условия

IF Выражение1
... (инструкции для выполнения, если результат Выражения1 ненулевой/истина)
ELSEIF Выражение2
... (иначе инструкции для выполнения, если результат Выражения2 ненулевой/истина)
ELSE
... (иначе инструкции для выполнения в остальных случаях)
ENDIF

#### Циклы

WHILE Выражение3
... (инструкции для выполнения пока результат Выражение3 ненулевой/истина)
перейти к началу цикла:
CONTINUE
прервать выполнение цикла:
BREAK
ENDWHILE

#### Переходы

Строка LABEL:N определяет метку, а инструкция GOTO:N - переход на строку LABEL:N, где N - любая константа. Неаккуратное использование оператора перехода GOTO может привести к зацикливанию.

### Переключатели и горячие ссылки

Инструкция переключателя $1:=TOGGLE:N,x:X выводит поле переключателя [+] ([-]) в столбце X текущей строки вывода, где N - уникальный номер переключателя (переменная или константа); и переменная $1 принимает значение 0 или 1 в зависимости от состояния переключателя (переключение происходит нажатием клавиши [пробел] или кликом мыши). Это позволяет изменять вывод шаблона на лету (например, разворачивать / сворачивать структуры, где номер переключателя N удобно устанавливать равным смещению структуры).

Инструкция горячей ссылки $VAR=Param делает текущую строку вывода горячей ссылкой, т.е. позволяет переходить к смещению объекта / записи / открывать другой связанный объект в окне редактора двойным щелчком по строке (или нажатием [Enter]). Param - это значение выражения, используемое ссылкой (смещение, номер записи, файла, сектора и т.д.), и $VAR - одна из следующих специальных переменных:
$GOTOREC, $GOTORECOFS - перейти к указанным номеру и смещению записи объекта
$GOTOOFS - перейти к указанному смещению объекта
$OPENLBA - открыть указанный сектор диска
$OPENDEVOFS - открыть указанный байт диска
$OPENVOLSEC - открыть указанный сектор тома
$OPENCLUSTER - открыть указанный кластер тома
$OPENVOLPAGE - открыть указанную страницу / объект тома
$OPENFILENUM - открыть запись файла с указанным номером
$OPENFILENUMDATA - открыть содержимое файла с указанным номером
$OPENFILERECOFS - открыть файл по указанному смещению файловой записи в объекте
$OPENATTROFS - открыть поток данных по указанному смещению записи атрибута в объекте.
Можно указать шаблон, примененный после перехода, с помощью инструкции:
$OPENTEMPLATE='{GUID}'; указать дополнительное смещение шаблона: $OPENTEMPLOFS=Param.

### Дополнительные разделы шаблона

Вычисление размера записи - инструкции между строками CALCSIZESTART и CALCSIZEEND. Используется, если размер записи может быть больше размера сектора и может зависеть от данных. Значение переменной $RECSIZE можно изменить только в этом разделе шаблона.

Предварительная обработка данных - инструкции между строками LOADSTART и LOADEND. Используется, например, для обработки USN в записях MFT (восстановление последних двух байт в каждом секторе). Блоки данных можно изменять в этом разделе шаблона: например, инструкция {X,Y}:={Z,Y} копирует Y байт по смещению Z в позицию по смещению X.

Постобработка данных - инструкции между строками FLUSHSTART и FLUSHEND. Используется для обратного преобразования перед записью изменённых данных на диск (также можно изменять блоки данных).

### Определения

Определения используются для замены повторяющихся блоков инструкций. Определение может быть объявлено в любом шаблоне следующим образом:

DEFINE DefineTitle(%1%,%2%,...)
... (инструкции, в которых могут использоваться переменные подстановки %1%,%2%,...)
ENDDEFINE

Определение можно использовать далее в любом шаблоне. При обработке оно будет заменено соответствующими инструкциями и подставленными переменными:
DefineTitle($varname1,$varname2,...)