He vuelto al desarrollo de nuevas utilidades, en este caso con PatchPE, que me iba a resultar muy útil en FileOptimizer, como ya ocurriera con zRecompress.

Si ZEROFILL, ya era muy sencillo, PatchPE, lo es aún más, con sus menos de 90 lineas de código fuente en C. Ciertamente, esta versión inicial 1.00, no ha recibido ninguna optimización, pero modestia a parte, me quedó bastante sencillo y limpio desde el principio. Lo tuve listo en menos de una hora, lo cual es todo un logro. O sea que tardé más en crear la web, y publicarlo, que en hacer.

El propósito de PatchPE, es parchear la cabecera de los archivos PE, para hacerlos compatibles con versiones anteriores de Windows. Como sabéis, un ejecutable de Windows, consiste en una cabecera DOS (MZ), seguida de una cabecera PE, luego una COFF, y luego una cabecera extendida PE, que en Microsoft llaman opcional, pero que realmente es obligatoria.

La cabecera extendida PE, guarda información que ha generado el enlazador (linker), y que instruye al sistema operativo sobre ciertos aspectos y requerimientos del mismo. Entre ellos, está la versión mínima de Windows necesaria para ejecutarlo. La inconsistencia ocurre, porque las versiones más recientes de los enlazadores como LINK 14 en Visual C++ 2015, o LINK 15 en Visual C++ 2017, fijan esa versión mínima a Windows 7.

Por tanto, todos los programas que lo utilicen, sólo podrán abrirse en Windows 7, 2008, 8, 8.1, 2012, 10 o 2016. Todo ello, independientemente de el código real del programa, use funciones de Windows 7 o no. La solución era sencilla, modificar la cabecera, para reducir el valor estampado como versión mínima de Windows requerida.

Tomamos los campos MajorOperatingSystemVersion, MinorOperatingSystemVersion, MajorSubsystemVersion y MinorSubsystemVersion, y los fijamos a versión mínima Windows NT 4. Si tenemos suerte, y ese programa, no usa características especiales disponibles en versiones más modernas del sistema operativo, podremos ejecutarlo sin problemas. Incluso si hace uso de esas funciones recientes, pero lo hace bien, como FileOptimizer, esto es, detecta el sistema operativo actual, y carga dinámicamente sus funciones en caso de estar disponibles, lo podremos usar.

En mi caso, esto ocurre con los binarios de Google Guetzli y de MuPDF Mutool, que vienen marcados como Windows 7 o superior, pero que una vez parcheados, se ejecutan sobre Windows XP correctamente.

Tienes el código fuente, y los binarios para Win32 y Win64, disponibles en Sourceforge.