La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Jc/md/lp-01/05Principe des drivers1 Généralités sur les drivers Présentation.

Présentations similaires


Présentation au sujet: "Jc/md/lp-01/05Principe des drivers1 Généralités sur les drivers Présentation."— Transcription de la présentation:

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

2 jc/md/lp-01/05Principe des drivers2 Objectif du chapitre Architecture dun driver sous Windows CE Fonctions système disponibles Fonctions système à créer Écriture dun driver élémentaire Génération du driver Écriture dune application élémentaire Génération de lapplication Essai du driver

3 jc/md/lp-01/05Principe des drivers3 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 linterface entre le système et le device

4 jc/md/lp-01/05Principe des drivers4 Système de base NOYAU (1) Principaux blocs constitutifs KERNEL GWES DEVICE DRIVERS OAL DEVICE MANAGER FILESYS

5 jc/md/lp-01/05Principe des drivers5 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 linterface 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

6 jc/md/lp-01/05Principe des drivers6 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)

7 jc/md/lp-01/05Principe des drivers7 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 lutilisateur, les applications et lOS –Process : gwes.exe chargé au boot –Pilotes pour lécran, le clavier, laffichage sur les LED, etc.

8 jc/md/lp-01/05Principe des drivers8 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 dun flot

9 jc/md/lp-01/05Principe des drivers9 Création dun driver Préparation des fonctions souhaitées pour la gestion du « device » en respectant la règle de nommage et lesprit des fonctions similaires des autres drivers Description compréhensible par Windows CE sous forme dun 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 »

10 jc/md/lp-01/05Principe des drivers10 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 dapplication Caractère souligné Nom des fonctions souhaitées : Init, Deinit, Open, Close, Read, Write, etc.

11 jc/md/lp-01/05Principe des drivers11 Fichier.def Sert à décrire un module pour orienter le travail de léditeur de liens lors de la création dun exécutable.exe ou dune dll Fichier à créer en respectant une structure particulière Structure décrite dans la documentation sous lentrée « Module-Definition Files » Nous nutiliserons que le paragraphe LIBRARY et lentrée EXPORT dans notre fichier.def

12 jc/md/lp-01/05Principe des drivers12 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 lapplication les fonctions denregistrement ou dactivation prévues sous Windows CE : –RegisterDevice (périmée mais plus simple) –ActivateDevice –ActivateDeviceEx

13 jc/md/lp-01/05Principe des drivers13 Fonctions dun driver XXX_Init XXX_Deinit XXX_Open XXX_Close XXX_Read XXX_Write XXX_IoControl XXX_Seek XXX_PowerUp XXX_PowerDown

14 jc/md/lp-01/05Principe des drivers14 Fonction XXX_Init Fonction appelée pour démarrer le driver par le Device Manager via lappel 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

