jc/md/lp-01/05 Driver élémentaire : présentation 1
Driver élémentaireÉmulateur
Présentation
jc/md/lp-01/05 Driver élémentaire : présentation 2
Objectif du chapitre
• Sous une plate-forme de type Industrial Controler préparer un driver « STR » capable de gérer un buffer en mémoire
• Écrire une chaîne de caractères en majuscules dans le buffer du driver par STR_Write
• Lire le buffer par STR_Read• Modifier le buffer par des STR_IOControl (par
exemple, passage majuscule/minuscule, cryptage)
• Renvoyer le buffer modifié
jc/md/lp-01/05 Driver élémentaire : présentation 3
Création du driver
jc/md/lp-01/05 Driver élémentaire : présentation 4
File→New Project or File
STRINGS_DRVCHOIX : dll
jc/md/lp-01/05 Driver élémentaire : présentation 5
Choix du projet
jc/md/lp-01/05 Driver élémentaire : présentation 6
Fichiers obtenus
jc/md/lp-01/05 Driver élémentaire : présentation 7
Fonctions du driver
• On créera les fonctions :STR_InitSTR_DeinitSTR_OpenSTR_CloseSTR_ReadSTR_WriteSTR_IOControl
jc/md/lp-01/05 Driver élémentaire : présentation 8
Création du fichier .def
jc/md/lp-01/05 Driver élémentaire : présentation 9
STRINGS_DRV.def
LIBRARY STRINGS_DRV EXPORTS STR_Init
STR_Deinit STR_Open STR_Close STR_Read STR_Write STR_IOControl
jc/md/lp-01/05 Driver élémentaire : présentation 10
Platform→Settings
jc/md/lp-01/05 Driver élémentaire : présentation 11
Structure du driver
jc/md/lp-01/05 Driver élémentaire : présentation 12
En-tête du driver
// Fichiers d’en-têtes .h nécessaires
#include…
// Buffer de travail (unicode)
#define BUFSIZE 256
WCHAR wcBuffer[BUFSIZE];
jc/md/lp-01/05 Driver élémentaire : présentation 13
Définition des IOCTL
// Définition des IOCTL
#define IOCTL_TOLOWER \
CTL_CODE(FILE_DEVICE_UNKNOWN,2048,\
METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_CRYPTO \
CTL_CODE(FILE_DEVICE_UNKNOWN,2049,\
METHOD_BUFFERED,FILE_ANY_ACCESS)
jc/md/lp-01/05 Driver élémentaire : présentation 14
Entrée du driver
BOOL APIENTRY DllMain(HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved)
{
return TRUE;
}
jc/md/lp-01/05 Driver élémentaire : présentation 15
Driver Init
DWORD STR_Init(DWORD dwContext){ DWORD dwRet = 1; RETAILMSG(1,(TEXT("STRINGS: STR_Init\n")));
// Mise à zéro du buffer avec memset() // TODO
return dwRet;}
jc/md/lp-01/05 Driver élémentaire : présentation 16
Driver Deinit
BOOL STR_Deinit(DWORD hDeviceContext)
{
RETAILMSG(1,(TEXT("STRINGS: STR_Deinit\n")));
return TRUE;
}
jc/md/lp-01/05 Driver élémentaire : présentation 17
Driver Open
DWORD STR_Open(DWORD hDeviceContext,
DWORD AccessCode,
DWORD ShareMode)
{
DWORD dwRet = 1;
RETAILMSG(1,(TEXT("STRINGS: STR_Open\n")));
return dwRet;
}
jc/md/lp-01/05 Driver élémentaire : présentation 18
Driver Close
BOOL STR_Close(DWORD hOpenContext)
{
RETAILMSG(1,(TEXT("STRINGS: STR_Close\n")));
return TRUE;
}
jc/md/lp-01/05 Driver élémentaire : présentation 19
Driver Read
DWORD STR_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count){ // TODO // Copie de wcBuffer dans le buffer d’adresse
pBuffer avec wcsncpy() // Retour : nombre de caractères lus return dwRet;}
jc/md/lp-01/05 Driver élémentaire : présentation 20
Driver Write
DWORD STR_Write(DWORD hOpenContext,
LPCVOID pBuffer,DWORD NbOfBytes)
{
DWORD dwRet = NbOfBytes;
// TODO
// Copie du buffer d’adresse pBuffer dans wcBuffer avec wcsncpy()
return dwRet; //nombre de caractères écrits
}
jc/md/lp-01/05 Driver élémentaire : présentation 21
Driver IOCTL (1)
BOOL STR_IOControl(DWORD hOpenContext, DWORD dwCode, PWCHAR pBufIn, DWORD dwLenIn, PWCHAR pBufOut, DWORD dwLenOut, PDWORD pdwActualOut){ BOOL bRet;
switch(dwCode){
jc/md/lp-01/05 Driver élémentaire : présentation 22
Driver IOCTL (2)
case IOCTL_TOLOWER: // TODO // Mettre dans le buffer d’adresse pBufOut
le contenu de wcBuffer en minuscule // Chaque lettre en majuscule est transformée
en minuscule par ajout de 0x20 à chaque caractère
bRet=TRUE; break;
jc/md/lp-01/05 Driver élémentaire : présentation 23
Driver IOCTL (3)
case IOCTL_CRYPTO: // TODO // Écrire dans le buffer d’adresse pBufOut le contenu de wcBuffer encrypté // On fera un codage fictif en utilisant la fonction rand() modulo 128
bRet=TRUE;break;
jc/md/lp-01/05 Driver élémentaire : présentation 24
Driver IOCTL (4)
} // switch
*pdwActualOut = dwLenOut;
RETAILMSG(1,(TEXT("STRINGS: STR_IOControl\n")));
return bRet;
} //STR_IOControl
jc/md/lp-01/05 Driver élémentaire : présentation 25
Génération du driver
jc/md/lp-01/05 Driver élémentaire : présentation 26
Image du noyau avec le driver
jc/md/lp-01/05 Driver élémentaire : présentation 27
Création de l’application
jc/md/lp-01/05 Driver élémentaire : présentation 28
File→New Project or File
jc/md/lp-01/05 Driver élémentaire : présentation 29
WCE Application
jc/md/lp-01/05 Driver élémentaire : présentation 30
Type de l’application
jc/md/lp-01/05 Driver élémentaire : présentation 31
Application obtenue
jc/md/lp-01/05 Driver élémentaire : présentation 32
Platform→Settings
jc/md/lp-01/05 Driver élémentaire : présentation 33
Code de l’application
jc/md/lp-01/05 Driver élémentaire : présentation 34
Application (1)
// TODO
// Fichiers d’en-têtes nécessaires
#include…
#define IOCTL_TOLOWER \
CTL_CODE(FILE_DEVICE_UNKNOWN,2048,\ METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_CRYPTO \
CTL_CODE(FILE_DEVICE_UNKNOWN,2049,\
METHOD_BUFFERED,FILE_ANY_ACCESS)
jc/md/lp-01/05 Driver élémentaire : présentation 35
Application (2)
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow){ // TODO
// Définitions et initialisations
WCHAR* pString = TEXT("HA QUE COUCOU DANS LA MACHINE");
jc/md/lp-01/05 Driver élémentaire : présentation 36
Application (3)
// TODO
// Chargement du driver avec RegisterDevice()
// Retourne hDevice ou 0 si il y a une erreur
if(hDevice == 0) { MessageBox(NULL, _T(" Pb Register: "),
_T("StringApp"),MB_OK); return 0; }
jc/md/lp-01/05 Driver élémentaire : présentation 37
Application (4)
// TODO // Ouverture du driver avec CreateFile(), // Retourne hString, INVALID_HANDLE_VALUE si erreur if(hString == INVALID_HANDLE_VALUE) { MessageBox(NULL, _T("Pb open"),
_T("StringApp"),MB_OK); // TODO
// DeregisterDevice et fermeture des handles return 0;
}
jc/md/lp-01/05 Driver élémentaire : présentation 38
Application (5)
// TODO // Écriture de la chaine avec WriteFile(), // Retourne dwErreur égal à 0 s’il y a une erreur
if (dwErreur == 0){
// TODO MessageBox(NULL, _T("Pb Write: "),
_T("StringApp"),MB_OK); // DeregisterDevice et fermeture des handles
return 0; }
jc/md/lp-01/05 Driver élémentaire : présentation 39
Application (6)
// TODO // Lecture de la chaine avec ReadFile() // Retourne dwErreur égal à -1 s’il y a une erreur
if(dwErreur == -1) {
MessageBox(NULL, _T("Pb Read: "), _T("StringApp"),MB_OK);
// TODO // DeregisterDevice et fermeture des handles
return 0; }
jc/md/lp-01/05 Driver élémentaire : présentation 40
Application (7)
// TODO // Impression de ce qui a été lu avec MessageBox // Appel de l'IOCTL TOLOWER avec DeviceIoControl() // Retourne dwErreur égal à 0 s’il y a une erreur
if(dwErreur == 0) { MessageBox(NULL, _T("Pb TOLOWER: "), _T("StringApp"),MB_OK);
// TODO // DeregisterDevice et fermeture des handles return 0;
}
jc/md/lp-01/05 Driver élémentaire : présentation 41
Application (8)
// TODO // Affichage de la chaîne reçue avec MessageBox // Appel de l'IOCTL CRYPTO avec DeviceIoControl() // Retourne dwErreur égal à 0 s’il y a une erreur
if(dwErreur == 0){ MessageBox(NULL, _T("Pb CRYPTO"), _T("StringApp"),MB_OK);
// TODO // DeregisterDevice et fermeture des handles
return 0;}
jc/md/lp-01/05 Driver élémentaire : présentation 42
Application (9)
// TODO
// Affichage de la chaîne cryptée avec MessageBox
// DeregisterDevice et fermeture des handles
return 0;
} // WinMain
jc/md/lp-01/05 Driver élémentaire : présentation 43
Résultat à obtenir (1)
jc/md/lp-01/05 Driver élémentaire : présentation 44
Résultat à obtenir (2)
jc/md/lp-01/05 Driver élémentaire : présentation 45
Résultat à obtenir (3)
jc/md/lp-01/05 Driver élémentaire : présentation 46
Conclusion
• Les principales fonctions d’un driver ont été activée sur un exemple
Top Related