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;