15 jc/md/lp-01/05Principe des drivers15 Fonction XXX_Init DWORD XXX_Init(LPCTSTR pContext, LPCVOID lpvBusContext ); Parameters pContext [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 Values Returns a handle to the device context created if successful. Returns zero if not successful.

16 jc/md/lp-01/05Principe des drivers16 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

17 jc/md/lp-01/05Principe des drivers17 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

18 jc/md/lp-01/05Principe des drivers18 Fonction XXX_Deinit BOOL XXX_Deinit(DWORD hDeviceContext); Fonction appelée quand le Device Manager arrête le driver via lappel des fonctions DeactiveDeviceEx ou DeregisterDevice par lapplication Lapplication 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

19 jc/md/lp-01/05Principe des drivers19 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.

20 jc/md/lp-01/05Principe des drivers20 Fonction DeregisterDevice Supprime lenregistrement dans la registry du driver Appelle la fonction XXX_Deinit Remplacée par DeactivateDevice

21 jc/md/lp-01/05Principe des drivers21 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.

22 jc/md/lp-01/05Principe des drivers22 Fonction XXX_Open Ouvre un driver en lecture et/ou écriture Fonction appelée par lapplication à 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

23 jc/md/lp-01/05Principe des drivers23 Fonction XXX_Open DWORD XXX_Open(DWORD hDeviceContext,DWORD AccessCode,DWORD ShareMode); Parameters hDeviceContext [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 Values This function returns a handle that identifies the open context of the device to the calling application.

24 jc/md/lp-01/05Principe des drivers24 Fonction CreateFile Crée, ouvre ou tronque un objet –Fichier –Port –Service –Console Valeur de retour –Handle pour accéder à lobjet –INVALID_HANDLE_VALUE si lopération échoue –Peut indiquer si lobjet existe déjà

25 jc/md/lp-01/05Principe des drivers25 Fonction CreateFile (1) HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDispostion, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ); Parameters

26 jc/md/lp-01/05Principe des drivers26 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

27 jc/md/lp-01/05Principe des drivers27 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.

28 jc/md/lp-01/05Principe des drivers28 Fonction CreateFile (4) dwShareMode [in] Share mode for object. If dwShareMode is zero, the object cannot be shared. Plusieurs valeurs possibles… FILE_SHARE_READ FILE_SHARE_WRITE lpSecurityAttributes [in] Ignored; set to NULL.

29 jc/md/lp-01/05Principe des drivers29 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_NEW CREATE_ALWAYS …

30 jc/md/lp-01/05Principe des drivers30 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)

31 jc/md/lp-01/05Principe des drivers31 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.

32 jc/md/lp-01/05Principe des drivers32 XXX_Close BOOL XXX_Close( DWORD hOpenContext); Parameters hOpenContext [in] Handle returned by the XXX_Open function, used to identify the open context of the device. Return Values TRUE indicates success. FALSE indicates failure. Fonction appelée par loperating system en réponse à un appel par lapplication de la fonction CloseHandle

33 jc/md/lp-01/05Principe des drivers33 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

34 jc/md/lp-01/05Principe des drivers34 XXX_Read DWORD XXX_Read( DWORD hOpenContext, LPVOID pBuffer, DWORD Count); Fonction appelée par loperating system en réponse à la fonction ReadFile de lapplication 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

