1.24k likes | 1.45k Vues
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
E N D
Généralités sur les drivers Présentation Principe des drivers
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 Principe des drivers
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 Principe des drivers
Système de base NOYAU (1) • Principaux blocs constitutifs KERNEL GWES DEVICE MANAGER FILESYS DEVICE DRIVERS OAL Principe des drivers
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 Principe des drivers
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) Principe des drivers
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. Principe des drivers
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 Principe des drivers
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 » Principe des drivers
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. Principe des drivers
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 Principe des drivers
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 Principe des drivers
Fonctions d’un driver • XXX_Init • XXX_Deinit • XXX_Open • XXX_Close • XXX_Read • XXX_Write • XXX_IoControl • XXX_Seek • XXX_PowerUp • XXX_PowerDown Principe des drivers
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 Principe des drivers
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. Principe des drivers
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 Principe des drivers
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 Principe des drivers
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 Principe des drivers
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. Principe des drivers
Fonction DeregisterDevice • Supprime l’enregistrement dans la registry du driver • Appelle la fonction XXX_Deinit • Remplacée par DeactivateDevice Principe des drivers
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. Principe des drivers
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 Principe des drivers
Fonction XXX_Open DWORDXXX_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. Principe des drivers
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à Principe des drivers
Fonction CreateFile (1) HANDLECreateFile( LPCTSTRlpFileName, DWORDdwDesiredAccess, DWORDdwShareMode, LPSECURITY_ATTRIBUTESlpSecurityAttributes, DWORDdwCreationDispostion, DWORDdwFlagsAndAttributes, HANDLEhTemplateFile); Parameters Principe des drivers
Fonction CreateFile (2) lpFileName [in] Pointer to a null-terminated string that specifiesthe 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 Principe des drivers
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. Principe des drivers
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. Principe des drivers
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… Principe des drivers
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) Principe des drivers
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. Principe des drivers
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 l’operating system en réponse à un appel par l’application de la fonction CloseHandle Principe des drivers
Fonction CloseHandle BOOLCloseHandle( HANDLEhObject); 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 Principe des drivers
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 Principe des drivers
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. Principe des drivers
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 Principe des drivers
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. Principe des drivers
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. Principe des drivers
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 Principe des drivers
Fonction XXX_Write DWORDXXX_Write(DWORD hOpenContext, LPCVOIDpBuffer,DWORDCount); 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. Principe des drivers
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 Principe des drivers
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. Principe des drivers
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. Principe des drivers
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 Principe des drivers
Fonction XXX_Seek (1) DWORDXXX_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. Principe des drivers
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. Principe des drivers
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 Principe des drivers
Fonction SetFilePointer (1) DWORDSetFilePointer( HANDLEhFile, LONGlDistanceToMove, PLONGlpDistanceToMoveHigh, DWORDdwMoveMethod); 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. Principe des drivers
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. Principe des drivers
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 Principe des drivers