Curso de drivers para Windows

10 de May de 2007 - Fernando Roberto

Como alguns de vocês puderam ler em um outro post, fui convidado pela Universidade Gama Filho a ministrar um curso de desenvolvimento em Kernel Mode para Windows. Já foram fechados os detalhes do curso que darei e já estariam produzindo o material para a divulgação, mas enquanto este post era escrito, fui notificado de que ocorreu um atraso na produção deste material e que estaria disponível a partir do dia 21 de maio. Já dei uma olhada no Folder que eles estão produzindo, e pelo que vi, resolveram resumir a descrição do curso que darei. Por esta razão, vou colocar a versão completa da descrição aqui. Segue o arquivo que enviei para a universidade.

Objetivo:
==========
Este curso é destinado aos desenvolvedores ou estudantes que precisam entender
os conceitos fundamentais sobre implementação de drivers para Windows. Este
curso não abordará implementações específicas de drivers, tais como impressoras,
vídeo, SCSI, NDIS, USB, 1394 ou UMDF. O objetivo deste curso é preparar os
alunos que querem entender, testar, complementar ou construir drivers para
Windows empregando os conceitos gerais envolvidos durante o processo.
 
 
Pré-requisitos:
==================
Conhecimento da linguagem C
Básico de API Windows
Básico de Sistemas Operacionais
 
 
Tópicos abordados:
=====================
Visão geral da arquitetura do Sistema
        Processos e Threads     
        Memória Virtual e Paginação
        Kernel Mode x User Mode
        Subsistemas e API nativa
        IoManager
        Pilha de Drivers e Plug-and-Play
        Object Manager
                Terminal Server
        Camada de abstração de Hardware (HAL)
 
Ambiente (obtenção, instalação e utilização)
        Windows Device Driver Kit
        Microsoft Visual Studio Express
        Microsoft Windows Debugging Tools
        Símbolos
 
Escrevendo um Driver
        Escrevendo DriverEntry e DriverUnload
        Compilando o Driver
        Instalando o Driver (Legacy)
                Dependências
                Grupos
                Load Order
        Depurando o Driver
                Instalações Checked Build
                Driver Verifier
                Mapeando imagem para depuração
                Utilizando Máquinas Virtuais
                SoftIce
        Criando DeviceObject
        Symbolic Links
        I/O Request Packets
        IOCTLs e DeviceIoControl
        Implementando Dispatch Routines
                Buffered I/O
                Direct I/O
                Neither I/O
        Objetos, Handles e Ponteiros
        Contexto Arbitrário
        IRQL's, APC's, DPC's e WorkItems
        Sincronismo
                Mutex
                FastMutex
                ERESOURCE
                Spin Lock
        Eventos e Timers
        Filas Personalizadas
 
Interações com Hardware
        Port I/O
        Interrupções e ISR's
        DMA
 
Escrevendo Filtros
        Escrevendo a rotina AddDevice
        Filtros para drivers Legacy
        Repassando IRPs
        Stack Locations
        Completion Routines
        Tratamento de IRPs Pendentes
        Cancelamento de IRPs
        Criando IRPs para outros Drivers
 
Tipos de Drivers
        Legacy drivers
        WDM Drivers
        Minidrivers
        Miniports
        Miniclass
 
Instalações
        Criando um arquivo .INF
        O uso da SetupApi
 
Referências
        Web sites
        Grupos de discussão
        Livros

Até o momento em que este post foi escrito, o atendimento da universidade não estava apto a fornecer detalhes sobre o curso, tais como data de inscrição, conteúdo ou mesmo calendário. Mas posso lhes adiantar o que estou sabendo até agora.

O curso terá duração de 40 horas, sendo distribuídas em 10 aulas de 4 horas cada. As aulas serão dadas aos sábados das 13:00 às 17:00.

O curso está marcado para ter sua primeira turma iniciando dia 26 de maio. Serão necessários no mínimo 5 alunos para formar uma turma, mas pela quantidade de pessoas que já entraram em contato buscando detalhes (mesmo sem divulgação), minha preocupação passa a ser o limite superior de 10 alunos. Resolvemos limitar a turma em 10 alunos para que houvesse um melhor aproveitamento do conteúdo.

