viernes, julio 25, 2008

Nuevo blog

He decidido crear un nuevo blog donde seguiré tratando la misma temática que he venido tratando en éste. Anote la dirección en sus favoritos: http://msmvps.com/blogs/dmartin/. Por supuesto, también puede suscribirse al correspondiente RSS en la dirección: http://msmvps.com/blogs/dmartin/rss.aspx.

Espero que les guste.

viernes, julio 18, 2008

TweakArrows, una Power Toy para Windows Vista

He codificado una pequeña "Power Toy" para Windows Vista que elimina las flechas de los accesos directos. No requiere instalación y funciona sobre cualquier versión de Windows Vista.

En mi tiempo libre espero poder ir codificando nuevas "Power Toys" para Windows Vista y reunirlas todas en una sola aplicación. Si tiene sugerencias de ciertas configuraciones que no se puedan realizar desde la interfaz gráfica y que le gustaría que se incorporaran en alguna de mis utilidades, deje un comentario en este artículo.

Puede descargar TweakArrows desde aquí: http://winvista.mvps.org/Tema.aspx?ID=413.

Y, para finalizar, un aviso algo repetitivo pero necesario:

Pese a que el autor ha puesto el máximo empeño para que esta herramienta sea lo más fiable posible, TweakArrows se proporciona "como está", sin garantías de ninguna clase, y no otorga ningún derecho.

domingo, julio 06, 2008

¿Por qué el proceso Explorer.exe analiza periódicamente todas y cada una de las unidades del sistema?

Un usuario consultaba lo siguiente:

Cuando tengo Process Monitor analizando un sistema "en reposo", sin hacer nada en él, cada cierto tiempo veo que se registran eventos del proceso Explorer.exe accediendo a todas y cada una de las unidades de mi sistema. ¿Por qué ocurre eso?

Es muy probable que lo que esté observando el usuario es el chequeo que realiza Windows cada minuto con el objetivo de comprobar si alguna unidad está quedándose sin espacio libre y mostrar el pertinente globo informativo que enlaza con la herramienta Liberador de espacio en disco.

Durante la inicialización del proceso Explorer.exe (tema que será tratado en profundidad en un próximo artículo), en concreto durante la creación de la barra de tareas, se genera un temporizador para que, cada minuto, se lance un hilo encargado de verificar si la alguna de las unidades presentes en el sistema se está quedando sin espacio. Como para calcular el espacio libre en disco se debe abrir un manejador hacia dicho volumen, Process Monitor refleja este hecho.

Por supuesto, es posible añadir una política que desactive por completo la comprobación periódica de espacio disponible en disco. En concreto, la clave de registro implicada es HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer ó HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer, valor "NoLowDiskSpaceChecks" con contenido 1.

Si está interesado en generar temporizadores, puede usar por ejemplo la función SetTimer tal y como describe el sitio web de MSDN.

viernes, junio 13, 2008

¿Cuál es la correspondencia entre las carpetas de usuario de XP y de Vista?

Si configura un sistema Windows Vista para que muestre archivos ocultos y de sistema, es probable que se encuentre con "una especie de accesos directos" que muestran un mensaje de acceso denegado si intenta abrirlos.

Realmente esa especie de accesos directos no son tal cosa, son enlaces simbólicos que sirven para garantizar la compatibilidad con aplicaciones antiguas que aún hagan uso del esquema de carpetas de Windows XP.

La siguiente tabla recoge las correspondencias entre las rutas de Windows XP y las nuevas de Windows Vista:

Carpeta Windows XP

Carpeta Windows Vista

Datos de programa

AppData\Roaming

Cookies

AppData\Roaming\Microsoft\Windows\Cookies

Configuración local

AppData\Local

Mis documentos

Documentos

Nethood

AppData\Roaming\Microsoft\Windows\Network Shortcuts

PrintHood

AppData\Roaming\Microsoft\Windows\Printer Shortcuts

Reciente

AppData\Roaming\Microsoft\Windows\Recent

SendTo

AppData\Roaming\Microsoft\Windows\SendTo

Menú Inicio

AppData\Roaming\Microsoft\Windows\Menú Inicio

Plantillas

AppData\Roaming\Microsoft\Windows\Templates


martes, junio 03, 2008

¿Sabía que...? [IX]

