122
jc/md/lp-01/05 Principe des drivers 1 Généralités sur les drivers Présentation

Généralités sur les drivers

  • Upload
    nam

  • View
    28

  • Download
    2

Embed Size (px)

DESCRIPTION

Généralités sur les drivers. Présentation. Objectif du chapitre. Architecture d’un driver sous Windows CE Fonctions système disponibles Fonctions système à créer Écriture d’un driver élémentaire Génération du driver Écriture d’une application élémentaire Génération de l’application - PowerPoint PPT Presentation

Citation preview

Page 1: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 1

Généralités sur les drivers

Présentation

Page 2: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 2

Objectif du chapitre

• Architecture d’un driver sous Windows CE• Fonctions système disponibles• Fonctions système à créer• Écriture d’un driver élémentaire• Génération du driver• Écriture d’une application élémentaire• Génération de l’application• Essai du driver

Page 3: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 3

Driver

• Driver : raccourci pour « device driver », souvent traduit par pilote ou contrôleur de périphérique

• Device : dispositif physique (périphérique) ou logique (protocole, service, périphérique virtuel, fichier) dont le fonctionnement nécessite des commandes et des ressources au sens large, mémoire, temps, port, etc.

• Device driver : module logiciel qui assure l’interface entre le système et le device

Page 4: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 4

Système de base NOYAU (1)

• Principaux blocs constitutifs

KERNELGWES

DEVICE DRIVERSOAL

DEVICEMANAGER

FILESYS

Page 5: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 5

NOYAU (2)

• KERNEL– OS minimal ; il gère les process, les threads, la

mémoire, les interruptions, etc.• GWES (Graphics Windowig Events Subsystem)

– Gère l’interface graphique et les entrées-sorties (I/O) des utilisateurs

• DEVICE DRIVERS– Native Drivers : interface utilisateur de base sauf

clavier, écran et souris qui sont gérés par GWES et chargés lors du boot

– Stream Drivers : gérés par le Device Manager

Page 6: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 6

NOYAU (3)

• DEVICE MANAGER– Gère les Stream Drivers : charge lors du boot ceux

qui sont listés dans la Registry– Gère de manière dynamique les drivers chargeables

à la demande

• FILESYS– Gère le système de fichiers, la registry et la Property

Data Base (base de donnée non hiérarchisée pour stocker des adresses, des mails et des informations)

Page 7: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 7

Drivers de base Windows CE (1)

• File System– File system drivers : support logiciel du système de

gestion des fichiers de Windows CE– Process : filesys.exe exécuté dès la phase de

démarrage du noyau (boot)

• GWES– Interface entre l’utilisateur, les applications et l’OS– Process : gwes.exe chargé au boot– Pilotes pour l’écran, le clavier, l’affichage sur les

LED, etc.

Page 8: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 8

Drivers de base Windows CE (2)

• Device Manager– Responsable de la gestion de nombreux

périphériques et du chargement dynamique de leur pilote

– Process : device.exe– Pilotes audio, batterie, clavier, souris, lignes série,

ports USB,– Interface réseau NDIS– Interface PC Card,– Drivers divers fonctionnant par gestion d’un flot

Page 9: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 9

Création d’un driver

• Préparation des fonctions souhaitées pour la gestion du « device » en respectant la règle de nommage et l’esprit des fonctions similaires des autres drivers

• Description compréhensible par Windows CE sous forme d’un fichier .def qui contient la liste des fonctions

• Installation dans le contexte Windows CE par inscription dans la base de données système, la « Registry »

Page 10: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 10

Règle de nommage

• Nom commençant par un préfixe (XXX de façon symbolique) de trois caractères pour le driver, par exemple TTY pour une ligne série ou STR pour notre exemple d’application

• Caractère souligné• Nom des fonctions souhaitées : Init, Deinit,

Open, Close, Read, Write, etc.

Page 11: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 11

Fichier .def

• Sert à décrire un module pour orienter le travail de l’éditeur de liens lors de la création d’un exécutable .exe ou d’une dll

• Fichier à créer en respectant une structure particulière

• Structure décrite dans la documentation sous l’entrée « Module-Definition Files »

• Nous n’utiliserons que le paragraphe LIBRARY et l’entrée EXPORT dans notre fichier .def

Page 12: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 12

Inscription dans la « Registry »

• Opération indispensable pour que notre driver soit connu du système

• On peut introduire les informations dans la registry par les voies habituelles ou en utilisant dans l’application les fonctions d’enregistrement ou d’activation prévues sous Windows CE :

