Столкнулся с не совсем понятным поведением кода, перечисляющего все альтернативные потоки данных (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 -