Si acostumbra a indagar en cada uno de los errores de aplicaciones que haya podido experimentar en Windows Vista, una de las cosas que seguramente más habrá echado en falta es que, con la aparición de la nueva arquitectura de detección y reportes de excepciones en modo usuario, por defecto solo se genera un "minivolcado" de memoria del proceso si el servidor de Microsoft así lo indica. Sin embargo, con la aparición de Windows Server 2008 y Windows Vista SP1 ya es posible indicarle al sistema que queremos que se genere automáticamente un volcado de memoria siempre que ocurra un error. Para ello, hay que añadir el valor LocalDumps a alguna de estas claves de Registro: HKEY_CURRENT_USER\Software\Microsoft\Windows\Windows Error Reporting o
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Windows Error Reporting. Dispone de más información en la siguiente página de MSDN: http://msdn.microsoft.com/en-us/library/bb513638(VS.85).aspx.

¡Feliz debugging!

domingo, mayo 25, 2008

Utilidad de Microsoft que intenta solucionar diversos problemas con Windows Update

Si bien yo recomiendo siempre echar un vistazo a los ficheros LOG generados por Windows Update antes de abordar cualquier problema con el mismo, mucha gente simplemente busca una solución que sea rápida, simple y lo más eficiente posible, aunque no se adapte completamente a su problema particular.

Con este motivo, un empleado de Microsoft, Eddie Bowers, ha codificado Aureset (Automatic Updates and Windows Update Reset Tool), una herramienta que básicamente restablece Windows Update a su configuración por defecto, y realiza una reparación de los servicios, DLLs, y demás componentes necesarios para la correcta descarga de actualizaciones. También detecta ciertos problemas de conectividad en el equipo.

Puede descargar la herramienta desde http://www.codeplex.com/aureset/Release/ProjectReleases.aspx?ReleaseId=13656.

Importante: Aunque la herramienta provenga de Microsoft, se proporciona "como está", sin garantías de ninguna clase, y no otorga ningún derecho. Usted asume toda responsabilidad de los posibles daños o efectos indeseados que esta herramienta pueda causar en su sistema. Es posible que no logre solucionar su problema con Windows Update usando esta herramienta.

viernes, mayo 09, 2008

Un proceso Explorer.exe consume toda la CPU

Recientemente un usuario preguntaba por qué el proceso Explorer.exe de su sistema consumía constantemente entre un 90% y un 100% de CPU. La verdad es que la causa de un problema como este puede ser variadísima, así que le dije que ejecutara en ese sistema Process Explorer para hacer una comprobación más en detalle.

Una de las características destacadas de Process Explorer sobre Administrador de tareas es que permite "descender" a la granularidad de hilo; es decir, permite saber qué hilos ha creado un determinado proceso, qué consumo de CPU tienen y qué funciones están asociadas a los mismos. Para mostrar esta información hay que hacer doble clic sobre el proceso en cuestión y elegir la pestaña Threads (hilos).

Nota: La información mostrada en esa pestaña depende enormemente de si los símbolos para al menos los componentes del sistema operativo están instalados o no.

Desde Process Explorer, menú Options, Configure Symbols, puede agregar la ruta del servidor de símbolos público de Microsoft, a saber: SRV*c:\websymbols*http://msdl.microsoft.com/download/symbols



En el caso que nos ocupa, al ordenar la lista de hilos por consumo de CPU, el primer puesto de la lista lo ocupaba una tal función wsil32.dll+0x1000. Esa DLL pertenece a un troyano, que había sorteado todas las medidas de protección que el usuario tenía instaladas en su sistema.

Si algo se puede sacar como conclusión adicional es que realmente un antivirus, por bueno que sea, no va a protegernos del 100% de las amenazas informáticas de hoy día, así que siempre debe prevalecer el sentido común a la hora de navegar por Internet, abrir un correo electrónico o descargar un programa de un sitio de dudosa confianza.


Actualización 25/5/2008: El usuario solucionó su problema analizando el sistema con un antivirus actualizado. Una vez que el sistema esté limpio (o crea que esté limpio), eche un vistazo a la lista generada por el programa Autoruns. Autoruns es una herramienta similar al popular HijackThis, pero mucho más completa. Céntrese en los elementos que no estén firmados digitalmente por Microsoft (en Autoruns abra Options, Hide Microsoft Signed Entries y pulse F5).

