Beruflich Dokumente
Kultur Dokumente
Esqueleto de driver
• A partir de 2006
– WDF (Windows Drivers Foundation)
• Framework (?)
• Construída “em cima” do WDM
• Resultado?
– Mais fácil de aprender
– Mais rápido de desenvolver
KMDF vs UMDF
• WDF: KMDF UMDF
KernelͲMode UserͲMode
Driver Framework Driver Framework
Objectos KMDF
• Os objectos podem ser colocados numa hierarquia paiͲfilho através do
membro ParentObject da estrutura WDF_OBJECT_ATTRIBUTES de cada
objecto
• Existe um contador de referências para cada objecto gerido pela
framework
• A framework apaga um objecto quando c.refs=0 (primeiro tenta apagar os
filhos)
• Drivers podem controlar o tempo de vida dos objectos através de
WdfObjectReference e WdfObjectDereference
• A cada objecto pode ser um atribuído um contexto próprio com
informação específica
– Criado no método que cria o objecto ou WdfObjectAllocateContext
– Tem o mesmo tempo de vida, e reside em memória não paginável
– Acessível através de um método accessor criado pela macro
WDF_DECLARE_CONTEXT_TYPE, ou através de WdfObjectGetTypedContext
Comentar o código
• Atenção:
– Em itálico: funções cujo nome é definido pelo driver
– Distinguir o que é documentação WDM de WDF. Exemplo:
• Escrever “DriverEntry” na documentação .chm do WDK
• Ver as diferenças entre:
– DriverEntry[WDK Kernel] Ͳ> Writing a DriverEntry Routine Ͳ> AddDevice,
e
– DriverEntry[WDK KMDF] Ͳ> EvtDriverDeviceAdd
• Pistas:
– Os tipos de dados e os nomes de funções WDF
normalmente incluem o prefixo “Wdf” ou “WDF”
– Só no WDF é que se pode falar em callbacks
Callback EvtDriverDeviceAdd
• Invocada sempre que o PnP manager detecte a ligação de um novo
dispositivo (e.g., várias portas USB)
• Obrigatória para drivers que suportem dispositivos PnP
• Declarada usando o tipo EVT_WDF_DRIVER_DEVICE_ADD
• Registada através de WDF_DRIVER_CONFIG_INIT em DriverEntry
• Reponsabilidade fundamental – criar e inicializar o deviceͲobject:
– Create a framework device object to represent the device.
– Create I/O queues so the driver can receive I/O requests.
– Create device interfaces that applications use to communicate with the
device.
– Create driverͲdefined interfaces that other drivers can use.
– Initialize Windows Management Instrumentation (WMI) support.
– Create interrupt objects, if the driver handles device interrupts.
– Enable direct memory access (DMA) transactions, if the driver handles DMA
operations.
• EvtDeviceReleaseHardware
– Declarada usando o tipo EVT_WDF_DEVICE_RELEASE_HARDWARE
– Realiza as operações de quando o dispositivo já não está acessível (mas a
configuração PCI sim) desfazendo o mapeamento feito na de cima
– Invocada após EvtDeviceD0Exit
Callbacks EvtDeviceD0????
• EvtDeviceD0Entry
– Declarada usando o tipo EVT_WDF_DEVICE_D0_ENTRY
– Realiza as operações necessárias quando o dispositivo entra no estado de energia D0 (working
state)
– Inicializações necessárias ao funcionamento do driver (e.g., lançar o timer de acções
periodicas)
– Operações podem depender do estado energia anterior
• EvtDeviceD0Exit
– Declarada usando o tipo EVT_WDF_DEVICE_D0_EXIT
– Realiza as operações necessárias quando o dispositivo sai de D0 para um estado de menor
consumo de energia
– Terminar ou suspender operações de IO pendentes e guardar o estado do dispositivo para
poder ser utilizado na callback acima (para repor o estado D0)
– Operações podem depender do estado energia seguinte
Trabalho prático
• Comentar o código do driver “basic”
• Com base na aplicação EchoApp.c do exemplo de driver ECHO, construir
uma aplicação que envie pedidos de IO para o driver “basic”, com os
seguintes requisitos:
– receba um primeiro parâmetro opcional que defina o número de pedidos a
enviar (por defeito 10)
– receba um segundo parâmetro opcional que determina se o o pedido é
Read/Write/DeviceIoControl (Read por defeito)
– receba um terceiro parâmetro opcional da linha de comandos que seleciona o
envie de forma síncrona/ assíncrona (síncrona por defeito)
• Ciclos do Desenvolvimento Iterativo
– Enviar 10 pedidos Read de modo síncrono
– Suportar o parâmetro de escolha do número de pedidos e acrescentar o envio
de pedidos Write e DeviceIoControl em sequencia
– Suportar a escolha dos 2 ultimos parâmetros e acrescentar o envio assíncrono
Pistas
• Utilize a função GetDevicePath() fornecida no exemplo,
documentandoͲa com base nas seguintes secções da
documentação do WDK:
– “Device Information Sets”
– “Using Device Installation Functions”, nomeadamente:
• SetupDiGetClassDevs e SetupDiDestroyDeviceInfoList
• SetupDiEnumDeviceInterfaces e SetupDiGetDeviceInterfaceDetail
• Pesquise na documentação do API Win32 do Windows
(http://msdn.microsoft.com/enͲ
us/library/cc433218(VS.85).aspx) os comandos
– CreateFile e CloseHandle
– DeviceIoControl
– ReadFile e WriteFile
– CreateIoCompletionPort e GetQueuedCompletionStatus