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

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

Embed Size (px)

Citation preview

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

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

Gestion mémoire

Corrigé

Page 2: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 2

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

Page 3: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 3

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

Page 4: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 4

PTR.h

typedef struct

{

WCHAR *lpInBuffer;

WCHAR *lpOutBuffer;

}MYPTRS,*PMYPTRS;

#define IOCTL_POINTEURS CTL_CODE( FILE_DEVICE_UNKNOWN, 2048, METHOD_BUFFERED, FILE_ANY_ACCESS)

Page 5: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 5

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

Page 6: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 6

PTR_DRV.def

LIBRARY PTR_DRV

EXPORTS

PTR_Init

PTR_Deinit

PTR_Open

PTR_Close

PTR_IOControl

Page 7: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

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

Structure du driver

Page 8: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 8

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

Page 9: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 9

Entrée du driver

//Entrée du driver

BOOL APIENTRY DllMain( HANDLE hModule,

DWORD ul_reason_for_call,

LPVOID lpReserved)

{

return TRUE;

}

Page 10: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 10

PTR_Init

DWORD PTR_Init(DWORD dwContext)

{

DWORD dwRet =1;

RETAILMSG(1,(TEXT("PTR_DRV: PTR_Init\n")));

// Initialisation du buffer de travail à zéro

memset (Buffer, 0, BUFSIZE * sizeof(WCHAR));

return dwRet;

}

Page 11: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 11

PTR_Deinit

BOOL PTR_Deinit(DWORD hDeviceContext)

{

BOOL bRet = TRUE;

RETAILMSG(1,(TEXT("PTR_DRV: PTR_Deinit\n")));

return bRet;

}

Page 12: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 12

PTR_Open

DWORD PTR_Open(DWORD hDeviceContext, DWORD

AccessCode, DWORD ShareMode)

{

DWORD dwRet = 1;

RETAILMSG(1,(TEXT("PTR_DRV: PTR_Open\n")));

return dwRet;

}

Page 13: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 13

PTR_Close

BOOL PTR_Close(DWORD hOpenContext)

{

BOOL bRet = TRUE;

RETAILMSG(1,(TEXT("PTR_DRV: PTR_Close\n")));

return bRet;

}

Page 14: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 14

IOCTL (1)

BOOL PTR_IOControl(DWORD hOpenContext,

DWORD dwCode,

PBYTE pBufIn,

DWORD dwLenIn,

PBYTE pBufOut,

DWORD dwLenOut,

PDWORD pdwActualOut)