35 jc/md/lp-01/05Principe des drivers35 Fonction XXX_Read DWORD XXX_Read( DWORD hOpenContext, LPVOID pBuffer, DWORD Count ); Parameters hOpenContext [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 Values Returns zero to indicate end-of-file. Returns –1 to indicate an error. Returns the number of bytes read to indicate success.

36 jc/md/lp-01/05Principe des drivers36 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 lopération Le pointeur de lecture est mis à jour

37 jc/md/lp-01/05Principe des drivers37 Fonction ReadFile (1) BOOL ReadFile( HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped ); Parameters hFile[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.

38 jc/md/lp-01/05Principe des drivers38 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 Values Nonzero indicates success. Zero indicates failure.

39 jc/md/lp-01/05Principe des drivers39 XXX_Write DWORD XXX_Write( DWORD hOpenContext, LPVOID pBuffer, DWORD Count); Appelée par loperating system en réponse à la fonction WriteFile de lapplication Les caractères à écrire sont placés dans le buffer et Count indique le nombre de caractères à écrire LOS écrira dans le device connu par un handle de « contexte ouvert » créé par XXX_Open Fournit le nombre de caractères écrits ou erreur

40 jc/md/lp-01/05Principe des drivers40 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 Values The number of bytes written indicates success. A value of –1 indicates failure.

41 jc/md/lp-01/05Principe des drivers41 Fonction WriteFile Écrit dans un fichier à lendroit indiqué par un pointeur Met à jour ce pointeur Nest pas protégée contre les accès multiples : il peut se produire des corruptions de données en cas daccès multiples pendant les écritures

42 jc/md/lp-01/05Principe des drivers42 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.

43 jc/md/lp-01/05Principe des drivers43 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 Values Nonzero indicates success. Zero indicates failure.

44 jc/md/lp-01/05Principe des drivers44 XXX_Seek DWORD XXX_Seek( DWORD hOpenContext, long Amount, WORD Type); Appelée par loperating system en réponse à la fonction SetFilePointer de lapplication 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

45 jc/md/lp-01/05Principe des drivers45 Fonction XXX_Seek (1) DWORD XXX_Seek( DWORD hOpenContext, long Amount, WORD Type ); Parameters hOpenContext [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.

46 jc/md/lp-01/05Principe des drivers46 Fonction XXX_Seek (2) Type [in] Starting point for the data pointer. FILE_BEGIN, FILE_CURRENT, FILE_END. Return Values The new data pointer for the device indicates success. A value of –1 indicates failure.

47 jc/md/lp-01/05Principe des drivers47 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

48 jc/md/lp-01/05Principe des drivers48 Fonction SetFilePointer (1) DWORD SetFilePointer ( HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod ); Parameters hFile [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.

49 jc/md/lp-01/05Principe des drivers49 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.

50 jc/md/lp-01/05Principe des drivers50 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

51 jc/md/lp-01/05Principe des drivers51 Macro CTL_CODE(1) CTL_CODE ( DeviceType, Function, Method, Access ); DeviceType Defines 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.

52 jc/md/lp-01/05Principe des drivers52 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.

53 jc/md/lp-01/05Principe des drivers53 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 dun buffer dentrée On dispose dun buffer de sortie pdwActualOut permet de retourner le nombre de caractères effectivement lus sur le device. Appelé par lapplication avec DeviceIoControl

54 jc/md/lp-01/05Principe des drivers54 Fonction XXX_IOControl (1) BOOL XXX_IOControl ( DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut ); Parameters hOpenContext [in] Handle to the open context of the device. The XXX_Open function creates and returns this identifier.

55 jc/md/lp-01/05Principe des drivers55 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

56 jc/md/lp-01/05Principe des drivers56 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 Values TRUE indicates success. FALSE indicates failure.

57 jc/md/lp-01/05Principe des drivers57 Fonction DeviceIoControl (1) BOOL DeviceIoControl ( HANDLE hDevice, DWORD dwIoControlCode, LPVOID lpInBuffer, DWORD nInBufferSize, LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped ); Parameters hDevice [in] Handle to the device on which the operation is to be performed.

58 jc/md/lp-01/05Principe des drivers58 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.

59 jc/md/lp-01/05Principe des drivers59 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.

60 jc/md/lp-01/05Principe des drivers60 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 Values If the function succeeds, the return value is nonzero.

61 jc/md/lp-01/05Principe des drivers61 XXX_ PowerDown XXX_PowerUp Appelés par loperating system pour gérer lénergie sur des périphériques disposant des fonctionnalités de mise en veilleuse ou dextinction Void XXX_PowerUp(DWORD hDeviceContext); Void XXX_PowerDown(DWORD hDeviceContext);

62 jc/md/lp-01/05Principe des drivers62 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 quun message RETAILMSG pour une visualisation dans la fenêtre de sortie de Platform Builder Faire une version « Debug » pour observer mieux le fonctionnement

63 jc/md/lp-01/05Principe des drivers63 Macro RETAILMSG RETAILMSG(cond, printf_exp) Impression si la condition est vraie de ce quon 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);

64 jc/md/lp-01/05Principe des drivers64 Macro RETAILMSG RETAILMSG (Expression,( printf-style Message)) Return Values None. Remarks The printf-style message parameter is output if the Boolean input expression evaluates to TRUE. Note that the parameter Message must be enclosed by parentheses to prevent syntax errors being generated by the preprocessor. This macro should be used sparingly, as it increases the size of retail builds. ex: RETAILMSG(1,(TEXT( " bonjour\n " ))) RETAILMSG(1,(_T( " val= %x\n " ), val))

65 jc/md/lp-01/05Principe des drivers65 Récupération derreur De façon générale, quand une fonction détecte une erreur, elle le signifie à lappelant par une valeur particulière du code de retour. Mais on peut avoir plus de détails sur lerreur par la fonction spécialisée GetLastError. Exemple : impression dun numéro derreur en décimal DWORD dwErreur=GetLastError(); RETAILMSG(1,(_T("erreur numero %d \n"),dwError));

66 jc/md/lp-01/05Principe des drivers66 Exemple de Driver

67 jc/md/lp-01/05Principe des drivers67 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 na pas de contexte propre, à la différence dun point.exe

68 jc/md/lp-01/05Principe des drivers68 FileNew Project or File

69 jc/md/lp-01/05Principe des drivers69 Choix du projet

70 jc/md/lp-01/05Principe des drivers70 Fichiers obtenus

71 jc/md/lp-01/05Principe des drivers71 PlatformSettings

72 jc/md/lp-01/05Principe des drivers72 Choix du type de génération

73 jc/md/lp-01/05Principe des drivers73 Création des fichiers du driver Fichier DRIVER.def Fichier DRIVER_XXX.cpp

74 jc/md/lp-01/05Principe des drivers74 FileNew Project or File

75 jc/md/lp-01/05Principe des drivers75 Choix : Text File DRIVER.def

76 jc/md/lp-01/05Principe des drivers76 DRIVER.def (1) LIBRARY DRIVER_DRV EXPORTS XYZ_Init XYZ_Deinit XYZ_Open XYZ_Close XYZ_Read XYZ_Write XYZ_IOControl XYZ_Seek XYZ_PowerDown XYZ_PowerUp

77 jc/md/lp-01/05Principe des drivers77 DRIVER.def (2)

78 jc/md/lp-01/05Principe des drivers78 Code du Driver

79 jc/md/lp-01/05Principe des drivers79 Compléter le fichier.cpp Mettre les include pour les fichiers dentêtes Mettre les macros IOCTL Mettre les prototypes des fonctions Mettre toutes les fonctions

80 jc/md/lp-01/05Principe des drivers80 Fichiers dentêtes #include "StdAfx.h" #include //pour les macros

81 jc/md/lp-01/05Principe des drivers81 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)

82 jc/md/lp-01/05Principe des drivers82 ENTREE DU DRIVER BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { return TRUE; }

83 jc/md/lp-01/05Principe des drivers83 XYZ_Init DWORD XYZ_Init(DWORD dwContext) { DWORD dwRet = 1; RETAILMSG(1,(TEXT("DRIVER: XYZ_Init\n"))); return dwRet; }

84 jc/md/lp-01/05Principe des drivers84 XYZ_Deinit BOOL XYZ_Deinit(DWORD hDeviceContext) { RETAILMSG (1,(TEXT("DRIVER: XYZ_Deinit\n"))); return TRUE; }

85 jc/md/lp-01/05Principe des drivers85 XYZ_Open DWORD XYZ_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode) { DWORD dwRet = 1; RETAILMSG (1,(TEXT(" DRIVER: XYZ_Open\n"))); return dwRet; }

86 jc/md/lp-01/05Principe des drivers86 XYZ_Close BOOL XYZ_Close(DWORD hOpenContext) { RETAILMSG (1,(TEXT("DRIVER: XYZ_Close\n"))); return TRUE; }

87 jc/md/lp-01/05Principe des drivers87 XYZ_Read DWORD XYZ_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count) { DWORD dwRet = Count; RETAILMSG (1,(TEXT("DRIVER: XYZ_Read\n"))); return dwRet; }

