Einzelnen Beitrag anzeigen

blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#1

Papierkorb INFO2: Löschungszeitpunkt ermitteln

  Alt 12. Aug 2007, 21:49
Hallo zusammen

Hier noch eine Funktion zur Ermittlung des Löschungsdatums einer Datei. Dabei wird die Datei INFO2 ausgelesen.

Delphi-Quellcode:
uses
  DateUtils;

// get_recycler_datetime von Daniel Marschall
// Gibt das Löschungsdatum und die Zeitangabe einer gelöschten Datei wieder

// Erwartete Eingaben
// NTFS: ?:\Recycler\<SID>\D?*.*
// FAT: ?:\Recycled\D?*.*

// Benötigt: Int64-Support, Unit DateUtils
// Nicht Vista-Fähig

// Vollversion der Recycler-Bin-Unit (mit Vista-Support):
// [url]http://www.viathinksoft.de/index.php?page=projektanzeige&seite=download&id=124[/url]

function get_recycler_datetime(filename: string): tdatetime;

  function ReadInt64(const Stream: TStream): int64;
  var
    I: int64;
  begin
    i := 0;
    Stream.ReadBuffer(i, 8);
    Result := i;
  end;

  function GetGMTDifference(): extended;

    // [url]http://www.delphipraxis.net/post340194.html#340194[/url]
    function NowUTC: TDateTime;
    var
      SystemTime: TSystemTime;
    begin
      GetSystemTime(SystemTime);
      with SystemTime do
        Result := EncodeDate(wYear, wMonth, wDay) +
          EncodeTime(wHour, wMinute, wSecond, wMilliseconds);
    end;

  begin
    result := - (datetimetounix(NowUTC())-datetimetounix(Now())) / 3600;
  end;

var
  fs: TFileStream;
  buf: integer;
  suche: string;
  i: integer;
const
  record_length = $320;
  unique_index_position = $118;
  timestamp_position = $120;
  info_file = 'INFO2';
begin
  // Beginn der Windows-Zeitzählung: 01.01.1601 00:00:00 (GMT)
  result := EncodeDateTime(1601, 1, 1, 0, 0, 0, 0);

  suche := copy(filename, 0, length(filename)-length(extractfileext(filename)));
  suche := extractfilename(suche);
  suche := copy(suche, 3, length(suche)-2);
  fs := TFileStream.Create(extractfilepath(filename)+info_file, fmOpenRead);
  try
    i := -1;
    repeat
      inc(i);
      if unique_index_position+i*record_length > fs.size then break;
      fs.seek(unique_index_position+i*record_length, soFromBeginning);
      fs.ReadBuffer(buf, 4);
      if buf = strtoint(suche) then
      begin
        fs.seek(timestamp_position+i*record_length, soFromBeginning);

        // [url]http://www.e-fense.com/helix/Docs/Recycler_Bin_Record_Reconstruction.pdf[/url]
        // UnixTime = 0.0000001 * NTTime + 11644473600
        // DAS IST FALSCH!!!
        // Die korrekte Formel ist:
        // UnixTime = 0.0000001 * NTTime - 11644473600 + c * 3600
        // c = GMT-Abweichung (MEZ = 1) inklusive Sommerzeitzusatz (+3600 Sekunden)
        result := unixtodatetime(ReadInt64(fs) div 10000000 - 11644473600 + round(GetGMTDifference() * 3600));

        break;
      end;
    until false;
  finally
    fs.free;
  end;
end;
Das habe ich noch nicht getestet:
- Mit Windows 9x INFO2 Kompatibel? (Da der Timestamp "NT TIME" genannt wird)
- Macht Windows einen Unterschied zwischen MEZ und MESZ? Fraglich...

Beispiel:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  x: TDateTime;
begin
  x := get_recycler_datetime('C:\recycler\S-1-5-21-515967899-1957994488-839522115-1003\DC27.bmp');
  showmessage(datetimetostr(x));
end;
Weitere Informationen zur INFO2-Datei hier: http://www.e-fense.com/helix/Docs/Re...nstruction.pdf
Achtung! Anleitung teilweise fehlerhaft! Habe den Autor bereits kontaktiert

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat