Gestion mmoire Corrig jcmdlp0105 gestion mmoire corrig 1

  • Slides: 43
Download presentation
Gestion mémoire Corrigé jc/md/lp-01/05 gestion mémoire : corrigé 1

Gestion mémoire Corrigé jc/md/lp-01/05 gestion mémoire : corrigé 1

Objectif du chapitre • • Organisation de la mémoire Découpage en slots Rôle du

Objectif du chapitre • • Organisation de la mémoire Découpage en slots Rôle du slot 0 Passage d’adresses entre le slot 0 et le slot de l’application jc/md/lp-01/05 gestion mémoire : corrigé 2

Insertion du fichier PTR. h • Fichier PTR. h – – – File→New Project

Insertion du fichier PTR. h • Fichier PTR. h – – – File→New Project or File Onglet Files →C/C++ Header File Renseigner le champ nom : PTR. h Valider Entrer le texte du fichier • Ce fichier d’entête sera utilisé par PTR_DRV et par PTR_APP jc/md/lp-01/05 gestion mémoire : corrigé 3

PTR. h typedef struct { WCHAR *lp. In. Buffer; WCHAR *lp. Out. Buffer; }MYPTRS,

PTR. h typedef struct { WCHAR *lp. In. Buffer; WCHAR *lp. Out. Buffer; }MYPTRS, *PMYPTRS; #define IOCTL_POINTEURS CTL_CODE( FILE_DEVICE_UNKNOWN, 2048, METHOD_BUFFERED, FILE_ANY_ACCESS) jc/md/lp-01/05 gestion mémoire : corrigé 4

Insertion du fichier PTR_DRV. def • Fichier PTR_DRV. def – – – File→New Project

Insertion du fichier PTR_DRV. def • Fichier PTR_DRV. def – – – File→New Project or File Onglet Files →Text File Renseigner le champ nom : PTR_DRV. def Valider Entrer le texte du fichier jc/md/lp-01/05 gestion mémoire : corrigé 5

PTR_DRV. def LIBRARY PTR_DRV EXPORTS PTR_Init PTR_Deinit PTR_Open PTR_Close PTR_IOControl jc/md/lp-01/05 gestion mémoire :

PTR_DRV. def LIBRARY PTR_DRV EXPORTS PTR_Init PTR_Deinit PTR_Open PTR_Close PTR_IOControl jc/md/lp-01/05 gestion mémoire : corrigé 6

Structure du driver jc/md/lp-01/05 gestion mémoire : corrigé 7

Structure du driver jc/md/lp-01/05 gestion mémoire : corrigé 7

Entête du driver //Includes #include "stdafx. h" #include <tchar. h> #include <Pkfuncs. h> #include

Entête du driver //Includes #include "stdafx. h" #include <tchar. h> #include <Pkfuncs. h> #include <string. h> #include "PTR. h" //Définitions #define BUFSIZE 256 WCHAR Buffer[BUFSIZE]; jc/md/lp-01/05 gestion mémoire : corrigé 8

Entrée du driver //Entrée du driver BOOL APIENTRY Dll. Main( HANDLE h. Module, DWORD

Entrée du driver //Entrée du driver BOOL APIENTRY Dll. Main( HANDLE h. Module, DWORD ul_reason_for_call, LPVOID lp. Reserved) { return TRUE; } jc/md/lp-01/05 gestion mémoire : corrigé 9

