Fișier jurnal schimbare USN
Sistemele de fișiere NTFS și refs au un jurnal de schimbare. Se numește USN. Odată ce un fișier este schimbat, jurnalul este scris informații despre el. Aceste informații pot fi extrase din revista. Revista nu este infinit, numărul de intrări în ea este limitată. Prin urmare, pentru un anumit fișier de intrări în jurnal nu poate fi, de exemplu, în cazul în care acesta este deja dovedit zatorta mai noi recorduri. În cazul în care pe un volum de fișiere local, sunt multe și ele sunt în continuă schimbare, intrarea jurnal nu va trăi foarte mult timp.
Susțineți logare
Deci, de exemplu, un fișier arbitrar. Scopul este de a intra în jurnalul de schimbare USN și trageți informații cu privire la cele mai recente produs cu operațiunile de fișiere. Fișierul trebuie să fie amplasat pe un sistem de fișiere NTFS sau Refs. Aceste sisteme de fișiere sunt jurnalizare. În primul rând în Windows NTFS acceptă numai de logare. Dar acum două dintre aceste sisteme de fișiere. Dintr-o data nu va fi noul sistem de fișiere USN jurnal în viitor? Prin urmare, pentru a determina dacă există vreun jurnal USN, sau nu este pe un volum local, nu se va compara numele de sistem de fișiere, și va căuta steaguri capabilități ale sistemului de fișiere. Orice ar fi fost, vechi sau noi, steagul ne va arăta dacă acest lucru susține revista USN sistemul de fișiere sau nu. Iată cum:
După acest apel, uita la numele sistemului de fișiere lpFileSystemNameBuffer, precum și pavilioanele capacităților sale în dwFsFlags. In mod specific, prezența jurnalizare este verificată după cum urmează:
Gândindu versiune USN jurnal
Există două versiuni curente ale revistei USN - versiunea 2.0 și versiunea 3.0. Acesta din urmă se caracterizează prin faptul că, în identificatorii ei de fișiere pe 128 de biți. Sub aceste două reviste utilizate diferite structuri de date, diferite dimensiuni. În mod implicit, dacă nu se specifică scopul, structura va reveni la 2,0. Dar vă voi arăta cum să obțineți datele și noua versiune, dacă această versiune este susținută de către sistem.
Se prepară doi parametri, pReadUSN și uReadUSNSize, pentru o utilizare ulterioară cu FSCTL_READ_FILE_USN_DATA de apel. Fie punctele pReadUSN la un tampon cu tip READ_FILE_USN_DATA, sau indică NULL.
Obținerea de numere de fișier USN-înregistrare Handley
Pentru a prelua datele din fișierul USN-jurnal, trebuie să aveți un număr de înregistrare a fișierului. Acesta poate fi obținut printr-un apel FSCTL_READ_FILE_USN_DATA. Numărul eliminat din structura, care are două versiuni diferite, care sunt de dimensiuni diferite, este necesar să se ia în considerare. Pentru a ține cont de acest lucru, de la început structurile USN_RECORD nevoie pentru a citi versiunea, și apoi prelucra datele de la ea.
4K este de mărime suficientă pentru a stoca USN-informații despre un fișier. Chiar și 1 Kb va fi suficient.
Acum uUsnNumber avem un număr de USN-înregistrare. Presupunem că este adevărat, deși nu poate fi cazul. Acest lucru poate fi un număr de înregistrare, care este deja în revista zatorta alte înregistrări. Acest număr poate fi ascuns de înregistrare fișier complet diferit. Sau ar putea fi un număr record în revista USN anterioară, care a fost îndepărtat și recreat. Prin urmare, după ce a primit informații din jurnalul USN, trebuie să verificați dacă informațiile există într-adevăr se referă la dosarul nostru. Acest lucru se face prin compararea identificatorilor de fișiere. identificator de fișier trebuie mai întâi să primească (cum se face acest lucru este descris aici).
De asemenea, următoarele întrebări vor fi să se ocupe de la volume și nu fișierul. Avem nevoie pentru a obține un mâner la volumul (hVolume), pe care se află fișierul.
Ajunge USN-Journal
URD - READ_USN_JOURNAL_DATA structura poate fi versiunea 0 sau versiunea 1, dar ele diferă doar prin două elemente suplimentare la capătul structurii în versiunea 1. Prin urmare, tamponul pentru cele două structuri au aceleași, și diferă doar să fie de mărimea structurii pe care le trece în apelul (urd_size). Aceste două elemente suplimentare inițializa ca 2 și 3, care este, DeviceIoControl de apel, atunci ne putem întoarce informații despre USN fie versiunea 2.0 sau 3.0.
Efectuarea apelurilor FSCTL_QUERY_USN_JOURNAL, pentru a obține ID-ul curent volumului revistei USN, în scopul de a face apoi o provocare finală cu această opțiune. Ca rezultat, în READ_USN_JOURNAL_DATA URD tip variabil scris anterior obținut înregistrări log USN camere, rezultați și în această etapă a identificatorul revistei.
Obținem recordul din Jurnalul USN
Acum, că structura READ_USN_JOURNAL_DATA formată, puteți face ultimul apel, care va extrage informații din jurnal. Este aceasta o provocare FSCTL_READ_USN_JOURNAL face.
În general, ca urmare a apelului, ambele pointerul urv2 și tampon urv3 indică în cazul în care structura situate fie USN_RECORD_V2, fie USN_RECORD_V3. Este necesar să se citească câmpul MajorVersion (pentru orice indicație), și apoi utilizați, respectiv, una dintre cele două indicatoare pentru informații despre versiunea corespunzătoare de pe USN-înregistrare.
Compara identificatorilor de USN v2.0
Dar, totuși, este necesar să se verifice dacă înregistrarea avem, dacă se referă la dosarul nostru, dar nu la altul. Ai nevoie pentru a compara identificatorii. Acest cod este diferit în versiunea 2.0 și 3.0, deoarece cantitatea de diferite identificatori. comparație Versiunea 2.0 USN arată astfel:
A se vedea. GetFileId cod function () aici.
Compara identificatorilor de USN v3.0
În versiunea 3.0 comparația USN arată astfel:
A se vedea. GetFileIdEx cod function () aici.
câmp de înregistrare Valoarea USN Journal
In MSDN USN_RECORD structura descrisă. Acolo și Vezi descrierea câmpurilor de structură. Cel mai interesant este câmpul Motiv și SourceInfo. Acestea vă permit să știe exact ceea ce a dus la crearea de înregistrări în jurnalul USN acțiuni. Asta este, să afle ce de fapt sa schimbat în fișierul?
S-ar părea că prima FSCTL_READ_FILE_USN_DATA provocare și așa returnează structura USN_RECORD, ce alte apeluri? Și apoi, când acel apel FSCTL_READ_FILE_USN_DATA structura astfel obținută USN_RECORD câmpul Motiv și SourceInfo întotdeauna 0. Acest lucru este chiar scris în MSDN. De aceea, un singur apel FSCTL_READ_FILE_USN_DATA nu are sens. El nu spune nimic utile despre dosar, cu excepția numărul de înregistrare USN. La urma urmelor, restul structurii câmpului, cu excepția Rațiunea și SourceInfo pot fi obținute prin mai multe metode tradiționale.

Informațiile din revista USN