El constante pantallazo azul causado por athwbx.sys, Windows PE, Autoruns, DISM y su solución

El caso que pasaré a describir, es uno de los que personalmente más trabajo me ha costado solucionar, pero también en el que más combinación de herramientas he utilizado; por estas razones, quiero compartirlo para otros que a lo mejor se vean en el mismo escenario que yo, y no sepan cómo proceder. Como siempre, lo dividiré en problema, causa y solución.

El problema y su causa

Hace unos días recibí un equipo que tenía un problema bastante preocupante; cada vez que se reiniciaba, justo antes de iniciar sesión, daba un escalofriante pantallazo azul:

10644238_344446339052034_2954703526335869854_o

No importa cuántas veces reiniciara, siempre recibía el BSOD. Por otro lado, no tenía puntos de restauración funcionales el equipo, así que no había cómo devolverlo a un estado donde todo estuviese corriendo bien.

Como el equipo ya llevaba un buen tiempo desde que se instaló, opté por ser práctico e instalar nuevamente el sistema operativo desde cero, pues consideré que perdería más tiempo si me ponía a indagar en el problema. El verdadero dilema empezó cuando terminé de instalar, pues mientras estaba actualizando Windows nuevamente explotó el pantallazo azul, pero la primera vez pude ingresar otra vez a Windows.

Lo primero que hice, fue extraer el Minidump ubicado en C:WindowsMinidump y lo abrí en otro equipo con Windbg para realizar un análisis.

Ejecutando !Analyze –v en Windbg, me arrojó este resultado en el stack:

BSOD1

Como ven, había incluso múltiples repetisiones del athwbx, correspondiente a athwbx.sys:

BSOD2

El controlador, creado en Octubre del 2013, pertenecía a Qualcomm Atheros Wireless Network Adapter, o en palabras más humanas, al controlador inalámbrico del equipo:

Dr7

Lo más normal en este tipo de casos, es simplemente buscar en la página web del fabricante una versión del controlador más actual, así que bajé uno de Toshiba, que era la marca del portátil y procedí a actualizar… lamentablemente, apenas Windows utilizaba el controlador de alguna forma, volvía a estallar el BSOD.

Lo que hice entonces fue desinstalar todo el controlador, y dejar que Windows lo reconociera desde su propia base de datos, y en efecto, se instaló uno que parecía más actual:

Dvr01

Para mi mala fortuna, no solo volvió a dar el pantallazo azul, sino que se quedó idefinidamente estallando en cada reinicio, ¡otra vez!

Tenía mucho sentido que diera el pantallazo apenas en el logon, pues ahí es donde el sistema operativo carga servicios y controladores; ¿Pero, cómo detener el inicio del controlador en cuestión, cuando ni siquiera tengo acceso a Windows?

Como he mostrado en otros artículos enfocados a implementación, utilizando el ADK es posible generar un Windows PE; pequeño sistema operativo Windows que carga en memoria RAM, con algunas funciones limitadas, pero que al ser sistema operativo, tiene ventajas notables como las de ejecutar algunos tipos de aplicaciones. Autoruns de Sysinternals, es una de ellas y desde Autoruns se puede ver todo lo que inicie en Windows, para todos los usuarios y empezar a deshabilitar según sea necesario.

Lo que hice entonces fue crear un Windows PE desde otro equipo, preparé una USB y arranqué el equipo desde allí. Una vez iniciado, busqué la unidad del PE y ejecuté Autoruns desde allí para luego ir al menú File > Analyze Offline System. Aquí símplemente indiqué la unidad que contenía la instalación de Windows y la ruta de ProgramData para referenciar a todos los perfiles:

image

Al hacer clic en OK, Autoruns cargó nuevamente todos los datos, pero esta vez del sistema local. Con esto, bastaba ir ahora a la pestaña de Drivers, buscar el correspondiente al controlador inalámbrico, es decir, athwbx.sys y deshabilitar la entrada:

image

*Nota: Técnicamente, se podría hacer esto mismo cargando el Hive de System en el Registro de Windows, pero es un procedimiento un poco más complejo.

Cerré Autoruns, la consola del Windows PE y al reiniciar, ya estaba nuevamente en Windows, con el controlador deshabilitado:

Dr1

Ya sabía que no podía habilitarlo ni usar la WiFi, porque volvería a causar el BSOD, así que conecté el equipo por cable y procedí a buscar nuevamente actualizaciones de Windows.

Revisando los resultados, me encontré con una en particular muy interesante:

Dvr02

Era justamente una actualización al controlador inalámbrico que me estaba causando el pantallazo, con fecha de este mes, lo que sugería que corregía el problema que estaba causando en Windows.

