Device Drivers
Comunicação entre Aplicação e o Device
Device Driver
z Um Device Driver implementa a
comunicação entre a Aplicação e o Hardware (dispositivo)
z Existem vários tipos de Device Driver que dependem fundamentalmente do tipo de dispositivo e do modo de comunicação entre o Driver e a aplicação e o dispositivo.
Aplicações Win32 Subsistema Device Drivers Gestão I/O Hardware Camada de Abstracção de hardware Win 32 API Modo do Utilizador Modo Kernel
IRP I/O Request Packet
Chamadas HAL
Operações especificas da Plataforma
Device Driver
z Um driver é um ficheiro executável
z Tem extensão .sys
z Tem a estrutura de qualquer programa executável (.exe) de 32 bits
z Como qualquer programa usa um conjunto de rotinas, dinâmicas ou estáticas mas principalmente (Kernel.dll)
z Não tem como ponto de entrada uma rotina main()
z Disponibiliza um conjunto de rotinas que podem ser chamadas pelo sistema.
Comunicação entre o aplicativo e
o device driver
São utilizadas as funções padrão (API) do Kernel32.dll:
– CreateFile – CloseHandle – DeviceIoControl
Adicionalmente poderão também ser usadas as funções:
– WriteFile – ReadFile
CreateFile
z Permite abrir a comunicação entre o dispositivo e aplicação
– Um processo pode abrir mais que uma
comunicação com o dispositivo
– Processos diferentes podem abrir diferentes
comunicações com o dispositivo
– Também é possível a exclusividade no acesso ao
CreateFile
CreateFile é uma API do win32 definida em Kernel32.dll
[DllImport(“Kernel32.dll”, CharSet=CharSet.Auto, SetLastError=true)] public static extern int CreateFile(String lpfilename, int
dwDesiredAccess, int dwShareMode, IntPtr lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, int htemplateFile)
CreateFile
z Devolve um identificador manipulador para ser usado com outras rotinas da API (CloseHandle e DeviceIoControl)
z Lpfilename – nome do ficheiro do Driver a ser usado para criar a aplicação entre a aplicação e o Driver, tem um formato especifico “\\.\NomeFicheiro”, em C fica “\\\\.\\NomeFicheiro”
CreateFile
z dwDesiredAccess – estabelece as
condições de acesso, o valor 0 permite utilizar o dispositivo sem alterar.
Tipicamente:
GENERIC_READ | GENERIC_WRITE GENERIC_READ= 0x80000000
CreateFile
z dwShareMode - Especifica o modo como o
ficheiro pode ser compartilhado. Tipicamente:
FILE_SHARE_READ | FILE_SHARE_WRITE
FILE_SHARE_READ=0x00000001 FILE_SHARE_WRITE=0x00000002
CreateFile
z lpSecurityAttributes – Contêm os atributos de segurança, pode ser NULL
z dwCreationDisposition – Condição de abertura da ligação, devera ser
OPEN_EXISTING OPEN_EXISTING=3
CreateFile
z dwFlagsAndAttributes – Flags e atributos da ligação deve ser colocado a 0.
z htemplateFile – Identificador manipulador para ficheiro temporário, deve ser colocado a NULL
CreateFile
Exemplo da utilização de CreateFile
m_hThermUsb = CreateFile( "\\\\.\\ThermUsb0", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (m_hThermUsb == INVALID_HANDLE_VALUE) {
// caso em que existe erro na abertura de ficheiro };
CloseHandle
z Fecha a ligação existente entre a aplicação e o Driver, devolve um valor boleano:
TRUE- se foi bem sucedida
FALSE- se não for bem sucedida
z O processo deverá fechar a ligação com o Driver, mas caso não feche o próprio SO
fechará essa ligação quando o processo terminar.
CloseHandle
[DllImport(“Kernel32.dll”, CharSet=CharSet.Auto, SetLastError=true)]
public static extern bool CloseHandle(int hHandle)
z hHandle – Identificador manipulador devolvido em CreateFile
Exemplo:
DeviceIoControl
z A chamada a DeviceIoControl resulta em IRP IO request Packet no Driver, possibilitando a
comunicação entre o Driver e a Aplicação.
z Nem todos os dispositivos usam a função da API
DeviceIoControl para a comunicação como é o caso
dos HID (Dispositivos de Interface Humana) que alternativamente usam a API HID_GetFeature e
DeviceIoControl
z Realiza a comunicação entre a aplicação e o
Driver
z Devolve TRUE se a operação foi realizada com sucesso, caso contrário devolve FALSE
DeviceIoControl
DeviceIoControl é uma API do win32 definida em Kernel32.dll
[DllImport(“Kernel32.dll”, CharSet=CharSet.Auto, SetLastError=true)]
public static extern bool DeviceIoControl(int hDevice, int dwIoControlCode, byte[] InBuffer, int nInBufferSize, byte [] OutBuffer, int nOutbufferSize, ref int pBytesReturned, int pOverlapped);
DeviceIoControl
z hDevice – é o identificador do manipulador, que foi obtido com a função CreateFile
z dwIoControlCode – é um código de controlo indicando o código da operação que se pretende efectuar.
DeviceIoControl
z InBuffer – Buffer de dados de entrada para o
Driver
z nInBufferSize – Tamanho do buffer de dados de entrada
z OutBuffer – Buffer de dados de saída do
Driver
z nOutbufferSize - Tamanho do buffer de dados de saída
DeviceIoControl
z pBytesReturned – variavel actualizada pelo
Driver que indica o numero de bytes de
dados devolvido pelo Driver
z pOverlapped – Utilizado em acesso assíncronos deve ser NULL
DeviceIoControl
LONG GetButtonState(HANDLE hThermUsb) {
ULONG length; // the return length from the driver UCHAR buttonState; // the state of the button
if (!DeviceIoControl( hThermUsb, IOCTL_THERMUSB_GET_BUTTON_STATE, NULL, 0, &buttonState, sizeof(UCHAR), &length, NULL)) { return -1; } if (buttonState) { return 1; } else { return 0; } }
Exemplo – Termómetro Cypress
MSB LSB MSB LSB
Intensidade do LED Intens. 0x0E estado
Leitura Termómetro - - - 0x0b botao sinal Temp estado
Le Porto - - porto 0x14 - - valor estado
Escreve Porto - Valor porto 0x15 - - - estado
Lê Ram - - End. 0x16 - - valor estado
Escreve RAM valor End. 0x17 - - - estado
Lê ROM - Index NA 0x18 - - valor estado
Exemplo dos argumentos de entrada para o Device Driver do termómetro Cypress