– RegisterDevice (périmée mais plus simple)– ActivateDevice– ActivateDeviceEx

Page 13: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 13

Fonctions d’un driver

• XXX_Init• XXX_Deinit• XXX_Open• XXX_Close• XXX_Read• XXX_Write• XXX_IoControl• XXX_Seek• XXX_PowerUp• XXX_PowerDown

Page 14: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 14

Fonction XXX_Init

• Fonction appelée pour démarrer le driver par le Device Manager via l’appel de ActivateDeviceEx ou de RegisterDevice

• Initialise les ressources nécessaires au fonctionnement du driver (mémoire, registres des périphériques…)

• XXX_Init crée un handle hDeviceContext passé par RegisterDevice à XXX_Open, XXX_Deinit, XXX_PowerUp et XXX_PowerDown

Page 15: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 15

Fonction XXX_Init

DWORD XXX_Init(LPCTSTR pContext, LPCVOID lpvBusContext );

ParameterspContext

[in] Pointer to a string containing the registry path to the active key for the stream interface driver.

lpvBusContext non utilisé dans notre application

Return ValuesReturns a handle to the device context created if successful. Returns zero if not successful.

Page 16: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 16

Fonction RegisterDevice

• Plus simple à simple à mettre en œuvre que les fonctions ActivateDevice ou ActivateDeviceEx qui la remplacent

• Enregistre le driver dans la « registry »• Appelle XXX_Init pour obtenir un handle• Communique ce handle aux autres fonctions :

XXX_Open, XXX_Deinit, XXX_PowerUp, et XXX_PowerDown

• Retourne le handle ou 0 en cas d’échec

Page 17: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 17

Fonction RegisterDevice

HANDLE RegisterDevice( LPCWSTR lpszType, DWORD dwIndex, LPCWSTR lpszLib, DWORD dwInfo );

Parameters:lpszType

[in] Long pointer to the null-terminated string that contains the device identifier prefix, for example COM, DEV, or PGR. Must be three characters long.

dwIndex [in] Device identifier index. Must be a number from 0 (zero) through

9. For example, the index value for COM2 is 2. lpszLib

[in] Long pointer to the null-terminated string that identifies the device driver DLL name.

dwInfo [in] Instance information.

Return Values: Zero indicates failure

Page 18: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 18

Fonction XXX_Deinit

• BOOL XXX_Deinit(DWORD hDeviceContext);• Fonction appelée quand le Device Manager

arrête le driver via l’appel des fonctions DeactiveDeviceEx ou DeregisterDevice par l’application

• L’application devra compléter par un appel à CloseHandle pour détruire le handle associé et libèrer toutes les ressources matérielles et/ou logicielles utilisées par le driver

Page 19: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 19

Fonction XXX_Deinit

BOOL XXX_Deinit( DWORD hDeviceContext );

Parameters

hDeviceContext

[in] Handle to the device context. The XXX_Init function creates and returns this identifier.

Return Values

TRUE indicates success.

FALSE indicates failure.

Page 20: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 20

Fonction DeregisterDevice

• Supprime l’enregistrement dans la registry du driver

• Appelle la fonction XXX_Deinit• Remplacée par DeactivateDevice

Page 21: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 21

Fonction DeregisterDevice

BOOL DeregisterDevice( Handle hDevice );

Parameters

hDevice

[in] Handle to a registered device returned from RegisterDevice

Return Values

TRUE indicates success. FALSE indicates failure.

Page 22: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 22

Fonction XXX_Open

• Ouvre un driver en lecture et/ou écriture • Fonction appelée par l’application à travers la

fonction CreateFile• Alloue les ressources propres à chaque

contexte ouvert• Crée un handle hOpenContext utilisé par

XXX_Close, XXX_Read, XXX_Write, XXX_Seek XXX_IOControl

• Peut-être appelée plusieurs fois

Page 23: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 23

Fonction XXX_Open

DWORD XXX_Open(DWORD hDeviceContext,DWORD AccessCode,DWORD ShareMode);

ParametershDeviceContext [in] Handle to the device context. The

XXX_Init function creates and returns this handle. AccessCode [in] Access code for the device. The

access is a combination of read and write access from CreateFile.

ShareMode [in] File share mode of the device. The share mode is a combination of read and write access sharing from CreateFile.

Return ValuesThis function returns a handle that identifies the open context of the

device to the calling application.

Page 24: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 24

Fonction CreateFile

• Crée, ouvre ou tronque un objet– Fichier– Port– Service– Console

• Valeur de retour– Handle pour accéder à l’objet– INVALID_HANDLE_VALUE si l’opération échoue– Peut indiquer si l’objet existe déjà

Page 25: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 25

Fonction CreateFile (1)

HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDispostion, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile );

Parameters

Page 26: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 26

Fonction CreateFile (2)

lpFileName [in] Pointer to a null-terminated string that specifies

the name of the object, such as file, COM port, disk device, or console, to create or open.etc.When lpFileName points to a COM port to open, you must include a colon after the name. For example, specify COM1: to open that port.

dwDesiredAccess [in] Type of access to the object. An application can

obtain read-only access, write-only access, read/write access

Page 27: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 27

Fonction CreateFile (3)

– GENERIC_READ specifies read access to the object. Data can be read from the file and the file pointer can be moved.

– GENERIC_WRITE specifies write access to the object. Data can be written to the file and the file pointer can be moved.

– GENERIC_READ | GENERIC_WRITE combine read/write access.

Page 28: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 28

Fonction CreateFile (4)

dwShareMode[in] Share mode for object. If dwShareMode is zero, the object cannot be

shared. Plusieurs valeurs possibles…

FILE_SHARE_READFILE_SHARE_WRITE

lpSecurityAttributes [in] Ignored; set to NULL.

Page 29: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 29

Fonction CreateFile (5)

dwCreationDispostion

[in] Action to take on files that exist, and which action to take when files do not exist.

OPEN_EXISTING opens the file. The function fails if the file does not exist.

CREATE_NEWCREATE_ALWAYS…

Page 30: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 30

Fonction CreateFile (6)

dwFlagsAndAttributes

[in] File attributes and flags for the file. FILE_ATTRIBUTE_NORMAL FILE_ATTRIBUTE_HIDDEN

FILE_ATTRIBUTE_READONLY…

hTemplateFile

[in] Ignored; (0)

Page 31: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 31

Fonction CreateFile (7)

Return Values– An open handle to the specified file indicates

success.– If the specified file exists before the function call and

dwCreationDisposition is CREATE_ALWAYS or OPEN_ALWAYS, a call to GetLastError returns ERROR_ALREADY_EXISTS, even though the function has succeeded. If the file does not exist before the call, GetLastError returns zero.

– INVALID_HANDLE_VALUE indicates failure. To get extended error information, call GetLastError.

Page 32: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 32

XXX_Close

BOOL XXX_Close( DWORD hOpenContext);ParametershOpenContext

[in] Handle returned by the XXX_Open function, used to identify the open context of the device.

Return ValuesTRUE indicates success. FALSE indicates failure.

• Fonction appelée par l’operating system en réponse à un appel par l’application de la fonction CloseHandle

Page 33: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 33

Fonction CloseHandle

BOOL CloseHandle( HANDLE hObject );

Parameters

hObject [in] Handle to an open object. Return Values

Nonzero indicates success. Zero indicates failure.

• Sert à fermer un handle fourni par un appel à la fonction CreateFile

Page 34: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 34

XXX_Read

DWORD XXX_Read( DWORD hOpenContext,

LPVOID pBuffer, DWORD Count);• Fonction appelée par l’operating system en

réponse à la fonction ReadFile de l’application• Utilise un contexte ouvert par XXX_Open• Les caractères lus sont placés dans le buffer

pointé par pBuffer• Count indique le nombre de caractères à lire• La fonction retourne le nombre de caractères lus

Page 35: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 35

Fonction XXX_Read

DWORD XXX_Read( DWORD hOpenContext, LPVOID pBuffer, DWORD Count );

ParametershOpenContext

[in] Handle to the open context of the device. The XXX_Open function creates and returns this identifier.

pBuffer [out] Pointer to the buffer that stores the data read from the device. This buffer should be at least Count bytes long.

Count [in] Number of bytes to read from the device into pBuffer.

Return ValuesReturns zero to indicate end-of-file. Returns –1 to indicate an error. Returns the number of bytes read to indicate success.

Page 36: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 36

Fonction ReadFile

• Cette fonction lit dans un fichier connu par son handle, à partir de la position indiquée par un pointeur, le nombre de caractères demandé

• ReadFile indique à une adresse fournie, combien de caractères ont été lus

• Le code de retour indique la réussite de l’opération

• Le pointeur de lecture est mis à jour

Page 37: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 37

Fonction ReadFile (1)

