Detalhes da implementação do WOW64

O emulador WOW64 é executado no modo de usuário. Ele fornece uma interface entre a versão de 32 bits do Ntdll.dll e o kernel do processador e intercepta chamadas de kernel. O emulador WOW64 consiste nas seguintes DLLs:

  • Wow64.dll fornece a infraestrutura de emulação principal e os thunks para as funções de ponto de entrada Ntoskrnl.exe.
  • Wow64Win.dll fornece conversões para as funções de ponto de entrada Win32k.sys.
  • (somente x64) Wow64Cpu.dll dá suporte à execução de programas x86 em x64.
  • (Somente Intel Itanium) IA32Exec.bin contém o emulador de software x86.
  • (Somente Intel Itanium) Wowia32x.dll fornece a interface entre IA32Exec.bin e WOW64.
  • (Somente ARM64) xtajit.dll contém o emulador de software x86.
  • (somente ARM64) wowarmw.dll fornece suporte para executar programas ARM32 no ARM64.

Essas DLLs, juntamente com a versão de 64 bits do Ntdll.dll, são os únicos binários de 64 bits que podem ser carregados em um processo de 32 bits. Em Windows 10 no ARM, os binários CHPE (Compiled Hybrid Portable Executable) também podem ser carregados em um processo de 32 bits x86.

Na inicialização, Wow64.dll carrega a versão x86 do Ntdll.dll (ou a versão CHPE, se habilitada) e executa seu código de inicialização, que carrega todas as DLLs de 32 bits necessárias. Quase todas as DLLs de 32 bits são cópias não modificadas de binários do Windows de 32 bits, embora algumas sejam carregadas como CHPE por motivos de desempenho. Algumas dessas DLLs são escritas para se comportarem de forma diferente no WOW64 do que no Windows de 32 bits, geralmente porque compartilham memória com componentes do sistema de 64 bits. Todo o espaço de endereço do modo de usuário acima do limite de 32 bits é reservado pelo sistema. Para obter mais informações, consulte Desempenho e consumo de memória em WOW64.

Em vez de usar a sequência de chamadas x86 system-service, binários de 32 bits que fazem chamadas do sistema são recriados para usar uma sequência de chamadas personalizada. Essa sequência de chamadas é barata para wow64 interceptar porque permanece inteiramente no modo de usuário. Quando a sequência de chamada personalizada é detectada, a CPU WOW64 faz a transição de volta para o modo nativo de 64 bits e chama para Wow64.dll. A conversão é feita no modo de usuário para reduzir o impacto no kernel de 64 bits e reduzir o risco de um bug na conversão que pode causar uma falha no modo kernel, dados corrompidos ou uma falha de segurança. Os thunks extraem argumentos da pilha de 32 bits, estendem-nos para 64 bits e, em seguida, fazem a chamada do sistema nativo.

Variáveis de ambiente

Quando um processo de 32 bits é criado por um processo de 64 bits ou quando um processo de 64 bits é criado por um processo de 32 bits, WOW64 define as variáveis de ambiente para o processo criado, conforme mostrado na tabela a seguir.

Processar Variáveis de ambiente
Processo de 64 bits
PROCESSOR_ARCHITECTURE=AMD64 ou PROCESSOR_ARCHITECTURE=IA64 ou PROCESSOR_ARCHITECTURE=ARM64
ProgramFiles=%ProgramFiles%
ProgramW6432=%ProgramFiles%
CommonProgramFiles=%CommonProgramFiles%
CommonProgramW6432=%CommonProgramFiles%
Windows Server 2008, Windows Vista, Windows Server 2003 e Windows XP: As variáveis de ambiente ProgramW6432 e CommonProgramW6432 foram adicionadas a partir do Windows 7 e do Windows Server 2008 R2.
Processo de 32 bits
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_ARCHITEW6432=%PROCESSOR_ARCHITECTURE%
ProgramFiles=%ProgramFiles(x86)%
ProgramW6432=%ProgramFiles%
CommonProgramFiles=%CommonProgramFiles(x86)%
CommonProgramW6432=%CommonProgramFiles%

Ganchos globais

A função SetWindowsHookEx poderá ser usada para injetar uma DLL em outro processo se as seguintes condições forem atendidas:

  • Uma DLL de 32 bits só pode ser injetada em um processo de 32 bits e uma DLL de 64 bits só pode ser injetada em um processo de 64 bits. Não é possível injetar uma DLL de 32 bits em um processo de 64 bits ou vice-versa.
  • As DLLs de 32 bits e 64 bits devem ter nomes diferentes.
  • As arquiteturas da DLL e do processo devem corresponder. Por exemplo, você não pode injetar uma DLL x86 de 32 bits em um processo ARM de 32 bits.

Para obter mais informações, consulte SetWindowsHookEx.

Lembre-se de que os ganchos WH_MOUSE, WH_KEYBOARD, WH_JOURNAL*, WH_SHELL e de baixo nível podem ser chamados no thread que instalou o gancho em vez do thread que processa o gancho. Para esses ganchos, é possível que os ganchos de 32 e 64 bits sejam chamados se um gancho de 32 bits estiver à frente de um gancho de 64 bits na cadeia de ganchos. Para obter mais informações, consulte Usando ganchos.