![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перечисление потоков "файлового объекта".
Riply © (2007-12-07 08:56:00)Здравствуйте !
NtQueryInformationFile(..., FileStreamInformation)
возвращает не совсем полную информацию:
в структуре FILE_STREAM_INFORMATION нет описания "типа"(или атрибутов) потока.
Дело в том, что объект может иметь несколько потоков без имени, отличающихся "типом".
NtQueryInformationFile их перебирает, но не дает возможности разобраться "ху из ху" :)
"Типы" можно получить, например, читая "вручную" с помощью BackupRead,
но это очень медленно и некузяво. (Ну и разумеется, работая с MFT).
Нет ли аналога NtQueryInformationFile, дающего более полную информацию ?
Rouse_ (2007-12-07 10:43:00) [21]
> Ну кто же такие имена для переменных берет как FileStreamInformation ?
> Это вводит в заблуждение :)
Нормальные имена :) Я не люблю пользоваться приведениями типа
FILE_STREAM_INFORMATION = FileStreamInformation :)
Незачем сущности плодить :)
Riply (2007-12-07 10:37:00) [22]> [3] Rouse_ © (07.12.07 10:10)
> во тут целиком можешь взять: http://rouse.drkb.ru/tmp/ntfs.zip
Спасибо. Правда я уже успела перевести код из [2] Rouse_ © (07.12.07 10:06)
на русский язык. :)
Ну кто же такие имена для переменных берет как FileStreamInformation ?
Это вводит в заблуждение :)
P.S. Очень надеюсь, что эти два байта (про которые ты говоришь) и есть искомое,
но боюсь что это просто выравнивание :(
Сейчас буду тестировать.
О результатах доложу :)
Rouse_ (2007-12-07 10:10:00) [23]во тут целиком можешь взять: http://rouse.drkb.ru/tmp/ntfs.zip
Rouse_ (2007-12-07 10:06:00) [24]Неначем проверить, но глянь вот этот код, в доппотоках 2 байта лишних остаются (смотри на Reserved):
procedure TdlgNTFSThread.QueryStreams;
const
STATUS_BUFFER_OVERFLOW = $80000005;
STATUS_INFO_LENGTH_MISMATCH = $C0000004;
var
IoStatusBlock: IO_STATUS_BLOCK;
FileStreamInformation, FileStreamInformationReader: PFileStreamInformation;
FileStreamInformationSize: DWORD;
AResult: NT_STATUS;
Reserved: array of Byte;
ReservedLength: Integer;
ReservedOffset: PByte;
begin
if FileHandle = INVALID_HANDLE_VALUE then Exit;
AResult := STATUS_BUFFER_OVERFLOW;
FileStreamInformationSize := MAXSHORT;
GetMem(FileStreamInformation, FileStreamInformationSize);
repeat
if AResult = STATUS_INFO_LENGTH_MISMATCH then
begin
FileStreamInformationSize := FileStreamInformationSize * 2;
ReallocMem(FileStreamInformation, FileStreamInformationSize);
end;
AResult := NtQueryInformationFile(FileHandle, IoStatusBlock, FileStreamInformation,
FileStreamInformationSize, FILE_STREAM_INFORMATION);
until AResult <> STATUS_INFO_LENGTH_MISMATCH;
try
if (AResult = NO_ERROR) or (AResult = STATUS_BUFFER_OVERFLOW) then
begin
FileStreamInformationReader := FileStreamInformation;
repeat
SetLength(StreamsSize, Length(StreamsSize) + 1);
StreamsSize[Length(StreamsSize) - 1] :=
FileStreamInformationReader^.StreamSize;
lbStreams.Items.Add(
Copy(PWideChar(@FileStreamInformationReader^.StreamName),
1, FileStreamInformationReader^.StreamNameLength div SizeOf(WideChar)));
ReservedLength :=
FileStreamInformationReader^.NextEntryOffset -
((SizeOf(TFileStreamInformation)) +
FileStreamInformationReader^.StreamNameLength);
if ReservedLength > 0 then
begin
ReservedOffset := Pointer(DWORD(FileStreamInformationReader) +
FileStreamInformationReader^.NextEntryOffset - ReservedLength);
SetLength(Reserved, ReservedLength);
Move(ReservedOffset^, Reserved[0], ReservedLength);
end;
FileStreamInformationReader :=
Pointer(DWORD(FileStreamInformationReader) +
FileStreamInformationReader^.NextEntryOffset);
until FileStreamInformationReader^.NextEntryOffset = 0;
end;
finally
FreeMem(FileStreamInformation);
end;
end;
Kolan (2007-12-07 08:59:00) [25]> Здравствуйте !
Только млин хотел ответить: «ждите Riply» А это она и есть :)