Определение ADS
От: EreTIk EreTIk's Box
Дата: 18.04.18 11:35
Оценка:
Как можно определить, что открытый описатель (или FILE_OBJECT в ядре) открыт на ADS, а не на основные данные файла? Понятно, что можно получить имя и разобрать строку, поискав в последнем компоненте пути двоеточие (по аналогии с FltParseFileName в ядре). Но неужели нет явного признака, как например для директории — FILE_STANDARD_INFORMATION::Directory?
Re: Определение ADS
От: ononim  
Дата: 18.04.18 11:56
Оценка: +1
Насколько я помню, 'обычные' данные файла — это на самом деле альтернативный поток :$Data так что не удивительно если особых признаков не будет.
Как много веселых ребят, и все делают велосипед...
Re[2]: Определение ADS
От: EreTIk EreTIk's Box
Дата: 18.04.18 12:09
Оценка:
Здравствуйте, ononim, Вы писали:

O>Насколько я помню, 'обычные' данные файла — это на самом деле альтернативный поток :$Data так что не удивительно если особых признаков не будет.


С одной стороны — да.
С другой стороны, например, при вызове NtSetInformationFile(..., FileDispositionInformation) на открытый ADS мы потеряем только этот ADS. А в случае открытого обычного файла удаляется весь файл со всеми его ADS'ами.
Re: Определение ADS
От: Conr Россия  
Дата: 18.04.18 12:45
Оценка: 4 (1)
Здравствуйте, EreTIk, Вы писали:

ETI>Как можно определить, что открытый описатель (или FILE_OBJECT в ядре) открыт на ADS, а не на основные данные файла? Понятно, что можно получить имя и разобрать строку, поискав в последнем компоненте пути двоеточие (по аналогии с FltParseFileName в ядре). Но неужели нет явного признака, как например для директории — FILE_STANDARD_INFORMATION::Directory?


Неа, нет такого признака. По крайней мере я в свое время не нашел. Более того, даже по имени определять опасно, так как файловая система имеет полное право произвольно менять имя после открытия и двоеточия в нем не будет. На ReFS и Cluster Shared Volumes так иногда происходит. Поэтому самый безопасный способ в pre-create (там имя еще гарантированно неизменно) создавать свой контекст и хранить в нем флаг — альтернативный это поток или нет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.