Bookmarks unter IE (W2k)
FrankieB
- php
0 Matthias Jütte0 Viennamade0 FrankieB0 Viennamade0 FrankieB
0 Thomas Meinike
Hallo,
schreibe mir gerade eine kleine Favoritenverwaltung mit PHP. Dazu lese ich die "Favoritenordner" unter Windows aus und "parse" die *.url-Dateien.
Frage:
...
[InternetShortcut]
URL=http://forum.de.selfhtml.org/my/
Modified=D07FF63D8869C40138
...
Wie kann ich den Eintrag bei Modified entschlüsseln?
Danke für eure Antworten.
Grüsse
Frankie
Hallo!
Auf nette Anfrage hin kann es dir der Autor dieser Software vielleicht verraten: http://freehost14.websamba.com/nirsoft/utils/faview.html
Gruß
Matthias
Hallo!
schreibe mir gerade eine kleine Favoritenverwaltung mit PHP. Dazu lese ich die "Favoritenordner" unter Windows aus und "parse" die *.url-Dateien.
Frage:
[InternetShortcut]
URL=http://forum.de.selfhtml.org/my/
Modified=D07FF63D8869C40138
...
Also bitte, das solche Banalitäten hier gefragt werden. Sowas weiß doch jeder. Logischweise - wie könnte es anders sein - ist es ein 64-bit-Wert welcher die 100-Nanosekunden-Intervalle seit dem 1. Januar 1601 darstellt. Schäm Dich!
:-) Huch, jetzt bleibt nur noch zu hoffen, daß ich das richtige gefunden habe: http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemruntimeinteropservicesfiletimeclasstopic.asp
Und wenn ja, das in PHP abzubilden kann doch überhaupt kein Problem sein.
Odr?
;-) Beste Grüße
Viennamade
Hallo Wiener,
Also bitte, das solche Banalitäten hier gefragt werden. Sowas weiß doch jeder. Logischweise - wie könnte es anders sein - ist es ein 64-bit-Wert welcher die 100-Nanosekunden-Intervalle seit dem 1. Januar 1601 darstellt. Schäm Dich!
Entschuldigung dass ich dich mit solchen Banalitäten belästigt habe!
:-) Huch, jetzt bleibt nur noch zu hoffen, daß ich das richtige gefunden habe: http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemruntimeinteropservicesfiletimeclasstopic.asp
Wo auf dieser Seite finde ich den Entschlüsselungsalgorithmus?
Grüsse
Frankie
Hallo Frankie!
Also bitte, das solche Banalitäten hier gefragt werden. Sowas weiß doch jeder. Logischweise - wie könnte es anders sein - ist es ein 64-bit-Wert welcher die 100-Nanosekunden-Intervalle seit dem 1. Januar 1601 darstellt. Schäm Dich!
Entschuldigung dass ich dich mit solchen Banalitäten belästigt habe!
Äh, so Du das mit dem Entschuldigen ernst meinst ... mein Posting war scherzhaft gemeint. Mich hat Deine Frage interessiert, habe gesurft und in Erfahrung gebracht, daß es sich um den MS-Datentyp FILETIME handelt und ab welchem Datum die serielle Zählung für solche Informationen begann. In meiner kleinen EDV-Welt habe ich es nicht für möglich gehalten, daß man mit Nicht-MS-Programmtools das nachrechnen kann, und daher habe ich Dir so gepostet wie ich es eben tat. Umso größer mein Erstaunen über Thomas Lösung ..., denn wie gesagt, ich wußte nicht, daß das überhaupt möglich ist ...
Beste Grüße
Viennamade
Hallo Viennamde,
Äh, so Du das mit dem Entschuldigen ernst meinst ... mein Posting war scherzhaft gemeint...
das habe ich auch so aufgefasst, es haben lediglich ein oder zwei Smiles in _meiner_ Antwort gefehlt ;-) ;-)
Mich hat Deine Frage interessiert, habe gesurft und in Erfahrung gebracht, daß es sich um den MS-Datentyp FILETIME handelt und ab welchem Datum die serielle Zählung für solche Informationen begann.
Ich habe mich natürlich auch sehr über dein Posting gefreut, da Du in "meiner" Sache recherchiert hast. Vielleicht ist das nicht so rübergekommen, da Thomas' Lösung schon vorlag.
Vielen Dank auch an dich und nix für ungut, ok?
Grüsse
Frankie
Hallo,
[InternetShortcut]
URL=http://forum.de.selfhtml.org/my/
Modified=D07FF63D8869C40138
...Wie kann ich den Eintrag bei Modified entschlüsseln?
Unter http://www.cyanwerks.com/file-format-url.html gibt es eine formale Beschreibung mit einem VB-Programm.
Zum angegebenen Modified-Wert liefert dieses Programm die Ausgabe: 14/7/2004 09:52:14
Wichtig: Das letzte Byte ist eine Pruefsumme, also nur die ersten 8 Bytes sind relevant.
Mit PHP habe ich dieses Ergebnis so zustande bekommen:
<?php
$mod="D07FF63D8869C40138"; // Modified-Wert
$high_dword=substr($mod,14,2).substr($mod,12,2).substr($mod,10,2).substr($mod,8,2);
$low_dword=substr($mod,6,2).substr($mod,4,2).substr($mod,2,2).substr($mod,0,2);
$mod_neu=$high_dword.$low_dword;
// Anzahl der 100-Nanosekunden-Intervalle seit 1601 in Sekunden
$sek_ab_1601=hexdec($mod_neu)/1e7;
// Sekunden zwischen 1601 und 1970 ermitteln
$diff=0;
$sek_tag=24*60*60;
for($jahr=1601;$jahr<1970;$jahr++)
{
if(checkdate(2,29,$jahr))$diff+=366*$sek_tag;
else $diff+=365*$sek_tag;;
}
$sek_ab_1970=$sek_ab_1601-$diff;
$ausgabe=gmdate("d.m.Y h:i:s",$sek_ab_1970);
print $ausgabe; // 14.07.2004 09:52:14
?>
MfG, Thomas
Hallo,
Kleiner Nachtrag:
In der Zeile
$diff+=365*$sek_tag;;
reicht ein ; am Ende.
MfG, Thomas
Hallo Thomas,
Unter http://www.cyanwerks.com/file-format-url.html gibt es eine formale Beschreibung mit einem VB-Programm.
Vielen Dank für den Link und dein Skript. Genau so habe ich mir das vorgestellt. Funktioniert perfekt!
Auf diesen Algorithmus muß man erstmal kommen. Ohne deine Hilfe hätte ich das so schnell wohl nicht hinbekommen.
Nochmals besten Dank und ein schönes WE.
Grüsse
Frankie
Hallo,
Auf diesen Algorithmus muß man erstmal kommen.
Nachdem das Prinzip und das Ergebnis klar waren, bestand fuer mich der eigentliche "Knackpunkt" in der Umsetzung der API-Funktion FileTimeToSystemTime, die das genannte VB-Programm aus der kernel32.dll aufruft.
Nochmals besten Dank und ein schönes WE.
Danke gleichfalls -- Dein Problem hat auch mir ein gutes Stueck Erkenntnisgewinn gebracht.
MfG, Thomas
Hallo,
[Nachtrag 2]
Wichtig: Das letzte Byte ist eine Pruefsumme, also nur die ersten 8 Bytes sind relevant.
Diese Pruefsumme hat mich auch noch interessiert, da sich damit die Gueltigkeit des Modified-Strings pruefen lassen sollte. Ich habe keine direkten Hinweise gefunden, aber mal mit den Modified-Daten experimentiert.
Beim Addieren der Dezimalwerte der ersten 8 Hex-Bytes und Subtrahieren des Pruefbyte-Dezimalwertes ergab sich entweder 768 oder 1024. Genauer: NTFS liefert 768 und FAT32 1024. Vermutlich gibt es noch weitere Werte.
Hier nochmal der Ausgangscode mit Pruefbedingung und einigen Testbeispielen:
<?php
// Beispiel-Modified-Werte
$mod1="D07FF63D8869C40138"; // 14.07.2004 09:52:14 (1024)
$mod2="C03490B307DCC301DE"; // 16.01.2004 08:06:53 (768)
$mod3="20F06BA06D07BD014D"; // 13.12.1997 02:20:06 (768)
$mod4="3099E08EBCC2C30179"; // 15.12.2003 03:36:00 (1024)
$mod5="C02571CDCBC2C30174"; // 15.12.2003 05:25:07 (1024)
$mod6="A0B47184A25AC00106"; // 30.11.2000 07:52:41 (1024)
$mod7="205095AA2E84C30125"; // 26.09.2003 01:04:06 (768)
$mod8="A017BFF0CC5AC40151"; // 25.06.2004 03:56:13 (1024)
// Modified-Wert auswaehlen
$mod=$mod1;
// Modified-String zerlegen
$high_dword=substr($mod,14,2).substr($mod,12,2).substr($mod,10,2).substr($mod,8,2);
$low_dword=substr($mod,6,2).substr($mod,4,2).substr($mod,2,2).substr($mod,0,2);
$pruef_summe=substr($mod,16,2);
// Teil-String zur Datum/Zeit-Bestimmung mit Gueltigkeitspruefung
$mod_neu=$high_dword.$low_dword;
$pruef_arr=explode(" ",trim(chunk_split($mod_neu,2," ")));
$pruef_test=0;
for($i=0;$i<8;$i++)$pruef_test+=hexdec($pruef_arr[$i]);
$pruef_test-=hexdec($pruef_summe);
if($pruef_test==768 || $pruef_test==1024)
{
// Anzahl der 100-Nanosekunden-Intervalle seit 1601 in Sekunden
$sek_ab_1601=hexdec($mod_neu)/1e7;
// Sekunden zwischen 1601 und 1970 ermitteln
$diff=0;
$sek_tag=24*60*60;
for($jahr=1601;$jahr<1970;$jahr++)
{
if(checkdate(2,29,$jahr))$diff+=366*$sek_tag;
else $diff+=365*$sek_tag;
}
$sek_ab_1970=$sek_ab_1601-$diff;
$ausgabe=gmdate("d.m.Y h:i:s",$sek_ab_1970);
print $ausgabe;
}
else print "Modified-Wert ist nicht gueltig!\n";
?>
MfG, Thomas