domingo, abril 27, 2008

El caso del espacio en negro en Agregar o quitar programas

Uno de mis sistemas XP estaba experimentando un problema extraño: Al abrir Agregar o quitar programas noté un espacio de color negro bastante grande, con franjas de color blanco, entre dos programas. La siguiente captura de pantalla lo muestra:


Hace tiempo ya había analizado otro caso parecido. En aquella ocasión se mostraba un espacio enorme en blanco, y eso se debe a que la ruta del icono a mostrar contiene un "-1". (La función ExtractIcon devuelve el tamaño total de iconos disponibles en el ejecutable si se le pasa como índice para el icono un "-1").

Así pues, lo primero que hice fue descubrir qué aplicación era la culpable de ese espacio enorme en color negro. Lo que hice en primer lugar es anotar cuidadosamente la lista de aplicaciones que se mostraban correctamente y comparé dicha lista con la de la clave de Registro HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall. La aplicación que faltaba, y por tanto culpable de ese espacio en negro resultaba ser TI-Graph Link, perteneciente a una calculadora gráfica de Texas Instruments. Decidí investigar un poco más en detalle para desvelar el misterio.


Por diseño, la herramienta Agregar o quitar programas obtiene los iconos de las aplicaciones de la lista de dos maneras:


  • Si un valor DisplayIcon está presente en la subclave correspondiente de Uninstall, lo usará preferentemente.

  • Si no hay valor DisplayIcon, intentará obtener el icono desde la ruta del ejecutable del programa.

Se trataba del segundo caso, así que arranqué Process Monitor (http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx?PHPSESSID=d926bdd849b5aab10f7263dd7f5904f2) y establecí como filtro la ruta ejecutable del programa de la calculadora gráfica.


¿Qué tiene de especial ese ejecutable? Al examinarlo un poco, observé que se trata de un ejecutable de 16 bits. Según la documentación de MSDN, ExtractIcon no soporta la extracción de iconos desde ejecutables de 16 bits, así que empecé a sospechar.


Desde el propio shell de Windows intenté cambiar el icono de un acceso directo a la aplicación y seleccioné el icono que ocupa la posición 0 dentro del ejecutable. Aparentemente se veía correctamente, pero recordé rápidamente que Agregar o quitar programas extrae un icono pequeño (10x10) para mostrarlo en la lista. Lo que hice, pues, es cambiar la vista de la carpeta a Lista, para así forzar la extracción de un icono pequeño. ¡Bingo!, el resultado fue el de la siguiente captura de pantalla:



Al parecer, la función de extracción de iconos tiene problemas para proporcionar un icono de tamaño pequeño para el recurso que ocupa el índice 0 del ejecutable. Como quería investigar un poco más, primero me aseguré de qué función se trata. Para ello, seleccioné con el botón derecho una de las entradas del listado de Process Monitor y pulsar sobre Stack con el objetivo de visualizar la pila de llamadas del proceso Rundll32.exe encargado de abrir la herramienta Agregar o quitar programas.

La función que me llamó la atención fue ExtractIconFromEXE, así que decidí empezar a depurar desde ahí.


Al abrir el ejecutable en Windbg, establecí el correspondiente breakpoint y ejecuté. Como esa función es llamada para diferentes programas de la lista, tuve que idear una forma que me permitiera saber cuándo había llegado al punto en el que se extrae el icono del ejecutable de la calculadora. Como la función recibe un handle al ejecutable, con Process Explorer examiné la lista de handles hastá que vi por ahí el ejecutable en cuestión, tal y como se muestra en la imagen.


Cuando llegué al breakpoint, examiné la pila con el comando dd esp:


0:000> g

Breakpoint 0 hit

eax=00005a4d ebx=00000000 ecx=00000000 edx=7c91eb94 esi=7c810760 edi=10000080eip=7e3a325a esp=0007d25c ebp=0007d6cc iopl=0 nv up ei pl zr na pe nccs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246

USER32!ExtractIconFromEXE:7e3a325a 6a38 push 38h

0:000> dd esp

0007d25c 7e3a2f7d 000003e8 00000000 00000010

0007d26c 00000010 0007d74c 00000000 00000001

0007d27c 00000000 00000000 00000000 0007d74c

0007d28c 3df27be2 01c8a88b 00000000 011afd3c

