Но самое забавное это то, что узнать есть ли у файла потоки и какие нельзя “общеюзерскими средствами”. Что ж, придётся написать просмативалку потоков. Для этого Delphi 7 как раз подойдёт… Стоп. На Delphi просто так это не написать. Дело в том, что для поиска имён потоков надо использовать BackUpSeek из юнита Windows.pas, но толи злобные зулусские хакеры ломанули Бормана, толи программист который писал Windows.pas оппился пива (хотя судя по юниту употребляли кое-что покрепче :)), в результате чего функция объявлена так:
function BackupSeek(hFile: THandle; dwLowBytesToSeek, dwHighBytesToSeek: DWORD;
var lpdwLowByteSeeked, lpdwHighByteSeeked: DWORD; lpContext: Pointer): BOOL; stdcall;
lpContext – задеклорирован как указатель. А у MS это задекларировано так:
BOOL BackupSeek(
HANDLE hFile,
DWORD dwLowBytesToSeek,
DWORD dwHighBytesToSeek,
LPDWORD lpdwLowByteSeeked,
LPDWORD lpdwHighByteSeeked,
LPVOID* lpContext
);
Придётся задекларировать BackupSeek самим:
function BackupSeekA(hFile: THandle; dwLowBytesToSeek, dwHighBytesToSeek: DWORD;
lpdwLowByteSeeked, lpdwHighByteSeeked: PDWORD;var lpContext: Pointer): BOOL; stdcall; external kernel32 name ‘BackupSeek’;
Так… Ну теперь всё готово. :) Можно приступать к самому способу перечисления потоков. Для этого используются функции BackupSeek и BackupRead:
Procedure EnumStreamsInfo(path:PChar);
var s:string;
wszStreamName:array[0..MAX_PATH-1] of WCHAR;
sid:WIN32_STREAM_ID absolute wszStreamName;
h:thandle;
p:pointer;
temp,dw1, dw2:cardinal;
begin
p:=nil;
h:=CreateFile(path,GENERIC_READ, 0, nil, OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS or FILE_FLAG_POSIX_SEMANTICS, 0);
while true do begin
memo1.Lines.Add(‘_-_-_-_-_-_-‘); // разграничиваем записи ;)
BackupRead(h, @wszStreamName, sizeof(sid), temp, FALSE, TRUE, p);
if temp = 0 then break;
if sid.dwStreamNameSize > 0 then begin // если у потока есть имя, то узнаем его
BackupRead(h, pointer(integer(@wszStreamName) + sizeof(sid)), sid.dwStreamNameSize, temp, FALSE, TRUE, p);
if temp <> sid.dwStreamNameSize then break;
{ для простоты всё выводиться в TMemo }
memo1.Lines.Add(PwideChar(@sid.cStreamName));
end;
Обсуждене
Отзывов нет на «NTFS Streams»
Ваш отзыв