logo
Contato | Sobre...        
rebarba rebarba

Rodrigo Strauss :: Blog

follow us in feedly

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


  
 
 
Comentários
Wanderley Caloni | website | e-mail | em 26/04/2008 | #
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
Fernando Roberto | website | e-mail | em 05/06/2008 | #
"Fechar um handle mais de uma vez é um bug não-muito-grave". Meninos e meninas, leiam com atenção, ainda é um bug. Como foi visto, um handle funciona como um offset para a tabela de objetos em uso. O fato deste handle ser fechado significa que este offset pode agora ser utiliado por outro objeto a ser aberto. Lembrando que handles são válidos para todas as threads de um processo, fechar um handle duas vezes pode fazer com quem você feche o handle de algum outro objeto em uso, mesmo que seja de outra thread. Esse problema pode ficar muito divertido de encontrar se imaginarmos a seguinte situação.

1) Abro arquivo X e recebo seu handle em h1=0xfdc
2) Fecho o handle h1
3) Abro arquivo Y e recebo seu handle em h2=0xfdc
4) Fecho o handle h1 novamente. Ou pelo menos penso que estou fechando o h1, mas na verdade estou fechando o h2, cujo o valor também é 0xfdc. Afinal de contas, a API não sabe que o valor 0xfdc veio da variavel h1 ou h2.
5) Abro arquivo X e recebo o handle em h1. Já que estamos brincando de conhecidências, o valor do handle obtido é 0xfdc.
6) Leio o conteúdo do arquivo Y, e para isso uso o h2 que é 0xfdc, e dessa forma obtemos o conteúdo do arquivo X. CRUZES!!

No fundo não é necessário tanta conhecidência assim. Fiz um testículo (um teste pequeno) utilizando uma aplicação console com o VS2008, e seguindo estes passos obtemos este comportamento.

Have fun!
Charles | em 20/06/2008 | #
Ué cara?! Que houve? Quase 2 meses sem escrever nada...
É o frio do sul?
Rodrigo Strauss | website | em 21/06/2008 | #
Acabei de voltar pra São Paulo e ainda estou terminando de acertar as coisas da mudança, nem e-mail eu tenho lido. Logo mais o site volta ao normal também...
Thiago | em 24/09/2009 | #
Kra... Não entendi nada, mas q é bonito é!!!
rsrsrsrsrs
Algo a dizer?
Nome:


Site:


E-mail:


Escreva o número vinte e seis:


 Não mostre meu e-mail no site, não serve pra nada mesmo...

Comentário





Os comentários devem ser sobre assuntos relativos ao post, eu provavelmente apagarei comentários totalmente offtopic. Se quiser me enviar uma mensagem, use o formulário de contato. E não esqueça: isso é um site pessoal e eu me reservo o direito de apagar qualquer comentário ofensivo ou inapropriado.
rebarba rebarba
  ::::