Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

46
jc/md/lp-01/05 Driver élémentaire : présentatio n 1 Driver élémentaire Émulateur Présentation

Transcript of Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

Page 1: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

jc/md/lp-01/05 Driver élémentaire : présentation 1

Driver élémentaireÉmulateur

Présentation

Page 2: Jc/md/lp-01/05Driver élémentaire : présentation1 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é

Page 3: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

jc/md/lp-01/05 Driver élémentaire : présentation 3

Création du driver

Page 4: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

jc/md/lp-01/05 Driver élémentaire : présentation 4

File→New Project or File

STRINGS_DRVCHOIX : dll

Page 5: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

jc/md/lp-01/05 Driver élémentaire : présentation 5

Choix du projet

Page 6: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

jc/md/lp-01/05 Driver élémentaire : présentation 6

Fichiers obtenus

Page 7: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

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

Page 8: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

jc/md/lp-01/05 Driver élémentaire : présentation 8

Création du fichier .def

Page 9: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

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

Page 10: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

jc/md/lp-01/05 Driver élémentaire : présentation 10

Platform→Settings

Page 11: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

jc/md/lp-01/05 Driver élémentaire : présentation 11

Structure du driver

Page 12: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

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];

Page 13: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

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)

Page 14: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

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;

}

Page 15: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

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;}

Page 16: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

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;

}

Page 17: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

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;

}

Page 18: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

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;

}

Page 19: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

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;}

Page 20: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

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

}

Page 21: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

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){

Page 22: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

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;

Page 23: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

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;

Page 24: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

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

Page 25: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

jc/md/lp-01/05 Driver élémentaire : présentation 25

Génération du driver

Page 26: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

jc/md/lp-01/05 Driver élémentaire : présentation 26

Image du noyau avec le driver

Page 27: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

jc/md/lp-01/05 Driver élémentaire : présentation 27

Création de l’application

Page 28: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

jc/md/lp-01/05 Driver élémentaire : présentation 28

File→New Project or File

Page 29: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

jc/md/lp-01/05 Driver élémentaire : présentation 29

WCE Application

Page 30: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

jc/md/lp-01/05 Driver élémentaire : présentation 30

Type de l’application

Page 31: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

jc/md/lp-01/05 Driver élémentaire : présentation 31

Application obtenue

Page 32: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

jc/md/lp-01/05 Driver élémentaire : présentation 32

Platform→Settings

Page 33: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

jc/md/lp-01/05 Driver élémentaire : présentation 33

Code de l’application

Page 34: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

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)

Page 35: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

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");

Page 36: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

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; }

Page 37: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

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;

}

Page 38: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

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; }

Page 39: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

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; }

Page 40: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

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;

}

Page 41: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

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;}

Page 42: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

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

Page 43: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

jc/md/lp-01/05 Driver élémentaire : présentation 43

Résultat à obtenir (1)

Page 44: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

jc/md/lp-01/05 Driver élémentaire : présentation 44

Résultat à obtenir (2)

Page 45: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

jc/md/lp-01/05 Driver élémentaire : présentation 45

Résultat à obtenir (3)

Page 46: Jc/md/lp-01/05Driver élémentaire : présentation1 Driver élémentaire Émulateur Présentation.

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