Archivos del escritorioAmpliación de Windows PE

Wes Miller

Antes incluso de lanzar al mercado Windows PE hace más de cinco años, algunos clientes deseosos ya solicitaban más características. Desgraciadamente, Windows PE no se diseñó para ser ampliado fácilmente del modo que, digamos, puede ampliarse Windows XP Embedded, con la adición de más capas en el sistema operativo. Por supuesto, Windows PE tuvo que contar con el soporte del rudimentario

Win32 ® (tal como funcionarían la mayoría de las aplicaciones de Windows ®) y el soporte de redes y almacenamiento masivo (para establecer comunicaciones por la red y poder instalar Windows). Pero ya desde el principio, el shell fue algo que quisimos restringir; utilizando cmd.exe en lugar del shell tradicional de Windows Explorer limitamos las posibilidades del entorno de Windows PE y, lo que es más importante, lo hicimos para que el entorno predeterminado fuera fácilmente ejecutable mediante secuencias de comandos para todas tareas de la automatización.

Aún así, puede ampliar Windows PE, lo único que tiene que recordar es que es limitado. Cabe esperar que la aplicación no funcione o que se comporte incorrectamente si necesita alguna de las tecnologías enumeradas en la lista de la Figura 1 (esta lista no es exhaustiva).

Figure 1 API que faltan de Windows

.NET Framework (cualquier versión)
Interfaces de servicio de Active Directory® (ADSI, Active Directory® Services Interfaces)
DirectX®
Microsoft Data Access Components (MDAC)
Jet (Access)
Visual Basic® (versiones previas a .NET incluidas)
Cualquier tipo ejecutable que necesite un marco que no esté instalado con Windows de forma nativa.
Explorador de Windows o Internet Explorer
Reproductor de Windows Media®
SAPI, MAPI, TAPI (API de discurso, correo y telefonía de Windows respectivamente)

Si no sabe de qué depende su aplicación, es necesario que lo averigüe. ¿Pero cómo? Cuándo tratamos de que los componentes de ADO, las aplicaciones HTML (HTA) y Windows Script Host (WSH) funcionaran con Windows PE antes de lanzarlo al mercado, nos enfrentamos al mismo problema. Hay que tener en cuenta sin embargo que si bien este artículo describirá maneras para localizar estas dependencias, la adición de código binario de Windows a la imagen de Windows PE más allá de lo que incluye el comando MKIMG no está contemplado en el Contrato de licencia para el usuario (CLUF). Será necesario que adquiera un anexo de licencia de Microsoft para poder implementar cambios de esa naturaleza en su entorno.

Descripción de las dependencias

Si abre el archivo .inf de una aplicación en el Bloc de notas y lo examina con atención, podrá aprender mucho. De hecho, es a menudo la manera más fácil de conocer el sentido de una aplicación y de saber qué dependencias tiene. Lo importante que hay que saber acerca de Windows PE es que generalmente es tan limitado que tendrá que depurar múltiples niveles de dependencias —las dependencias directas de su propia aplicación y las dependencias que cada una de ellas pueda generar— para que la aplicación funcione de forma fiable. En esencia, se puede producir una gran cascada de dependencias si no se tiene cuidado. Con algunas adiciones accidentales (o a propósito) al componente, la imagen puede aumentar considerablemente de tamaño y complejidad.

Si tiene un archivo .inf que describe la aplicación, puede obtener indicios acerca de las dependencias localizando claves del Registro y archivos que el archivo .inf agrega al sistema. Busque las secciones CopyFiles y AddReg. Estas entradas señalarán a apps, DLL y a otros archivos de los que dependa la aplicación. De los tres complementos para Windows PE (ADO, HTA y WSH), WSH fue el más sencillo de crear. Debido a que aún estaba disponible una versión redistribuible de WSH para versiones anteriores de Windows y porque existe un archivo .inf integrado en Windows hoy en día que se encarga de realizar las asociaciones de archivos para WSH (en %windir%\inf\wsh.inf), su instalación en Windows PE fue relativamente fácil.

Orca y la realización de instantáneas

Si la aplicación en cuestión se distribuye como archivo de Microsoft ® Installer (MSI), puede hacer dos cosas para localizar las dependencias. Si es un gurú de MSI, puede utilizar Orca (una herramienta para editar archivos de Windows Installer que se distribuye como parte del SDK de la plataforma Windows Server ® 2003 R2: go.microsoft.com/fwlink/?LinkId=77941) para verlo. También puede instalar los componentes de MSI que desee realizando un análisis previo y posterior de los archivos y las claves del Registro que han cambiado. Puede hacer un volcado del Registro, instalar el app, volver a exportar el registro y ejecutar WinDiff en él (consulte la barra lateral "Cómo utilizar WinDiff"). El resultado puede entonces utilizarse como plantilla de los cambios que es necesario hacer en el Registro. El problema es que el número de cambios puede ser enorme. No obstante, puede ser la mejor opción si no tiene un archivo .inf (ni el autor de la aplicación) cercano.