PTR_Init DWORD PTR_Init(DWORD dw. Context) { DWORD dw. Ret =1; RETAILMSG(1, (TEXT("PTR_DRV: PTR_Initn"))); //

PTR_Init DWORD PTR_Init(DWORD dw. Context) { DWORD dw. Ret =1; RETAILMSG(1, (TEXT("PTR_DRV: PTR_Initn"))); // Initialisation du buffer de travail à zéro memset (Buffer, 0, BUFSIZE * sizeof(WCHAR)); return dw. Ret; } jc/md/lp-01/05 gestion mémoire : corrigé 10

PTR_Deinit BOOL PTR_Deinit(DWORD h. Device. Context) { BOOL b. Ret = TRUE; RETAILMSG(1, (TEXT("PTR_DRV:

PTR_Deinit BOOL PTR_Deinit(DWORD h. Device. Context) { BOOL b. Ret = TRUE; RETAILMSG(1, (TEXT("PTR_DRV: PTR_Deinitn"))); return b. Ret; } jc/md/lp-01/05 gestion mémoire : corrigé 11

PTR_Open DWORD PTR_Open(DWORD h. Device. Context, DWORD Access. Code, DWORD Share. Mode) { DWORD

PTR_Open DWORD PTR_Open(DWORD h. Device. Context, DWORD Access. Code, DWORD Share. Mode) { DWORD dw. Ret = 1; RETAILMSG(1, (TEXT("PTR_DRV: PTR_Openn"))); return dw. Ret; } jc/md/lp-01/05 gestion mémoire : corrigé 12

PTR_Close BOOL PTR_Close(DWORD h. Open. Context) { BOOL b. Ret = TRUE; RETAILMSG(1, (TEXT("PTR_DRV:

PTR_Close BOOL PTR_Close(DWORD h. Open. Context) { BOOL b. Ret = TRUE; RETAILMSG(1, (TEXT("PTR_DRV: PTR_Closen"))); return b. Ret; } jc/md/lp-01/05 gestion mémoire : corrigé 13

IOCTL (1) BOOL PTR_IOControl(DWORD h. Open. Context, DWORD dw. Code, PBYTE p. Buf. In,

IOCTL (1) BOOL PTR_IOControl(DWORD h. Open. Context, DWORD dw. Code, PBYTE p. Buf. In, DWORD dw. Len. In, PBYTE p. Buf. Out, DWORD dw. Len. Out, PDWORD pdw. Actual. Out) { jc/md/lp-01/05 gestion mémoire : corrigé 14

IOCTL (2) //Déclarations unsigned int i; HANDLE h. Appelant; BOOL b. Ret ; WCHAR

IOCTL (2) //Déclarations unsigned int i; HANDLE h. Appelant; BOOL b. Ret ; WCHAR *ptr. Abs_in, *ptr. Abs_out; switch(dw. Code) { jc/md/lp-01/05 gestion mémoire : corrigé 15

IOCTL (3) case IOCTL_POINTEURS: RETAILMSG(1, (TEXT("PTR_DRV: IOCTL_POINTEURS n"))); //Récupération du handle de l'appelant h.

IOCTL (3) case IOCTL_POINTEURS: RETAILMSG(1, (TEXT("PTR_DRV: IOCTL_POINTEURS n"))); //Récupération du handle de l'appelant h. Appelant=Get. Caller. Process(); //Mappage des adresses des pointeurs ptr. Abs_in=(WCHAR *)Map. Ptr. To. Process (((PMYPTRS)p. Buf. In)->lp. In. Buffer, h. Appelant); ptr. Abs_out=(WCHAR *)Map. Ptr. To. Process (((PMYPTRS)p. Buf. In)->lp. Out. Buffer, h. Appelant); jc/md/lp-01/05 gestion mémoire : corrigé 16

IOCTL (4) //Impression des valeurs des pointeurs remappés RETAILMSG(1, (TEXT("PTR_DRV: In. Buffer après remapping:

IOCTL (4) //Impression des valeurs des pointeurs remappés RETAILMSG(1, (TEXT("PTR_DRV: In. Buffer après remapping: %xn"), ptr. Abs_in)); RETAILMSG(1, (TEXT("PTR_DRV: Out. Buffer après remapping: %xn"), ptr. Abs_out)); wcscpy(Buffer, ptr. Abs_in); //lecture du buffer In for(i=0; i<wcslen(Buffer); i++) //modifiation Buffer[i]=(Buffer[i]+0 x 20); wcscpy (ptr. Abs_out, Buffer); //réécriture dans Out jc/md/lp-01/05 gestion mémoire : corrigé 17

IOCTL (5) b. Ret = TRUE; break; default: RETAILMSG(1, (TEXT("PTR_DRV: err IOCTLn"))); b. Ret=FALSE;

IOCTL (5) b. Ret = TRUE; break; default: RETAILMSG(1, (TEXT("PTR_DRV: err IOCTLn"))); b. Ret=FALSE; break; }// Fin du switch return b. Ret; } // Fin IOCTL jc/md/lp-01/05 gestion mémoire : corrigé 18

Génération du driver jc/md/lp-01/05 gestion mémoire : corrigé 19

Génération du driver jc/md/lp-01/05 gestion mémoire : corrigé 19

Création de l’image noyau & driver jc/md/lp-01/05 gestion mémoire : corrigé 20

Création de l’image noyau & driver jc/md/lp-01/05 gestion mémoire : corrigé 20

Application PTR_APP Préparation jc/md/lp-01/05 gestion mémoire : corrigé 21

Application PTR_APP Préparation jc/md/lp-01/05 gestion mémoire : corrigé 21

Application à réaliser • L’application créera 2 buffers prévus pour des textes codés en

Application à réaliser • L’application créera 2 buffers prévus pour des textes codés en unicode : In et Out • In contiendra un texte en majuscule • Out contiendra XXXXX • L’application passera au driver une structure contenant l’adresse de ces 2 buffers • Un IOCTL modifiera le buffer OUT • L’application imprimera le buffer modifié jc/md/lp-01/05 gestion mémoire : corrigé 22

Application (1) jc/md/lp-01/05 gestion mémoire : corrigé 23

Application (1) jc/md/lp-01/05 gestion mémoire : corrigé 23

Application (2) jc/md/lp-01/05 gestion mémoire : corrigé 24

Application (2) jc/md/lp-01/05 gestion mémoire : corrigé 24

Application (3) jc/md/lp-01/05 gestion mémoire : corrigé 25

Application (3) jc/md/lp-01/05 gestion mémoire : corrigé 25

Application (4) jc/md/lp-01/05 gestion mémoire : corrigé 26

Application (4) jc/md/lp-01/05 gestion mémoire : corrigé 26

Application (5) jc/md/lp-01/05 gestion mémoire : corrigé 27

Application (5) jc/md/lp-01/05 gestion mémoire : corrigé 27

Application PTR_APP Code jc/md/lp-01/05 gestion mémoire : corrigé 28

Application PTR_APP Code jc/md/lp-01/05 gestion mémoire : corrigé 28

Entête de l’application //Include et définitions #include "stdafx. h" #include <Pkfuncs. h> #include "PTR.

Entête de l’application //Include et définitions #include "stdafx. h" #include <Pkfuncs. h> #include "PTR. h" #define BUFFER_SIZE 256 int WINAPI Win. Main(HINSTANCE h. Instance, HINSTANCE h. Prev. Instance, LPTSTR lp. Cmd. Line, int n. Cmd. Show) { jc/md/lp-01/05 gestion mémoire : corrigé 29

Création et initialisation des buffers HANDLE h. Driver, h. Ptr; //Définition de la structure

Création et initialisation des buffers HANDLE h. Driver, h. Ptr; //Définition de la structure de donnée MYPTRS ptr. Loc; //Allocation de buffers In et Out (fonction new) ptr. Loc. lp. In. Buffer = new WCHAR[BUFFER_SIZE]; ptr. Loc. lp. Out. Buffer = new WCHAR[BUFFER_SIZE]; //Initialisation des 2 buffers (wcscpy) wcscpy( ptr. Loc. lp. In. Buffer, _T("AH QUE COUCOU DANS APPLICATION ")); wcscpy (ptr. Loc. lp. Out. Buffer, _T("XXXXXXXXXX")); jc/md/lp-01/05 gestion mémoire : corrigé 30

Impression des diverses adresses //Affichage du buffer de sortie (Message. Box) Message. Box(NULL, ptr.

Impression des diverses adresses //Affichage du buffer de sortie (Message. Box) Message. Box(NULL, ptr. Loc. lp. Out. Buffer, TEXT("PTR_APP Out. Buffer initial"), MB_OK); //Impression des adresses des buffers (RETAILMSG) RETAILMSG(1, (TEXT("PTR_APP: In. Buffer avant remapping : xn"), ptr. Loc. lp. In. Buffer)); RETAILMSG(1, (TEXT("PTR_APP: Out. Buffer avant remapping: xn"), ptr. Loc. lp. Out. Buffer)); jc/md/lp-01/05 gestion mémoire : corrigé 31

Chargement du driver //Chargement du driver (Register. Device) h. Driver=Register. Device(_T("PTR"), 1, _T("PTR_DRV. dll"),

Chargement du driver //Chargement du driver (Register. Device) h. Driver=Register. Device(_T("PTR"), 1, _T("PTR_DRV. dll"), 0); if(h. Driver ==NULL) { Message. Box(NULL, _T("Pb au load de PTR_DRV. dll"), _T("PTR_APP"), MB_OK); return 0; } jc/md/lp-01/05 gestion mémoire : corrigé 32

Ouverture du driver //Ouverture du driver en accés Read/Write h. Ptr=Create. File(TEXT("PTR 1: "),

Ouverture du driver //Ouverture du driver en accés Read/Write h. Ptr=Create. File(TEXT("PTR 1: "), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0); if (INVALID_HANDLE_VALUE == h. Ptr) { Message. Box(NULL, _T("Pb Open driver: "), _T("PTR_APP"), MB_OK); //Déchargement du driver Deregister. Device(h. Driver); Close. Handle(h. Driver); return 0; } jc/md/lp-01/05 gestion mémoire : corrigé 33

Appel IOCTL //Appel de l'IOCTL Device. Io. Control(h. Ptr, IOCTL_POINTEURS, &ptr. Loc, sizeof(ptr. Loc),

Appel IOCTL //Appel de l'IOCTL Device. Io. Control(h. Ptr, IOCTL_POINTEURS, &ptr. Loc, sizeof(ptr. Loc), NULL, 0, NULL); //Affichage du buffer de sortie modifié Message. Box(NULL, ptr. Loc. lp. Out. Buffer, TEXT("PTR_APP Out. Buffer modifié"), MB_OK); jc/md/lp-01/05 gestion mémoire : corrigé 34

Fin de l’application //Libération des buffers delete (ptr. Loc. lp. In. Buffer); delete (ptr.

Fin de l’application //Libération des buffers delete (ptr. Loc. lp. In. Buffer); delete (ptr. Loc. lp. Out. Buffer); //Déchargement et fermeture du driver Close. Handle(h. Ptr); Deregister. Device(h. Driver); Close. Handle(h. Driver); return 0; } jc/md/lp-01/05 gestion mémoire : corrigé 35

Génération de l’application jc/md/lp-01/05 gestion mémoire : corrigé 36

Génération de l’application jc/md/lp-01/05 gestion mémoire : corrigé 36

Exécution de l’application • Télécharger dans la cible l’image du noyau avec le driver

Exécution de l’application • Télécharger dans la cible l’image du noyau avec le driver STR_DRV • Lancer l’application Target→Run Program→STR_APP jc/md/lp-01/05 gestion mémoire : corrigé 37

Début de l’exécution jc/md/lp-01/05 gestion mémoire : corrigé 38

Début de l’exécution jc/md/lp-01/05 gestion mémoire : corrigé 38

Exécution jc/md/lp-01/05 gestion mémoire : corrigé 39

Exécution jc/md/lp-01/05 gestion mémoire : corrigé 39

Messages dans la fenêtre se sortie jc/md/lp-01/05 gestion mémoire : corrigé 40

Messages dans la fenêtre se sortie jc/md/lp-01/05 gestion mémoire : corrigé 40

Adresses avant et après remapping PTR_APP: In. Buffer avant remapping: 30050 PTR_APP: Out. Buffer

Adresses avant et après remapping PTR_APP: In. Buffer avant remapping: 30050 PTR_APP: Out. Buffer avant remapping: 30260 PTR_DRV: In. Buffer après remapping: 12030050 PTR_DRV: Out. Buffer après remapping: 12030260 jc/md/lp-01/05 gestion mémoire : corrigé 41

Target→Ce Processes jc/md/lp-01/05 gestion mémoire : corrigé 42

Target→Ce Processes jc/md/lp-01/05 gestion mémoire : corrigé 42

Conclusion • Première approche de l’organisation mémoire • Exemple pratique de communication d’adresses créées

Conclusion • Première approche de l’organisation mémoire • Exemple pratique de communication d’adresses créées dynamiquement dans le slot 0 à un driver jc/md/lp-01/05 gestion mémoire : corrigé 43