Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перечисление потоков "файлового объекта".


Страницы:   1 2

Riply ©   (2007-12-07 08:56:00) 

Здравствуйте !
NtQueryInformationFile(..., FileStreamInformation)
возвращает не совсем полную информацию:
в структуре FILE_STREAM_INFORMATION нет описания "типа"(или атрибутов) потока.
Дело в том, что объект может иметь несколько потоков без имени, отличающихся "типом".
NtQueryInformationFile их перебирает, но не дает возможности разобраться "ху из ху" :)
"Типы" можно получить, например, читая "вручную" с помощью BackupRead,
но это очень медленно и некузяво. (Ну и разумеется, работая с MFT).
Нет ли аналога NtQueryInformationFile, дающего более полную информацию ?


Riply   (2007-12-08 04:05:00) [1]

> [24] guav © (07.12.07 15:01)
Похоже, что ты прав.

> Сколько этого "чего-то" на файл ?
> Если один, то ввидимо имеется ввиду ::$DATA
Более одного "чего-то" у объектов обнаружить не удалось.

> Какой там StreamSize ? Совпадает ли с размером какого либо аттрибута ? какого именно ?
Совпадает... С размером ::$DATA.

> Вроде у директории тоже может быть $DATA
И даже не одна :)

Значит, мой страшный безымянный барабашка - всего навсего основной поток,
не пожелавший показывать свой тип :)


guav   (2007-12-07 15:01:00) [2]

> [23] Riply ©   (07.12.07 14:17)

Сколько этого "чего-то" на файл ?
Если один, то ввидимо имеется ввиду ::$DATA
If a file system supports stream enumeration, but the file has no streams other than the default data stream, which is unnamed, the file system should return a single FILE_STREAM_INFORMATION structure containing either "::$DATA" or a zero-length Unicode string as the StreamName.

Какой там StreamSize ? Совпадает ли с размером какого либо аттрибута ? какого именно ?


> P.S. с такими "несуществующими потоками" встречаются и директории.

Вроде у директории тоже может быть $DATA

Интерсно, а FindNextStreamW тоже будет возвращать "что-то" ?


Riply   (2007-12-07 14:17:00) [3]

> [22] guav ©   (07.12.07 14:02)

> Тут вопрос не в размере а о терминологии Windows.
> у $Mft $BITMAP большой, но всё же это ИМХО не поток :)

Хорошо. Как тогда объяснить, что NtQueryInformationFile
возвращает что-то с именем нулевой длинны ?
Если рассуждать как ты, то потоков без имени не бывает,
а она перебирает только потоки. Что же она находит ?
P.S. с такими "несуществующими потоками" встречаются и директории.


guav   (2007-12-07 14:02:00) [4]

> Еще и какой поток: у него и размер может быть в сотни байт. :)


Тут вопрос не в размере а о терминологии Windows.
у $Mft $BITMAP большой, но всё же это ИМХО не поток :)


Riply   (2007-12-07 13:58:00) [5]

> [19] guav ©   (07.12.07 13:48)
> А ты попробуй заархивировать с обычным альтернативным $DATA

Попробую. Думаю получиться т.к. имя не будет пустым(в нем будет :DATA) и RAR его увидит :)

> Я думаю что винрар согласен со мной что $OBJECT_ID - не поток :)

Еще и какой поток: у него и размер может быть в сотни байт. :)

Попробую скачать 7z. Может он сумеет сохранить ?
В крайнем случае, у меня таких файлов несколько.
В основном это html файлы, скаченные с интернета.
В фаворитах тоже встречаются (у меня там аж целых четыре таких).
Можете попробовать поискать подобные у себя. Я думаю найдутся :)


Rouse_   (2007-12-07 13:56:00) [6]


> А разархивировать тоже надо хитро ?

Нет, просто разархивировать :)


guav   (2007-12-07 13:48:00) [7]

> [18] Riply ©   (07.12.07 13:45)

А ты попробуй заархивировать с обычным альтернативным $DATA
Я думаю что винрар согласен со мной что $OBJECT_ID - не поток :)