BOOL ReadFile( HANDLE hFile,LPVOID lpBuffer,DWORD nNumberOfBytesToRead,LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped );

ParametershFile [in] Handle to the file to be read. The file

handle must have been created with GENERIC_READ access to the file.

lpBuffer [out] Pointer to the buffer that receives the data read from the file.

Page 38: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 38

Fonction ReadFile (2)

nNumberOfBytesToRead [in] Number of bytes to be read from the file.

lpNumberOfBytesRead [out] Pointer to the number of bytes read. ReadFile sets this value to zero before doing taking action or checking errors.

lpOverlapped [in] Unsupported; set to NULL.

Return ValuesNonzero indicates success. Zero indicates failure.

Page 39: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 39

XXX_Write

DWORD XXX_Write( DWORD hOpenContext, LPVOID pBuffer, DWORD Count);• Appelée par l’operating system en réponse à la

fonction WriteFile de l’application• Les caractères à écrire sont placés dans le

buffer et Count indique le nombre de caractères à écrire

• L’OS écrira dans le device connu par un handle de « contexte ouvert » créé par XXX_Open

• Fournit le nombre de caractères écrits ou erreur

Page 40: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 40

Fonction XXX_Write

DWORD XXX_Write( DWORD hOpenContext, LPCVOID pBuffer, DWORD Count ); Parameters

hOpenContext [in] Handle to the open context of the device. The call to the XXX_Open function returns this identifier.

pBuffer [out] Pointer to the buffer that contains the data to write.

Count [in] Number of bytes to write from the pBuffer buffer into the device.

Return ValuesThe number of bytes written indicates success. A value of –1 indicates failure.

Page 41: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 41

Fonction WriteFile

• Écrit dans un fichier à l’endroit indiqué par un pointeur

• Met à jour ce pointeur• N’est pas protégée contre les accès multiples : il

peut se produire des corruptions de données en cas d’accès multiples pendant les écritures

Page 42: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 42

Fonction WriteFile (1)

BOOL WriteFile(HANDLE hFile,LPCVOID lpBuffer,DWORD nNumberOfBytesToWrite,LPDWORD lpNumberOfBytesWritten,LPOVERLAPPED lpOverlapped );

Parameters hFile [in] Handle to the file to be written to. The file handle

must have been created with GENERIC_WRITE access to the file.

lpBuffer [in] Pointer to the buffer containing the data to write to the file.

Page 43: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 43

Fonction WriteFile (2)

nNumberOfBytesToWrite

[in] Number of bytes to write to the file.

lpNumberOfBytesWritten

[out] Pointer to the number of bytes written by this function call. WriteFile sets this value to zero before taking action or checking errors.

lpOverlapped

[in] Unsupported; set to NULL.

Return ValuesNonzero indicates success. Zero indicates failure.

Page 44: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 44

XXX_Seek

• DWORD XXX_Seek( DWORD hOpenContext,long Amount,WORD Type);

• Appelée par l’operating system en réponse à la fonction SetFilePointer de l’application

• Amount indique le nombre de bytes dont doit être modifié le pointeur de données du device

• Type spécifie le point de départ du pointeur de données

Page 45: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 45

Fonction XXX_Seek (1)

DWORD XXX_Seek( DWORD hOpenContext, long Amount, WORD Type );

ParametershOpenContext

[in] Handle to the open context of the device. The XXX_Open function creates and returns this identifier.

Amount [in] Number of bytes to move the data pointer in the

device. A positive value moves the data pointer toward the end of the file, and a negative value moves it toward the beginning.

Page 46: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 46

Fonction XXX_Seek (2)

Type

[in] Starting point for the data pointer.

FILE_BEGIN, FILE_CURRENT, FILE_END.

Return ValuesThe new data pointer for the device indicates success. A

value of –1 indicates failure.

Page 47: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 47

Fonction SetFilePointer

• Permet de déplacer un pointeur dans un fichier ouvert

• Suppose un objet qui supporte un positionnement, pas un port qui travaille toujours au même endroit

• Peut renseigner sur la position dans le fichier• Retourne la nouvelle valeur du pointeur ou une

erreur

Page 48: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 48

Fonction SetFilePointer (1)

DWORD SetFilePointer( HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod );

ParametershFile

[in] Handle to the file whose file pointer is to be moved. The file handle must have been created with GENERIC_READ or GENERIC_WRITE access to the file.

lDistanceToMove Low-order 32 bits of a signed value that specifies the number of

bytes to move the file pointer.

Page 49: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 49

Fonction SetFilePointer (2)