Puede que el proceso de realización de instantáneas de una aplicación le resulte familiar. En esencia, es el mismo análisis previo y posterior que se realiza para conseguir que la aplicación se ejecute. Microsoft solía distribuir (con Windows 2000) una herramienta que realizaba este proceso, pero dicha herramienta ya no funciona con ninguna versión posterior de Windows. Hay diversas aplicaciones comerciales (herramientas para volver a empaquetar instalaciones) que pueden hacerlo, pero también es posible hacerlo con utilidades gratuitas. Para solucionarlo, instale el SDK de la plataforma (consulte el vínculo del párrafo anterior), que incluye WinDiff. Tenga en cuenta que para realizar la comparación WinDiff, lo ideal es que desee instalar la aplicación en Windows Server 2003, Service Pack 1 (SP1) porque esa es la versión de Windows PE que debe estar utilizando; Windows PE 1.6, una versión creada a partir de las ediciones Standard Edition o Enterprise Edition (con SP1). Al realizar esta tarea en Windows Server 2003, tendrá el entorno más parecido posible al que tendría con Windows PE (en el que obviamente no puede ejecutar MSI). Siga los pasos de la barra lateral "Cómo utilizar WinDiff".

De este modo, podrá tener acceso a gran cantidad de información que ha cambiado. Lamentablemente, no existe una forma sencilla de exportar la información que ha cambiado desde el Registro, ni capturas de archivo para crear algún tipo de manifiesto para instalar la aplicación. Es necesario incorporar los cambios manualmente. En este punto es donde encontramos algunos de los problemas más complicados de la primera versión de Windows PE. Conseguir que los componentes de HTA funcionaran por completo fue una tarea compleja, ya que no había una definición para ellos (fuera de Internet Explorer®) en Microsoft. Utilizando las diferencias, pudimos conseguir mediante procesos manuales el suficiente soporte para HTA para que resultara funcional. Aunque es posible agregar manualmente estas claves en el Registro de Windows PE, puede que desee agregarlas una vez iniciado Windows PE. Puede observar los archivos OC.bat y OC2.bat que se utilizaron para instalar el soporte para HTA, WSH y/o ADO en Windows PE a través de la secuencia de comandos buildoptionalcomponents.vbs incluida en las herramientas de creación de Windows PE.

Herramientas útiles

Aún después de aislar las dependencias directas, con frecuencia no se puede encontrar cada código binario del que depende la aplicación. No sabrá, por ejemplo, si requiere otro DLL u OCX para realizar alguna tarea. Así que, ¿cómo saberlo? Mark Russinovich, famoso por Sysinternals (ahora técnico en Microsoft) escribió una utilidad llamada listdlls que hace justamente eso. Listdlls puede descargarse de microsoft.com/technet/sysinternals/utilities/ListDlls.mspx. Para utilizar la utilidad, ejecute el comando listdlls.exe > dlls.txt y examine el resultado. La Figura 2 muestra el resultado de la ejecución de listdlls sobre sí misma. Puede comparar esta lista con los archivos DLL y OCX incluidos en Windows PE para determinar si todas las dependencias de la aplicación están en su sitio o no (en el caso de listdlls, ya están presentes). Para el soporte HTA en Windows PE, la utilidad listdlls fue esencial para identificar algunas dependencias que no se pudieron identificar de otro modo.

Figura 2 Resultado de la ejecución de lisdlls sobre sí misma

Figura 2** Resultado de la ejecución de lisdlls sobre sí misma **(Hacer clic en la imagen para ampliarla)