Riply   (2007-12-07 13:45:00) [8]

> [15] Rouse_ ©   (07.12.07 13:06)
> При архивировании выбери из меню "добавить в архив" появится диалог,
> там зайди на вторую закладки, включи гайку "Сохранять файловые потоки" :)

А разархивировать тоже надо хитро ?
Ничего не понимаю: архивирую как ты сказал.
Разархивирую: потока в новом файле нет. Сравниваю с исодным файлом - в нем поток есть.
Может RAR его не видит потому что имя пустое ?


Riply   (2007-12-07 13:21:00) [9]

> [15] Rouse_ ©   (07.12.07 13:06)
> А то этот чистый файл, без потоков :)

Sorry. Сейчас исправлюсь.


Riply   (2007-12-07 13:20:00) [10]

> [11] guav © (07.12.07 12:49)
> The FILE_STREAM_INFORMATION structure is used to enumerate the streams for a file.
> Разве другие атрибуты считаются потоками.

А разве нет ? Это будет для меня открытием. Чем они хуже ?

> Впрочем, раз ты уже вызывала эту функцию, вот и скажи, нет ли там имён файлов.
Имен нет, но довольно часто возвращает поток с длинной имени равной нулю.
(Т.е. там не то что имени или типа нет. Там нет даже ":" )
Это как понимать ? Что это за образование ?
BackupRead его находит.

> Если я правильно понимаю, то там где оно нужно (ну т.е. на NTFS) оно будет.

В том файле, который я выложила, NtQueryInformationFile находит поток,
но говорит, что имени нет.
Конечно, может я неправильно использую эту функцию.


Rouse_   (2007-12-07 13:06:00) [11]


> Вот здесь: http://slil.ru/25202642
> Там такой поток: ObjectIdentifier  64 Byte

При архивировании выбери из меню "добавить в архив" появится диалог, там зайди на вторую закладки, включи гайку "Сохранять файловые потоки" :)
А то этот чистый файл, без потоков :)


Rouse_   (2007-12-07 13:02:00) [12]


> Придется слазить в ReactOS, посмотреть что там к чему.
> Очень надеюсь, что они работают не через BackupRead.

В случае FileBasicInformation производится вызов FastIoQueryBasicInfo, во всех остальных случаях через драйвер посредством вызова обработчика завязанного на IRP_MJ_QUERY_INFORMATION


Riply   (2007-12-07 12:59:00) [13]

> [10] Rouse_ © (07.12.07 12:43)
> Выложи куда нибуть такой файлик. Только заархивируй RAR-ом,
>он умеет файловые потоки тоже сохранять - гляну на досуге.

Вот здесь: http://slil.ru/25202642
Там такой поток: ObjectIdentifier  64 Byte
Но бывают и другого размера и типа.


guav   (2007-12-07 12:53:00) [14]

> Причём это можно видеть даже на консольных командах :)

C:\>more< $Mft::$Zzzz
The parameter is incorrect.

C:\>more< $Mft::$Bitmap
Access is denied.



> > В MSDN написано что типы учтены в имени, т.е. имя потока имеет
> > формат :имя:тип, вроде ::$DATA или :AldData:$DATA или
> ::$FILE_NAME

> Если я правильно понимаю, то так должно быть (что-то типа
> правла хорошего тона),
> но не является законом.

Если я правильно понимаю, то там где оно нужно (ну т.е. на NTFS) оно будет.


guav   (2007-12-07 12:49:00) [15]

> Он с таким же успехом может съесть имя и не в таком формате :)

Это понятно. но главное что с полной квалификацией атрибутов тоже "ест".
Причём это можно видеть даже на консольных командах :)

> По САБЖУ: Это все-таки выравнивание :(
> (Может я, конечно, и ошибаюсь. Проверялось не досконально)

В MSDN утверждают что выравнивание, и здесь я думаю стоит им верить.


> Вроде да. С какой стати - нет ? С ними же тоже надо работать :)