lpDistanceToMoveHigh Not supported; must be NULL.

dwMoveMethod [in] Starting point for the file pointer move

Return Values

The new file pointer indicates success. If the function fails, the return value is -1.

Page 50: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 50

IOCTL

#define IOCTL_essai1 CTL_CODE(\ FILE_DEVICE_UNKNOWN,2048,\METHOD_BUFFERED,FILE_ANY_ACCESS)

• Permet de définir des fonctions spécifiques à un device donné

• IOControl est un code 32 bits défini avec la macro CTL_CODE

Page 51: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 51

Macro CTL_CODE(1)

CTL_CODE( DeviceType, Function, Method, Access );

DeviceTypeDefines the type of device for the given IOCTL.

FILE_DEVICE_UNKNOWN ,FILE_DEVICE_VIDEO, …

Function

Defines an action within the device category. That function codes 0-2047 are reserved for Microsoft, and 2048-4095 are reserved for OEMs.

Page 52: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 52

Macro CTL_CODE(2)

Method Defines the method codes for how buffers are

passed for I/O METHOD_BUFFERED ( for CE)

Access Defines the access check value for access.

FILE_ANY_ACCESS,FILE_READ_ACCESS,FILE_WRITE_ACCESS.

Page 53: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 53

XXX_IOControl

• BOOL XXX_IOControl( DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut);

• dwCode identifie une opération• On dispose d’un buffer d’entrée• On dispose d’un buffer de sortie• pdwActualOut permet de retourner le nombre de

caractères effectivement lus sur le device.• Appelé par l’application avec DeviceIoControl

Page 54: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 54

Fonction XXX_IOControl (1)

BOOL XXX_IOControl( DWORD hOpenContext,

DWORD dwCode, PBYTE pBufIn,

DWORD dwLenIn, PBYTE pBufOut,

DWORD dwLenOut, PDWORD pdwActualOut );

ParametershOpenContext

[in] Handle to the open context of the device. The XXX_Open function creates and returns this identifier.

Page 55: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 55

Fonction XXX_IOControl (2)

dwCode

[in] I/O control operation to perform. These codes are device-specific and are usually exposed to developers through a header file.

pBufIn

[in] Pointer to the buffer containing data to transfer to the device.

dwLenIn

[in] Number of bytes of data in the buffer specified for pBufIn

Page 56: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 56

Fonction XXX_IOControl (3)

pBufOut [out] Pointer to the buffer used to transfer the output

data from the device. dwLenOut

[in] Maximum number of bytes in the buffer specified by pBufOut.

pdwActualOut [out] Pointer to the DWORD buffer that this function

uses to return the actual number of bytes received from the device.

Return ValuesTRUE indicates success. FALSE indicates failure.

Page 57: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 57

Fonction DeviceIoControl (1)

BOOL DeviceIoControl( HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped );

ParametershDevice

[in] Handle to the device on which the operation is to be performed.

Page 58: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 58

Fonction DeviceIoControl (2)

dwIoControlCode [in] Control code for the operation. This value identifies

the specific operation to be performed and the type of device on which to perform it.(ex: IOCTL_essai1)

lpInBuffer [in] Pointer to the input buffer that contains the data

required to perform the operation. The format of this data depends on the value of the dwIoControlCode parameter. This parameter can be NULL if dwIoControlCode specifies an operation that does not require input data.

Page 59: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 59

Fonction DeviceIoControl (3)

nInBufferSize [in] Size of the input buffer, in bytes.

lpOutBuffer [out] Pointer to the output buffer that is to receive the

data returned by the operation. The format of this data depends on the value of the dwIoControlCode parameter. This parameter can be NULL if dwIoControlCode specifies an operation that does not return data.

nOutBufferSize [in] Size of the output buffer, in bytes.

Page 60: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 60

Fonction DeviceIoControl (4)

lpBytesReturned [out] Pointer to a variable that receives the size of the

data stored in the output buffer, in bytes.

lpOverlapped [in] Pointer to an OVERLAPPED structure. If hDevice

was opened without specifying FILE_FLAG_OVERLAPPED, lpOverlapped is ignored.

Return ValuesIf the function succeeds, the return value is nonzero.

Page 61: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 61

XXX_ PowerDown XXX_PowerUp

• Appelés par l’operating system pour gérer l’énergie sur des périphériques disposant des fonctionnalités de mise en veilleuse ou d’extinction

• Void XXX_PowerUp(DWORD hDeviceContext);• Void XXX_PowerDown(DWORD hDeviceContext);

