terça-feira, 5 de maio de 2009

Explicando porque EnumProcessModules retorna ERROR_PARTIAL_COPY - 299 em Windows 64 bits

Semana passada recebi um chamado sobre um problema em um de nossos produtos.

Nosso plugin de monitoração de SQL Server não estava funcionando em Windows Server 2003 64 Bits.

Antes de qualquer coisa, nosso plugin é um programa 32 bits mas executando num ambiente 64 bits usando um mecanismo conhecido como WOW64.

Verifiquei no log do sistema que o plugin não estava conseguindo obter o path do processo do banco de dados (sqlserv.exe).

Para obter o path de um processo usamos a função EnumProcessModules que estava falhando e retornando o erro ERROR_PARTIAL_COPY (erro 299).

Fiz uma breve pesquisa e rapidamente verifiquei que EnumProcessModules não consegue enumerar processos 64 bits a partir de programas 32 bits.

Uma opção era recompilar tudo em 64 Bits. Mas por agora não pretendemos ter 2 builds do mesmo produto.

Descobri que não é apenas este função que tem este problema.

As versões 32 bits das funções EnumProcessModulesEx e GetModuleFileNameEx sofrem do mesmo problema.

Quem quiser mais detalhes técnicos basta clicar aqui.

Solução:

Para windows XP ou superior podemos obter o path de processos 64 bits a partir de programas 32 bits usando a chamada GetProcessImageFileName.

O único problema é que o path retornado tem um formato diferente (/Device/HarddiskVolumeX) do tradicional formato tipo DOS com as letras dos drives no início.

[]'s

Leonardo Cardoso

palavras chaves google: c c++ windows 64 bits win32
blog comments powered by Disqus