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

Preview:

Citation preview

jc/md/lp-01/05 gestion 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

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

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)

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

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

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

Structure du driver

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

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;

}

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;

}

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;

}

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;

}

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;

}

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)

{

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)

{

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

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

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

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

Génération du 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é 21

Application PTR_APP

Préparation

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é

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

Application (1)

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

Application (2)

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

Application (3)

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

Application (4)

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

Application (5)

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

Application PTR_APP

Code

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)

{

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

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

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;

}

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;

}

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

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;

}

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

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é 39

Exécution

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

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

Target→Ce Processes

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

Recommended