Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parIrénée Thomas Modifié depuis plus de 10 années
1
jc/md/lp-01/05gestion mémoire : corrigé1 Gestion mémoire Corrigé
2
jc/md/lp-01/05gestion mémoire : corrigé2 Objectif du chapitre Organisation de la mémoire Découpage en slots Rôle du slot 0 Passage dadresses entre le slot 0 et le slot de lapplication
3
jc/md/lp-01/05gestion mémoire : corrigé3 Insertion du fichier PTR.h Fichier PTR.h –FileNew Project or File –Onglet Files –C/C++ Header File –Renseigner le champ nom : PTR.h –Valider –Entrer le texte du fichier Ce fichier dentête sera utilisé par PTR_DRV et par PTR_APP
4
jc/md/lp-01/05gestion 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)
5
jc/md/lp-01/05gestion mémoire : corrigé5 Insertion du fichier PTR_DRV.def Fichier PTR_DRV.def –FileNew Project or File –Onglet Files –Text File –Renseigner le champ nom : PTR_DRV.def –Valider –Entrer le texte du fichier
6
jc/md/lp-01/05gestion mémoire : corrigé6 PTR_DRV.def LIBRARY PTR_DRV EXPORTS PTR_Init PTR_Deinit PTR_Open PTR_Close PTR_IOControl
7
jc/md/lp-01/05gestion mémoire : corrigé7 Structure du driver
8
jc/md/lp-01/05gestion mémoire : corrigé8 Entête du driver //Includes #include "stdafx.h" #include #include "PTR.h" //Définitions #define BUFSIZE 256 WCHAR Buffer[BUFSIZE];
9
jc/md/lp-01/05gestion 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; }
10
jc/md/lp-01/05gestion 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; }
11
jc/md/lp-01/05gestion mémoire : corrigé11 PTR_Deinit BOOL PTR_Deinit(DWORD hDeviceContext) { BOOL bRet = TRUE; RETAILMSG(1,(TEXT("PTR_DRV: PTR_Deinit\n"))); return bRet; }
12
jc/md/lp-01/05gestion 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; }
13
jc/md/lp-01/05gestion mémoire : corrigé13 PTR_Close BOOL PTR_Close(DWORD hOpenContext) { BOOL bRet = TRUE; RETAILMSG(1,(TEXT("PTR_DRV: PTR_Close\n"))); return bRet; }
14
jc/md/lp-01/05gestion mémoire : corrigé14 IOCTL (1) BOOL PTR_IOControl(DWORD hOpenContext, DWORD dwCode, PBYTE pBufIn, DWORD dwLenIn, PBYTE pBufOut, DWORD dwLenOut, PDWORD pdwActualOut) {
15
jc/md/lp-01/05gestion mémoire : corrigé15 IOCTL (2) //Déclarations unsigned int i; HANDLE hAppelant; BOOL bRet ; WCHAR *ptrAbs_in, *ptrAbs_out; switch(dwCode) {
16
jc/md/lp-01/05gestion 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);
17
jc/md/lp-01/05gestion 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
18
jc/md/lp-01/05gestion 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
19
jc/md/lp-01/05gestion mémoire : corrigé19 Génération du driver
20
jc/md/lp-01/05gestion mémoire : corrigé20 Création de limage noyau & driver
21
jc/md/lp-01/05gestion mémoire : corrigé21 Application PTR_APP Préparation
22
jc/md/lp-01/05gestion mémoire : corrigé22 Application à réaliser Lapplication 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 Lapplication passera au driver une structure contenant ladresse de ces 2 buffers Un IOCTL modifiera le buffer OUT Lapplication imprimera le buffer modifié
23
jc/md/lp-01/05gestion mémoire : corrigé23 Application (1)
24
jc/md/lp-01/05gestion mémoire : corrigé24 Application (2)
25
jc/md/lp-01/05gestion mémoire : corrigé25 Application (3)
26
jc/md/lp-01/05gestion mémoire : corrigé26 Application (4)
27
jc/md/lp-01/05gestion mémoire : corrigé27 Application (5)
28
jc/md/lp-01/05gestion mémoire : corrigé28 Application PTR_APP Code
29
jc/md/lp-01/05gestion mémoire : corrigé29 Entête de lapplication //Include et définitions #include "stdafx.h" #include #include "PTR.h" #define BUFFER_SIZE 256 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) {
30
jc/md/lp-01/05gestion 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"));
31
jc/md/lp-01/05gestion 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));
32
jc/md/lp-01/05gestion 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; }
33
jc/md/lp-01/05gestion 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; }
34
jc/md/lp-01/05gestion 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);
35
jc/md/lp-01/05gestion mémoire : corrigé35 Fin de lapplication //Libération des buffers delete (ptrLoc.lpInBuffer); delete (ptrLoc.lpOutBuffer); //Déchargement et fermeture du driver CloseHandle(hPtr); DeregisterDevice(hDriver); CloseHandle(hDriver); return 0; }
36
jc/md/lp-01/05gestion mémoire : corrigé36 Génération de lapplication
37
jc/md/lp-01/05gestion mémoire : corrigé37 Exécution de lapplication Télécharger dans la cible limage du noyau avec le driver STR_DRV Lancer lapplication TargetRun ProgramSTR_APP
38
jc/md/lp-01/05gestion mémoire : corrigé38 Début de lexécution
39
jc/md/lp-01/05gestion mémoire : corrigé39 Exécution
40
jc/md/lp-01/05gestion mémoire : corrigé40 Messages dans la fenêtre se sortie
41
jc/md/lp-01/05gestion 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
42
jc/md/lp-01/05gestion mémoire : corrigé42 TargetCe Processes
43
jc/md/lp-01/05gestion mémoire : corrigé43 Conclusion Première approche de lorganisation mémoire Exemple pratique de communication dadresses créées dynamiquement dans le slot 0 à un driver
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.