Windows Device Drivers Programação de Periféricos SO - 2013/14
Arquitetura Windows
Tipos de processos user-mode System Support Process Logon process e session manager Service Processes Agendador de tarefas, spool de impressao e servidores em geral incluem processos que executam como serviços no windows (MySQL, Tomcat, SQLServer ) User Application Windows 32-bit, Windows 64-bit, Windows 3.1 16-bit, MS-DOS 16-bit, POSIX 32-bit, or OS/2 32-bit Subsistems POSIX, OS/2 e Windows
Tipos de processos kernel-mode Windows Executive Contém os principais serviços do sistema operacional como gerência de memória, gerência de processos e threads, segurança, I/O, comunicação entre processos Windows Kernel Funções de baixo nível do sistema como escalonamento de threads, interrupções e lançamento de exceções, e contém também um conjunto de rotinas e objetos básicos que são usados pelo executive para implementar os serviços de mais alto nível Device Drivers Incluem os drivers de dispositivos, sistema de arquivos e protocolos de rede Hardware Abstraction Layer É uma camada de código que isola o kernel, os drivers e o executive das diferenças de hardware de plataformas específicas (como motherboards, por exemplo) Windowing e graphics system Implementa todas as funções de renderização, janelas e controles de interface, conhecido como Windows User and GDI Functions
Drivers possuem a extensão.sys Geralamente são armazenados no diretório windows/system32/drivers possuem geralmente um arquivo.inf que possui todas as informações de instalação do driver
Tipos de Drivers User-mode drivers Virtual Device Drivers: usados para compatibilidade de aplicações DOS 16bits, capturam as chamadas feitas por estas aplicações e mapeiam para Win32 Printer Drivers Kernel-mode drivers File system drivers: tratam as requisições direcionadas aos dispositivos de armazenamento ou dispositivos de rede Plug and play drivers:trabalham com algum hardware e integramse ao power manager e ao plug and play manager do windows Class Drivers: drivers genéricos para classes de dispositivos Minidrivers: drivers que adicionam aos class drivers algumas funções específicas do fabricante Function drivers: incorporam todas as funcionalidades necessárias para suportar um dispositivo Filter Drivers: filtram requisições de I/O para um driver específico e adicionam informações ou modificam seu comportamento Legacy drivers: drivers que controlam diretamente um hardware sem a ajuda de nenhum outro driver
Tipos de Drivers
Windows Driver Model WDM Framework introduzido à partir das versões Win98 e Win2000 que standariza os drivers em um modelo unificado e implementa os padrões de plug and play e power management Os drivers WDM são organizados em camadas (layered drivers) e comunicam-se através de I/O Request Packets IRPs Vantagens dos drivers que aderem ao WDM São compatíveis com Win98, WinME Win2000, WinXP e Win2003 server, Windows Vista (source and binary) Desvantagens Curva de aprendizado é muito alta Interações com eventos de power managemente a plug and play é muito complexa e por isso várias máquinas apresentam problemas nas funções de sleep e wakeup devido à bugs nos drivers É necessário muito código de suporte para codificar um driver É necessário conhecimento muito avançado do WDM mesmo para criar drivers muito simples
I/O Request Packet O IRP é uma estrutura de dados criada pelo I/O System onde ele armazena todas as informações necesárias para realizar a operação O IRP contém informações sobre qual a rotina Dispatch que será chamada do driver (create, read, write, close...), informações do status da operação (que vai sendo atualizada conforme o andamento) e também contém ponteiros para estruturas importantes que serão utilizadas no processo
Exemplo da hierarquia
Estrutura de um driver
DriverEntry A principal função dessa rotina é informar ao I/O System os ponteiros para as funções que o driver irá implementar extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) { DriverObject->DriverUnload = DriverUnload; DriverObject->DriverExtension->AddDevice = AddDevice; DriverObject->MajorFunction[IRP_MJ_PNP] = DispatchPnp; DriverObject->MajorFunction[IRP_MJ_POWER] = DispatchPower; DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = DispatchWmi; servkey.buffer = (PWSTR) ExAllocatePool(PagedPool, RegistryPath->Length + sizeof(wchar)); if (!servkey.buffer) return STATUS_INSUFFICIENT_RESOURCES; servkey.maximumlength = RegistryPath->Length + sizeof(wchar); RtlCopyUnicodeString(&servkey, RegistryPath); servkey.buffer[registrypath->length/sizeof(wchar)] = 0; } return STATUS_SUCCESS;
Driver Development Kit - DDK Ambiente utilizado para a compilação de drivers que possui diversas ferramentas utilitárias e exemplos funcionais para quase todos os tipos de drivers possíveis A maior parte dos desenvolvedores de drivers e inclusive a própria documentação do DDK aconselha que se inicie o desenvolvimento de um novo driver sempre a partir de um dos exemplos do DDK Download gratuito no site da Micro$oft Possui uma extensa e desorganizada documentação técnica sobre o desenvolvimento de drivers
Exemplo 1: Stupid driver O driver possui apenas as rotinas DriverEntry e DriverUnload Não realiza nenhuma operação, apenas é carregado e descarregado pelo sistema A configuração do driver é feita manualmente no register
Código do driver #include <ntddk.h> VOID OnDriverUnload(IN PDRIVER_OBJECT pdriverobject); NTSTATUS DriverEntry(IN PDRIVER_OBJECT pdriverobject, IN PUNICODE_STRING pusregistrypath) { DbgPrint("Carregando o driver!!\n"); //informando o endereço da rotina de unload pdriverobject->driverunload = OnDriverUnload; return STATUS_SUCCESS; } VOID OnDriverUnload(IN PDRIVER_OBJECT pdriverobject) { DbgPrint("Finalizando o driver...\n"); }