Page 62: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 62

Objectif

• Créer un driver XYZ pour l’émulateur dans une plate-forme de type « Industrial Controler »

• Dans cet exemple, nommer la plate-forme z_driver

• Chaque module ne contiendra qu’un message RETAILMSG pour une visualisation dans la fenêtre de sortie de Platform Builder

• Faire une version « Debug » pour observer mieux le fonctionnement

Page 63: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 63

Macro RETAILMSG

• RETAILMSG(cond, printf_exp) • Impression si la condition est vraie de ce qu’on

mettrait dans un printf• Impression faite par une fonction équivalente à

printf mais qui écrit dans la fenêtre de sortie de l’émulateur et non dans la cible émulée

Exemple :RETAILMSG(1,(TEXT("Main: adresse de i= %x\n"),&i));

Équivalent dans la fenêtre de sortie à :printf("Main: adresse de i= %x\n",&i);

Page 64: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 64

Macro RETAILMSG

RETAILMSG (Expression,( printf-style Message))Return Values

None.Remarks

The printf-style message parameter is output if theBoolean input expression evaluates to TRUE.Note that the parameter Message must be enclosed byparentheses to prevent syntax errors being generatedby the preprocessor. This macro should be usedsparingly, as it increases the size of retail builds.

ex: RETAILMSG(1,(TEXT(" bonjour\n "))) RETAILMSG(1,(_T(" val= %x\n "), val))

Page 65: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 65

Récupération d’erreur

• De façon générale, quand une fonction détecte une erreur, elle le signifie à l’appelant par une valeur particulière du code de retour.

• Mais on peut avoir plus de détails sur l’erreur par la fonction spécialisée GetLastError.

• Exemple : impression d’un numéro d’erreur en décimal

DWORD dwErreur=GetLastError();

RETAILMSG(1,(_T("erreur numero %d \n"),dwError));   

Page 66: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 66

Exemple de Driver

Page 67: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 67

Projet dll

• Un driver est un fichier .dll créé via un projet proposé par Platform Buider

• Il faut un fichier .def dans le projet pour définir les fonctions connues par le driver et faire connaître aux autres applications ces fonctions

• Une dll n’a pas de contexte propre, à la différence d’un point .exe

Page 68: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 68

File→New Project or File

Page 69: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 69

Choix du projet

Page 70: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 70

Fichiers obtenus

Page 71: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 71

Platform→Settings

Page 72: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 72

Choix du type de génération

Page 73: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 73

Création des fichiers du driver

• Fichier DRIVER.def• Fichier DRIVER_XXX.cpp

Page 74: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 74

File→New Project or File

Page 75: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 75

Choix : Text File

DRIVER.def

Page 76: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 76

DRIVER.def (1)

LIBRARY DRIVER_DRV EXPORTS XYZ_Init

XYZ_DeinitXYZ_OpenXYZ_CloseXYZ_ReadXYZ_WriteXYZ_IOControlXYZ_SeekXYZ_PowerDownXYZ_PowerUp

Page 77: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 77

DRIVER.def (2)

Page 78: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 78

Code du Driver

Page 79: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 79

Compléter le fichier .cpp

• Mettre les include pour les fichiers d’entêtes• Mettre les macros IOCTL• Mettre les prototypes des fonctions• Mettre toutes les fonctions

Page 80: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 80

Fichiers d’entêtes

#include "StdAfx.h"

#include <Pkfuncs.h> //pour les macros

Page 81: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 81

Déclaration des IOControl

#define IOCTL_essai1 \

CTL_CODE(FILE_DEVICE_UNKNOWN,2048,\

METHOD_BUFFERED,FILE_ANY_ACCESS)

#define IOCTL_essai2 \

CTL_CODE(FILE_DEVICE_UNKNOWN,2049,\

METHOD_BUFFERED,FILE_ANY_ACCESS)

Page 82: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 82

ENTREE DU DRIVER

BOOL APIENTRY DllMain( HANDLE hModule,

DWORD ul_reason_for_call,

LPVOID lpReserved

)

{

return TRUE;

}

Page 83: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 83

XYZ_Init

DWORD XYZ_Init(DWORD dwContext)

{

DWORD dwRet = 1;

RETAILMSG(1,(TEXT("DRIVER: XYZ_Init\n")));

return dwRet;

}

Page 84: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 84

XYZ_Deinit

BOOL XYZ_Deinit(DWORD hDeviceContext)