{

Page 15: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 15

IOCTL (2)

//Déclarations

unsigned int i;

HANDLE hAppelant;

BOOL bRet ;

WCHAR *ptrAbs_in, *ptrAbs_out;

switch(dwCode)

{

Page 16: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 16

IOCTL (3)

case IOCTL_POINTEURS:

RETAILMSG(1,(TEXT("PTR_DRV: IOCTL_POINTEURS \n")));

//Récupération du handle de l'appelant

hAppelant=GetCallerProcess();

//Mappage des adresses des pointeurs

ptrAbs_in=(WCHAR *)MapPtrToProcess

(((PMYPTRS)pBufIn)->lpInBuffer,hAppelant);

ptrAbs_out=(WCHAR *)MapPtrToProcess

(((PMYPTRS)pBufIn)->lpOutBuffer, hAppelant);

Page 17: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 17

IOCTL (4)

//Impression des valeurs des pointeurs remappés

RETAILMSG(1,(TEXT("PTR_DRV: InBuffer après

remapping:%x\n"), ptrAbs_in));

RETAILMSG(1,(TEXT("PTR_DRV: OutBuffer après

remapping:%x\n"),ptrAbs_out));

wcscpy(Buffer,ptrAbs_in); //lecture du buffer In

for(i=0;i<wcslen(Buffer);i++) //modifiation

Buffer[i]=(Buffer[i]+0x20);

wcscpy (ptrAbs_out,Buffer); //réécriture dans Out

Page 18: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 18

IOCTL (5)

bRet = TRUE; break;

default: RETAILMSG(1,(TEXT("PTR_DRV: err

IOCTL\n")));

bRet=FALSE; break;

}// Fin du switch return bRet;} // Fin IOCTL

Page 19: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 19

Génération du driver

Page 20: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 20

Création de l’image noyau & driver

Page 21: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 21

Application PTR_APP

Préparation

Page 22: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 22

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 XXXXXXXXX• 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é

Page 23: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 23

Application (1)

Page 24: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 24

Application (2)

Page 25: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 25

Application (3)

Page 26: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 26

Application (4)

Page 27: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 27

Application (5)

Page 28: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

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

Application PTR_APP

Code

Page 29: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 29

Entête de l’application

//Include et définitions

#include "stdafx.h"

#include <Pkfuncs.h>

#include "PTR.h"

#define BUFFER_SIZE 256

int WINAPI WinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPTSTR lpCmdLine,

int nCmdShow)

{

Page 30: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 30

Création et initialisation des buffers

HANDLE hDriver,hPtr;//Définition de la structure de donnée

MYPTRS ptrLoc; //Allocation de buffers In et Out (fonction new)

ptrLoc.lpInBuffer = new WCHAR[BUFFER_SIZE];ptrLoc.lpOutBuffer = new WCHAR[BUFFER_SIZE];

//Initialisation des 2 buffers (wcscpy)

wcscpy( ptrLoc.lpInBuffer, _T("AH QUE COUCOU DANS APPLICATION "));

wcscpy (ptrLoc.lpOutBuffer, _T("XXXXXXXXXXXXXXXXXXXX"));

Page 31: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 31

Impression des diverses adresses

//Affichage du buffer de sortie (MessageBox)

MessageBox(NULL, ptrLoc.lpOutBuffer, TEXT("PTR_APP OutBuffer initial"), MB_OK);

//Impression des adresses des buffers (RETAILMSG)

RETAILMSG(1,(TEXT("PTR_APP: InBuffer avant

remapping :x\n"),ptrLoc.lpInBuffer));

RETAILMSG(1,(TEXT("PTR_APP: OutBuffer avant

remapping:x\n"),ptrLoc.lpOutBuffer));

Page 32: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 32

Chargement du driver

//Chargement du driver (RegisterDevice)

hDriver=RegisterDevice(_T("PTR"),1,_T("PTR_DRV.dll"),0);

if(hDriver ==NULL)

{

MessageBox(NULL, _T("Pb au load de PTR_DRV.dll"),_T("PTR_APP"), MB_OK);

return 0;

}

Page 33: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 33

Ouverture du driver

//Ouverture du driver en accés Read/Write hPtr=CreateFile(TEXT("PTR1:"), GENERIC_READ |

GENERIC_WRITE, 0, NULL,OPEN_EXISTING,0,0); if (INVALID_HANDLE_VALUE == hPtr) { MessageBox(NULL, _T("Pb Open driver:"),

_T("PTR_APP"), MB_OK); //Déchargement du driver DeregisterDevice(hDriver);

CloseHandle(hDriver); return 0;

}

Page 34: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 34

Appel IOCTL

//Appel de l'IOCTL

DeviceIoControl(hPtr,IOCTL_POINTEURS,&ptrLoc,sizeof(ptrLoc),NULL,0,NULL,NULL);

//Affichage du buffer de sortie modifié

MessageBox(NULL, ptrLoc.lpOutBuffer, TEXT("PTR_APP OutBuffer modifié"),MB_OK);

Page 35: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 35

Fin de l’application

//Libération des buffers

delete (ptrLoc.lpInBuffer);

delete (ptrLoc.lpOutBuffer);

//Déchargement et fermeture du driver

CloseHandle(hPtr);

DeregisterDevice(hDriver);

CloseHandle(hDriver);

return 0;

}

Page 36: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 36

Génération de l’application

Page 37: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 37

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

Page 38: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 38

Début de l’exécution

Page 39: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

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

Exécution

Page 40: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 40

Messages dans la fenêtre se sortie

Page 41: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 41

Adresses avant et après remapping

PTR_APP: InBuffer avant remapping:30050

PTR_APP: OutBuffer avant remapping:30260

PTR_DRV: InBuffer après remapping:12030050

PTR_DRV: OutBuffer après remapping:12030260

Page 42: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 42

Target→Ce Processes

Page 43: Jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé

jc/md/lp-01/05 gestion mémoire : corrigé 43

Conclusion

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

créées dynamiquement dans le slot 0 à un driver