Как можно определить, что открытый описатель (или FILE_OBJECT в ядре) открыт на
ADS, а не на основные данные файла? Понятно, что можно получить имя и разобрать строку, поискав в последнем компоненте пути двоеточие (по аналогии с
FltParseFileName в ядре). Но неужели нет явного признака, как например для директории —
FILE_STANDARD_INFORMATION::Directory?
Насколько я помню, 'обычные' данные файла — это на самом деле альтернативный поток :$Data так что не удивительно если особых признаков не будет.
Здравствуйте, EreTIk, Вы писали:
ETI>Как можно определить, что открытый описатель (или FILE_OBJECT в ядре) открыт на ADS, а не на основные данные файла? Понятно, что можно получить имя и разобрать строку, поискав в последнем компоненте пути двоеточие (по аналогии с FltParseFileName в ядре). Но неужели нет явного признака, как например для директории — FILE_STANDARD_INFORMATION::Directory?
Неа, нет такого признака. По крайней мере я в свое время не нашел. Более того, даже по имени определять опасно, так как файловая система имеет полное право произвольно менять имя после открытия и двоеточия в нем не будет. На ReFS и Cluster Shared Volumes так иногда происходит. Поэтому самый безопасный способ в pre-create (там имя еще гарантированно неизменно) создавать свой контекст и хранить в нем флаг — альтернативный это поток или нет.