![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() |
volvo |
![]()
Сообщение
#1
|
Гость ![]() |
Привет всем
![]() Столкнулся с не совсем понятным поведением кода, перечисляющего все альтернативные потоки данных (Alternative Data streams). Код был написан на Дельфи, на основании статьи: MSDN -> Iterating NTFS Streams Код, приведенный в статье проверил, он для моего файла выдает вот что: F:\smileyaddbinw.zip: Дельфийский код: 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 . То есть, один поток не просматривается. Перенес код на Билдер. То же самое. Один поток не обнаруживается. Билдеровские результаты полностью совпадают с Дельфийскими. Тестировалось на одной и той же машине, естественно. Под одним и тем же пользователем, с админскими правами. Версия ОС - WinXP SP3, и Дельфи и Билдер 2009, установлен .NET 2.0 (2.0.50727), если это важно. Вопрос, собственно, в следующем: это я что-то не увидел или напортачил в Дельфи, или потоки типа SecurityData в принципе не определяются, кроме как под .NET? Довольно странно, ведь там же идет вызов тех же самых API-шных функций. Update Хм... Ясно... Тема далека от нахождения минимума в массиве и сортировки пузырьком. Ну, продолжайте совершенствоваться дальше в стандартных и на фиг не нужных никому задачах. Закрыто... Сообщение отредактировано: volvo - 2.04.2010 15:41 |
![]() ![]() |
![]() |
Текстовая версия | 8.08.2025 7:33 |