This is a mirror of official site: http://jasper-net.blogspot.com/

Расширенные атрибуты FAT16 и NTFS

| Monday, February 14, 2011
Расширенные атрибуты файлов — дополнительный набор атрибутов, поддерживаемый Windows в файловых системах NTFS, FAT16 и HPFS. Расширенные атрибуты (extended attributes, EA) поддерживаются начиная с Windows NT и во всех последующих операционных системах на ядре NT. Поддержка расширенных атрибутов была добавлена в Windows для совместимости с операционной системой OS/2, в которой они широко использовались. В Windows эти атрибуты почти не используются программным обеспечением, но, тем не менее, их поддержка не была убрана и присутствует даже в Windows 7.

Каждый расширенный атрибут имеет строку названия, максимальный размер которой 255 символов, и байт флагов атрибута. Максимальный размер данных расширенного атрибута — 64 килобайта, причём это ограничение распространяется не на один отдельный атрибут, а на все атрибуты целиком.

В NTFS расширенные атрибуты прицеплены к файлу в виде потока ::$EA. Увидеть этот поток у файла можно с помошью программы NTFS Stream Explorer. Она предназначена для работы с альтернативными файловыми потоками, но может отображать и наличие потока EA. На иллюстрации видно, что у файла test.dat нулевой длины есть поток расширенных атрибутов размером 23 байта.


Имена расширенных атрибутов

Имя расширенного атрибута состоит из ASCII-символов. Латинские буквы приводятся к верхнему регистру, регистр символов не различается при обращении к атрибуту. Набор символов имени файла не должен содержать следующие запрещённые символы: значения ASCII 0x00 - 0x1F, символы \ / : * ? " < > | , + = [ ] ;. Максимальная длина имени 255 символов.

API расширенных атрибутов

В ntdll.dll содержатся две функции, с помощью которых реализуется доступ к расширенным атрибутам. Их прототипы:


NTSYSCALLAPI
NTSTATUS
NTAPI
NtSetEaFile(
   IN HANDLE FileHandle,
   IN PIO_STATUS_BLOCK IoStatusBlock,
   PVOID EaBuffer,
   ULONG EaBufferSize
);

NTSYSCALLAPI
NTSTATUS
NTAPI
NtQueryEaFile(
   IN HANDLE FileHandle,
   OUT PIO_STATUS_BLOCK IoStatusBlock,
   OUT PVOID Buffer,
   IN ULONG Length,
   IN BOOLEAN ReturnSingleEntry,
   IN PVOID EaList OPTIONAL,
   IN ULONG EaListLength,
   IN PULONG EaIndex OPTIONAL,
   IN BOOLEAN RestartScan
);

Функция NtSetEaFile служит для записи информации в расширенные атрибуты, а также для удаления атрибутов. Функция NtQueryEaFile предназначена для чтения данных EA или перечисления расширенных атрибутов у файла. Эти функции работают со структурой FILE_FULL_EA_INFORMATION, имеющей следующий формат:


typedef struct _FILE_FULL_EA_INFORMATION
{
   ULONG NextEntryOffset;
   UCHAR Flags;
   UCHAR EaNameLength;
   USHORT EaValueLength;
   CHAR EaName[1];
} FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;

Поле NextEntryOffset содержит смещение следующей структуры в буфере данных. Поле нужно при использовании NtQueryEaFile, когда она возвращает в буфере сразу несколько атрибутов. Поле Flags содержит флаги атрибутов. По-умолчанию поле флагов имеет значение 0, допустимо также значение FILE_NEED_EA, равное 0x80, которое означает, что имеющий этот флаг атрибут важен для обработки данных файла.

Read more: hex.pp.ua

Posted via email from Jasper-net

0 comments: