Os arquivos da área de trabalhoEstendendo o Windows PE

Wes Miller

Antes mesmo de lançarmos o Windows PE há cinco anos, clientes ansiosos já pediam mais recursos. Infelizmente, o Windows PE não foi criado para ser estendido facilmente, conforme, digamos, o Windows XP Embedded pode ser: acrescentando-se camadas adicionais do sistema operacional. É claro que o Windows PE tinha que ter suporte

rudimentar ao Win32® (para que a maioria dos aplicativos Windows® pudesse funcionar) e suporte de rede e armazenamento em massa (para se comunicar pela rede e poder instalar o Windows). Mas, mesmo desde o início, desejávamos restringir o shell. Usando o cmd.exe em vez do shell do Windows Explorer tradicional, limitamos as ações do ambiente Windows PE e, mais importante, fizemos isso de forma que o ambiente padrão fosse facilmente programável por scripts em todas as tarefas de automação.

Ainda assim, você poderá estender o Windows PE; basta apenas lembrar-se de que ele é limitado. Você pode esperar que o seu aplicativo talvez não funcione ou se comporte incorretamente se ele requerer alguma das tecnologias listadas na Figura 1 (essa lista não é abrangente).

Figure 1 APIs ausentes do Windows

.NET Framework (qualquer versão)
Interfaces de Serviços do Active Directory ® (ADSI)
DirectX®
Microsoft Data Access Components (MDAC)
Jet (Acess)
Visual Basic® (versõs .NET anteriores incluídas)
Todo tipo de executável que exija uma estrutura que não esteja instalada nativamente com o Windows.
Windows Explorer ou Internet Explorer
Windows Media Player®
SAPI, MAPI, TAPI (APIs de fala, email e telefonia do Windows, respectivamente)

Se você não sabe do que depende o seu aplicativo, precisará descobrir. Mas como? Quando tentamos fazer com que os componentes ADO, HTA (aplicativos HTML) e WSH (Host de Scripts do Windows) funcionassem no Windows PE antes de o lançarmos, nós nos deparamos com o mesmo problema. Observe, no entanto, que, embora este artigo descreva maneiras de rastrear essas dependências, adicionar qualquer binário do Windows à imagem do Windows PE, além do que o comando MKIMG inclui, não é coberto pelo EULA (Contrato de Licença de Usuário Final). Você precisará adquirir um adendo de licença da Microsoft para implementar alterações dessa natureza em seu ambiente.

Noções básicas sobre dependências

Se você abrir um arquivo .inf do aplicativo no Bloco de Notas e examiná-lo cuidadosamente, poderá aprender muito. Na verdade, geralmente essa é a maneira mais fácil de se compreender um aplicativo e ver que dependências ele possui. O importante a saber sobre o Windows PE é que geralmente ele é tão mais simples que você terá que depurar vários níveis de dependências: as dependências diretas próprias do seu aplicativo e as dependências que cada um deles possa apresentar para fazer com que o aplicativo seja executado de forma confiável. Essencialmente, pode ocorrer uma cascata muito grande de dependências se você não for cuidadoso. Com algumas adições de componentes acidentais (ou intencionais), sua imagem pode crescer consideravelmente em tamanho e complexidade.

Se você já tiver um arquivo .inf que descreva o aplicativo, poderá obter indícios sobre as dependências, localizando chaves e arquivos do Registro que o .inf adiciona ao sistema. Procure as seções CopyFiles e AddReg. Essas entradas apontarão para aplicativos, DLLs e outros arquivos de que o seu aplicativo depende. Dos três suplementos do Windows PE (ADO, HTA e WSH), o WSH foi o mais simples de se criar. Como uma versão redistribuível do WSH ainda estava disponível para versões mais antigas do Windows e por haver um .inf interno no Windows atual que executa as associações de arquivo no WSH (em %windir%\inf\wsh.inf), instalá-lo no Windows PE foi relativamente fácil.

Orca e Instantâneo

