jc/md/lp-01/05gestion mémoire : corrigé1 gestion mémoire corrigé
TRANSCRIPT
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