Lanzar el visor de imágenes desde Windows XP en Windows moderno

Tengo una carpeta con fotos antiguas que reuní en cero. Transfiero de computadora a computadora junto con todos mis archivos con cada actualización, ocasionalmente me vuelvo nostálgico. Pero cada vez me daba un poco de vergüenza que el visor estándar de Windows 7 no mostrara animaciones GIF, aunque la memoria me decía que en los días de XP la animación se mostraba sin problemas. Con el siguiente ataque de nostalgia, aún decidí iniciar el visor desde XP en Windows 7. Después de superar una serie de obstáculos, ¡ahora estoy seguro de que la animación GIF realmente fue compatible allí! Y lo más importante: ahora puedo ver mi carpeta anterior con imágenes en la interfaz auténtica del visor de imágenes de Windows XP, lo que crea una atmósfera más adecuada =)


Descargar: shimgvw_xp32.7z (incluye el código binario y fuente del iniciador, más shimgvw.dll del SP3 de Windows XP en inglés).

¿Cómo se hizo esto?


El visor de imágenes estándar en Windows XP no es una aplicación normal. Está ubicado en la biblioteca shimgvw.dll y no puede ejecutarlo directamente; necesita al menos rundll32 (se requiere una ruta a un archivo de imagen existente):

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

Pero este truco no funciona cuando se intenta ejecutar shimgvw.dll desde Windows XP en Windows 7 y versiones posteriores: shimgvw.dll no se puede cargar, necesita el modo de compatibilidad con Windows XP para funcionar correctamente. Esto se puede lograr estableciendo el modo de compatibilidad apropiado para la copia rundll32, pero la compatibilidad con XP implica aumentar los permisos de la aplicación al máximo, lo que hace que aparezca el diálogo UAC en cada inicio, lo que me gustaría evitar.

Un pequeño baile con un depurador permitió descubrir la razón: durante el proceso de arranque, shimgvw.dll intenta importar varias funciones desde shunimpl.dll, donde se almacenan funciones de shell obsoletas, y este último se niega a cargar por defecto si ATOM "FailObsoleteShellAPIs" está ausente (la presencia de este ATOM permite cargar la biblioteca , pero todas las funciones obsoletas solo devuelven el código de error). El modo de compatibilidad con XP, entre otras cosas, establece este ATOM, por lo que el visor se inicia.

Se decidió escribir un pequeño cargador que agrega "FailObsoleteShellAPIs" de ATOM, pregunta qué imagen abrir (si la ruta no se especificó en los parámetros) y luego transfiere el control a shimgvw.dll. El visor funciona bien (es decir, se completó la tarea inicial), por lo que no investigué qué funciones obsoletas se importan de shunimpl.dll y en qué casos se usan, aparentemente, no hacen nada crítico para que el visor funcione.

Como no necesita nada más que un pequeño número de funciones WinAPI para implementar el cargador, decidí como experimento construir un proyecto usando Clang sin usar un tiempo de ejecución (anteriormente siempre usaba MSVC para tales bailes). Así, se obtuvo un archivo ejecutable de 14 kilobytes de tamaño, de los cuales 9 kilobytes fueron al icono. Si a alguien también le gusta hacer gadgets sin dependencias de bibliotecas no estándar, este proyecto puede servir como un pequeño ejemplo de cómo se hace esto usando Clang.

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


All Articles