IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

> Перечисление альт. потоков данных (ADS), C# vs Delphi
volvo
сообщение 20.02.2010 21:29
Сообщение #1


Гость






Привет всем smile.gif

Столкнулся с не совсем понятным поведением кода, перечисляющего все альтернативные потоки данных (Alternative Data streams). Код был написан на Дельфи, на основании статьи: MSDN -> Iterating NTFS Streams

Код, приведенный в статье проверил, он для моего файла выдает вот что:
F:\smileyaddbinw.zip:
(unnamed) SecurityData 188
(unnamed) Data 294563
:Zone.Identifier:$DATA AlternateData 26
Press any key to continue . . .



Дельфийский код:
procedure ListADS(const fn: string; memo: TMemo);
var
  hFile: Cardinal;
  streamInfo: WIN32_STREAM_ID;
  offset: Cardinal;
  readed, readedLow, readedHigh: DWORD;
  secInfo: Pointer;
  wszStreamName: array[0 .. MAX_PATH] of WideChar;

const
  strStreamTypes: array[0 .. 8] of string =
  (
  'Data', 'ExternalData', 'SecurityData',
  'AlternateData', 'Link', 'PropertyData',
  'ObjectID', 'ReparseData', 'SparseDock'
  );

begin
  secInfo := nil;

  ZeroMemory(@wszStreamName[0], sizeof(wszStreamName));
  hFile := CreateFile(PChar(fn), READ_CONTROL, FILE_SHARE_READ or FILE_SHARE_WRITE,
                      nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);
  if hFile = INVALID_HANDLE_VALUE then exit;

  offset := Integer(@streamInfo.cStreamName) - Integer(@streamInfo);
  if (not BackupRead(hFile, PByte(@streamInfo), offset, readed, False, False, secInfo))
     or (readed = 0) then
  begin
    CloseHandle(hFile);
    Exit;
  end;

  while BackupRead(hFile, PByte(@wszStreamName[0]), streamInfo.dwStreamNameSize, readed, False, False, secInfo) do
  begin
    memo.Lines.Add(Format('%s (%s), size = %d',
      [IfThen(streamInfo.dwStreamNameSize > 0, wszStreamName, '<unnamed>'),
       strStreamTypes[pred(streamInfo.dwStreamId)], streamInfo.Size]));

    BackupSeek(hFile, Int64Rec(streamInfo.Size).Lo, Int64Rec(streamInfo.Size).Hi, readedLow, readedHigh, secInfo);
    if (not BackupRead(hFile, PByte(@streamInfo), offset, readed, False, False, SecInfo))
       or (readed = 0) then
    begin
      Break;
    end;
    ZeroMemory(@wszStreamName[0], sizeof(wszStreamName));
  end;
  BackupRead(hFile, PByte(@streamInfo), SizeOf(streamInfo), readed, True, False, secInfo);
  CloseHandle(hFile);
end;
, однако, выводит:
<unnamed> (Data), size = 294563
:Zone.Identifier:$DATA (AlternateData), size = 26



. То есть, один поток не просматривается. Перенес код на Билдер. То же самое. Один поток не обнаруживается. Билдеровские результаты полностью совпадают с Дельфийскими.

Тестировалось на одной и той же машине, естественно. Под одним и тем же пользователем, с админскими правами. Версия ОС - WinXP SP3, и Дельфи и Билдер 2009, установлен .NET 2.0 (2.0.50727), если это важно.

Вопрос, собственно, в следующем: это я что-то не увидел или напортачил в Дельфи, или потоки типа SecurityData в принципе не определяются, кроме как под .NET? Довольно странно, ведь там же идет вызов тех же самых API-шных функций.

Update
Хм... Ясно... Тема далека от нахождения минимума в массиве и сортировки пузырьком. Ну, продолжайте совершенствоваться дальше в стандартных и на фиг не нужных никому задачах. Закрыто...

Сообщение отредактировано: volvo - 2.04.2010 15:41
 К началу страницы 
+ Ответить 

Сообщений в этой теме


Closed Topic Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 8.08.2025 7:33
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"