А вот в MSDN пишут (смотрю оффлайновый, там где описана структура FILE_STREAM_INFORMATION):
The FILE_STREAM_INFORMATION structure is used to enumerate the streams for a file.
Разве другие атрибуты считаются потоками. Впрочем, раз ты уже вызывала эту функцию, вот и скажи, нет ли там имён файлов.

Причём, там же в MSDN упоминается из аттрибутов только $DATA


Rouse_   (2007-12-07 12:43:00) [16]

Выложи куда нибуть такой файлик. Только заархивируй RAR-ом, он умеет файловые потоки тоже сохранять - гляну на досуге.


Riply   (2007-12-07 12:24:00) [17]

> [5] Rouse_ © (07.12.07 10:43)
> Нормальные имена :) Я не люблю пользоваться приведениями типа
> FILE_STREAM_INFORMATION = FileStreamInformation :)
> Незачем сущности плодить :)

Когда я собственнолапно перевожу структуры, я тоже не "плодю сущности" :)
но если я использую юниты, например, от JWA,
то они там сами уже наплодили выше крыши - ну не затирать же :)

По САБЖУ: Это все-таки выравнивание :(
А жаль. Так бы было здорово. (Может я, конечно, и ошибаюсь. Проверялось не досконально)

> [6] Юрий Зотов © (07.12.07 11:03)
> Александра, скромность, конечно, человека украшает, но постить подобные
> темы в "начинающие" - это уже перебор. Не прибавляй работы, плз.

Sorry. Всю жизнь там (в Начинающих) сидела - привычка. Обещаю исправиться :)

> [7] guav © (07.12.07 11:26)
> В MSDN написано что типы учтены в имени, т.е. имя потока имеет
> формат :имя:тип, вроде ::$DATA или :AldData:$DATA или ::$FILE_NAME

Если я правильно понимаю, то так должно быть (что-то типа правла хорошего тона),
но не является законом. Да и вытаскивать тип из строки: брр...
Гораздо приятнее когда тебе DWord возвращают :)

> Я сам не пробовал вызывать NtQueryInformationFile, но с таким синтаксисом я сталкивался в других функциях,
> например полный формат имени потока для CreateFile - имяфайла:имяпотока:типпотока.

Он с таким же успехом может съесть имя и не в таком формате :)

> Кстати, если нужны только сами имена, почему бы не
> применить FindNextStreamW/FindFirstStream[Transacted]W ?

NtQueryInformationFile - удобнее, быстрее и гибче. (Это мое imho)
Придется слазить в ReactOS, посмотреть что там к чему.
Очень надеюсь, что они работают не через BackupRead.

> [8] guav © (07.12.07 11:33)
> Стоп. Разве вообще другие типы потоков, кроме $DATA должны возвращатся ?

Вроде да. С какой стати - нет ? С ними же тоже надо работать :)


guav   (2007-12-07 11:33:00) [18]

Стоп. Разве вообще другие типы потоков, кроме $DATA должны возвращатся ?

Про выравнивание - там же в MSDN:

The FILE_STREAM_INFORMATION structure must be aligned on a LONGLONG (8-byte) boundary. If a buffer contains two or more of these structures, the NextEntryOffset value in each entry, except the last, falls on an 8-byte boundary.


guav   (2007-12-07 11:26:00) [19]

В MSDN написано что типы учтены в имени, т.е. имя потока имеет формат :имя:тип, вроде ::$DATA или :AldData:$DATA или ::$FILE_NAME

Я сам не пробовал вызывать NtQueryInformationFile, но с таким синтаксисом я сталкивался в других функциях, например полный формат имени потока для CreateFile - имяфайла:имяпотока:типпотока.

Кстати, если нужны только сами имена, почему бы не применить FindNextStreamW/FindFirstStream[Transacted]W ?


Юрий Зотов   (2007-12-07 11:03:00) [20]

Александра, скромность, конечно, человека украшает, но постить подобные темы в "начинающие" - это уже перебор. Не прибавляй работы, плз.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо