На днях пришлось столкнуться с ADS'ами на новой Resilient файловой системе (ReFS). По публичным документам от Micosoft складывалось двоякое впечатление: по одним данным ADS были убраны из ReFS, по другим - оставлены.
Публикации публикациями, но можно проверить вызовом ::GetVolumeInformation(...). На моей тестовой Win8.1 я получил маску флагов 0x070400cf:
- FILE_CASE_SENSITIVE_SEARCH
- FILE_CASE_PRESERVED_NAMES
- FILE_UNICODE_ON_DISK
- FILE_PERSISTENT_ACLS
- FILE_SUPPORTS_SPARSE_FILES
- FILE_SUPPORTS_REPARSE_POINTS
- FILE_NAMED_STREAMS
- FILE_SUPPORTS_OPEN_BY_FILE_ID
- FILE_SUPPORTS_USN_JOURNAL
- FILE_SUPPORTS_INTEGRITY_STREAMS
Казалось бы, вот оно счастье - флаг FILE_NAMED_STREAMS. Создаем тестовый stream, пишем в него тестовую строку - все работает на ура. Вызываем ::CopyFile(...), указывая в качестве целевого пути stream и... все завершается с ошибкой ERROR_FILE_SYSTEM_LIMITATION, 665 (STATUS_FILE_SYSTEM_LIMITATION, 0xC0000427). Протрассировав вызов, который завершается ошибкой, мы придем к функции RefsAddAllocationForResidentWrite, которая проверяет размер stream'а и, если он [размер] превышает 0x20000 (128 килобайт), то генерируется указанная ошибка.
P.S. Уже со знанием этого лимита мне удалось найти его описание в статье Resilient File System Overview на TechNet:
ΞρεΤΙκ