Рассмотрим структуры данных, задействованные при работе с файловой системой NTFS (рис. 9).
Рис. 9. Структуры данных, связанные с NTFS
В структуре данных EPROCESS, описывающей процесс в Windows (см. лекцию 6 «Процессы и потоки»), имеется поле ObjectTable (файл base\ntos\inc\ps.h, строка 293), в котором содержится указатель на таблицу дескрипторов процесса типа HANDLE_TABLE (файл base\ntos\inc\ex.h, строка 5179). В строках этой таблицы содержатся ссылки на ресурсы, открытые процессом, и в том числе, ссылки на объекты типа FILE_OBJECT, которые упоминались в лекции 10 «Управление устройствами».
Структура FILE_OBJECT (файл base\ntos\inc\io.h, строка 1763) содержит следующие основные поля:
· FileName – строковое имя файла;
· Vpb – указатель на структуру VPB, которая представляет том на устройстве внешней памяти;
· FsContext – указатель на блок управления потоком данных NTFS;
· DeviceObject – указатель на объект типа DEVICE_OBJECT, связанный с физическим диском, на котором находится файл.
В структуре VPB (Volume Parameter Block) содержатся следующие поля (файл base\ntos\inc\io.h, строка 1288):
· VolumeLabelLength – размер тома в байтах;
· DeviceObject – указатель на объект типа DEVICE_OBJECT, ассоциированный с данным томом (логическим диском);
· RealDevice – указатель на объект типа DEVICE_OBJECT, ассоциированный с физическим устройством внешней памяти (физическим диском);
· SerialNumber – серийный номер тома;
· ReferenceCount – счетчик количества ссылок на структуру; если это поле не равно нулю, значит, структура кем-то используется;
· VolumeLabel – метка (строковое имя) тома. Максимальная длина метки определяется константой MAXIMUM_VOLUME_LABEL_LENGTH, равной 32 двухбайтовым символам (см. файл base\ntos\inc\io.h, строка 1286).
На рис. 9 изображен физический диск, разбитый на три тома (логических диска) – два тома NTFS и один том FAT32. Поле DeviceObject структуры VPB указывает на объект DEVICE_OBJECT, который ссылается на первый из томов NTFS. Поле RealDevice структуры VPB указывает на объект DEVICE_OBJECT, связанный с физическим диском.
С каждым файлом NTFS, с которым операционная система в данный момент работает, связана структура данных, называемая блок управления файлом (File Control Block, FCB). В этой структуре хранится указатель на запись в таблице MFT для данного файла (см. рис. 9).
Поскольку в файле существует в общем случае несколько потоков, для каждого потока создается своя структура данных – блок управления потоком (Stream Control Block, SCB), в котором содержится ссылка на FCB. Поле FsContext структуры FILE_OBJECT указывает на SCB для открытого потока, таким образом, структура FILE_OBJECT на самом деле связана с потоком, а не с файлом. Чтобы открыть другой поток в том же файле требуется создавать новый объект FILE_OBJECT. На рис. 9 показана ситуация, когда процесс открыл два разных потока одного и того же файла. В WRK можно найти описание блока управления потоком SCB – структуру FSRTL_ADVANCED_FCB_HEADER (файл base\ntos\inc\fsrtl.h, строка 120) вместе с её основным полем, представляющим структуру FSRTL_COMMON_FCB_HEADER (тот же файл, строка 65).