3. Рассчитывается новая контрольная сумма загрузочного сектора, которая затем записывается по смещению 50h
от его начала (более подробная информация была приведена в
4. Создается новый файл $MFT
, содержащий сведения обо всех файлах на диске. Как правило, он записывается поверх старого файла $MFT
. Исключения из этого правила бывают, но они крайне редки. Обычно они происходят, если прежний файл $MFT
был заблаговременно перемещен дефрагментатором, или если при переформатировании был назначен новый размер кластера. Во всех остальных случаях первые 24 файловых записи (FILE Record) погибают безвозвратно. Эти записи содержат непосредственно сам файл $MFT
, $MFTMirr
, корневой каталог, /$LogFile
— файл транзакций, /$BITMAP
— карту свободного пространства, /$Secure
— дескрипторы безопасности, а также ряд других служебных файлов.
5. Инициализируется файл $MFT:$DATA
— назначаются новая длина файла (инициализируются $MFT:$30.AllocatedSize
, $MFT:$30.RealSize
, $MFT:$80.AllocatedSize
, $MFT:$80.RealSize
, $MFT:$80.CompressionSize
, $MFT:$80.InitializedSize
и $MFT:$80.LastVCN
), дата и время создания и последней модификации (инициализируются $MFT:$10.FileCreationTime
, $MFT:$10.FileAlertedTime
, $MFT:$10.FileReadTime
, $MFT:$30.FileCreationTime
, $MFT:$30.FileAlertedTime
, $MFT:$30.MFTChangeTime
и $MFT:$30.FileReadTime
) и, самое главное, создается новый список отрезков (data-runs), необратимо затирающий старый. Это значит, что собирать фрагментированный файл $MFT
нам придется по частям.
6. Создается новый файл /$MFT:$BITMAP
, отвечающий за занятость файловых записей в MFT. При этом все старые записи помечаются как свободные, однако их фактического удаления не происходит (поле FileRecord.flags
остается нетронутым), благодаря чему процедура восстановления заметно упрощается. Чаще всего $MFT:$BITMAP
располагается на том же самом месте, что и старый (т.е. между загрузочным сектором и MFT), забивая прежнее содержимое нулями, однако с помощью утилиты chkdsk его можно восстановить.
7. Создается новый файл /$BITMAP
, отвечающий за распределение дискового пространства (свободные и занятые кластеры). Этот файл также записывается поверх прежнего файла /$BITMAP
, который, тем не менее, может быть восстановлен с помощью chkdsk.
8. Создается новый файл журнала транзакций — /$LogFile
, структура которого подробно описана в документации LINUX-NTFS Project.
9. В заголовок файловой записи $MFT
заносится новый LSN (LogFile Sequence Number).
10. $MFT
назначается новый номер последовательности обновления (Update Sequence Number).
11. Создается новое зеркало $MFTMirr, необратимо затирающее старое (в текущих версиях файловых систем оно расположено в середине раздела NTFS).
12. Создаются новые /$Volume
, /$AttrDef
и другие служебные файлы, играющие сугубо вспомогательную роль и легко восстанавливаемые утилитой chkdsk. Следует отметить, что хотя /$Volume
и присутствует в зеркальной копии MFT, его ценность явно преувеличена.
13. Осуществляется проверка целостности поверхности диска, и все обнаруженные плохие кластеры заносятся в файл /$BadClus
.
14. Формируется новый корневой каталог.
15. Если до форматирования тома на нем присутствовал файл /System Volume Information
, то он обновляется, в противном случае новый файл /System Volume Information
создается только после перезагрузки.
На самом деле процесс форматирования протекает намного сложнее. Тем не менее, для восстановления данных с непреднамеренно переформатированных разделов приведенной здесь информации вполне достаточно. Углубленное обсуждение этих технических деталей требуется только программисту, разрабатывающему собственную нестандартную утилиту форматирования. Заинтересованные читатели могут самостоятельно дизассемблировать утилиту format.com (рекомендуется делать это с помощью IDA Pro).