Разширени файлови атрибути в Windows
Разширени файлови атрибути е допълнителен набор от атрибути, поддържани от Windows във файловите системи NTFS, FAT16 и HPFS. Разширените атрибути (EA) се поддържат, започвайки с Windows NT и всички следващи операционни системи, базирани на NT ядрото. Поддръжката на разширените атрибути беше добавена към Windows за съвместимост с операционната система OS/2, където те бяха широко използвани. В Windows тези атрибути почти никога не се използват от софтуера, но въпреки това поддръжката им не е премахната и присъства дори в Windows 7.
Всеки разширен атрибут има низ от име с максимална дължина от 255 знака и байт флаг на атрибута. Максималният размер на данните на разширен атрибут е 64 килобайта и това ограничение не се прилага за един отделен атрибут, а за всички атрибути като цяло.
В NTFS разширените атрибути се прикачват към файл като ::$EA поток. Можете да видите този поток за файл с помощта на програмата NTFS Stream Explorer. Той е проектиран да работи с алтернативни файлови потоци, но може също да показва наличието на EA поток. На илюстрацията можете да видите, че файлът test.dat с нулева дължина има 23-байтов разширен поток от атрибути.
Не е възможно да се прочете директно съдържанието на потока ::$EA. Това ще доведе до съобщение като това:
Във FAT16 за разширени атрибути системата създава системен файл „EA DATA. SF“, където се съхранява тяхното съдържание. Но във FAT32 няма поддръжка за разширени атрибути; когато копирате файл в тази файлова система, EA се губят.
Когато копирате файл с разширени атрибути в FAT32 дял, информацията за EA се губи тихо. Windows не показва съобщения за загуба на информация. Това разграничава допълнителните атрибути от подобните по концепция.алтернативни файлови потоци, поддържани от NTFS. Например, в Windows 7, когато се опитвате да копирате файл, съдържащ NTFS алтернативни потоци от NTFS към FAT32, се показва съобщението „Наистина ли искате да копирате файла без неговите свойства?“ Но ако копирате файла от EA на същото място, няма да има съобщения.
Няма стандартни WinAPI функции специално за работа с разширени атрибути. Също така няма стандартни помощни програми за Windows, които да работят с тях. Дори помощната програма fsutil, която може да извършва много интересни операции с файлове, няма да помогне при работа с EA. Това обяснява факта, че тази технология почти никога не се използва от никого в Windows. Четенето на разширени атрибути е възможно чрез използването на функцията BackupRead (методът е описан тук, но примерът описва четене на NTFS потоци, а не EA) или чрез използването на NT Native API (недокументирани функции на библиотеката ntdll.dll).
Името на разширения атрибут се състои от ASCII знаци. Латинските букви се преобразуват в главни, регистърът на знаците не се различава при достъп до атрибута. Наборът от символи на името на файла не трябва да съдържа следните непозволени знаци: ASCII стойности 0x00 - 0x1F, знаци \ / : * ? " , + = [ ] ;. Максималната дължина на името е 255 знака.
Разширен API за атрибути
ntdll.dll съдържа две функции, които предоставят достъп до разширени атрибути. Техните прототипи:
Функцията NtSetEaFile се използва за запис на информация в разширени атрибути, както и за премахване на атрибути. Функцията NtQueryEaFile е проектирана да чете данни от EA или да изброява разширените атрибути на файл. Тези функции работят върху структурата FILE_FULL_EA_INFORMATION, която има следния формат:
Полето NextEntryOffset съдържа отместването на следващияструктури в буфера за данни. Полето е необходимо при използване на NtQueryEaFile, когато връща няколко атрибута в буфера наведнъж. Полето Флагове съдържа атрибутни флагове. По подразбиране полето за флагове има стойност 0, като е разрешена и стойност на FILE_NEED_EA, равна на 0x80, което означава, че атрибутът с този флаг е важен за обработка на файлови данни.
Полетата EaNameLength и EaValueLength са дължините на името на атрибута и данните за атрибута. EaName е указател към началото на името на атрибута. Данните започват веднага след името на атрибута. Общият размер на структурата FILE_FULL_EA_INFORMATION не може да надвишава 64 KB. Ако в буфера има няколко структури, общият им размер също не може да надвишава този размер.
Разширено въвеждане на атрибути
Нека дефинираме в константата EA_BUF_LEN максималния размер на EA буфера, равен на 0xFFFF. Тогава максималният размер на данните на атрибута MAX_EA_DATA_LEN е равен на размера на буфера, от който трябва да извадите 8 (заглавка на структурата) и да извадите 2 (минималното кратко име на атрибута, 1 буква + нулев знак). Преди да запишете, трябва да се уверите, че данните, които се записват, не надвишават тази стойност.
Файлът за запис на EA данни трябва да бъде отворен с флага FILE_FLAG_BACKUP_SEMANTICS. След това трябва да формирате структурата FILE_FULL_EA_INFORMATION, да укажете правилно името и размерите на данните в нея, да зададете флагове и да копирате низа на името и данните за атрибута в структурата с правилните отмествания.
След това се извиква функцията NtSetEaFile и нейната върната стойност, NTSTATUS, се анализира. В резултат на грешка при опит за запис на разширени атрибути, функцията може да върне следните кодове на грешка:
Кодът за грешка STATUS_EAS_NOT_SUPPORTED може да означава не само липсата на поддръжка за разширени атрибути във файловата система, но и невъзможността да се използва EA за конкретен файл. Ако файлът имаима данни за повторна обработка, тоест файлът е точка за повторна обработка (например символна връзка), тогава разширените атрибути не се поддържат за такъв файл. Във файловата система NTFS един файл не може едновременно да бъде точка за повторна обработка и да съдържа разширени атрибути на EA, само едно нещо.
Четене на разширен атрибут
За да прочетете разширен атрибут, вземете целия буфер на EA и намерете в буфера структурата, която съдържа атрибута с желаното име (EaName). Буферът се чете с помощта на функцията NtQueryEaFile. Ако параметърът ReturnSingleEntry е зададен на TRUE, функцията връща само една структура с всяко извикване, ако е FALSE, всички структури се записват в буфера наведнъж и преходът между тях се извършва чрез полето NextEntryOffset.
Данните се четат от буфера при отместване EaName + EaNameLength + 1. Параметърът RestartScan рестартира изхода на атрибут от началото (ако се използва ReturnSingleEntry). Параметърът EaList може да съдържа указател към незадължителен списък от структури FILE_GET_EA_INFORMATION, съдържащи списъка с EA, които трябва да бъдат извлечени. По този начин можете да получите в буфера не всички EA, а някакъв специфичен набор. Параметърът EaIndex ви позволява да получите достъп до атрибута по индекс.
В резултат на грешка при опит за четене на разширени атрибути, функцията NtQueryEaFile може да върне следните кодове на грешка:
Функционален код за четене на разширени атрибути:
Премахване на разширен атрибут
Премахването на разширен атрибут от файл се изпълнява чрез извикване на NtSetEaFile със структура, където полето EaValueLength е NULL и EaName съдържа само името на атрибута, който трябва да бъде премахнат.
Източник
Изтеглете конзолната програма EA.EXE за работа с разширени атрибути. Архивът съдържа програмата и нейния изходен код на C.
Освен това,моята програма NTFS Stream Explorer, която има графичен интерфейс, сега също поддържа редактиране на разширени файлови атрибути.