Concordo que 40 horas é pouco para aprender tudo que é necessário para desenvolver drivers, mas já será um excelente ponto de partida para ter seu primeiro contato. Se você é do tipo de pessoa que precisa aprender absolutamente tudo para começar a desenvolver, então já vou lhe adiantando que este curso não é para você. Os maiores desenvolvedores de Kernel que eu conheço (de Blog, mas conheço), e que trabalham com isso a anos e anos, dizem que nunca sabem tudo. Para se ter uma idéia, alguns desenvolvedores focam apenas determinados assuntos dentro do Kernel. Um trabalha a 10 anos só com drivers de disco, um outro trabalha a 7 anos somente com drivers de rede. Tony Mason, por exemplo, trabalha a 18 anos só com File System Drivers. Agora pergunta pra eles se eles sabem tudo. E eu que, por uma época, me sentia mal por tentar me focar somente em trabalhos de Kernel e recusava trabalhos em User Mode. As vezes, em rodas de amigos, ouvia comentários de como fazer isso ou aquilo em .Net, e eu viajando na maionese. Eu mal sabia que dentro do assunto Kernel ainda existia uma infinidade de detalhes e especializações. Será possível aprender tudo?

Estou preparando o conteúdo de forma que os alunos possam ter pequenas experiências práticas, tais como escrever e compilar um driver “Hello World”, instalá-los em máquinas virtuais e depurá-los. Não tem jeito, tem que colocar a mão na massa. Conectar duas máquinas reais com um cabo serial e fazer Debug de Kernel. Gerar e analizar Crash Dumps. Penso que temos que tirar o máximo proveito do fato de estarmos juntos em uma sala aula, e realizar algumas experiências que os livros tentam descrever somente com palavras e figuras. É esta vontade de pôr as coisas em prática que contribuíram para que eu adquirisse o kit de treinamento à venda na OSR Online. O kit que estarei levando para o curso, e que aparece na foto acima, é basicamente uma placa PCI de I/O Digital. Meu objetivo é fazer com que drivers de alunos possam controlar este dispositivo.

Bom, à medida que eu for recebendo notícias, irei repassando a vocês.
Até mais.

Este post foi sobre um curso oferecido em um evento isolado. Caso você esteja interessado em treinamentos para desenvolvimento de drivers e software de baixo nível para Windows, dê uma olhada nesta página.

