Archive for July, 2010

Sétimo Encontro de Programadores C/C++

20 de July de 2010

Como alguns de vocês já sabem, no próximo dia 14 de agosto acontecerá o sétimo encontro de programadores do grupo C/C++ Brasil. Mais uma vez, será um grande prazer participar do evento como palestrante e ter a oportunidade de falar um pouco sobre o desenvolvimento de drivers (pra variar). 😉

Minha primeira participação nesse evento foi em sua quarta edição, onde fiz um overview sobre arquitetura e desenvolvimento de drivers para Windows. Os slides desta palestra podem ser baixados a partir deste post. Apesar de o feedback ter sido muito bom, recebi algumas sugestões sobre mostrar mais código fonte. O desenvolvimento de drivers requer muito conceito, tanto sobre o sistema operacional quanto sobre as  regras impostas pelo I/O Manager e seus inseparáveis amigos. Assim, imaginei que mostrar código fonte sobre estruturas e regras não conhecidas pela maioria dos participantes da palestra soaria como “Nana neném que a Cuca vem…”. Mas não tem jeito, programador gosta mesmo é de código fonte.

Na sexta edição foi que tive minha segunda participação. Desta vez foquei nas caraterísticas de funcionamento e utilização da memória virtual por drivers, dei mais ênfase aos nomes das rotinas que drivers utilizam para obter os serviços do Kernel. Pois é, embora tenha melhorado ainda não foi suficiente. O resultado do feedback mais uma vez revelou que faltou exemplos práticos e código fonte pra galera.

Nesta sétima edição vou praticamente escrever, compilar, instalar, executar e depurar um driver de exemplo. Tudo alí na hora. A proposta desta palestra é demostrar como dar os estes primeiros passos para se ter um driver compilado bem alí em seu próprio notebook.

Embora essa informação também esteja na página no evento, seguem os tópicos que serão apresentados por mim:

  • O que é o Windows Driver Kit
  • Device Drivers e Software Drivers
  • WDK e os arquivos de um projeto
  • A rotina DriverEntry e DriverUnload
  • Hands on: Escrevendo e compilando um driver
  • Testando drivers em máquinas vituais
  • Hands on: Instalando o driver exemplo
  • Depurando o Kernel do Windows
  • Hands on: Depurando seu driver
  • A Tela Azul da Morte (BSOD)
  • Hands on: A primeira Tela Azul a gente nunca esquece
  • Gerando crash dumps
  • Hands on: Analisando seu crash dump
  • Dúvidas, pânico e depressão

Parece muito? Pois é, para que isso seja possível no tempo que disponho será necessário que já se tenha o ambiente preparado. Você não vai querer ver uma palestra de uma hora que vai explicar de onde baixar as ferramentas, como instalá-las e como preparar uma máquina virtual que sirva de ambiente de testes para seu novo driver. Se tudo isso for feito no dia do evento, mais uma vez vou ficar devendo o código fonte e provavelmente serei enforcado em praça pública. Eu não sei sobre vocês, mas eu não gostaria que isso acontecesse.

Baixando e Instalando o WDK

O primeiro passo dessa preparação é baixar o kit de desenvolvimento de drivers da Microsoft, o Windows Driver Kit (WDK). Esse kit contém os headers e bibliotecas necessárias para que seu driver possa utilizar as rotinas exportadas pelo Kerne, permitindo a interação do seu driver com o restante do sistema operacional. Além dos headers e bibliotecas, o kit também traz o compilador e depurador de sistema, fazendo desse kit a única ferramenta necessário para que se tenha um driver compilado e depurado.

Ainda não falei dos vários e vários exemplos de drivers que o kit traz, bem como toda a documentação necessária para a utilização das rotinas exportadas pelo Kernel. Essa documentação não serve apenas de referência, mas também como um guia de construção de drivers. Embora a documentação se proponha a servir de guia de construção de drivers, ainda recomendo fortemente a leitura de livros dedicados a essa atividade. Os livros conseguem expor as idéias com mais clareza abordando os assuntos de forma gradativa.

