martes, septiembre 25, 2007

Cómo solucionar problemas con el servicio de acceso remoto de Windows XP

En los últimos días he recibido una serie de problemas relacionados con el servicio "Enrutamiento y acceso remoto" (RemoteAccess) de Windows XP. En particular se trata de problemas al intentar iniciar este servicio, que es imprescindible para poder establecer conexiones remotas entre dos PCs. En este artículo doy algunas pautas para solucionar este tipo de problemas.

En primer lugar abra una ventana de línea de comandos y teclee lo siguiente: sc queryex RemoteAccess. En la salida del comando verá cuál es el código específico con el que se ha detenido el servicio. Si dicho código fuese el 340 (0x154), pude determinar que esto suele ocurrir cuando cierta información del registro relacionada con Jet y OleDB falta o está dañada. Este artículo mío propone una solución para este caso.

Es posible que el código de salida no sea el 340; otro que he encontrado al tratar con usuarios afectados es el 16389 (0x4005). Este código suele indicar que hay un problema con la base de datos IAS (Internet Authentication Service) del equipo. Para abordar este problema suele resultar útil habilitar tracing en el servicio RAS. Siga estos pasos:

  1. Abra Inicio, Ejecutar, escriba cmd y pulse Aceptar.
  2. Teclee este comando y pulse INTRO: netsh ras set tracing * en

A partir de ahora, toda la actividad relacionada con el acceso remoto quedará registrada en ficheros con extensión LOG dentro del directorio %SystemRoot%\tracing. Este es un ejemplo del contenido del fichero IASRECST.log:

[3264] 09-24 09:02:51:796: INFO Enter IASOpenJetDatabase. path = F:\WINDOWS\system32\IAS\ias.mdb readonly = 0

[3264] 09-24 09:02:53:750: IDBInitialize::Initialize failed; return value = 0x80004005

[3264] 09-24 09:02:53:859: Description: 'F:\WINDOWS\system32\IAS\ias.mdb' no es una ruta de acceso válida. Asegúrese de que la ruta está escrita correctamente y que está conectado al servidor donde se encuentra el archivo.

[3264] 09-24 09:02:53:859: Record 0: hrError = 0x80004005; dwMinor = 0xE01FFC01

En este ejemplo, el error Jolt que se devuelve es JET_errInvalidPath. Lo primero que se debería comprobar en este caso es si el directorio "F:\WINDOWS\system32\IAS" existe y en caso negativo, crearlo manualmente y expandir los ficheros Dnary.mdb, Ias.mdb desde el disco compacto de XP SP2. Podría tratarse de otro problema distinto relacionado con el acceso a la base de datos, u otro problema de otro tipo, pero en general los reportes suelen ser bastante claros.

Espero que este artículo les ayude a solucionar problemas con el servicio de acceso remoto de Windows XP.

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.