{

RETAILMSG(1,(TEXT("DRIVER: XYZ_Deinit\n")));

return TRUE;

}

Page 85: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 85

XYZ_Open

DWORD XYZ_Open(DWORD hDeviceContext,

DWORD AccessCode, DWORD ShareMode)

{

DWORD dwRet = 1;

RETAILMSG(1,(TEXT(" DRIVER: XYZ_Open\n")));

return dwRet;

}

Page 86: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 86

XYZ_Close

BOOL XYZ_Close(DWORD hOpenContext)

{

RETAILMSG(1,(TEXT("DRIVER: XYZ_Close\n")));

return TRUE;

}

Page 87: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 87

XYZ_Read

DWORD XYZ_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)

{

DWORD dwRet = Count;

RETAILMSG(1,(TEXT("DRIVER: XYZ_Read\n")));

return dwRet;

}

Page 88: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 88

XYZ_Write

DWORD XYZ_Write(DWORD hOpenContext,

LPCVOID pSourceBytes, DWORD NbOfBytes)

{

DWORD dwRet = NbOfBytes;

RETAILMSG(1,(TEXT("DRIVER: XYZ_Write\n")));

return dwRet;

}

Page 89: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 89

XYZ_IOControl (1)

BOOL XYZ_IOControl(DWORD hOpenContext,

DWORD dwCode,

PWCHAR pBufIn,

DWORD dwLenIn,

PWCHAR pBufOut,

DWORD dwLenOut,

PDWORD pdwActualOut)

{

BOOL bRet=FALSE;

Page 90: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 90

XYZ_IOControl (2)

switch(dwCode)

{

case IOCTL_essai1: RETAILMSG(1,(TEXT( "DRIVER: XYZ_essai1\n"))); bRet = TRUE; break;

case IOCTL_essai2: RETAILMSG(1,(TEXT( "DRIVER: XYZ_essai2\n")));

bRet = TRUE;

break;

} //switch

Page 91: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 91

XYZ_IOControl (3)

*pdwActualOut = dwLenOut;

return bRet;

} //XYZ_IOControl

Page 92: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 92

XYZ_PowerUp & XYZ_PowerDown

void XYZ_PowerUp(DWORD hDeviceContext)

{

RETAILMSG(1,(TEXT("DRIVER: XYZ_PowerUp\n")));

}

void XYZ_PowerDown(DWORD hDeviceContext)

{

RETAILMSG(1,(TEXT("DRIVER: XYZ_PowerDown\n")));

}

Page 93: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 93

XYZ_Seek

DWORD XYZ_Seek(DWORD hOpenContext, long Amount, WORD Type)

{

DWORD dwRet = 1;

RETAILMSG(1,(TEXT(" DRIVER: XYZ_Seek\n")));

return dwRet;

}

Page 94: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 94

Génération du driver

Page 95: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 95

Image du noyau avec le driver

Page 96: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 96

Application

Page 97: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 97

Création de l’application

Page 98: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 98

WCE Application

Page 99: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 99

Type de l’application

Page 100: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 100

PlatformSettings

Page 101: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 101

Application (1) : code fourni

Page 102: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 102

Application (2) : directives

#include "stdafx.h"

#include <Pkfuncs.h>

#define IOCTL_essai1 CTL_CODE( FILE_DEVICE_UNKNOWN,2048, METHOD_BUFFERED,FILE_ANY_ACCESS)

#define IOCTL_essai2 CTL_CODE( FILE_DEVICE_UNKNOWN,2049, METHOD_BUFFERED,FILE_ANY_ACCESS)

#define BUFFER_SIZE 256

Page 103: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 103

Application (3) : déclarations

int WINAPI WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPTSTR lpCmdLine,

int nCmdShow)