O fato de haver um compilador nesse kit não significa que exista um ambiente de desenvolvimento específico para drivers. O que estou querendo dizer é que não existe uma versão do Visual Studio específica para drivers, ou mesmo um plug-in que fosse instalado no Visual Studio que agregasse tais funcionalidades ao ambiente. No caso mais básico, os fontes poderiam ser editados no bom e velho Notepad. Isso não nos impede de utilizar nosso editor do coração para escrever drivers, como mostra este outro post. De fato existem algumas ferramentas com esse propósito como o VisualDDK, mas não é nada oficial.

Baixar o WDK é fácil e indolor. E quando digo indolor, estou me referendo também no sentido financeiro da idéia. O primeiro passo é baixar o WDK que está disponível no Microsoft Download Center. Seguindo as instruções, você baixará um ISO de aproximadamente 620MB que conterá toda a instalação.

O ISO pode ser queimado em uma mídia de CD, ou você pode simplesmente usar um desses aplicativos que cria uma unidade de disco virtual a partir de um arquivo de imagem. Se você não tem nenhum aplicativo desses à mão, você pode  baixar e instalar gratuitamente o OsrVitrtualCdAndDisk da OSR.

Depois de inserir o CD, execute o aplicativo KitSetup.exe que estará na pasta raíz do CD. Fazendo isso você verá a splash screen do Windows Driver Kit 7.1.0 como exibida abaixo.

Em seguida a janela exibida abaixo.

Selecione os itens como exibido acima, deixando de selecionar os itens “Device Simulation Framework” e “Windows Device Testing Framework”. Em seguida clique em OK para ver a próxima janela como exibida na figura abaixo.

Pelo menos para a palestra, simplesmente aceite o caminho de instalação sugerido, isso vaip evitar contratempos durante a palestra. Clicando OK nesta janela, apenas aceite os termos da instalação e clique em OK na janela exibida abaixo para finalizar a instalação do WDK.

Aguarde a cópia dos arquivos terminar e a instalação se encerrará.

Dando uma compiladinha, só pra…

Depois de instalar o WDK você pode se certificar de que tudo está certo simplesmente compilado um dos exemplos instalados pelo próprio kit. Para fazer isso, abra o prompt de comando de build como demonstrado na figura abaixo.

Este prompt de comando é diferente do convencional por já estar devidamente configurado com as variáveis de ambiente necessárias para a compilação de drivers para Windows XP. Mais detalhes sobre isso na palestra. Com este prompt de comando, execute os passos indicados na figura a seguir.

Certifique-se de que o exemplo foi compilado verificando a saída do compilador como destacado na figura acima. Caso você tenha algum problema em seguir estes passos, mande-me um e-mail que a gente sai na porrada e tudo bem.

Baixando e Instalando o Virtual PC

Ter o ambiente de desenvolvimento configurado é essencial para o desenvolvimento de drivers, mas de nada adiantaria se você não tiver um ambiente de teste. Não caia na besteira de utilizar sua própria máquina de desenvolvimento como ambiente de teste. Tente pelo menos usar a máquina de desenvolvimento de um estagiário ou sei lá. Pense que você não vai escrever uma aplicação que, na pior das hipóteses, resultará no sonoro PAM. Dependendo do tipo de driver e do tamanho da orelhada que você aprontar, sua máquina pode ficar inutilizada, não iniciar mais ou mesmo ter dados corrompidos.

Depurar um driver de Kernel requer condições especiais. A rigor são necessárias duas máquinas para essa tarefa. Isso mesmo, duas máquinas. O que você está pensando? Que vai poder colocar um break-point em seu driver, interromper sua execução e dar um ALT+TAB para dar uma olhadinha na janela de variáveis locais? Nem pensar amigão. Quando um break-point interrope o sistema operacional, o Windows inteiro para. O mouse não se mexe, a janela não repinta o scheduler não trabalha, nada nada. Por essa razão é que precisamos de uma segunda máquia. Das suas máquinas, uma delas será sua vítima, a máquina na qual rodará seu driver e que será completamente congelada quando necessário. A outra será sua máquina de desenvolvimento. Nela estarão os códigos fontes, os símbolos e o ambiente de depuração. É em sua máquina de desenvolvimento que a janelinha de variáveis locais vai aparecer.

