Al depurar Control.exe (el ejecutable encargado de cargar ficheros de Panel de control) no obtuve nada reseñable. De hecho, Control.exe es un proceso efímero que dura poco tiempo en ejecución. Es el proceso Explorer.exe el que se hace cargo de la inicialización del Panel de control en última instancia (esto puede comprobarlo ejecutando "control.exe" con Process Explorer abierto). Así que decidí depurar Explorer.exe a partir de funciones conocidas de Shell32.dll que están relacionadas con la carga de Panel de control. También podría "volcar" los símbolos de Shell32.dll y poner "breakpoints" en aquellas funciones que, por el nombre, le parezca que están relacionadas con la carga de Panel de control. De pronto me encontré con una llamada a la DLL Slc.dll, una nueva DLL en Windows Vista que implementa funciones relacionadas con el servicio de licencias de software de Windows Vista. El servicio de licencias de software (Slsvc.exe) es un nuevo servicio de Windows Vista encargado de consultar la licencia del equipo (estado de la activación, si el sistema es genuino o no, qué funcionalidades permite la versión de Vista instalada, etc.).
Decidí poner "breakpoints" en funciones con el patrón "slc!*" y reiniciar la depuración. Llegué en primer lugar a una función de Slc.dll encargada de obtener información sobre la versión de Windows instalada.

Seguidamente, al retornar de la función se obtuvo el código de error 0x80070426, que significa que el servicio no está iniciado. Por ser la función Slc.dll, inmediatamente relacioné esto con el servicio Slsvc antes mencionado. Efectivamente comprobé que dicho servicio no estaba iniciado, así que lo inicié, reinicié el sistema y el problema quedó solucionado.
La función que realiza la llamada al servicio de licencias como ve es CPLD_GetRegModules. Esta función delega toda su actividad en otra función proxy: CPLD_GetRegModulesWorker, encargada de leer la caché de ficheros .cpl del sistema, almacenada en el Registro en la clave HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Controls Folder.
|
El motivo de emplear una función "representante" (proxy) es que no se quiere que ciertas funciones se ejecuten sin realizar antes una comprobación de la licencia del equipo.
En resumen, el servicio "Licencias de software" es muy importante para Windows Vista, muchas funciones del sistema operativo realizan antes de ejecutarse una llamada a este servicio. La licencia incluye, entre otras cosas, el máximo número de conexiones permitido, si se permite ejecutar Windows Aero o no, si se incluye un codec MPEG2, Control parental, Media Center, etc.). La conexión con el servicio de licencias evita que, por ejemplo, sustituyendo binarios de versiones distintas de Vista se obtenga una característica que no permita la licencia instalada. Como curiosidad final, durante la inicialización del núcleo de NT y del administrador de memoria (Ntoskrnl.exe), se consulta también la licencia del equipo para saber si se puede inicializar uno o dos procesadores, y el máximo tamaño de RAM direccionable, pero esto quizá lo muestre experimentalmente en un próximo artículo.