0007d29c 0000000c 00000000 0007d74c 000003e8

0007d2ac 003a0043 0041005c 00630072 00690068

0007d2bc 006f0076 00200073 00650064 00700020

0007d2cc 006f0072 00720067 006d0061 005c0061


El primer valor, 7e3a2f7d, es la dirección de retorno; el siguiente, el primer parámetro, y así sucesivamente. Como puede ver, el tamaño del icono es 10x10, que corresponde al tercer y cuarto parámetro de la función. ¿Qué ocurriría si la función en lugar de pedir un icono 10x10 pidiese uno 20x20, por ejemplo? Según las pruebas que hice anteriormente con la función Cambiar icono, debería funcionar, pues es solo la extracción de iconos pequeños la que falla.


Para modificar el contenido de una posición de memoria, puede usar el comando del depurador ed dirección contenido. Tenga mucho cuidado, pues si modifica posiciones de memoria puede hacer que el programa que está siendo depurado no haga lo que debe.


0:000> ed esp+c 20


0:000> ed esp+10 20


0:000> dd esp


0007d25c 7e3a2f7d 000003e8 00000000 00000020


0007d26c 00000020 0007d74c 00000000 00000001


0007d27c 00000000 00000000 00000000 0007d74c


0007d28c 3df27be2 01c8a88b 00000000 011afd3c


0007d29c 0000000c 00000000 0007d74c 000003e8


0007d2ac 003a0043 0041005c 00630072 00690068


0007d2bc 006f0076 00200073 00650064 00700020


0007d2cc 006f0072 00720067 006d0061 005c0061


Una vez modificado el tamaño de icono pedido, dejé que la aplicación se ejecutara completamente y este fue el resultado obtenido:


¡Bingo! Ya pude confirmar que un icono un poco más grande es extraído correctamente.

En resumen:


  • Agregar o quitar programas tiene que extraer un icono para cada uno de los programas que conforman la lista de programas instalados.

  • La función implicada es ExtractIconEx, que, dependiendo del tipo de fichero (EXE, DLL, ICO, etc.) llama a una u otra función. En el caso de ejecutables se trata de la función ExtractIconFromEXE (no documentada).

  • La documentación nos indica que no se soporta la extracción de iconos de ejecutables NE (16 bits). En nuestro caso, la extracción del icono de índice 0 del ejecutable en tamaño pequeño (10x10) es defectuosa. Agregar o quitar programas por diseño quiere obtener un icono 10x10.

  • Al "forzar" la extracción de un icono un poco mayor (20x20), todo funciona correctamente.

Una vez desvelado el misterio, me puse en contacto con el fabricante para ver si había disponible alguna actualización para su software (que ya no fuera de 16 bits, a ser posible).


¡Caso cerrado!

domingo, abril 06, 2008

Procesos "inmortales" en Windows XP

Si ha "jugueteado" alguna vez con la pestaña Procesos de Administrador de tareas en Windows XP, probablemente haya notado que, si intenta terminar alguno de los procesos críticos del sistema (aquéllos que si finalizan inesperadamente reiniciarán automáticamente el sistema, a saber: Csrss.exe, Winlogon.exe, Smss.exe, Services.exe y Lsass.exe), le aparecerá este mensaje de error:

Éste es un proceso de sistema crítico. El Administrador de tareas no puede finalizar este proceso.

Sin embargo, si su sistema se infecta con un virus cuyo ejecutable tenga el mismo nombre de alguno de esos procesos esenciales -muchos ejecutables de virus tienen alguno de esos nombres-, tampoco podrá terminarlo desde Administrador de tareas. Mi opinión es que como Administrador de tareas es una aplicación que se diseñó hace más de 10 años, no se tuvo en cuenta la posibilidad de que el software malicioso pudiera ocultarse del usuario usando los nombres de procesos críticos del sistema, así que es probable que lo que Administrador de tareas haga es simplemente una comparación textual. De hecho, usted mismo puede hacer la prueba: Renombre un ejecutable cualquiera de su sistema a "Smss.exe" (por ejemplo), y ejecútelo. Si lo intenta matar desde Administrador de tareas, no podrá, le aparecerá el mensaje de error comentado anteriormente.

