1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
// path = Chemin+fichier à analyser
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 // boucle infinie
begin
form1.memo1.Lines.Add(path+'_-_-_-_-_-_-'); // разграничиваем записи ;)
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
form1.memo1.Lines.Add(PwideChar(@sid.cStreamName));
end;
form1.memo1.Lines.Add('Stream size: '+IntToStr(sid.Size));
s:='Type of data: ';
case sid.dwStreamId of // определяем тип потока
BACKUP_DATA: s := s+'data';
BACKUP_EA_DATA: s := s+'extended attributes';
BACKUP_SECURITY_DATA: s := s+'security';
BACKUP_ALTERNATE_DATA: s := s+'other streams';
BACKUP_LINK: s := s+'link';
else
s := s+'unknown';
end;
form1.memo1.Lines.Add(s);
if sid.Size>0 then
form1.Memo1.Lines.Add(inttostr(h));
// я не думаю, что у кого-то есть потоки больше 4ГБ, поэтому второй параметр поиска = 0
BackupSeek(h, sid.Size, 0, dw1, dw2, p);
end;
BackupRead(h, @sid, 0, temp, TRUE, FALSE, p);
CloseHandle(h);
end; |
Partager