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, дающего более полную информацию ?


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»… А это она и есть :)


Страницы:   1 2

Наверх

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