430 likes | 564 Views
Gestion mémoire. Corrigé. 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. Insertion du fichier PTR.h. Fichier PTR.h File →New Project or File Onglet Files →C/C++ Header File
E N D
Gestion mémoire Corrigé gestion mémoire : corrigé
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 gestion mémoire : corrigé
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 gestion mémoire : corrigé
PTR.h typedef struct { WCHAR *lpInBuffer; WCHAR *lpOutBuffer; }MYPTRS,*PMYPTRS; #define IOCTL_POINTEURS CTL_CODE( FILE_DEVICE_UNKNOWN, 2048, METHOD_BUFFERED, FILE_ANY_ACCESS) gestion mémoire : corrigé
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 gestion mémoire : corrigé
PTR_DRV.def LIBRARY PTR_DRV EXPORTS PTR_Init PTR_Deinit PTR_Open PTR_Close PTR_IOControl gestion mémoire : corrigé
Structure du driver gestion mémoire : corrigé
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]; gestion mémoire : corrigé
Entrée du driver //Entrée du driver BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { return TRUE; } gestion mémoire : corrigé
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; } gestion mémoire : corrigé
PTR_Deinit BOOL PTR_Deinit(DWORD hDeviceContext) { BOOL bRet = TRUE; RETAILMSG(1,(TEXT("PTR_DRV: PTR_Deinit\n"))); return bRet; } gestion mémoire : corrigé
PTR_Open DWORD PTR_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode) { DWORD dwRet = 1; RETAILMSG(1,(TEXT("PTR_DRV: PTR_Open\n"))); return dwRet; } gestion mémoire : corrigé
PTR_Close BOOL PTR_Close(DWORD hOpenContext) { BOOL bRet = TRUE; RETAILMSG(1,(TEXT("PTR_DRV: PTR_Close\n"))); return bRet; } gestion mémoire : corrigé
IOCTL (1) BOOL PTR_IOControl(DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut) { gestion mémoire : corrigé
IOCTL (2) //Déclarations unsigned int i; HANDLE hAppelant; BOOL bRet ; WCHAR *ptrAbs_in, *ptrAbs_out; switch(dwCode) { gestion mémoire : corrigé
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); gestion mémoire : corrigé
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 gestion mémoire : corrigé
IOCTL (5) bRet = TRUE; break; default: RETAILMSG(1,(TEXT("PTR_DRV: err IOCTL\n"))); bRet=FALSE; break; }// Fin du switch return bRet; } // Fin IOCTL gestion mémoire : corrigé
Génération du driver gestion mémoire : corrigé
Création de l’image noyau & driver gestion mémoire : corrigé
Application PTR_APP Préparation gestion mémoire : corrigé
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é gestion mémoire : corrigé
Application (1) gestion mémoire : corrigé
Application (2) gestion mémoire : corrigé
Application (3) gestion mémoire : corrigé
Application (4) gestion mémoire : corrigé
Application (5) gestion mémoire : corrigé
Application PTR_APP Code gestion mémoire : corrigé
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) { gestion mémoire : corrigé
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")); gestion mémoire : corrigé
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)); gestion mémoire : corrigé
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; } gestion mémoire : corrigé
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; } gestion mémoire : corrigé
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); gestion mémoire : corrigé
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; } gestion mémoire : corrigé
Génération de l’application gestion mémoire : corrigé
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 gestion mémoire : corrigé
Début de l’exécution gestion mémoire : corrigé
Exécution gestion mémoire : corrigé
Messages dans la fenêtre se sortie gestion mémoire : corrigé
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 gestion mémoire : corrigé
Target→Ce Processes gestion mémoire : corrigé
Conclusion • Première approche de l’organisation mémoire • Exemple pratique de communication d’adresses créées dynamiquement dans le slot 0 à un driver gestion mémoire : corrigé