je souhaiterais faire un outil de lecture et ecriture dans les méta données des fichier NTFS ( flux ntfs). Concernant la lecture de flux, J'ai trouvé la procédure suivante en navigant sur le web mais il y a une ligne qui pose problème.

à l'exécution, j'ai une violation d'accès à la ligne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
BackupSeek(h, sid.Size, 0, dw1, dw2, p);
Fonction EnumStreamsInfo
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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;