martes, enero 31, 2006

A vueltas con un "error interno"

Hace poco me he encontrado en los grupos de noticias de Microsoft con un problema con el Reproductor de Windows Media. Aparecía el cuadro de diálogo "Error interno de la aplicación" y por tanto el reproductor no se abría correctamente. Aquí comento como se lo solucioné al usuario afectado.

El problema que ocurría era que aparecía el siguiente error al tratar de abrir el Reproductor de Windows Media:

Tengo constancia de que tres son las DLLs que, estando incorrectamente registradas, producen el error descrito:

  • Jscript.dll
  • Vbscript.dll
  • Wmp.dll

El registro de las dos primeras se realizó correctamente; pero la tercera se resistía, aparecía el error 0x8002801c, mostrado a continuación:

Vaya, un código de error no muy común, ¿qué "tripa" se le habrá roto a Windows?

Para conocer a fondo el motivo le pedí al usuario el reporte generado por Dependency Walker (www.dependencywalker.com), una pequeña aplicación muy útil para examinar dependencias de archivos. El reporte de Dependency Walker ofrecía algo de luz sobre el asunto en su última línea:

Exited "REGSVR32.EXE" (process 0x85C) with code 5 (0x5).

El código 0x5 significa "Acceso denegado", pero aparentemente ningún archivo exhibía ese código de error en el reporte de Dependency Walker. El problema quizá estuviera en el Registro.

Regmon es una utilidad de Sysinternals (www.sysinternals.com) capaz de monitorizar todos los accesos al Registro, así que le pedí al usuario el fichero LOG que generó Regmon en su sistema mientras procedía con el registro de la DLL. Presto me dispuse a cargar el reporte en Regmon (es bastante arduo leerlo en texto plano en el Bloc de notas, por ejemplo) y me encontré con esto:

Ajá, el sistema no pudo manipular la citada clave del Registro, que curiosamente está relacionada con el Reproductor de Windows Media. En este caso habría que verificar que el usuario que ha iniciado sesión tuviera privilegios de control total sobre la clave, cosa que efectivamente no tenía.

Tip: Para ver los permisos aplicados sobre una clave de registro en Windows XP, desde el programa Regedit.exe (Editor del Registro) seleccione la clave deseada, pulse Edición, Permisos.


Al modificar los permisos adecuamente, el archivo Wmp.dll se registró correctamente mediante la rutina regsvr32 wmp.dll y el reproductor se abrió sin problemas.

Nota: Para registrar una DLL en el Registro de Windows se debe emplear el ejecutable Regsvr32.exe y añadirle como parámetro la DLL (u otro fichero registrable) que queramos anexar en el Registro. Por ejemplo, para registrar el fichero Wmp.dll abra Inicio, Ejecutar, escriba regsvr32 wmp.dll y pulse Aceptar. Debería aparecer en pantalla un mensaje de confirmación acerca de que el registro se realizó con éxito.


Espero que les haya parecido interesante, se trata de un ejemplo más de las bondades de Regmon, Dependency Walker y Filemon (aunque no se referencie aquí) como ayudas inestimables a la hora de resolver problemas con el PC.

viernes, enero 27, 2006

¿Dónde y cómo se almacenan las personalizaciones de carpetas en Windows?

Si siempre se ha preguntado cómo hace Windows para recordar las personalizaciones aplicadas a las carpetas del disco duro no tiene más que leer este comentario, donde se tratará el tema detalladamente.

En cada apertura y cierre de alguna carpeta Windows XP almacena la información referente a su tipo (documentos, estándar, música, vídeos, etc.) así como ciertos parámetros visuales tales como el tamaño y la posición. En concreto el fichero Explorer.exe crea ciertas ramas en las claves del Registro HKCU\Software\Microsoft\Windows\Shell y HKCU\Software\Microsoft\Windows\ShellNoRoam cada vez que se abre o personaliza una carpeta. Veámos de manera algo más detallada cómo lo hace exactamente:

En primer lugar, Explorer.exe comprueba el contenido del valor BagMRU Size de la clave HKCU\Software\Microsoft\Windows\ShellNoRoam. Esto le permite saber si se ha alcanzado el límite de carpetas que se pueden almacenar (y por ello no almacenará más). Con Service Pack 2 Microsoft decidió ampliar este valor hasta 5000 (decimal). Esto quiere decir que podrá almacenar por defecto 5000 carpetas personalizadas en un sistema Windows XP SP2.

Posteriormente se crean dos claves (si es la primera ejecución del Explorador de Windows tras la instalación de XP), o bien se modifica su contenido apropiadamente. Las claves implicadas en esta operación son las siguientes:

HKCU\Software\Microsoft\Windows\ShellNoRoam\BagMRU.

HKCU\Software\Microsoft\Windows\ShellNoRoam\Bags.


La primera de ellas (BagMRU) es una especie de índice para Windows. En ella se generan sucesivamente valores de tipo binario (REG_BINARY) con nombres no muy originales: números a partir de 0. Estos valores binarios contienen la ruta de la carpeta que se ha almacenado. Asimismo el número del valor binario le permitirá a Windows enlazar con la subclave apropiada (Bag MRU\0), por ejemplo. En esta subclave Windows revisa el valor NodeSlot y, según el número que contenga, acudirá al "trastero" donde se ubica toda la información sobre la personalización de la carpeta, este lugar no es otro que la clave Bags.

En la clave Bags Windows genera un gran número de subclaves con nombres numéricos. Entre su contenido está toda la información de la personalización de cada carpeta, su tipo, su tamaño, su posición, etc. Windows acudirá a la subclave de la rama Bags que le indique el valor NodeSlot comentado anteriormente. Esto garantiza que Windows asigne a cada carpeta su personalización correcta y que ésta sea obtenida satisfactoriamente.

Sobre personalización de carpetas quizá también haya oído hablar del archivo Desktop.ini, encargado de otros matices de la personalización de carpetas.

El archivo Desktop.ini, fichero de sistema ubicado en la raíz de ciertas carpetas, permite que Windows aplique un cierto icono (no confundir con una vista en miniatura) así como otros parámetros (texto alternativo a mostrar mientras se deja el cursor sobre la carpeta, nombre de la carpeta, etc.).

Ejemplo de fichero Desktop.ini

Para que Windows tenga en cuenta el fichero Desktop.ini, debe suceder una cosa aparentemente curiosa: entre los atributos de la carpeta debe figurar el atributo de sólo lectura. Para ver o modificar el atributo de sólo lectura aplicado a carpetas, no a archivos, la interfaz de Windows no nos es de utilidad. En su lugar abra Inicio, Ejecutar, escriba cmd, pulse Aceptar, teclee el siguiente comando y pulse a continuación Intro:

attrib "C:\Carpeta"

o, para aplicarle el atributo de sólo lectura a la carpeta:

attrib +r "C:\Carpeta"

(Se supone que C:\Carpeta es la ubicación de la carpeta a tratar).

Por defecto Windows asigna el atributo de sólo lectura a la carpeta cuyo icono haya sido modificado (por ejemplo) y automáticamente le genera un fichero de sistema Desktop.ini en su raíz. La pérdida del atributo de sólo lectura y/o del fichero Desktop.ini en carpetas del sistema operativo supone que éstas pierdan su personalización, eche un vistazo a este artículo mío para ver un ejemplo de ello:

La carpeta "Documentos compartidos" ha cambiado su nombre por "Documentos"

Presentación

Os presento mi bitácora, donde trataré algunos temas sobre Windows, actualizaciones y demás noticias del mundo Microsoft. Espero que os guste.