Lamentablemente, al intentar instalarlo, Windows internamente debía manipular el controlador anterior, así que volví a recibir una vez más el dichoso pantallazo azul. Intenté desinstalando previamente el controlador desde el administrador de dispositivos, pero si hacía eso, Windows Update no me ofrecía la actualización y si lo dejaba, me regalaba un BSOD al intentar desplegarlo.

Como podrán imaginarse, estaba bastante atascado, pues aunque estaba casi seguro que esa actualización solucionaba el problema, Windows no me la iba a dejar fácil para actualizar… ¿Qué podía hacer, entonces?

La solución

Tal cual he expuesto en más de un caso, las técnicas y herramientas de implementación pueden llegar a ayudar en muchos casos para solución de problemas en Windows. Estaba claro que no podría instalar el controlador online, así que lo único que me quedaba era hacerlo offline, y para esto necesitaría acudir al argumento de /Add-Driver de DISM.

Básicamente, tendría que montar una imagen de Windows 8.1 con DISM, inyectarle el controlador manual, guardar la imagen, preparar la instalación en un .ISO o USB y proceder a instalar Windows nuevamente. Esto no lo podía hacer en la instalación que ya tenía, porque el parámetro de /Add-Driver solo funciona sobre imágenes offline.

Lo primero que tenía que hacer, era encontrar el controlador que ofrecía Windows Update, pues seguramente ese era el unico que solucionaría el problema, así que procedí a utilizar un servicio muy interesante en la página de Windows Update, y es poder consultar sobre un catálogo de controladores la descarga. Como ya tenía el nombre, bastaba con realizar lo siguiente:

1. Navegar hasta la página: http://catalog.update.microsoft.com/v7/site/Home.aspx

2. Instalar el complemento que pide la página.

3. Buscar por el nombre específico del driver, tal cual aparece en Windows Update:

Qualcomm Atheros AR9002WB-1NG Wireless Network Adapter

4. Hacer clic en el botón Agregar.

5. Clic en el enlace de Ver cesta en la parte superior.

6. Clic en el botón Descargar:

image

Después de esto, procedí a inyectarlo con DISM a la imagen de instalación de Windows para que una vez instalado, ya estuviese el controlador actualizado y que no generaba BSOD.

*Nota: Como inyectar controladores requiere un procedimiento, escribí un artículo aparte donde pueden ver el paso a paso:

Inyectar controladores a una imagen offline de Windows 8.1 utilizando DISM.

Después de instalado, el Wi-Fi estaba funcionando y para mi gran fortuna, ¡el problema se había ido! Recordemos que no bastaba con instalar nuevamente Windows.

Al revisar el controlador, pude verificar que se había instalado con Windows por la fecha de creación:

Solved

Solo restaba configurar nuevamente Windows para que se pudiera continuar trabajando con el equipo.

Espero sea de utilidad para los que presenten un problema similar.

PD: No olviden que pueden consultar con la comunidad por sus problema con Windows en los foros de Windows 8.1 de Microsoft Community.

Saludos.

Checho

Inyectar controladores a una imagen offline de Windows 8.1 utilizando DISM

Hace un tiempo, por petición de alguien que me había escrito, creé un artículo donde mostraba paso a paso cómo podíamos generar una imagen de Windows 8.1, integrando la cantidad de actualizaciones deseadas; hoy, gracias a que me he dado cuenta de lo valioso que puede ser en casos de solución de problemas, mostraré cómo pueden hacer lo mismo, pero esta vez inyectando controladores específicos a una imagen para que estén disponibles una vez instalado Windows, si el hardware tiene el dispositivo necesario.

Requerimientos

1. Claramente, necesitamos los archivos de instalación de Windows 8.1, o por lo menos la imagen .WIM, para cuando se vaya a utilizar alguna solución como MDT.

2. Los archivos de instalación para el respectivo controlador; no el ejecutable (.exe), sino lo que utiliza ese ejecutable, es decir, el archivo .INF y .SYS.

*Nota: Microsoft tiene disponible una web en donde se pueden descargar todos los controladores que uno encuentra en Windows Update:
http://catalog.update.microsoft.com/v7/site/Home.aspx

3. Tener instalado el ADK para Windows 8.1 Update. El paquete de instalación lo pueden descargar desde el sitio oficial de Microsoft:
http://www.microsoft.com/en-us/download/details.aspx?id=39982

4. Crear las siguientes 4 carpetas en C:

C:81

C:Mount

C:Drivers

*Nota: Los nombres no son obligatorios, pero yo utilizaré estos durante el resto del post.

Copiando archivos de instalación

Si tenemos un medio .ISO o DVD con los archivos de instalación, es necesario copiar todo el contenido a la carpeta 81, para esto, hacemos clic derecho sobre el botón de Inicio, seleccionamos Símbolo del sistema (Administrador) y allí ejecutamos:

