¿En qué consiste una versión localizada de Windows Vista/7? [Parte III]

Artículos anteriores

En esta tercera parte de la saga de artículos dedicados a la tecnología MUI de Windows Vista y Windows 7, vamos a ver qué caches incorporan estos sistemas para que no se penalice excesivamente durante el acceso a los recursos en etapas críticas en lo que a rendimiento se refiere (por ejemplo, al iniciar el equipo).

Cache en modo núcleo

El núcleo de Windows dispone de una cache por proceso en la que se almacena cierta información sobre los idiomas que forman parte del sistema. Concretamente, esta cache contiene datos tales como los idiomas permitidos por la licencia del sistema operativo, los idiomas instalados, políticas de idioma por usuario y por máquina, así como la lista de idiomas “de apoyo”, para el caso en que el idioma principal no sea un idioma 100% traducido.

Los datos que conforman esta cache provienen del registro, concretamente de claves como HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\MUI, HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Language o HKEY_CURRENT_USER\Control Panel\Desktop\MuiCached. Las políticas relacionadas con MUI se establecen en las claves de registro HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Control Panel\Desktop y HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\MUI\Settings.

Cache de recursos en modo usuario

Windows Vista/7 incorporan una nueva utilidad en el directorio \Windows\System32 denominada Mcbuilder.exe (MUI cache builder). Esta herramienta se encarga de generar la cache de recursos en modo usuario del sistema operativo. Por defecto, esta cache se sitúa en el directorio C:\Windows\Rescache, y el registro contiene información de configuración, así como estadísticas de uso tales como su tamaño, su uso en los últimos días, etc. en la clave HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CMF\.

Los archivos que forman parte de la cache son archivos de recursos (.mui) del propio sistema operativo, tales como %SystemRoot%\System32\%idioma%\csrss.exe.mui y demás componentes relacionados con el arranque, así como aplicaciones como Windows Media Player, Internet Explorer, o incluso los juegos que incorpora de serie el sistema operativo. Esta información queda recogida en el fichero ResCache.mni. Cabe destacar que este fichero contiene información sobre todos los archivos MUI que pueden formar parte de la cache, no solo los que actualmente están en ella.

El hecho de hablar de una cache es también incorrecto, pues el sistema dispone de 3 caches, identificadas por un índice diferente (subdirectorio R000<índice>). Cada una de las cuales incorpora, entre otras, estas estructuras:

Directorio de la cache

El directorio de la cache contiene referencias a todos los archivos que forman parte de la misma. El cargador de recursos de Windows (Resource Loader), que será tema del próximo artículo, se encarga de “mapear” la cache del sistema como solo lectura en la memoria de cada proceso que quiera acceder a recursos, para que así su acceso a los mismos sea muy eficiente. El directorio de la cache queda almacenado en el fichero ResCache.dir.

Fichero de aciertos de la cache

La cache incorpora un fichero opcional, ResCache.hit, que almacena una determinada fecha por cada entrada disponible en el directorio de la cache. Inicialmente esta fecha es la fecha de creación de la cache, pero cada vez que el cargador de recursos encuentra un recurso en ella (acierto de cache), se establece la fecha actual en la correspondiente entrada.

Segmentos de cache

La cache está formada por un conjunto de segmentos de cache de nombre Segment<indice>.cmf. Los segmentos representan los datos de un subconjunto de los ficheros que forman parte de la cache. El cargador de recursos de Windows “mapea” segmentos de cache en el espacio de memoria de aquellos procesos que los vayan a utilizar.

Tabla de contenidos (TOC) de segmentos

La tabla de contenidos de segmentos, recogida en el fichero Segment<indice>.cmf, contiene los ficheros que forman parte de un segmento determinado. Al crearse, la tabla de contenidos de segmentos se “mapea” en memoria también.

¿Qué ocurre si una aplicación muestra recursos obsoletos, o bien no muestra interfaz gráfica al arrancar?

Este tipo de problemas pueden deberse a que el sistema está obteniendo recursos desde la cache MUI y estos por algún motivo no están todo lo actualizados que debieran o bien no son los indicados. Es un caso raro, pero podría darse. El secreto para saber si la aplicación está obteniendo recursos desde la cache es pasar el manejador que devuelva la API LoadResource a la API GetMappedFileName. Si el resultado es un error o bien un fichero con extensión .cmf, entonces el recurso proviene de un segmento de la cache.

Otro caso posible es que la aplicación no muestre ningún tipo de interfaz gráfica al ser arrancada. Una de las causas posibles de este problema es que el sistema no es capaz de encontrar recursos para esa aplicación y por consiguiente esta no consigue crear su ventana principal. Aquí el uso de depuradores como Windbg está muy aconsejado porque estos síntomas tienen múltiples causas, por lo que siempre hay que analizar cada caso individualmente. Para poder abordar con éxito este problema debemos saber qué ubicaciones consulta Windows para encontrar ficheros .mui con recursos, cosa que describiremos en el próximo artículo.

Leave a Reply

Your email address will not be published. Required fields are marked *