Специальные файлы на разделе с NTFS
Первые шестнадцать элементов главной таблицы файлов (MFT — Master File Table) зарезервированы для специальных файлов. В NTFS 3.0 используются только первые двенадцать элементов. Это скрытые файлы, имена которых расположены в корне раздела. Файлов не видно, но, тем не менее, они существуют. Проверить это можно, попытавшись создать файл с одним из зарезервированных имён в корне раздела. На диске с NTFS, например, не получится создать файл C:\$Volume.
Список специальных файлов NTFS
- $MFT (элемент 0) Главная таблица файлов. Атрибут данных содержит элементы MFT, а также неиспользуемые растровые атрибуты.
- $MFTMirr (элемент 1) Зеркало (резервная копия) первых четырёх элементов MFT.
- $LogFile (элемент 2) Файл журнала тома, в который записываются все изменения структуры тома.
- $Volume (элемент 3) Атрибут данных $Volume представляет весь том. Обращение Win32 по имени «\\.\C:» откроет файл тома на диске С: (предполагается, что диск С: является томом NTFS), Файл $Volume содержит также имя тома, информацию о томе и атрибуты идентификатора объекта.
-
$AttrDef (элемент 4)
Атрибут данных $AttrDef содержит массив определений атрибута.
typedef struct { WCHAR AttributeName[64]; ULONG AttributeNumber; ULONG Unknown[2]; ULONG Flags; ULONGLONG MinimumSize; ULONGLONG MaximumSize; } ATTRIBUTE_DEFINITION, *PATTRIBUTE_DEFINITION;
- \ (элемент 5) Корневой каталог тома.
- $Bitmap (элемент 6) Атрибут данных $Bitmap представляет собой растр кластеров тома.
-
$Boot (элемент 7)
Первый сектор $Boot является также и первым сектором тома. Поскольку он используется в самом начале процесса загрузки системы (если том является загружаемым), то пространство здесь не нормируется, а хранимые данные не выравниваются по естественным границам. Формат первого сектора можно описать с помощью структуры BOOT_BLOCK.
#pragma pack(push, 1) typedef struct { UCHAR Jump[3]; UCHAR Format[8]; USHORT BytesPerSector; UCHAR SectorsPerCluster; USHORT BootSectors; UCHAR Mbz1; USHORT Mbz2; USHORT Reserved1; UCHAR MediaType; USHORT Mbz3; USHORT SectorsPerTrack; USHORT NumberOfHeads; ULONG PartitionOffset; ULONG Reserved2[2]; ULONGLONG TotalSectors; ULONGLONG MftStartLcn; ULONGLONG Mft2StartLcn; ULONG ClustersPerFileRecord; ULONG ClustersPerIndexBlock; ULONGLONG VolumeSerialNumber; UCHAR Code[0x1AE]; USHORT BootSignature; } BOOT_BLOCK, *PBOOT_BLOCK; #pragma pack(pop)
- $BadClus (элемент 8) В атрибуте данных этого файла содержится информация о сбойных кластерах.
- $Secure (элемент 9) Атрибут данных $Secure содержит совместно используемые идентификаторы доступа. $Secure содержит также два индекса.
- $UpCase (элемент 10) Атрибут данных $Upcase содержит эквивалент верхнего регистра всех 65536 символов Unicode.
- $Extend (элемент 11) $Extend — это каталог, который содержит специальные файлы, используемые некоторыми дополнительными функциями NTFS 3.0. Специальные файлы, хранящиеся в этим каталоге, это: «$ObjId» (поддержка объектных идентификаторов), «$Quota» (поддержка квот), «$Reparse» (данные точек повторной обработки) и «$UsnJrnl» (журнал файловой системы). Начиная с Windows Vista здесь также находится каталог «$RmMetadata» (поддержка транзакций NTFS).
Как открыть специальные файлы
Хоть специальные файлы и являются на самом деле файлами, но открыть их обычным способом (например с помощью функций NtOpenFile или NtCreateFile) нельзя. Даже получив в ACL права администратора (разрешающие чтение специальных файлов), доступ к ним оказывается невозможен, поскольку для них ntfs.sys (драйвер файловой системы NTFS) всегда возвращает статус ошибки STATUS_ACCESS_DENIED. В ntfs.sys существуют две переменные, которые влияют на его поведение: NtfsProtectSystemFiles и NtfsProtectSystemAttributes. По умолчанию, значением обоих этих переменных является TRUE.
Если переменной NtfsProtectSystemAttributes присвоить значение FALSE (например с помощью отладчика), то, используя имена в формате «filename::$STANDARD_INFORMATION», можно получить доступ к атрибутам системы (в частности к стандартным информационным атрибутам). Если присвоить значение FALSE переменной NtfsProtectSystemFiles, то можно будет открыть специальные файлы. Но при попытке сделать это можно столкнуться и с некоторыми трудностями, связанными с тем, что многие из специальных файлов оказываются уже открыты системными средствами при инициализации тома, а кроме того, они не приспособлены для обработки запроса IRP_MJ_READ, возникающего при обращения к функции NtReadFile, и если такой запрос поступит, то система даст сбой. Специальные файлы можно прочесть, сделав с помощью функций NtCreateSection и NtMapViewOfSection их копии и прочитав данные из них.
Следующая проблема заключается в том, что некоторые из специальных файлов неспособны обрабатывать запрос IRP_MJ_CLEANUP, который передается тогда, когда закрывается последний дескриптор объекта файла. Если такой запрос будет получен, то произойдет сбой системы. Таким образом, необходим как минимум один открытый дескриптор специального файла, принадлежащий процессу, который никогда не завершится (например системному процессу).
См. также
Скрытое хранение данных в потоках файла $Repair в системном каталоге $RmMetadata.
По теме NTFS также есть следующее:
- Обход ограничений FAT32/NTFS (статья 2004 года).
- Использование NtFsControlFile для получение информации о файле на NTFS
- Предварительный взгляд на возможности файловой системы Protogon.
Избранное
Остальное
По вопросам сотрудничества и другим вопросам по работе сайта пишите на cleogroup[собака]yandex.ru