Hace algunos años comencé un proyecto para uso personal, que permitiera generar ejecutables duales con facilidad. Lo llamé en un arrebato de imaginación: DUAL. Casualmente hoy he encontrado un CD que contenía esos fuentes…
Un ejecutable dual, es aquel corre nativamente en DOS si se ejecuta bajo DOS, o en Win32 si se ejecuta bajo algún sistema operativo de esta familia.
El truco consisten en incluir en el mismo EXE, las dos versiones al mismo tiempo: la versión DOS en la parte MZ de la cabecera, y la versión Windows en la parte PE.
Si el sistema operativo es DOS, solamente cargará el ejecutable MZ, mientras que si es Win32 cargará el el PE.
Fue un recurso bastante utilizado hace algunos años, y debo decir que siempre me llamó la atención.
Seguro que os suena el clásico mensaje de "This program requires Microsoft Windows", o "This program cannot be run in DOS mode". No es más que el stub DOS que incluyen las aplicaciones Windows. Éste es ejecutado cuando lanzamos una aplicación Windows bajo DOS puro.
Comencé desarrollando los stubs genéricos para DOS, y para Windows, que me permitieran ir comprobando los progresos, y posteriormente distribuirlos junto al programa. Cuando los tenía terminados, comencé con el programa en si, que no llegó a avanzar demasiado, pues descubrí STUBEXE (Executable optimizer), que permitía realizar el mismo proceso que yo quería.
Me divirtió hacer que el stub Windows, sacara el mensaje de "This program cannot be run in Windows mode", e ir luchando para reducir su tamaño hasta llegar a los 224 bytes (736 en el ejecutable). El truco para conseguir esta reducción, era más las opciones de enlazado (combinar secciones del ejecutable, reducir alineamiento, …) que el propio código en si.
El stub DOS, fue más sencillo de programar, dejándolo en uno de los primeros intentos ya en 92 bytes. Un tamaño inferior en varias veces al que incluyen la mayoría de aplicaciones Windows.
Puedes descargar los fuentes (MASM 6.x y MASM 7.x), y los binarios (2 Kb. en formato ZIP).