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

> Внимание!

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

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
Closed Topic Открыть новую тему 
> Перечисление альт. потоков данных (ADS), C# vs Delphi
сообщение
Сообщение #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 -
 К началу страницы 
+ Ответить 

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

 





- Текстовая версия 27.04.2024 7:38
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name