Ich habe einen Ordner mit alten Bildern, die ich in Null gesammelt habe. Ich übertrage mit jedem Upgrade von Computer zu Computer zusammen mit all meinen Dateien, gelegentlich werde ich nostalgisch. Aber jedes Mal war es mir ein wenig peinlich, dass der Standard-Windows 7-Viewer keine GIF-Animationen zeigte, obwohl mein Gedächtnis mir sagte, dass die Animation in XP-Zeiten ohne Probleme angezeigt wurde. Beim nächsten Anfall von Nostalgie habe ich mich dennoch entschlossen, den Viewer unter XP unter Windows 7 zu starten. Nachdem ich einige Hindernisse überwunden habe, bin ich mir jetzt sicher, dass die GIF-Animation dort wirklich unterstützt wurde! Und vor allem - jetzt kann ich meinen alten Ordner mit Bildern in der authentischen Oberfläche des Windows XP-Bildbetrachters anzeigen, wodurch eine geeignetere Atmosphäre entsteht =)
Download: shimgvw_xp32.7z (enthält den Binär- und Quellcode des Launchers sowie shimgvw.dll aus dem englischsprachigen Windows XP SP3).
Wie wurde das gemacht?
Der Standard-Bildbetrachter in Windows XP ist keine reguläre Anwendung. Es befindet sich in der Bibliothek shimgvw.dll und kann nicht direkt ausgeführt werden. Sie benötigen mindestens
rundll32 (die Angabe des Pfads zu einer vorhandenen Bilddatei ist erforderlich):
rundll32 c:\windows\system32\shimgvw.dll,ImageView_Fullscreen c:\test.gif
Dieser Trick funktioniert jedoch nicht, wenn versucht wird, shimgvw.dll unter Windows XP unter Windows 7 und höher auszuführen. Shimgvw.dll kann nicht geladen werden. Der Windows XP-Kompatibilitätsmodus ist erforderlich, um ordnungsgemäß zu funktionieren. Dies kann erreicht werden, indem der entsprechende Kompatibilitätsmodus für die rundll32-Kopie festgelegt wird. Die Kompatibilität mit XP bedeutet jedoch, dass die Anwendungsberechtigungen auf das Maximum angehoben werden, wodurch das UAC-Dialogfeld bei jedem Start angezeigt wird, was ich vermeiden möchte.
Ein kleiner Tanz mit einem Debugger ermöglichte es, den Grund herauszufinden. Während des Startvorgangs versucht shimgvw.dll anschließend, mehrere Funktionen aus shunimpl.dll zu importieren, in denen veraltete Shell-Funktionen gespeichert sind. Letzteres lehnt das Laden standardmäßig ab, wenn ATOM "FailObsoleteShellAPIs" nicht vorhanden ist (das Vorhandensein dieses ATOM ermöglicht das Laden der Bibliothek , aber dann geben alle veralteten Funktionen nur den Fehlercode zurück. Im XP-Kompatibilitätsmodus wird dieses ATOM unter anderem so eingestellt, dass der Viewer gestartet wird.
Es wurde beschlossen, einen kleinen Loader zu schreiben, der ATOM „FailObsoleteShellAPIs“ hinzufügt, fragt, welches Bild geöffnet werden soll (wenn der Pfad nicht in den Parametern angegeben wurde) und dann die Steuerung an shimgvw.dll überträgt. Der Viewer funktioniert einwandfrei (d. H. Die ursprüngliche Aufgabe wurde abgeschlossen), daher habe ich nicht untersucht, welche veralteten Funktionen aus shunimpl.dll importiert werden und in welchen Fällen sie verwendet werden - anscheinend tun sie nichts, was für den Viewer kritisch ist.
Da Sie für die Implementierung des Loaders nur eine kleine Anzahl von WinAPI-Funktionen benötigen, habe ich mich als Experiment entschieden, ein Projekt mit Clang ohne Laufzeit zu erstellen (zuvor habe ich für solche Tänze immer MSVC verwendet). So wurde eine ausführbare Datei mit einer Größe von 14 Kilobyte erhalten, von denen 9 Kilobyte an das Symbol gingen. Wenn jemand auch gerne Gadgets ohne Abhängigkeit von nicht standardmäßigen Bibliotheken erstellt, kann dieses Projekt als kleines Beispiel dafür dienen, wie dies mit Clang gemacht wird.