Удаление файлов в NTFS.

В NTFS удаление файлов тоже происходит в несколько этапов. При этом нужно учитывать, что есть файлы резидентные и нерезидентные. Как уже говорилось в главе 2, резидентный файл находится в записи $MFT целиком, а от нерезидентного файла в $MFT хранится только начало. Процесс удаления выглядит примерно так:

В файле $MFT в записи (File Record) удаляемого файла изменяется атрибут $BITMAP. Его значение сбрасывается в ноль («запись не используется»). Тем самым операционной системе разрешается использовать освободившуюся запись для размещения нового файла.

В файле $BITMAP, каждый бит которого определяет «занятость» соответствующего кластера, для кластеров, ранее занятых удаленным файлом, устанавливаются значения 0 («кластер не используется»). В дальнейшем эти кластеры могут использоваться для размещения новых файлов.

В файле $MFT в записи (File Record) удаляемого файла поле FLAG, находящееся по смещению 16h от начала File Record, изменяется на ноль («запись обновляется или отсутствует»).

В файле $MFT в записи (File Record) родительского каталога ссылка на файл удаляется из дерева индексов. Это происходит, если только в настройках системы было разрешено индексирование диска.

В файле $MFT в записи каталога, хранившего удаляемый файл, обновляется атрибут $STANDART_INFORMATION (время последнего доступа и т. д.).

В файле журнала $LogFile для записей всех затронутых файлов обновляются атрибуты Sequence Number — их значения увеличивается на единицу. Как минимум, обновление касается самого удаляемого файла, каталога, в котором он находился, файлов $MFT и $BITMAP.

Каталоги удаляются практически так же, как и файлы. В NTFS каталог — файл, содержащий двоичное дерево индексов, и структура его записи в MFT точно такая же, как у любого другого файла.

В дальнейшем освободившиеся записи MFT и кластеры, в которых находился удаленный файл, могут быть переписаны при создании и копировании новых файлов и каталогов. Однако, пока запись на диск не производилась, все «удаление» сводится к изменению атрибутов файла, а это процедура обратимая!

Следовательно, для восстановления резидентного файла достаточно найти его запись в $MFT и вернуть значения атрибутов в прежнее состояние. С нерезидентным файлом чуть сложнее — помимо «тела», которое пока остается в MFT, нужно еще найти и задействовать соответствующие файлу кластеры в области файлов.