Rodrigo Strauss :: Blog
Win32: Handles
Como visto nos artigos anteriores, tudo no Windows é controlado por handles. Arquivos, sockets, objetos de sincronização, etc. O tipo HANDLE é na verdade um void* opaco, e somente o Windows sabe o que tem lá dentro (diga "veja mamãe, sem os fontes do sistema operacional!"). A única coisa a saber é: quem abre o HANDLE é o responsáve por fechá-lo usando a função CloseHandle. Fechar um handle mais de uma vez é um bug não-muito-grave, já que você não vai ganhar um GPF ou algo assim. Mas um GetLastError() retornará um ERROR_INVALID_HANDLE.
Acho que eu já disse isso algumas vezes, mas vou repetir. Todos os handles são fechados automaticamente quando o processo termina. É *impossível* que um programa termine e deixe um arquivo aberto, por exemplo. Impossível.
Dentro do kernel do Windows, todo processo tem uma tabela de handles referenciada pela estrutura de controle do processo, EPROCESS. Apesar do tipo do handle ser void*, ele é na verdade um offset para a tabela de handles, onde fica um ponteiro para o OBJECT_HEADER dentro do kernel. É tentador acessar a tabela para ver as informações sobre o objeto, mas isso não é possível... Como os objetos são gerenciados pelo Object Manager em kernel mode, os ponteiros são todos para a memória do kernel (endereço maior que 0x80000000). Se você quiser enumerar e ver os handles, terá que fazer um driver ou usar o Process Explorer:

Em 24/04/2008 22:56, por Rodrigo Strauss





Na verdade, você pode espetar o WinDbg em modo de kernel debug local e espiar as estruturas de todos os processos. Existe um tópico de experimento do livro Windows Internals que explica como usar o comando !handle para exibir informações sobre um ou todos os handles de um ou todos os processos do sistema:
EXPERIMENT: Viewing the Handle Table with the Kernel Debugger.
Basicamente o comando é
!handle <handle index> <flags> <processid>
[]s