Lancement de la visionneuse d'images à partir de Windows XP sur Windows moderne

J'ai un dossier avec de vieilles photos que j'ai collectées en zéro. Je transfère d'ordinateur à ordinateur avec tous mes fichiers à chaque mise à niveau, parfois je deviens nostalgique. Mais à chaque fois, j'étais un peu gêné que la visionneuse standard de Windows 7 ne montre pas d'animations GIF, bien que la mémoire me dise qu'à l'époque de XP, les animations montraient sans problème. Avec la prochaine attaque de nostalgie, j'ai quand même décidé de lancer la visionneuse depuis XP sur Windows 7. Après avoir surmonté un certain nombre d'obstacles, je suis maintenant sûr que l'animation GIF y était vraiment supportée! Et surtout - maintenant je peux regarder mon ancien dossier avec des photos dans l'interface authentique de la visionneuse d'images de Windows XP, ce qui crée une atmosphère plus appropriée =)


Téléchargement: shimgvw_xp32.7z (inclut le code binaire et le code source du lanceur, ainsi que shimgvw.dll à partir de Windows XP SP3 en anglais).

Comment cela s'est-il fait?


La visionneuse d'images standard dans Windows XP n'est pas une application standard. Il se trouve dans la bibliothèque shimgvw.dll, et vous ne pouvez pas l'exécuter directement - vous avez besoin d'au moins rundll32 (en spécifiant le chemin d'accès à un fichier image existant):

rundll32 c:\windows\system32\shimgvw.dll,ImageView_Fullscreen c:\test.gif 

Mais cette astuce ne fonctionne pas lorsque vous essayez d'exécuter shimgvw.dll à partir de Windows XP sur Windows 7 et versions ultérieures - shimgvw.dll ne peut pas se charger, il a besoin du mode de compatibilité Windows XP pour fonctionner correctement. Ceci peut être réalisé en définissant le mode de compatibilité approprié pour la copie rundll32, mais la compatibilité avec XP implique d'augmenter les autorisations d'application au maximum, ce qui fait apparaître la boîte de dialogue UAC à chaque démarrage, ce que j'aimerais éviter.

Une petite danse avec un débogueur a permis d'en découvrir la raison - lors du processus de démarrage, shimgvw.dll essaie ensuite d'importer plusieurs fonctions depuis shunimpl.dll, où sont stockées les fonctions shell obsolètes, et ce dernier refuse de se charger par défaut si ATOM "FailObsoleteShellAPIs" est absent (la présence de cet ATOM permet de charger la bibliothèque , mais toutes les fonctions obsolètes renvoient simplement le code d'erreur). Le mode de compatibilité XP, entre autres, définit cet ATOM, de sorte que la visionneuse démarre.

Il a été décidé d'écrire un petit chargeur qui ajoute ATOM «FailObsoleteShellAPIs», demande quelle image ouvrir (si le chemin n'a pas été spécifié dans les paramètres), puis transfère le contrôle à shimgvw.dll. La visionneuse fonctionne bien (c'est-à-dire que la tâche initiale a été terminée), donc je n'ai pas recherché quelles fonctions obsolètes sont importées de shunimpl.dll et dans quels cas elles sont utilisées - apparemment, elles ne font rien de critique pour que la visionneuse fonctionne.

Étant donné que pour implémenter le chargeur, vous n'avez besoin de rien d'autre qu'un petit nombre de fonctions WinAPI, j'ai décidé comme expérience de construire un projet en utilisant Clang sans utiliser d'exécution (auparavant, j'utilisais toujours MSVC pour de telles danses). Ainsi, un fichier exécutable de 14 kilo-octets a été obtenu, dont 9 kilo-octets sont allés à l'icône. Si quelqu'un aime également créer des gadgets sans dépendances sur des bibliothèques non standard, ce projet peut servir de petit exemple de la façon dont cela se fait à l'aide de Clang.

Source: https://habr.com/ru/post/fr430434/


All Articles