Windows - статьи




Каталоги - часть 2


Первый является резидентным и, следовательно, может хранить только один индексный узел, а второй является нерезидентным и хранить неограниченное число узлов.

Индексный элемент каталога наделен заголовком INDEX_ENTRY_HEADER_DIR.

typedef enum _INDEX_ENTRY_FLAGS { INDEX_ENTRY_NODE = 1, INDEX_ENTRY_END = 2 //последний элемент в узле } INDEX_ENTRY_FLAGS;

typedef struct _INDEX_ENTRY_HEADER_DIR //заголовок индексного элемента { /*0x00*/ MFT_REF indexed_file; //адрес MFT файла /*0x08*/ USHORT length; //смещение следующего элемента, относительно текущего /*0x0A*/ USHORT key_length; //длина атрибута $FILE_NAME /*0x0C*/ INDEX_ENTRY_FLAGS flags; //флаги /*0x10*/ FILE_NAME_ATTR file_name;//сам атрибут $FILE_NAME, если key_length //больше нуля. } INDEX_ENTRY_HEADER_DIR, *PINDEX_ENTRY_HEADER_DIR;

Теперь рассмотрим атрибут $INDEX_ROOT. В самом начале его тела располагается заголовок INDEX_ROOT.

typedef struct _INDEX_ROOT //заголовок $INDEX_ROOT { /*0x00*/ ATTR_TYPES type; //тип индексируемого атрибута /*0x04*/ ULONG collation_rule; //правило упорядочения в дереве /*0x08*/ ULONG index_block_size; //размер индексной записи в байтах /*0x0C*/ UCHAR clusters_per_index_block; //size of each index block (record) in clusters //либо логарифм размера /*0x0D*/ UCHAR reserved[3]; //unused /*0x10*/ INDEX_HEADER index; //заголовок индексного узла } INDEX_ROOT, *PINDEX_ROOT;

Наглядно, INDEX_ROOT представляется следующим образом.


Рис. 5. Тело атрибута $INDEX_ROOT.

Для перечисления всех индексных элементов в узле, необходимо вычислить адрес начального индексного элемента как сумму смещения заголовка INDEX_HEADER, и значения поля entries_offset заголовка узла, а затем перебрать все индексные элементы, пока в очередном элементе не будет встречен флаг INDEX_ENTRY_END. Для перехода от одного элемента к другому следует к адресу индексного элемента добавлять поле length.

Если индексные элементы не вмещаются в атрибуте $INDEX_ROOT, то для их хранения выделяется атрибут $INDEX_ALLOCATION, который по своему строению отличается от $INDEX_ROOT.




Содержание  Назад  Вперед