Pero únicamente porque un archivo DLL esté incluido en la lista no significa necesariamente que la aplicación lo necesite para poder ejecutarse. Si carga el Bloc de notas, por ejemplo, verá que carga el archivo uxtheme.dll. En Windows PE, este archivo DLL no está disponible y, de hecho, dado que ya no se utilizan temas de Windows, nunca se cargará. Aprender cuáles de los archivos DLL que muestra la aplicación listdlls son realmente necesarios frente a cuáles carga Windows bajo petición es, desgraciadamente, una difícil tarea que requerirá una dosis importante de prueba y error o estar muy familiarizado con aspectos de nivel profundo de Windows (para ello, recomiendo el libro de Mark Russinovich y David Salomon, Microsoft Windows InternalsFourth Edition** (Microsoft Press ®, 2004)

De hecho, Mark incluye también la misma funcionalidad en Process Explorer replacement for Windows Task Manager, disponible de forma gratuita. La diferencia es que la utilidad listdlls crea un resultado que, en mi opinión, es más fácil de establecer en secuencias de comandos y de utilizar para encontrar y reunir dependencias perdidas.

Tenga en cuenta que incluso una vez que se agrega un archivo DLL a la imagen, puede que aún haya trabajo por hacer. Es decir, hay dos tipos de archivos DLL: los que requieren registro y los que no. Desgraciadamente, no hay una manera fácil de distinguirlos, aparte de tratar de registrar cada uno de ellos. Para registrar un DLL (o un OCX), hay que ejecutar regsvr32 dllname.dll. Si funciona correctamente, recibe un cuadro de diálogo que le dice que se ha registrado el archivo DLL. De lo contrario, puede que no reciba ningún mensaje, o es más probable que vea un cuadro de diálogo que le informa de que hubo un error en el registro del DLL o que no ha podido ser registrado. Al desarrollar los componentes opcionales HTA y ADO para Windows PE, descubrimos que los DLL requieren almacenamiento de escritura al realizar su registro, tanto para escribir temporalmente, ya sea para copiar un archivo.inf para la instalación como para registrar alguna otra dependencia (es decir, un directorio específico que sea necesario). En Windows PE, solían suponer un error. Ahora nos complace saber que con Windows PE 2.0, este tipo de tareas funcionarán, ya que existe un espacio nuevo disponible de forma predeterminada.

Una tercera herramienta que Mark ha creado y sacado al mercado recientemente recibe el nombre de Process Monitor. Process Monitor puede contemplarse como un superconjunto de Regmon y Filemon, ya que ofrece muchos más detalles que cualquiera de ellos a la vez que agrega una capa nueva completa de comunicación entre procesos. Esta herramienta increíblemente eficaz puede ayudarle a solucionar problemas de aplicaciones de Windows, así como a dar respuesta a preguntas acerca de lo que suceden realmente con interdependencias de DLL. Es posible descargarse Process Monitor.

Eliminación de archivos de Windows PE

Junto con la capacidad de agregar cosas a Windows PE, otra petición frecuente eran las instrucciones sobre la forma de hacer Windows PE más pequeño. Hay pasos para ayudarle a reducir un poco el tamaño de Windows PE. La copia con licencia de Windows PE debe incluir una colección de herramientas de creación y alguna documentación. Uno de los documentos es un archivo de ayuda llamado winpe.chm. Si abre este archivo y examina la sección relativa al entorno de preinstalación de Windows de la guía de usuario, deberá ver un tema que trata la reducción del tamaño de Windows PE. Esta sección incluye una lista de archivos que puede eliminar sin riesgos (suponiendo que no los necesite). Encontrará tres secciones relativas a los archivos que puede eliminar:

  • Los archivos de fuentes pueden siempre eliminarse sin riesgos.
  • Las utilidades y archivos .inf relacionados con la red pueden eliminarse, pero sólo debe hacerlo si no tiene pensado utilizar su versión en la red en absoluto.
  • Las utilidades de línea de comandos no deben eliminarse. No recomiendo eliminar ninguna de ellas a menos que sepa específicamente su función y lo que puede suceder si la elimina.

Una vez que haya determinado qué archivos puede eliminar sin riesgos, puede simplemente copiar un archivo por lotes u otra secuencia de comandos y eliminarlos de su versión de Windows PE una vez que mkimg.cmd haya completado la versión.

Modificación del Registro de Windows PE

Puede ver que tomamos una decisión meditada al no instalar los componentes opcionales en el momento de la creación. Aunque esto supuso un poco más de tiempo en el momento de la ejecución, significó también que no tuvimos que desarrollar una forma completamente nueva de incluir estos componentes de nuevo en Windows PE; algo para lo que no teníamos tiempo y que seguramente hubiese supuesto haberlos omitido por completo. ¿Pero qué sucede si desea hacer un cambio en el Registro, tal como agregar algo en el delta de cambios del Registro de su aplicación, o si simplemente desea editar una clave que pueda mantener la aplicación en funcionamiento? Esta acción se puede realizar fácilmente, utilizando regedit, que muestra en la Figura 3. Siga estos pasos:

  1. Ejecute regedit y seleccione el subárbol HKEY_LOCAL_MACHINE.
  2. Seleccione Archivo | Cargar subárbol y, a continuación, examine hasta la ubicación de su versión de Windows PE. Seleccione setupreg.hiv en I386\System32\ (o MiniNT\System32, si se trata de una imagen que está colocando en un disco duro).
  3. Especifique un nombre temporal para el subárbol, tal como WinPE, y examine hasta ese nodo en HKLM.
  4. Modifique esta clave consecuentemente. Como punto de interés, observe que este nodo es en efecto el mismo nodo HKLM\System que sería en una instalación normal de Windows.
  5. Una vez que ha realizado sus modificaciones, seleccione la clave en HKLM que creó en el paso 3 (es muy importante hacerlo correctamente o podría dañar el sistema).
  6. Seleccione Archivo | Descargar subárbol... y confirme el cuadro de diálogo Sí | No, y asegúrese de desmontar el Registro cada vez, ya que tenerlo bloqueado evitará una compilación correcta de Windows PE.

Figura 3 Cómo abrir el Registro de Windows PE

Figura 3** Cómo abrir el Registro de Windows PE **(Hacer clic en la imagen para ampliarla)

Puede modificar HKLM\System siguiendo estos pasos. Hay también otras dos claves que se encuentran en I386\System32 que le permiten modificar otras áreas del Registro: DEFAULT es el subárbol predeterminado para usuarios (incluso SYSTEM, que se ejecuta como al utilizar Windows PE), y SOFTWARE, que es igual que HKLM\Software. Como siempre, modifique el Registro con el cuidado y sólo si es necesario.

Ahora tiene más información que debe ayudarle a comenzar a mover su herramienta de recuperación o solución de problemas favorita en Windows PE. El próximo mes, trataré la serie PSTools, que es una colección de herramientas de administración del sistema muy útiles creadas también por Mark Russinovich.

Uso de WinDiff

WinDiff puede ayudarle a encontrar las dependencias de su aplicación. Siga estos pasos para realizar una correcta instalación y ejecución:

  1. Prepare su sistema para la instalación; desea minimizar el tiempo y cualquier cambio en archivos o el Registro entre la instantánea inicial y la final.
  2. Abra un símbolo del sistema y ejecute reg export HKLM C: \HKLM1.reg para realizar una exportación completa del subárbol del Registro HKEY_Local_Machine.
  3. Ejecute dir C: \*.*/S > C: \C1.txt para realizar un volcado completo de todos archivos en la unidad C: (suponiendo que C: es su unidad del sistema).
  4. Instale su aplicación y configure cualquier ajuste posterior a la instalación.
  5. Ejecute reg export HKLM C: \HKLM2.reg.
  6. Ejecute dir C: \*.*/S > C: \C2.txt.
  7. Abra WinDiff y seleccione Archivo | Comparar archivos... y seleccione HKLM1.reg en el primer cuadro de diálogo Abrir archivo y HKLM2.reg en el segundo.
  8. Debe ver un mensaje en rojo que le indica cuál es más nuevo. Tenga paciencia; puede que tarde un poco debido a que las exportaciones de HKLM pueden ser bastante grandes.
  9. Haga doble clic en el texto en rojo para ampliar las diferencias.
  10. Puede que desee configurar lo que se muestra en la comparación mediante una comprobación de Opciones | Mostrar sólo líneas correctas. Esto habilitará que sólo se muestren las líneas recientemente agregadas en el segundo archivo comparado (de modo que sólo aparecerán archivos nuevos y nuevas claves del Registro).

Tenga en cuenta que puede que necesite utilizar la función de búsqueda para localizar claves relacionadas con su aplicación. En las Figuras A y B, puede ver cambios de archivos y del Registro en una aplicación ficticia. Por suerte, las funciones de copiar y pegar están disponibles en WinDiff. Para utilizar estas funciones, basta con hacer clic en la línea > ! y seleccionar las líneas deseadas.

Figura A Entradas de WinDiff

Figura A** Entradas de WinDiff **(Hacer clic en la imagen para ampliarla)

Figura B Clave específica en WinDiff

Figura B** Clave específica en WinDiff **(Hacer clic en la imagen para ampliarla)

Wes Miller es Director de desarrollo de Pluck (www.pluck.com) en Austin, Texas. Anteriormente, Wes trabajó en Winternals Software en Austin, y en Microsoft como administrador de programas y administrador de producto para Windows. Si lo desea, puede ponerse en contacto con Wes en la dirección technet@getwired.com.

© 2008 Microsoft Corporation and CMP Media, LLC. Reservados todos los derechos; queda prohibida la reproducción parcial o total sin previa autorización.