88 jc/md/lp-01/05Principe des drivers88 XYZ_Write DWORD XYZ_Write(DWORD hOpenContext, LPCVOID pSourceBytes, DWORD NbOfBytes) { DWORD dwRet = NbOfBytes; RETAILMSG (1,(TEXT("DRIVER: XYZ_Write\n"))); return dwRet; }

89 jc/md/lp-01/05Principe des drivers89 XYZ_IOControl (1) BOOL XYZ_IOControl(DWORD hOpenContext, DWORD dwCode, PWCHAR pBufIn, DWORD dwLenIn, PWCHAR pBufOut, DWORD dwLenOut, PDWORD pdwActualOut) { BOOL bRet=FALSE;

90 jc/md/lp-01/05Principe des drivers90 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

91 jc/md/lp-01/05Principe des drivers91 XYZ_IOControl (3) *pdwActualOut = dwLenOut; return bRet; } //XYZ_IOControl

92 jc/md/lp-01/05Principe des drivers92 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 "))); }

93 jc/md/lp-01/05Principe des drivers93 XYZ_Seek DWORD XYZ_Seek(DWORD hOpenContext, long Amount, WORD Type) { DWORD dwRet = 1; RETAILMSG (1,(TEXT(" DRIVER: XYZ_Seek\n"))); return dwRet; }