Parece ser que en Windows Vista la gente de Microsoft ha "cortado por lo sano" y ya no se hace la comprobación de si el proceso que el usuario quiere terminar es un proceso crítico del sistema o no. Se considera que Administrador de tareas es un programa usado en su mayoría por usuarios avanzados, que saben o deberían saber lo que hacen.

Esta es otra pequeña ventaja, entre muchas otras, de Process Explorer sobre Administrador de tareas. Puede descargar Process Explorer desde el sitio web de Technet: http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx.

lunes, marzo 10, 2008

¿Sabía que...? [VIII]

Un usuario tenía una duda o curiosidad sobre el cometido del valor de tipo DWORD ImageOptionFlags que reside en las claves de Registro HKEY_CLASSES_ROOT\jpegfile, HKEY_CLASSES_ROOT\giffile y, en general, en casi cualquier extensión gráfica.

Ese valor lo utiliza un manejador del menú contextual instalado por Windows y residente en la DLL Shimgvw.dll. Este manejador es el encargado de mostrar acciones útiles cuando se selecciona una imagen con el botón derecho del ratón. Concretamente, un contenido "1" en el valor de registro anterior indica que ese tipo de imagen se puede rotar, por lo que, consecuentemente, aparecerá la opción correspondiente en el menú contextual que aparezca al seleccionar la imagen con el botón derecho del ratón. Un contenido "2" indica que la imagen se puede establecer como fondo de escritorio.

Por defecto el valor es "3", que indica que la imagen se puede rotar y además se puede establecer como fondo de escritorio.

domingo, marzo 02, 2008

¿Problemas al instalar actualizaciones en Windows Vista?

Si experimenta problemas al instalar un componente opcional de Windows Vista, una actualización desde Windows Update, o un paquete de idiomas, es muy probable que usted o un profesional de soporte acabe examinando la información proporcionada por un servicio vital de Windows Vista: CBS o Component Based Servicing. El grueso principal de esa información de depuración reside en el fichero C:\Windows\Logs\CBS\CBS.log. Para saber cómo interpretar ese fichero así como el fichero C:\Windows\WindowsUpdate.log, dejo este completo artículo (eso sí, en inglés) procedente del sitio web de Technet: http://technet2.microsoft.com/windowsserver2008/en/library/ba7a187c-1ead-4459-829b-614a6428721f1033.mspx?mfr=true. En él se incluye también una referencia bastante completa de los códigos de error CBS más comunes.