18 Responses to “Curso de drivers para Windows”

  1. Anonymous says:

    quando teremos novas turmas para este curso?

    • Olá,

      Várias pessoas me perguntam o mesmo. Estou estudando um novo local para o curso que atenderá a um grupo aberto.

      Atualmente o curso é dado à turmas fechadas em empresas interessadas no assunto.

      Pelo andamento das coisas, devo ter uma turma aberta perto de junho ou julho. Mas qualquer novidade será postada aqui neste blog.

      []s.

  2. deborahmatteo says:

    Oie Fernando,
    Vou desenvolver um driver aqui no meu trabalho e sinceramente não sei por onde começar
    Será que vc teria algum material pra me passar?
    obrigada
    Deborah Karina de Matteo
    deborahmatteo@gmail.com

    • Olá Deborah,

      Acompanho a sua dor 🙂 . Quando eu comecei a aprender essas coisas, eu também fiquei perdido. Mas não se preocupe, com o tempo isso piora. Todo o material que tenho são slides do curso que dou, mas não posso fornecê-los separadamente, e para ser sincero, acho que não ajudariam muito.

      O que posso fazer é lhe dar uma lista de literaturas e ficar à disposição para tirar suas dúvidas pelo blog.

      Estou admitindo que você já conhece bem a linguagem C e que não vai ficar apanhando no Inglês dos livros que vem a seguir. Deste ponto em diante, acho que Windows Internals é um bom ponto de partida. Para ter um quick start, o The Windows 2000 Device Driver Book dá uma rápida pincelada no assunto. Mas um bom livro de WDM é inegavelmente o Windows Driver Model. Se você tem como alvo escrever drivers do WDF, então esqueça o WDM e vá direto ao Developing Drivers with the Windows Driver Foundation.

      Se você não sabe o que significa WDM ou WDF, então dê uma lida neste post antes de escolher o que você quer da vida.

      Se você está completamente perdida, então acho que você encontrou o blog certo 😉 . Não tenha vergonha de perguntar nada. Uma pergunta boba é aquela que você não fez por vergonha.

      Espero ter ajudado e conte comigo para ajudar no que eu puder.

      Have fun!
      []s

  3. Fernando Andrade says:

    Oi xará,

    Estou avaliando o esforço de desenvolver um driver de impressora para Windows XP, pois o fabricante, de uma impressora não fiscal, não o fornece para este SO.

    Apesar de estar atuando como líder de projeto há alguns anos, tenho bons fundamentos C/C++, conceitos de orientação a objetos na “hemácia”, e excelente leitura em inglês.

    Quanto tempo (horas, dias, meses, etc) eu levaria para estudar a literatura (sugerida à Debora), entender a WDF, desenvolver e testar o driver? Poderia dar um chute otimista e um realista?

    Muito obrigado!

    Abraços,
    Fernando

    • Olá xará,

      Bom, as perguntas mais legais são quase sempre respondidas por “depende”. E a sua é uma pergunta bem legal.

      Vamos primeiro conversar sobre as interfaces físicas. Como essa impressora vai se comunicar com o Windows? Via uma porta paralela, serial ou USB? Temos grandes diferenças nas interfaces físicas aqui. De um lado (paralela/serial) a impressora pode até ter seu driver feito todo em User-Mode, sem esquecer que alguns modos de operação da porta paralela (ECP por exemplo) ainda exigem um driver em Kernel-Mode, com direito a canal de DMA e tudo. Por outro lado (USB) os facilitadores físicos já cortam algum caminho, nada de interrupção e nem port I/O, mas outras tantas referências devem ser seguidas com relação às padronizações de tipos de interfaces USB que são definidas pelo USB.org. Como você tem um nome bonito, já separei este documento pra você. Não tenho a completa certeza assim de cabeça, mas creio que um driver USB de impressora também pode ser todo escrito em User-Mode utilizando o UMDF.

      Desde a idade média, drivers de impressora são divididos em dois principais módulos, sendo um que implementa a camada User-Mode que vai interagir com a GDI, normalmente implementado como uma DLL que será carregada pelo serviço de spooler de impressão, e outra camada, normalmene implementada em Kernel-Mode, que vai lidar com a comunicação da impressora. Fica aqui mais um link interessante pro xará. O driver tem que ser capaz de renderizar a imagem e passá-la para a impressora de uma maneira específica da impressora. E aqui temos outra parte legal da sua pergunta. Essa comunicação é dependente do fabricante/modelo, e desta forma você terá que ter acesso a toda a documentação deste protocolo da impressora. Então aqui teremos mais uma parte que vai depender da complexibilidade deste protocolo.

      Com relação ao tempo, isso também vai depender do tipo de driver que você quer fazer e principalmente quanto tempo você tem disponível para brincar de tela azul. Normalmente as palavras Lider e Tempo são incompatíveis. Já fui lider de desenvolvimento. :-\

      Se você está mesmo pensando que vou lhe dar estimativas de um driver que tenho poucos detalhes, que deverá incluir toda a curva de aprendizado de drivers e que será escrito por uma pessoa que não conheço, bom, nessa o seu nome não vai ajudar muito, mas espero que os links que te passei ajudem a clarear suas espectativas.

      Por falar em Lider, você já leu este post?

      Boa sorte e “have fun!”
      🙂

  4. Demetryus says:

    Olá Fernando,,td bem?
    Vou tambem iniciar neste mundo de desenvolvimento de drivers, possuo alguns conhecimentos de C++ e ingles tb….meu forte mesmo é hardware…gostaria de algumas dicas:
    a)Aqui em SP tem algum curso de iniciação a drivers para WIN XP?? com conteudo semelhante a este que ministrou??
    b)Meu primeiro desafio envolve PCIe para mass storage…que livros ou artigos vc recomendaria??
    c)Fernando,,,eu nao tenho nem ideia por onde começa,,,principamente de quais ferramentas precisarei….Se puder passar o caminho das pedras….agradeceria muito

    Obrigado

    • Olá Demetryus,

      Desculpe a demora em responder, fim de ano é uma correria sem tamanho. Mas vamos ver se ainda consigo te ajudar.

      —=== A ===—
      Imagino que as pessoas ficam pensando que escondendo outros cursos de drivers de São Paulo, mas o fato é que, apesar de me perguntarem isso diversas vezes, nunca fiquei sabendo de outro curso de drivers no Brasil.

      Num post recente, reuni interessados em uma nova turma do curso que dou esporadicamente. Posso incluir você nesta lista de interessados e nos programar para uma turma que deve ocorrer em janeiro de 2009.

      Se você estiver com pressa, então você poderia apelar para os monstros da OSR, mas na agenda deles os cursos só começam em janeiro de 2009.

      Se você estiver desesperado de pressa, então você pode contratar aulas particulares com eles, mas ainda não me atrevi a descobrir o preço disso.

      A OSR é o único curso mundialmente reconhecido e é o único lugar onde já fiz curso. Mas existem outras alternativas em outros continentes. Ao todo devem ser uns 10 no mundo. Desculpe não ter muitos detalhes quanto a isso.

      —=== B ===—
      Acho que no começo tudo são trevas e um bom caminho é o que recomendei à Debora neste mesmo post. Livros, livros e vontade. Depois de mastigar o básico, então você pode buscar especializações, mas até lá ainda existe algumas centenas de páginas. Listas de discussão são excelentes.

      —=== C ===—
      Getting Started…

      Espero ter ajudado,
      []s.

  5. Demetryus says:

    Valeu…mesmo…nossa esses livros são enormes!!
    Eu gostaria sim que me incluisse nessa lista de turmas para o proximo curso…
    Meu e-mail: de_junqueira@yahoo.com.br
    Obrigado

  6. Luiz says:

    Fernando, caso você for ministrar um curso desses aqui em São Paulo estou interessado.

    • Olá Luiz,

      Estou me preparando para montar uma turma com início na segunda quinzena de janeiro de 2009. Posso te adicionar na lista de interessados e você receberá maiores informações referentes ao curso, tais como data, local e preço.

      Mande um e-mail para mim para que eu possa te manter informado.

      []s,

  7. Otacilio Ricardo says:

    Caro Fernando
    Estava procurando informações de como criar driver com “C” e encontrei seu blog. Você pode enviar o material do seu curso ou indicar onde encontrar informações de como criar driver?

    Obrigado,
    Otacilio Ricardo.
    E-mail : otacilioricardo@gmail.com
    MSN: otacilioricardo@hotmail.com
    Skype: otacilioricardogm

  8. heber says:

    ola fernando, terá um curso em 2012?
    se não houver, o que será necessário fazer pra que haja?
    se for questão de pessoal ou investimento estou disposto a ajudar.

  9. Juliano says:

    Gostaria de saber possuo um impressora Hp Laserjet 1000 porem ela não funciona em sistema operacional 32bits o driver não funciona existe alguma alternativa para o driver ? modifica-lo ?

    • Olá Juliano,

      Modificar um driver requer não só o binário usado pelo Windows, que é aquele arquivo SYS que conhecemos. Precisaríamos não só dos fontes do driver, como também as especificações técnicas do protocolo que a impressora usa para se comunicar com o computador. Esse protocolo é normalmente não publicado pelos fabricantes da impressora.

      Então, se você é o fabricante de uma impressora e possui todos esses requisitos, sim, é possível modificar o driver da impressora. Mas se caso você seja um usuário de uma determinada impressora, então não, não é possível modificar esse driver.

      Espero ter ajudado. Abraço,
      Fernando.

  10. Rique Colombo says:

    boa noite vc tem o Curso de drivers para Windows online?
    no aguarde

Deixe um comentário