94 jc/md/lp-01/05Principe des drivers94 Génération du driver

95 jc/md/lp-01/05Principe des drivers95 Image du noyau avec le driver

96 jc/md/lp-01/05Principe des drivers96 Application

97 jc/md/lp-01/05Principe des drivers97 Création de lapplication

98 jc/md/lp-01/05Principe des drivers98 WCE Application

99 jc/md/lp-01/05Principe des drivers99 Type de lapplication

100 jc/md/lp-01/05Principe des drivers100 Platform Settings

101 jc/md/lp-01/05Principe des drivers101 Application (1) : code fourni

102 jc/md/lp-01/05Principe des drivers102 Application (2) : directives #include "stdafx.h" #include #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

103 jc/md/lp-01/05Principe des drivers103 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;

104 jc/md/lp-01/05Principe des drivers104 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; }

105 jc/md/lp-01/05Principe des drivers105 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; }

106 jc/md/lp-01/05Principe des drivers106 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; }

107 jc/md/lp-01/05Principe des drivers107 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; }

108 jc/md/lp-01/05Principe des drivers108 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; }

109 jc/md/lp-01/05Principe des drivers109 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; }

110 jc/md/lp-01/05Principe des drivers110 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

111 jc/md/lp-01/05Principe des drivers111 Génération de lapplication

112 jc/md/lp-01/05Principe des drivers112 Lancement du noyau (avec driver)

113 jc/md/lp-01/05Principe des drivers113 TargetRun Program

114 jc/md/lp-01/05Principe des drivers114 Résultat de lexécution

115 jc/md/lp-01/05Principe des drivers115 Erreur XYY dans RegisterDevice

116 jc/md/lp-01/05Principe des drivers116 Procédure Terminer si besoin lapplication –Fermer la cible –Déconnecter lémulateur Introduire lerreur dans le code de lapplication : dans RegisterDevice : XYY au lieu de XYZ Générer lapplication modifiée Recharger lémulateur Relancer lapplication DRIVER_APP

117 jc/md/lp-01/05Principe des drivers117 Erreur dans RegisterDevice

118 jc/md/lp-01/05Principe des drivers118 Erreur XYY1 dans CreateFile Terminer si besoin lapplication –Fermer la cible –Déconnecter lémulateur Introduire lerreur dans le code de lapplication : –Supprimer lerreur dans RegisterDevice : remettre XYZ au lieu de XYY –Dans CreateFile : XYY1 au lieu de XYZ1 Générer lapplication modifiée Recharger lémulateur Relancer lapplication DRIVER_APP

119 jc/md/lp-01/05Principe des drivers119 Erreur 55 : ERROR_DEV_NOT_EXIT

120 jc/md/lp-01/05Principe des drivers120 Erreur : Pb Open

121 jc/md/lp-01/05Principe des drivers121 Exercice : erreur dans WriteFile Terminer si besoin lapplication –Fermer la cible –Déconnecter lémulateur Introduire lerreur dans le code de lapplication : –Idée : laisser lerreur dans CreateFile et appeler WriteFile avec le handle invalide Générer lapplication modifiée Recharger lémulateur Relancer lapplication DRIVER_APP

122 jc/md/lp-01/05Principe des drivers122 Conclusion Le driver simple fonctionne et nous fournit une base pour écrire un driver plus sophistiqué


Télécharger ppt "Jc/md/lp-01/05Principe des drivers1 Généralités sur les drivers Présentation."

Présentations similaires


Annonces Google