{

HANDLE hDevice,hXYZ;

UCHAR BUFFER[BUFFER_SIZE];

DWORD dwNb, dwError,dwBytesRead;

BOOL bError;

DWORD dwWritten = 0;

Page 104: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 104

Application (4) : chargement driver

//Chargement et enregistrement du driver

hDevice = RegisterDevice(TEXT("XYZ"),1, TEXT("DRIVER_DRV.dll"),NULL);

if (hDevice == 0)

{

MessageBox(NULL, _T(" Pb Register"), _T(" DRIVER_APP"),MB_OK);

return 0;

}

Page 105: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 105

Application (5) : ouverture

hXYZ = CreateFile(TEXT("XYZ1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if (hXYZ == INVALID_HANDLE_VALUE) {

dwError=GetLastError(); RETAILMSG(1,(_T("erreur numero %d\n"),dwError));

MessageBox(NULL, _T("Pb open"), _T("DRIVER_APP"),MB_OK); // DeregisterDevice et fermeture des handles DeregisterDevice(hDevice); CloseHandle(hDevice);

return 0; }

Page 106: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 106

Application (6) : écriture

dwError=WriteFile(hXYZ,BUFFER, BUFFER_SIZE, &dwWritten, NULL);

if (dwError == 0){

MessageBox(NULL, _T("Pb Write:"), _T(" DRIVER_APP"), MB_OK); // DeregisterDevice et fermeture des handles

DeregisterDevice(hDevice);CloseHandle(hDevice);CloseHandle(hXYZ);

return 0;}

Page 107: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 107

Application (7) : lecture

bError= ReadFile (hXYZ,BUFFER, BUFFER_SIZE, &dwBytesRead, NULL);

if(bError == FALSE) {

MessageBox(NULL, _T("Pb Read:"), _T(" DRIVER_APP"), MB_OK); //DeregisterDevice et fermeture des handles

DeregisterDevice(hDevice);CloseHandle(hDevice);CloseHandle(hXYZ);

return 0; }

Page 108: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 108

Application (8) : IOControl essai1

bError=DeviceIoControl(hXYZ,IOCTL_essai1,BUFFER, BUFFER_SIZE, BUFFER, BUFFER_SIZE, &dwNb,NULL);

if(bError == FALSE){

MessageBox(NULL, _T("Pb IOCTL_1:"), _T(" DRIVER_APP"), MB_OK); // DeregisterDevice et fermeture des handles

DeregisterDevice(hDevice); CloseHandle(hDevice); CloseHandle(hXYZ); return 0;}

Page 109: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 109

Application (9) : IOControl essai2

bError =DeviceIoControl(hXYZ,IOCTL_essai2,BUFFER, BUFFER_SIZE, BUFFER, BUFFER_SIZE, &dwNb,NULL);

if (bError == FALSE){

MessageBox(NULL, _T("Pb IOCTL_2:"), _T(" DRIVER_APP"), MB_OK); // DeregisterDevice et fermeture des handles

DeregisterDevice(hDevice); CloseHandle(hDevice); CloseHandle(hXYZ); return 0; }

Page 110: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 110

Application (10) : fin

//Message OK

MessageBox(NULL, _T("APPLI_OK:"), _T(" DRIVER_APP"), MB_OK);

// DeregisterDevice et fermeture des handles

CloseHandle(hXYZ);

DeregisterDevice(hDevice);

CloseHandle(hDevice);

return 0;

} // WinMain

Page 111: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 111

Génération de l’application

Page 112: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 112

Lancement du noyau (avec driver)

Page 113: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 113

Target→Run Program

Page 114: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 114

Résultat de l’exécution

Page 115: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 115

Erreur XYY dans RegisterDevice

Page 116: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 116

Procédure

• Terminer si besoin l’application– Fermer la cible– Déconnecter l’émulateur

• Introduire l’erreur dans le code de l’application :dans RegisterDevice : XYY au lieu de XYZ

• Générer l’application modifiée• Recharger l’émulateur• Relancer l’application DRIVER_APP

Page 117: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 117

Erreur dans RegisterDevice

Page 118: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 118

Erreur XYY1 dans CreateFile

• Terminer si besoin l’application– Fermer la cible– Déconnecter l’émulateur

• Introduire l’erreur dans le code de l’application :– Supprimer l’erreur dans RegisterDevice : remettre

XYZ au lieu de XYY– Dans CreateFile : XYY1 au lieu de XYZ1

• Générer l’application modifiée• Recharger l’émulateur• Relancer l’application DRIVER_APP

Page 119: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 119

Erreur 55 : ERROR_DEV_NOT_EXIT

Page 120: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 120

Erreur : Pb Open

Page 121: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 121

Exercice : erreur dans WriteFile

• Terminer si besoin l’application– Fermer la cible– Déconnecter l’émulateur

• Introduire l’erreur dans le code de l’application :– Idée : laisser l’erreur dans CreateFile et appeler

WriteFile avec le handle invalide

• Générer l’application modifiée• Recharger l’émulateur• Relancer l’application DRIVER_APP

Page 122: Généralités sur les drivers

jc/md/lp-01/05 Principe des drivers 122

Conclusion

• Le driver simple fonctionne et nous fournit une base pour écrire un driver plus sophistiqué