Восстановление данных. Практическое руководство, стр. 37
Последовательность обновления
Будучи очень важными компонентами файловой системы,
$MFTINDEX$LogFileВ конец каждого из секторов, слагающих файловую запись (
INDEX RecordRCRD RecordRSTR RecordОсновное назначение последовательностей обновления — защита от "обрыва записи". Если в процессе записи сектора на диск исчезнет питающее напряжение, может случиться так, что часть файловой записи будет записана успешно, а другая часть — сохранит прежнее содержимое (файловая запись, как мы помним, обычно состоит из двух секторов). После восстановления питания драйвер файловой системы не может уверенно определить, была ли файловая запись записана целиком. Вот тут-то последовательности обновления и выручают! При каждой перезаписи сектора последовательность обновления увеличивается на единицу. Потому, если произошел обрыв записи, значение последовательности обновления, находящейся в заголовке файловой записи, не совпадет с последовательностью обновления, расположенной в конце сектора.
Оригинальное содержимое, расположенное "под" последовательностью обновления, хранится в специальном массиве обновления (update sequence array), расположенном в заголовке файловой записи непосредственно за концом смещения последовательности обновления (update sequence number). Для восстановления файловой записи в исходный вид необходимо извлечь из заголовка указатель на смещение последовательности обновления (он хранится по смещению 04h байт от начала заголовка) и сверить лежащее по этому адресу 16-байтное значение с последним словом каждого из секторов, слагающих файловую запись (
INDEX RecordRCRD RecordRSTR RecordПо смещению
006hsizeof (update sequence number) + sizeof(update sequence array)update sequence number & update sequence array - 1)*2(offset to update sequence number) + 22Ahupdate sequence array2Ch2Dh2FhПервое слово массива последовательности обновления соответствует последнему слову первого сектора файловой записи или индексной записи. Второе — последнему слову второго сектора и т.д. Для восстановления сектора в исходный вид необходимо вернуть все элементы массива последовательности обновления на их законные места (естественно, модифицируется не сам сектор, а его копия в памяти).
Чтобы проиллюстрировать сказанное выше, рассмотрим пример, приведенный в листинге 6.2.
Листинг 6.2. Оригинальная файловая запись до восстановления
--> начало первого сектора FILE Record00000000: 46 49 4C 45-<b>2A 00 03 00</b>-7C 77 1A 04-02 00 00 00 FILE*...|w......00000010: 01 00 02 00-30 00 01 00-28 02 00 00-00 04 00 00 ....0...(.......00000020: 00 00 00 00-00 00 00 00-06 00 <b>06 00-00 00 47 11</b> ..............G....000001F0: 00 00 00 00-00 00 00 00-00 00 00 00-00 00 06 00 ................<-- конец первого сектора FILE Record...000003F0: 07 СС E1 0D-00 09 00 00-FF FF FF FF-82 79 <i>06 00</i> .Іа..... Вy..<-- конец второго сектора FILE RecordСигнатура
FILE04h002Ah002Ah0006h06h0003hТеперь нам необходимо найти массив последовательности обновления, хранящий оригинальное значение последнего слова каждого из секторов. Смещение массива обновления равно значению указателя на последовательность обновления увеличенной на два, т.е. в данном случае
002Ah + 02h == 002Ch00h 00h47h 11hВ результате восстановленный сектор будет выглядеть, как показано в листинге 6.3.
Листинг 6.3. Восстановленная файловая запись
--> Начало первого сектора файловой записи