domingo, septiembre 09, 2007

Sobre el servicio de licencias de Windows Vista

Hace unas semanas me encontré con un equipo con Windows Vista instalado que tenía el siguiente problema: Al intentar abrir Panel de control, simplemente se abría una ventana de Explorador de Windows que, segundos después, se cerraba automáticamente. Después de analizar el problema por un tiempo, decidí depurar con Windbg para clarificar el asunto.

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.

Curiosidad: En la clave anterior hay dos valores: Presentation Cache, que contiene la caché propiamente dicha así como un "flag" que indica que esa caché es posterior a octubre de 2001, fecha en la cual se introdujo un arreglo en el código del Panel de control que invalida toda caché anterior. También está el valor Presentation LCID, que contiene el ID del idioma de la caché.


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.

5 comentarios:

Gonzalo dijo...

Daniel: ante todo, mis felicitaciones por este espacio que has creado; los que no sabemos a ese punto de computación pero que sí sabemos algo, valoramos muchísimo estos resquicios donde aprender.
Te querría pedir un consejo acerca de un problema que tengo. Tengo en la misma PC (con arranque dual) Windows XP y Windows Vista Ultimate (32 bits); he instalado la placa sintonizadora Genius TVGo A11MCE. En XP funciona de maravillas, pero en Vista no podía instalar los drivers. Busqué los mismos en la página de Genius pero me encontré que para instalar esos drivers y usar mi placa en Vista, tengo que instalar un nuevo firmware a la placa (con lo cual, la misma se volvería incompatible con XP). ¿Qué debo hacer?. Desde ya muchas gracias, Gonzalo.

juanillo dijo...

Increíble artículo tío. Me ha encantao!

Erwin Ried dijo...

Muy buen artículo. Quería preguntarte sobre un tema similar de Windows Vista, en especial con el SLC.

Lo que sucede es que en Windows Vista Business no puedo iniciar los juegos que vienen con el sistema, por algún motivo no pasan esa "comprobación" siendo que mi Windows es legal y está actualmente activado.

Pude activar los juegos modificando manualmente los mismos ejecutables luego de que hacían la llamada al servidor de licencias, sin embargo el problema de trasfondo continúa y creo que tampoco me deja instalar una actualización por este motivo.

Tu que estás algo más embebido en este tema podrías comentarme algo, en especial si hay forma de diagnosticar ese servicio de licencias.

Saludos

Whata dijo...

Hola,

Tengo un problema en algunos equipos con Windows Vista Business.

No se me abre ni el panel de control, ni propiedades de pantalla, ni funciona el ejecutar como administrador, en fin una serie de problemas...

Buscando por internet he encontrado que reiniciando el servicio "Licencias de software" (+ Readyboost asociado) se soluciona, ya que al parecer, por algún motivo este servicio no acba de arrancar correctamente, aunque se indique que está activado.

Este comportamiento lo tengo en unos 5 Windows Vista Business, y se va produciendo varias veces a la semana, lo solucionao, entrando como administrador local del PC y reiniciando el servicio "Licencias de software" (ejecutando services.msc desde una consola, ya que no tengo panel de control).

Hasta aquí más o menos controlado, me sigo peleando con la red y documentos de Microsoft, ya que no me dejan abrir un caso de soporte dentro de los 90 días de garantía, al ser licencias OEM, con lo que estoy sólo ante el peligro (bueno con vuestra ayuda ;-))

Pero acabo de ver el mismo problema en un portátil, con WinVista Business, e iba yo decidido a reiniciar el servicio "Licencias de software" y no aparece en la lista... y aunque lo he reiniciado, no hay forma...

Espero haberme explicado bien y si alguien ha visto algo parecido, que me lo comente.

Lo que más me preocupa es que no esta el servicio en la lista de servicios... En la L solo aparece live update

Gracias de nuevo Dani

David dijo...

Es exactamente lo que me pasa a mi. Ayer no me dejaba acceder al PC, y tuve que entrar en modo seguro. He reiniciado el servicio de licencias y el readyboot, y no me deja entrar en el panel de control (lo mismo que describes en el artículo), ni tampoco en windowsupdate. Creo que todo viene de un officce pirata que instale hace dos meses y al desinstalarlo se hace un lío. Además, el PC tenía un officce 2003 preinstalado, y ese office legal, sigue ahí, el pirata a desaparecido, pero el original no deja desinstalarse. ES UN CAOS.

Si me pudieras ayudar................

Gracias desde ya...............

David.