Si aún así no consiguiera solucionar su problema, o bien el artículo le parece demasiado complicado, exponga detalladamente su problema en alguna comunidad de Microsoft (http://www.microsoft.com/communities/default.mspx) y seguro que recibirá ayuda acertada.

sábado, febrero 23, 2008

¿Al iniciar sesión sólo se muestra el fondo de escritorio?

Un problema bastante común últimamente es el siguiente: Al iniciar sesión en Windows, no se muestra nada en pantalla, sólo el fondo de pantalla del usuario. No se muestra ni la barra de tareas ni los iconos del escritorio.

Este problema se debe a que el shell del sistema no se ha cargado correctamente (Explorer.exe es el shell por defecto del sistema operativo) o bien el sistema no tiene ningún shell asociado (o éste es incorrecto). Lo primero que debe hacer es abrir Administrador de tareas, pulsar sobre Archivo, Nueva tarea, escribir explorer.exe y pulsar Aceptar. Si así se iniciara correctamente la barra de tareas y los iconos del escritorio, abra Inicio, Ejecutar, escriba regedit y pulse Aceptar. Acceda a la clave de Registro HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon y observe lo que contiene el valor de Registro Shell de la parte derecha de la ventana. El sistema de un usuario afectado tenía lo siguiente como contenido de dicho valor: Explorer.exe C:\windows\media\csrss.exe. Ese fichero Csrss.exe situado en el directorio \WINDOWS\Media\ es un troyano. En este caso la solución pasa por dejar como contenido únicamente Explorer.exe y pasar a continuación un buen antivirus actualizado al sistema.

Si al intentar ejecutar Explorer.exe observa que la barra de tareas aparece durante una fracción de segundo para después desaparecer, el problema es algo más peliagudo y complicado de analizar, en un próximo artículo de esta bitácora mostraré algunos consejos útiles para detectar al culpable en esta situación.

martes, febrero 05, 2008

¿Qué sucede cuando ocurre una excepción no manejada en modo usuario en Windows Vista?

Si ha leído artículos anteriores, seguramente ya conozca cómo funciona el mecanismo de excepciones no manejadas en modo usuario (user mode unhandled exceptions) en Windows XP. Básicamente consta de un filtro de excepciones no manejadas que "recubre" a todos los hilos de un proceso. Si se produce alguna excepción que no ha sido adecuadamente tratada, se iniciará el depurador post-mortem por defecto de Windows XP, Dr Watson, que recabará toda la información que ayude en el diagnóstico posterior del error. Sin embargo, esta forma de administrar excepciones en modo usuario es poco robusta. Por ejemplo, si la corrupción es tal que la pila del hilo en cuestión ha sido sobreescrita con basura, todo el mecanismo de tratamiento de excepciones fallará y el usuario únicamente verá como la aplicación desaparece de repente, sin dejar rastro ni mostrarse ningún mensaje de error. Quizá alguna vez haya experimentado esto en su sistema.

Para evitar esta mala experiencia de usuario, el mecanismo de excepciones no manejadas en modo usuario ha sido completamente rediseñado en Windows Vista. A continuación se muestra un diagrama explicativo:



Para empezar, un nuevo servicio denominado "Windows Error Reporting" (WerSvc), alojado en un proceso Svchost.exe, mantiene abierto un puerto de comunicación con el núcleo del sistema operativo. A través de este puerto, el núcleo del sistema operativo estará informado de toda excepción que ocurra en modo usuario (note que ahora es el núcleo el que maneja todo esto, cosa que no sucedía en versiones anteriores de Windows). El kernel conecta con la aplicación y le da la oportunidad de capturar y tratar la excepción. Si ésta no es tratada, la petición se dirige a cualquier otro puerto de excepciones que esté asociado a la aplicación en cuestión. Todas las excepciones no manejadas de aplicaciones Win32 acaban en Csrss.exe, que forma el subsistema Win32 y es un proceso crítico del sistema operativo. Csrss.exe retorna el valor EXCEPTION_CONTINUE_SEARCH, lo que hace que el kernel informe al servicio WerSvc antes mencionado sobre la aplicación que ha producido el fallo. WerSvc, basándose en la información que ha recibido (PID, tipo de excepción, etc.), crea un nuevo proceso, Werfault.exe, que decide si adjuntar o no un depurador a la aplicación. El código de la DLL Faultrep.dll alojada por dicho proceso es la encargada de examinar la clave correspondiente, que es la misma que en versiones anteriores de Windows: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AeDebug. Puede ver una captura de la traza correspondiente de Process Monitor:



Si hubiera un depurador disponible, se hará cargo del proceso en cuestión; si no lo hubiera, WerFault.exe generará un reporte del fallo y almacenará la información correspondiente para que sea tratada por el componente "Problemas y soluciones" de Windows Vista (WerCon). Al contrario de lo que ocurre en versiones anteriores de Windows, por defecto no se mantiene una copia del volcado de memoria del proceso en cuestión (imagino que por cuestiones de privacidad). Para modificar este comportamiento, abra Inicio, haga clic sobre Iniciar búsqueda, escriba regedit y elija el programa ofrecido. Acceda a la clave HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting. Cree un nuevo valor DWORD de nombre ForceQueue y establézcale como contenido un 1. Reinicie el sistema y a partir de entonces los volcados de memoria se irán almacenando en las carpetas %AllUsersProfile%\Microsoft\Windows\WER (para procesos del sistema o con privilegios elevados), y en %LocalAppData%\Microsoft\Windows\WER (para el resto).

Otra forma de generar manualmente un volcado pequeño de memoria (minidump) de un proceso en Windows Vista es, desde Administrador de tareas, pestaña Procesos, seleccionar el proceso en cuestión con el botón derecho del ratón y hacer clic sobre Crear archivo de volcado. El volcado tendrá el nombre del proceso, extensión .dmp, y estará en la carpeta de temporales del usuario: %LocalAppData%\Temp. El volcado lo genera Administrador de tareas con la ayuda de la DLL Dbghelp.dll del directorio de sistema.

sábado, enero 12, 2008

Experimento: DWM en acción

En los días pasados hablamos un poco sobre el funcionamiento de Windows Aero, la composición de escritorio, y Desktop Window Manager (DWM). En este artículo haremos un pequeño experimento para que observe que es el propio sistema operativo el que compone imágenes en pantalla, a diferencia de lo que ocurre en versiones anteriores de Windows.

Quizá haya experimentado alguna vez lo siguiente: Un programa se ha bloqueado (deja de responder) y, como consecuencia, si pasa ventanas por encima de la ventana bloqueada observa un feo efecto que consiste en que la ventana que mueve "va tapando" a la ventana bloqueada, hasta que ésta pierde por completo su representación. ¿Por qué ocurre esto? Como ya sabe, Windows determina que un programa está bloqueado cuando, entre otras cosas, no ha respondido a mensajes durante un tiempo prudencial (5 segundos en las implementaciones actuales). Uno de estos mensajes es WM_PAINT, que más o menos le dice a la ventana en cuestión: "Hay una nueva parte visible, así que píntate de nuevo". Cuando un proceso está bloqueado, no trata ningún tipo de mensajes, así que la ventana irá perdiendo su forma conforme vayamos tapando zonas de la misma pasando otras ventanas por encima. En Windows Vista esto no ocurre pues es DWM el encargado de componer cada ventana en búferes distintos. Las ventanas en segundo plano no necesitan responder a WM_PAINT, pues el motor de composición de escritorio ya tiene su representación completa.

Para llevar a cabo el experimento, necesitará dos sistemas, uno con Windows XP instalado y otro con Windows Vista. Para simular el "bloqueo" de la aplicación, haremos uso de la función "Suspend" de Process Explorer (http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx), por lo que necesitará que esté presente en cada sistema operativo.
  • Arranque el sistema con Windows XP instalado.
  • Inicie una aplicación cualquiera, como Bloc de notas, por ejemplo.
  • Abra Process Explorer y seleccione el proceso Notepad.exe con el botón derecho del ratón.
  • Elija Suspend.
  • Mueva la propia ventana de Process Explorer sobre la ventana de Bloc de notas y observe el resultado.
  • Ahora arranque el sistema con Windows Vista instalado.
  • Repita los pasos anteriores y observe que la ventana de Bloc de notas no se ve afectada en absoluto. Por supuesto, necesitará tener activada la composición de escritorio en el sistema operativo.

jueves, enero 03, 2008

Sobre Windows Aero [Parte II]

En la primera parte del artículo ya comenté resumidamente cómo era la arquitectura interna de Windows Presentation Foundation (WPF), y Media Integration Layer (MIL), componentes fundamentales en los que se sustenta la composición de escritorio, y en definitiva Windows Aero. Esta segunda parte se centrará en el componente en modo usuario denominado DWM (Desktop Window Manager).

Como ya dije en la primera parte, la característica más destacada de la composición de escritorio consiste en que las aplicaciones no dibujan directamente sobre la pantalla, sino que lo hacen sobre búferes internos, y es el sistema operativo el que en última instancia "compone" todas las imágenes en pantalla. Este proceso de redirección es complejo, y lo resumo para los dos tipos principales de aplicaciones gráficas: GDI y DirectX (existe también la "mezcla" de ambas, pero este tema no se tratará en este artículo).

Las aplicaciones que dispongan de ventanas GDI (la gran mayoría) disponen de dos búferes, uno en memoria del sistema y otro en memoria de vídeo. Todas las operaciones se realizan sobre memoria de sistema, el sistema operativo es el que decide actualizar cada cierto tiempo porciones de memoria de vídeo con las superficies almacenadas en memoria de sistema. La composición de escritorio se realiza con las superficies de memoria de vídeo.

Las aplicaciones de tipo DirectX sólo disponen de un búfer en memoria de vídeo, pues éstas ya renderizan píxeles en un formato que "entiende" DWM. La redirección ocurre cuando DWM y la aplicación DirectX comparten una superficie donde se realiza el renderizado, cosa que sólo es posible cuando DirectX se sustenta en controladores WDDM.

El proceso de redirección, como puede observar, es bastante complejo. Las funciones implicadas residen en la DLL Dwmredir.dll, que forma parte del componente Microsoft-Windows-DesktopWindowManager-core.

Todo empieza en Userinit.exe

Userinit.exe es el componente de Windows encargado de inicializar el entorno de sesión del usuario (una vez que éste ha iniciado sesión) y cargar el shell de su elección, que por defecto es Explorer.exe.

Antes de cargar el shell, Userinit.exe inicia el servicio encargado de ejecutar DWM.exe, el servicio "Desktop Window Manager Session Manager" (un nombre algo redundante :-P), implementado en la DLL UxSms.dll (el servicio anteriormente se denominaba "User Experience Session Manager", de ahí el nombre). Durante su inicialización, DWM analiza las características hardware con el fin de determinar si puede (o debe) activar la composición de escritorio. Para ello, emplea algunas funciones implementadas en Milcore.dll, que se ponen en contacto con la información gráfica disponible, residente en el kernel. El primer requisito que se debe cumplir es que los controladores sean WDDM. Si no lo son, no se puede activar la composición de escritorio. Asimismo, se realiza un análisis del ancho de banda de la tarjeta de vídeo, moviendo texturas. Si la tarjeta gráfica resulta ser lenta, tampoco se activará composición de escritorio. Note que es esencial que el hardware gráfico sea reciente para que la composición de escritorio se realice eficientemente. También se calcula, a partir de la resolución de pantalla y el tamaño de píxel empleado, la cantidad mínima de memoria de vídeo exigida. Por último, es necesario que el sistema disponga de, al menos, 512 MB de memoria RAM. Esto se debe a que la composición de escritorio requiere almacenar texturas de vídeo que pueden ocupar un importante espacio en memoria. Por supuesto, también es necesario que la licencia permita activar la composición de escritorio, y que el sistema sea calificado como genuino.

Resumen: Composición de escritorio se permite siempre y cuando:

  • La licencia del sistema lo permita (Windows Vista Home Premium o Ultimate).

  • No esté deshabilitada mediante directivas.

  • Los controladores gráficos sean WDDM.

  • La versión de Pixel Shader soportada por la tarjeta gráfica sea la 2.0.

  • El ancho de banda proporcionado por la tarjeta gráfica sea apropiado.

  • La cantidad de memoria de vídeo sea adecuada según la resolución empleada.

  • El sistema disponga de, al menos, 512 MB de memoria principal.

  • El sistema sea genuino.

Windows Aero = Composición de escritorio + Transparencias



Estas mediciones, bastante interrelacionadas con otro componente de Windows Vista denominado WinSAT, se implementan en la DLL Dwmapi.dll, que también contiene las APIs relacionadas con DWM, Flip3D, instantáneas, etc.


Problema: Windows Aero funcionaba correctamente pero de repente se han desactivado todos los efectos de transparencia, ¿qué ha pasado?

Hay dos escenarios principales por los que puede ocurrir este problema:

  • Alguna aplicación ha intentado dibujar directamente sobre la pantalla (recuerde que no está permitido leer/escribir directamente en pantalla mediante la función GetDC(NULL)). Cuando la aplicación en cuestión deje de ejecutarse, los efectos se restablecerán.

  • Windows ha decidido desactivar DWM porque ha determinado que el desempeño del mismo sería pobre, dada la carga del sistema. Reinicie el sistema y observe si todo vuelve a la normalidad.

Esta información también queda reflejada en Visor de sucesos, así que será su primer lugar de búsqueda ante un problema con Windows Aero/DWM.


¿Cómo se sabe qué temas hay disponibles?

Cuando el usuario accede al panel correspondiente para cambiar el tema de escritorio, el sistema realiza algunas comprobaciónes antes de mostrar los temas a elegir:

  1. Si el sistema no soporta composición de escritorio, o bien está deshabilitada mediante políticas, o mediante licencia (la licencia de Windows Vista Home Basic no permite composición de escritorio), sólo se mostrará el tema "Básico de Windows Vista".

  2. Si el sistema soporta composición de escritorio, pero no efectos de transparencia (de nuevo, ya sea por limitación hardware, directivas aplicadas, o licencia), se mostrarán los temas "Estándar de Windows Vista" y "Básico de Windows Vista".

  3. Si el sistema soporta tanto composición como transparencias, se mostrarán los dos temas anteriores junto con "Windows Aero". Éste sólo está presente en Windows Vista Home Premium y Ultimate.

Este artículo de dos partes ha sido una descripción más o menos práctica de DWM/Windows Aero y WPF/MIL. En un próximo artículo verá una demostración empírica muy sencilla de la composición de escritorio en acción.