xcopy <UnidadWin>:*.* /s/e/f C:81

Donde <UnidadWin> corresponde a la letra asignada por Windows para nuestro medio después de montarlo o insertarlo; para mi caso, teniendo la letra H, el comando sería:

xcopy H:*.* /s/e/f C:81

image

El proceso tardará unos minutos.

Preparando controladores

Como mencioné en los requerimientos y por lógica, es necesario tener los archivos de instalación para los controladores, pero no pueden ser extensiones de ejecutables, sólo .INF.

Si conocen específcamente lo que están buscando, la página del catálogo de Windows Update es un lugar ideal, pues me descarga un .cab que luego se puede descomprimir. Desde la página de cada fabricante también se pueden bajar, para luego buscar manualmente los archivos de instalación cuando se descompriman, trabajo que es un poco más complejo.

En mi caso, utilizaré dos controladores bajados del catálogo; uno de Wireless y otro de la tarjeta gráfica:

image

Repito, lo importante es tener el archivo .INF, acompañado del .sys.

Si descargaron desde el catálogo de Windows Update:

Al descargar desde el catálogo como dije, sea baja un .cab dentro de una carpeta:

image

Para descomprimir, hacemos lo siguiente:

1. Renombramos el archivo a algo sencillo, por ejemplo: drv1.sys

image

2. Copiamos el .cab a la unidad raíz de Windows (C:).

3. Abrimos un símbolo del sistema con privilegios elevados y ejecutamos:

expand C:drv1.cab –F:* C:Drivers

image

Hacemos esto con cada nuevo controlador, cambiando por supuesto el nombre del .cab.

4. Verificamos que los archivos de instalación hayan quedado:

image

*Nota: Es normal que aparezcan muchos otros archivos o incluso .inf, pero siempre habrá uno principal, acompañado por su .sys. El de NVIDIA, por ejemplo, es el de nv_dispwu.inf:

image

Cuando tengamos los archivos listos dentro de la carpeta C:Drives, podemos proceder a montar la imagen para inyectarlos.

Paso 1: Montar la imagen

En el equipo técnico donde se instaló el ADK y copiamos la imagen, digitamos en la pantalla de inicio: Deployment and Imaging Tools Environment, clic derecho y Ejecutar como administrador:

image

En la consola, procedemos a montar nuestra imagen, en este caso de Windows 8.1 PRO:

Dism /Mount-Image /ImageFile:C:81sourcesinstall.wim /Index:1 /MountDir:C:Mount

image

Paso 2: Inyectar los controladores

Desde la misma consola del Deployment and Imaging Tools Environment, procedemos a inyectar los controladores a la imagen que está montada; puede ser uno a la vez o todos los que haya en una misma carpeta. Pasaré a mostrar ambas opciones, para que el artículo sea más completo:

Para un solo controlador:

Si queremos inyectar un solo controlador, por ejemplo, en mi caso con el de Wireless, ejecutamos:

Dism /Image:C:Mount /Add-Driver /Driver:C:Driversathwbx.inf

image

El resultado nos debe dar como: The driver package was successfully installed.

*Nota: Después del parámetro de /Driver, es básicamente indicar dónde está nuestro .inf, así que variará para cada uno de ustedes el nombre del archivo.

Para instalar múltiples controladores:

Si lo que deseamos es inyectar todos los controladores disponibles en una carpeta, debemos ejecutar:

Dism /Image:C:Mount /Add-Driver /Driver:C:Drivers /Recurse

image

Como ven, DISM es lo suficientemente inteligente para detectar todos los controladores que hayan y de ser posible, realizar la instalación.

Siempre podremos verificar que se hayan instalado ejecutando:

Dism /Image:C:Mount /Get-Drivers

image

Paso 3: Guardar y desmontar la imagen

Cuando terminemos de inyectar los controladores y estemos satisfechos, procedemos a ejecutar:

Dism /Unmount-Image /MountDir:C:Mount /Commit

image

Paso 4: Creando la imagen .ISO

Por último, es necesario volver a generar la imagen .ISO de instalación, si es que deseamos utilizar algún medio porque para una USB el proceso es diferente.

Para la ISO, desde la misma consola del Deployment and Imaging Tools Environment, ejecutamos:

oscdimg –bootdata:2#p0,e,bC:81bootEtfsboot.com#pEF,e,bC:81efimicrosoftbootEfisys.bin –u1 –udfver102 C:81 C:Win81_plus_drivers.iso

image

*Nota 1: Se ejcuta todo en una sola línea.

*Nota 2: El comando permite que la imagen se pueda intalar en un equipo que esté basado en BIOS o en UEFI.

¡Todo listo! Basta con proceder a instalar Windows y el controlador se implementará también.

Espero sea de utilidad.

Saludos.

Checho