Windows - статьи




Атрибуты


После нахождения записи mft, самой важной задачей является поиск необходимого атрибута, например с данными. Атрибуты бывают двух видов: резидентные (resident) и нерезидентные (nonresident). Резидентный атрибут умещается в записи MFT, а нерезидентный нет. У обоих атрибутов есть общий заголовок, куда входят поля типа, длины, и пр. и далее свой собственный заголовок (либо для резидентного либо для нерезидентного). Атрибуты идентифицируются типом, но также могут быть и именованными, если поле name_length не нулевое. В общем, заголовок обоих атрибутов описывается структурой.

typedef struct _ATTR_RECORD { /*0x00*/ ATTR_TYPES type; //тип атрибута /*0x04*/ USHORT length; //длина заголовка; используется для перехода к //следующему атрибуту /*0x06*/ USHORT Reserved; /*0x08*/ UCHAR non_resident; //1 если атрибут нерезидентный, 0 - резидентный /*0x09*/ UCHAR name_length; //длина имени атрибута, в символах /*0x0A*/ USHORT name_offset; //смещение имени атрибута, относительно заголовка //атрибута /*0x0C*/ USHORT flags; //флаги, перечислены в ATTR_FLAGS /*0x0E*/ USHORT instance;

union { //Резидентный атрибут struct { /*0x10*/ ULONG value_length; //размер, в байтах, тела атрибута /*0x14*/ USHORT value_offset; //байтовое смещение тела, относительно заголовка //атрибута /*0x16*/ UCHAR resident_flags; //флаги, перечислены в RESIDENT_ATTR_FLAGS /*0x17*/ UCHAR reserved; } r; //Нерезидентный атрибут struct { /*0x10*/ ULARGE_INTEGER lowest_vcn; /*0x18*/ ULARGE_INTEGER highest_vcn; /*0x20*/ USHORT mapping_pairs_offset;//смещение списка отрезков /*0x22*/ UCHAR compression_unit; /*0x23*/ UCHAR reserved1[5]; /*0x28*/ ULARGE_INTEGER allocated_size; //размер дискового пространства, //которое было выделено под тело //атрибута /*0x30*/ ULARGE_INTEGER data_size; //реальный размер атрибута /*0x38*/ ULARGE_INTEGER initialized_size; } nr; } u; } ATTR_RECORD, *PATTR_RECORD;

Флаги атрибута описываются структурой. typedef enum { ATTR_IS_COMPRESSED = 0x1, //атрибут сжат (compressed) ATTR_IS_ENCRYPTED = 0x4000, //атрибут зашифрован (encrypted) ATTR_IS_SPARSE = 0x8000 //атрибут разрежен (sparse) } ATTR_FLAGS;




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