Hoje em dia podemos recorrer à virtualização para economizar tempo e espaço em nossas mesas. Utilizando uma máquina virtual podemos ter o ambiente que precisamos para dar continuidade à palestra e testar o driver que será desenvolvido. Máquinas virtuais ajudam em muitos casos, principalmente nos casos de desenvolvimento de drivers que não lidam com hardware diretamente. Este é o caso de drivers de anti-virus, firewall, file systems, alguns tipos de drivers USB e outros. Por outro lado, se você por exemplo tiver uma placa PCI para fazer port I/O, manipular interrupções ou mesmo fazer DMA, uma VM não vai ajudar muito, mas este é outro caso.

O Virtual PC é uma ferramenta gratuita da Microsoft e que pode ser baixada a partir deste link. Executando o arquivo baixado, teremos a seguinte janela como listrado na figura abaixo. Apenas clique em Next para a próxima janela.

Aceite os termos do produto e clique Next para dar continuidade a instalação.

Apenas aceite o diretório de destino sugerido e clique Next.

Depois de aguardar a cópia dos arquivos, finalize a instalação.

Criando uma nova VM

Este não é um blog especializado em máquinas virtuais, então nem tentem me mandar e-mails com dúvidas cabeludas sobre esse assunto. Entretanto, posso ajudar na criação da máquina virtual que usaremos na palestra. Afinal de contas teremos que destruir alguma coisa, caso contrário ficaria meio sem graça.

Nesta tela inicial exibida acima, apenas clique Next para continuar com a instalação.

Aqui selecione a opção de criação de uma nova máquina virtual e depois clique Next para continuar.

Neste passo você dá o nome da sua máquina virtual. Fique a vontade para colocar o nome que achar mais adequado. Zé, Jão e Toin são algumas opções válidas, mas por simples clareza vou preferir “Windows XP” mesmo.

Neste passo selecionamos o sistema operacional que será instalado nessa nova máquina. Isso serve para que a VM possa instalar as ferramentas certas de integração. Resumindo, selecione Windows XP e clique Next para continuar.

Apenas aceite a quantidade de memória recomendada pelo Wizard e clique Next.

Como vamos fazer uma nova instalação do Windows, precisaremos de uma nova HD que será formatada pela instalação do Windows. Selecione a opção indicada na figura acima e clique Next.

Bom, aqui você determina onde o arquivo que representa o disco rígido será criado. Sem muitas firulas apenas aceite o caminho sugerido e clique Next para continuar.

Finalize a criação da sua nova máquina virtual clicando em Finish e pronto.

Ufa! Agora sua máquina virtual está pronta para receber um novo sistema operacional.

Deste ponto em diante você pode instalar uma cópia do seu Windows XP. Outras versões do Windows poderiam ser instaladas, mas a fim de evitar diferenças nas configurações de debug durante a palestra, vamos combinar de instalar o Windows XP mesmo.

Caso você não tenha uma cópia do Windows XP para instalar, não há muito que eu possa fazer para te ajudar. O máximo que posso fazer é te dar o seguinte conselho: Vá até a igreja de Santa Ifigênia, que fica na avenida Santa Ifigênia bem no centro de São Paulo, e acenda uma vela para a santa. Aproveitando que você vai estar por lá, dê uma passeada pelo comercio local. Tenho certeza que você receberá uma luz em seu caminho.

Agora vou para por aqui, caso contrário eu não vou ter muito que falar no dia da palestra. Aproveite essa oportunidade para aprender os conceitos básicos (e bota básico nisso) sobre como gerar seu primeiro driver, sua primeira tela azul e por fim fazer seu primeiro crash analysis. Pense que você um dia vai poder contar isso para os seus netos. Embora isso não ajude muito, eles não vão fazer a menor ideia do que você está falando e vão acabar te internando de qualquer maneira.

Espero vê-los por lá. T+!

Download dos slides