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
jc/md/lp-01/05 Principe des drivers 1
Généralités sur les drivers
Présentation
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
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
jc/md/lp-01/05 Principe des drivers 4
Système de base NOYAU (1)
• Principaux blocs constitutifs
KERNELGWES
DEVICE DRIVERSOAL
DEVICEMANAGER
FILESYS
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
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)
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.
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
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 »
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.
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
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
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
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
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.
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
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
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
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.
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
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.
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
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.
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à
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
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
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.
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.
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…
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)
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.
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
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
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
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.
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
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.
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.
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
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.
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
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.
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.
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
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.
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.
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
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.
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.
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
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.
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.
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
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.
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
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.
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.
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.
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.
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.
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);
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
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);
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))
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));
jc/md/lp-01/05 Principe des drivers 66
Exemple de Driver
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
jc/md/lp-01/05 Principe des drivers 68
File→New Project or File
jc/md/lp-01/05 Principe des drivers 69
Choix du projet
jc/md/lp-01/05 Principe des drivers 70
Fichiers obtenus
jc/md/lp-01/05 Principe des drivers 71
Platform→Settings
jc/md/lp-01/05 Principe des drivers 72
Choix du type de génération
jc/md/lp-01/05 Principe des drivers 73
Création des fichiers du driver
• Fichier DRIVER.def• Fichier DRIVER_XXX.cpp
jc/md/lp-01/05 Principe des drivers 74
File→New Project or File
jc/md/lp-01/05 Principe des drivers 75
Choix : Text File
DRIVER.def
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
jc/md/lp-01/05 Principe des drivers 77
DRIVER.def (2)
jc/md/lp-01/05 Principe des drivers 78
Code du Driver
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
jc/md/lp-01/05 Principe des drivers 80
Fichiers d’entêtes
#include "StdAfx.h"
#include <Pkfuncs.h> //pour les macros
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)
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
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
jc/md/lp-01/05 Principe des drivers 91
XYZ_IOControl (3)
*pdwActualOut = dwLenOut;
return bRet;
} //XYZ_IOControl
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")));
}
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;
}
jc/md/lp-01/05 Principe des drivers 94
Génération du driver
jc/md/lp-01/05 Principe des drivers 95
Image du noyau avec le driver
jc/md/lp-01/05 Principe des drivers 96
Application
jc/md/lp-01/05 Principe des drivers 97
Création de l’application
jc/md/lp-01/05 Principe des drivers 98
WCE Application
jc/md/lp-01/05 Principe des drivers 99
Type de l’application
jc/md/lp-01/05 Principe des drivers 100
PlatformSettings
jc/md/lp-01/05 Principe des drivers 101
Application (1) : code fourni
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
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;
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;
}
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; }
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;}
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; }
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;}
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; }
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
jc/md/lp-01/05 Principe des drivers 111
Génération de l’application
jc/md/lp-01/05 Principe des drivers 112
Lancement du noyau (avec driver)
jc/md/lp-01/05 Principe des drivers 113
Target→Run Program
jc/md/lp-01/05 Principe des drivers 114
Résultat de l’exécution
jc/md/lp-01/05 Principe des drivers 115
Erreur XYY dans RegisterDevice
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
jc/md/lp-01/05 Principe des drivers 117
Erreur dans RegisterDevice
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
jc/md/lp-01/05 Principe des drivers 119
Erreur 55 : ERROR_DEV_NOT_EXIT
jc/md/lp-01/05 Principe des drivers 120
Erreur : Pb Open
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
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é