Se o aplicativo em questão for distribuído como um arquivo Microsoft® Installer (MSI), você poderá localizar dependências de duas formas: Se você for um guru de MSI, poderá usar a Orca (uma ferramenta de edição dos arquivos do instaladores do Windows, distribuída como parte da plataforma SDK do Windows Server® 2003 R2: go.microsoft.com/fwlink/?LinkId=77941) para exibi-la. Você também pode instalar o MSI nos componentes que desejar, executando uma análise de antes e depois nos arquivos e nas chaves do Registro que foram alterados. Você pode fazer um despejo do Registro, instalar o aplicativo, exportar o Registro novamente e, em seguida, executar o WinDiff nele (consulte a barra lateral “Using WinDiff"). O resultado pode então ser usado como um modelo para as alterações que precisam ser feitas ao Registro. O problema é que o número de alterações pode se tornar confuso. No entanto, essa pode ser a melhor opção se você não tiver um .inf (ou o autor do aplicativo) à mão.

Talvez você esteja familiarizado com o processo de instantâneo do aplicativo. É basicamente o mesmo da análise de antes e depois que se realiza para executar o aplicativo. A Microsoft distribuía (com o Windows 2000) uma ferramenta que fazia isso, mas essa ferramenta não funciona mais com as versões mais recentes do Windows. Vários aplicativos comerciais (reempacotadores de instalação) podem fazer isso, mas alguns utilitários gratuitos também o fazem. Para uma solução, instale a Plataforma SDK (veja o link no parágrafo anterior), que inclui o WinDiff. Observe que, para executar a comparação WinDiff, talvez seja conveniente instalar o aplicativo no Windows Server 2003 com o Service Pack 1 (SP1) porque essa é a versão do Windows PE que você deve estar usando: Windows PE 1.6 criado com base no Standard Edition ou Enterprise Edition (com o SP1). Realizando essa tarefa no Windows Server 2003 você obterá o ambiente mais próximo daquele que obteria no Windows PE (onde obviamente você não pode executar um MSI) Siga as etapas na barra lateral “Using WinDiff”.

Isso lhe mostrará um volume razoável de informações que foram alteradas. Infelizmente não existe um modo fácil de exportar as informações alteradas de capturas de Registro ou de arquivo para criar um manifesto de algum tipo para instalar seu aplicativo. Você terá que incorporar as alterações manualmente. É aí que encontramos alguns dos problemas mais difíceis com a primeira versão do Windows PE. Fazer com que os componentes HTA funcionassem era complexo, porque não havia nenhuma definição para eles (fora do Internet Explorer®) na Microsoft. Ao usar a diferenciação, conseguimos inserir manualmente suporte HTA suficiente para que ele funcionasse. Embora seja possível adicionar manualmente essas chaves ao Registro do Windows PE, pode ser que você deseje adicioná-las após o Windows PE ter iniciado. Você pode olhar nos arquivos OC.bat e OC2.bat usados para instalar o HTA, WSH e/ou o suporte ADO no Windows PE por meio do script buildoptionalcomponents.vbs incluído nas ferramentas de compilação do Windows PE.

Ferramentas úteis

Mesmo após isolar as dependências diretas, geralmente não se consegue localizar todo binário de que o seu aplicativo depende. Você não saberá, por exemplo, se ele requer outra DLL ou outro OCX para executar uma tarefa. Então, como saber a diferença? Mark Russinovich, celebridade da Sysinternals (atualmente um parceiro técnico na Microsoft) escreveu um utilitário prático chamado listdlls que faz exatamente isso. O listdlls pode ser baixado do site Microsoft.com/technet/sysinternals/utilities/ListDlls.mspx. Para usar o utilitário, execute o comando listdlls.exe > dlls.txt e, depois, examine a saída. A Figura 2 mostra a saída de execução do listdlls por si própria. Você pode comparar essa lista com os arquivos DLL e OCX incluídos no Windows PE para determinar se todas as dependências do aplicativo estão em vigor ou não (no caso do listdlls, elas já estão presentes). Para o suporte HTA no Windows PE, o comando listdlls foi fundamental na identificação de algumas dependências que, do contrário, não poderiam ser identificadas.

Figura 2 Saída do comando Listdlls executada por si própria

Figura 2** Saída do comando Listdlls executada por si própria  **(Clique na imagem para aumentar a exibição)

Mas só porque uma DLL está listada não significa necessariamente que seja requerida para que o aplicativo funcione. Se você carregar o Bloco de notas, por exemplo, verá que ele carrega o uxtheme.dll. No Windows PE, essa DLL não está disponível e, na verdade, como os temas do Windows não são usados, ela nunca será carregada. Infelizmente é difícil saber, dentre as DLLS mostradas pelo comando listdlls, aquelas de que você realmente precisa versus aquelas que são carregadas por demanda. Isso exigirá de uma boa dose de tentativa e erro, ou que você se familiarize bastante com aspectos de nível inferior do Windows. (Para isso, recomendo o livro de Mark Russinovich e David Solomon, Microsoft Windows Internals, Quarta Edição (Microsoft Press®, 2004).

Na verdade, Mark, também inclui a mesma funcionalidade na substituição gratuita disponível do Process Explorer do Gerenciador de tarefas do Windows. A diferença é que o listdlls cria uma saída que, em minha opinião, é mais facilmente incluída em um script e usada para localizar e coletar dependências ausentes.

Observe que, mesmo após adicionar uma DLL à sua imagem, ainda haverá algum trabalho a ser feito. Ou seja, existem dois tipos de DLLs: as que requerem registro e as que não requerem. Infelizmente, não há uma maneira fácil diferenciá-las sem tentar registrar cada uma delas. Para registrar uma DLL (ou um OCX), execute o comando regsvr32 dllname.dll. Se funcionar corretamente, uma caixa de diálogo informará que a DLL foi registrada. Do contrário, talvez você não receba uma mensagem ou, mais provável, uma caixa de diálogo informará que houve falha ao registrar a DLL ou que ela não pôde ser registrada. Durante o desenvolvimento dos componentes opcionais HTA e ADO do Windows PE, descobrimos que DLLs requerem armazenamento gravável quando da execução de seus registros, seja para gravar temporariamente um arquivo .inf de instalação ou para registrar alguma outra dependência (digamos, um diretório especifico de que necessitem). No Windows PE, isto significa falha. Felizmente, com o Windows PE 2.0 tarefas como essas funcionarão, pois existe um espaço transitório disponível por padrão.

Uma terceira ferramenta criada por Mark e lançada recentemente chama-se Process Monitor. O Process Monitor pode ser visualizado como um superconjunto de Regmon e Filemon, embora forneça mais detalhes do que ambos, ao adicionar uma camada nova inteira de comunicação entre processos. Essa ferramenta incrivelmente eficiente pode ajudá-lo a solucionar problemas de aplicativos no Windows, além de ajudar a responder perguntas sobre o que de fato está acontecendo com as interdependências de DLL. O Process Monitor pode ser baixado.

Removendo arquivos do Windows PE

Junto com a capacidade de adicionar itens ao Windows PE, outra solicitação freqüente era por instruções sobre como tornar o Windows PE menor. Há etapas que você pode percorrer para reduzir um pouco o tamanho do Windows PE. Sua cópia licenciada do Windows PE deve incluir uma coleção de ferramentas de compilação e alguma documentação. Um dos documentos é um arquivo de ajuda chamado winpe.chm. Se você abrir esse arquivo e explorar a seção Guia do Usuário do Ambiente de Pré-instalação do Windows, verá um tópico intitulado Reduzindo o Tamanho do Windows PE. Essa seção lista uma coleção de arquivos que você pode remover com segurança (supondo que você não precise deles). Você encontrará três seções relacionadas aos arquivos removíveis:

  • Os arquivos de fonte podem sempre ser removidos com segurança.
  • Arquivos .inf e utilitários relacionados à rede podem ser removidos, mas remova-os somente se você não planeja, de maneira nenhuma, usar sua compilação na rede.
  • Os utilitários de linha de comando não devem ser removidos. Não recomendo a remoção de nenhum deles, a menos que você saiba exatamente o que ele faz e o que pode acontecer se o remover.

Depois de determinar que arquivos podem ser excluídos com segurança, você pode simplesmente gravar um arquivo em lotes ou outro script e removê-los da sua compilação do Windows PE, após o mkimg.cmd concluir a compilação.

Modificando o Registro do Windows PE

Você pode observar que fizemos uma escolha consciente de não instalar os componentes opcionais no momento da compilação. Embora isso tenha significado um pouco mais de tempo na execução, também significou que não tivemos que projetar uma nova maneira de inserir estes componentes de volta no Windows PE - algo que não tínhamos tempo para fazer e que, provavelmente, significaria omiti-los por completo. Mas e se você desejar fazer uma alteração no Registro, como, por exemplo, adicionar ao delta do Registro alterações do seu aplicativo, ou simplesmente editar uma chave que possa manter o aplicativo em funcionamento? Isso é fácil de se fazer, por meio do regedit, mostrado na Figura 3. Siga estas etapas:

  1. Execute o regedit e selecione o hive HKEY_LOCAL_MACHINE.
  2. Selecione File | Load Hive e, em seguida procure o local de sua compilação do Windows PE. Selecione setupreg.hiv em I386\System32\ (ou MiniNT\System32, se for uma imagem o que você estiver colocando no disco rígido).
  3. Insira um nome temporário para o hive, como WinPE, e procure esse nó em HKLM.
  4. Modifique essa chave adequadamente. Curiosamente, observe que este nó é, na verdade, o mesmo que seria o nó HKLM\System em uma instalação normal do Windows.
  5. Depois de fazer as modificações, selecione a chave em HKLM criada na Etapa 3 (é muito importante fazer isso da maneira correta ou o sistema poderá sair danificado).
  6. Selecione File | Unload Hive... e confirme na caixa de diálogo Sim | Não; certifique-se de desmontar o Registro sempre, uma vez que, se ele estiver bloqueado, isso impedirá que a compilação do Windows PE tenha êxito.

Figura 3 Abrindo o Registro do Windows PE

Figura 3** Abrindo o Registro do Windows PE **(Clique na imagem para aumentar a exibição)

Seguindo estas etapas você poderá modificar o HKLM\System. Existem também duas outras chaves localizadas em I386\System32 que permitem modificar outras áreas do Registro. DEFAULT é o hive padrão para usuários (até SYSTEM, executado durante o uso do Windows PE) e SOFTWARE, que equivale a HKLM\Software. Como sempre, modifique o Registro com cuidado e somente quando necessário.

Agora você já tem algumas informações que deverão ajudá-lo a começar a transferir suas soluções de problemas ou ferramenta de recuperação favorita para o Windows PE. No mês que vem falarei sobre o conjunto PStools, uma coleção de ferramentas de gerenciamento de sistema muito úteis, também escrito por Mark Russinovich.

Usando o WinDiff

O WinDiff pode ajudá-lo a encontrar as dependências do seu aplicativo. Basta seguir estas etapas para obter uma instalação e uma execução bem-sucedidas.

  1. Prepare o seu sistema para a instalação: você deseja minimizar o tempo e qualquer alteração no Registro ou ao arquivo entre os instantâneos inicial e final.
  2. Abra um prompt de comando e execute o comando reg export HKLM C:\HKLM1.reg para realizar uma exportação completa do hive do Registro HKEY_Local_Machine.
  3. Execute dir C:\*.* /S > C:\C1.txt para realizar um despejo completo de todos os arquivos da unidade C: (supondo que C: é a sua unidade de sistema).
  4. Instale o seu aplicativo e defina todas as configurações pós-instalação.
  5. Execute o reg export HKLM C:\HKLM2.reg.
  6. Execute dir C:\*.* /S > C:\C2.txt.
  7. Abra o WinDiff, selecione File | Compare Files... e selecione HKLM1.reg na primeira caixa de diálogo Abrir arquivo e HKLM2.reg, na segunda.
  8. Você verá uma mensagem em vermelho indicando qual é o mais recente. Seja paciente; a ação talvez leve algum tempo, pois as exportações do HKLM podem ser muito grandes.
  9. Clique duas vezes no texto em vermelho para expandir as diferenças.
  10. Talvez seja conveniente configurar o que será mostrado na comparação, selecionando Options | Show Right-Only Lines. Isso permitirá mostrar apenas as linhas adicionadas recentemente ao segundo arquivo comparado (assim, apenas os novos arquivos e as novas chaves do Registro serão exibidos).

Observe que talvez seja necessário usar a função Localizar para localizar as chaves relacionadas ao seu aplicativo. Nas Figuras A e B, você poderá ver as alterações de arquivo e de Registro a um aplicativo fictício que eu criei. Felizmente, os comandos copiar e colar estão disponíveis no WinDiff. Para usar essas funções basta clicar na linha !> e selecionar as linhas desejadas.

Figura A Entradas WinDiff

Figura A** Entradas WinDiff **(Clique na imagem para aumentar a exibição)

Figura B Chave específica do WinDiff

Figura B** Chave específica do WinDiff **(Clique na imagem para aumentar a exibição)

Wes Miller é gerente de desenvolvimento da Pluck www.pluck.com em Austin, no Texas. Antes disso, Wes trabalhou na Winternals Software, em Austin, e na Microsoft, como gerente de programas e gerente de produtos do Windows. Ele pode ser contatado pelo email technet@getwired.com.

© 2008 Microsoft Corporation e CMP Media, LLC. Todos os direitos reservados. A reprodução parcial ou completa sem autorização é proibida..