Introducción

Uno de los problemas más comunes en la migración de equipos Windows XP a versiones posteriores, es que las aplicaciones comprueban explícitamente la versión que tiene el sistema operativo antes de instalar. Lo malo lo está en hacer una revisión del sistema operativo, sino en la forma como la hacen, pues gran cantidad de estas aplicaciones requieren características y componentes que siguen existiendo en las últimas versiones. Por ejemplo, una aplicación de Oracle 10g hace esta comprobación antes de instalar:

Utilizando los Shims de mentira sobre versión con el ACT

Desde Windows 8 en adelante, Windows devuelve 6.2 como mínimo, así que falla tal cual ven en la figura. Una aplicación puede hacer la comprobación a nivel de kernel o de usuario. Si el escenario es el primero, no se puede mitigar; si es a nivel de usuario, hay grandes posibilidades de encontrar una solución temporal. En la siguiente parte mostraré con un ejemplo cómo utilizar los Shims del Kit de Compatibilidad de Aplicaciones (ACT) de Microsoft para realizar mentira sobre versión e intentar mitigar problemas de este tipo.

Instalación del ACT

El Kit de Compatibilidad de Aplicaciones (ACT), hace parte del ADK que se distribuye para diferentes versiones de Windows. Para instalar ACT, realizamos lo siguiente: 1. Descargar el ADK para Windows 8.1 desde el sitio web de Microsoft 2. Ejecutar el adksetup.exe, iniciar el asistente de instalación y seleccionar el Kit de compatibilidad de aplicaciones (ACT):

Utilizando los Shims de mentira sobre versión con el ACT

  1. Esperar a finalizar la instalación y cerrar el asistente.

Implementando el Shim con un caso práctico

Consideremos una aplicación simple, fea y que tenga este problema como la siguiente:

Utilizando los Shims de mentira sobre versión con el ACT

En esta aplicación, al hacer clic en el botón Check, se recibe este mensaje:

Utilizando los Shims de mentira sobre versión con el ACT

Como ven, el mensaje indica muy claramente que la versión de Windows no está soportada y muestra la versión de compilación que recibe, 6.2. Ahora, analicemos un poco el código que tiene esta aplicación sobre el evento de clic del botón Check:

private void btnCheck_Click(object sender, EventArgs e) { //Crear un objeto a partir de la clase OperatingSystem. System.OperatingSystem osInfo = System.Environment.OSVersion;

        //Variables para almacenar la versión mayor y menor de Windows.
        int Major = osInfo.Version.Major;
        int Minor = osInfo.Version.Minor;

        //Determinar el sistema operativo.
        //Windows XP es: 5.1.
        if (Major == 5 && Minor == 1)
        {
            MessageBox.Show("You are running on Windows XP: " + Major.ToString() + "." +  Minor.ToString(), "Compat Checker");  

        }
        else
        {
            MessageBox.Show("Unsupported operating system: " + Major.ToString() + "." + Minor.ToString(), "Compat Checker");
        }

      } //Fin de la función btnCheck_Click

Los comentarios del código explican las partes más “complejas”; básicamente se crea un objeto osInfo de la clase OperatingSystem y éste tiene una propiedad llamada OSVersion que me permite obtener información relevante al sistema operativo en que se está ejecutando como los números de versión, el identificador de plataforma, entre otros. En el código del condicional if, valido explícitamente si el número de versión es 5.1, correspondiente a Windows XP con el código: if (Major == 5 && Minor == 1) Si la validación devuelve verdadero, se muestra un mensaje indicando que se está ejecutando XP: MessageBox.Show(“You are running on Windows XP: “ + Major.ToString() + “.” + Minor.ToString(), “Compat Checker”);
Si el resultado es falso, muestra el mensaje de la figura 4: MessageBox.Show(“Unsupported operating system: “ + Major.ToString() + “.” + Minor.ToString(), “Compat Checker”); }

Ninguna aplicación, salvo en excepciones a más bajo nivel, debería comprobar la compatibilidad con una versión nueva de Windows solo por el número mayor y menor. Si se decide hacer de esta forma, debería comprobarse buscando que el número sea mayor o igual a 5.1, así: if (Major >= 5 && Minor >= 1)

Por supuesto, en el 90% de los casos o más, no tenemos acceso al código fuente, así que generalmente no es una opción. ¿Qué hacer entonces? ACT nos permite aplicar una corrección a las aplicaciones llamadas Shims. Básicamente, interceptan el llamado o la operación que realiza la aplicación a Windows y la dirige a unos módulos propios de ACT que devuelven respuestas diferentes generando otro comportamiento en la aplicación. Para el caso de mentira sobre versión, ACT devuelve diferentes versiones de Windows; por ejemplo, si aplico el de WinXPSP3VersionLite, la aplicación creerá que en efecto se está instalando sobre Windows XP. Lo primero que debemos hacer, es buscar en la pantalla o menú de inicio el Compatibility Administrator en la arquitectura que ejecuta la aplicación, 32 o 64 bits:

Utilizando los Shims de mentira sobre versión con el ACT

En la ventana principal de la consola de administración, clic en el botón superior de Fix. Se abrirá el asistente para crear un nuevo fix:

Utilizando los Shims de mentira sobre versión con el ACT

En la página de Program information, escribimos el nombre de la aplicación, fabricante y la ruta donde está el archivo de instalación para luego hacer clic en Siguiente:

Utilizando los Shims de mentira sobre versión con el ACT

En la página de Compatibility Modes, como son muy similares a los que Windows aplica en la ventana de Compatibilidad, lo dejamos así y clic en Siguiente:

Utilizando los Shims de mentira sobre versión con el ACT

En la página de Compatibility Fixes, buscamos el Shim que corresponde de acuerdo a nuestro problema. Volviendo a este caso de ejemplo, necesitamos que la aplicación crea que está en Windows XP, así que sería WinXPSP3VersionLie; lo seleccionamos y luego clic en el botón Parameters:

Utilizando los Shims de mentira sobre versión con el ACT

Lo que haremos en la página de Parameters será decirle al ACT que le mienta a todos los módulos posibles para que la aplicación no pueda evadir el engaño. Basta con escribir * en la caja de texto de Module name, hacer clic en Add y luego en OK para volver a la página de Compatibility Fixes:

Utilizando los Shims de mentira sobre versión con el ACT

De vuelta en Compatibility Fixes, clic en Siguiente.

En la página de Matching information, clic en Finalizar:

Utilizando los Shims de mentira sobre versión con el ACT

Antes de poder instalar el shim, debemos guardarlo en su archivo soportado, sdb. Para esto, en la consola de administración de ACT, clic en botón de Save:

Utilizando los Shims de mentira sobre versión con el ACT

En Database Name, ponemos un nombre cualquiera para identificar la base de datos y clic en OK:

Utilizando los Shims de mentira sobre versión con el ACT

Naturalmente, tendremos que darle un directorio al ACT en donde pueda guardar el shim, además de ponerle nombre, que puede ser el mismo del Database Name:

Utilizando los Shims de mentira sobre versión con el ACT

Por último, desde la consola de administración, hacemos clic derecho en nombre de la base de datos que guardamos y seleccionamos: Install

Utilizando los Shims de mentira sobre versión con el ACT

Si todo sale bien, nos debe salir un mensaje indicando que se realizó la instalación correctamente:

Utilizando los Shims de mentira sobre versión con el ACT

Lo que sigue es simplemente ejecutar la aplicación otra vez, sin modificar nada, lanzar la operación que en este caso sería clic en Check y ver el resultado:

Utilizando los Shims de mentira sobre versión con el ACT