EreTIk's Box » Cтатьи, исходники » Alternate Data Streams на ReFS


На днях пришлось столкнуться с 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:


ReFS also supports alternate data streams (up to 128K for both Windows 8.1 and Windows Server 2012 R2), which enables Office document thumbnails, Mark of the Web (MOTW), and similar features available on Windows 8.1.

ΞρεΤΙκ