La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

Présentations similaires


Présentation au sujet: "Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé"— Transcription de la présentation:

1 jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé

2 jc/md/lp-01/05Communication inter processus corrigé2 Objectif du chapitre Notions de mémoire locale, publique et partagée Passage dadresses entre deux process

3 jc/md/lp-01/05Communication inter processus corrigé3 INTER_DE.h #include typedef struct { DWORD dwProcPermissions; WCHAR *MapPtr; }BUFFERINFORMATION;

4 jc/md/lp-01/05Communication inter processus corrigé4 INTER_D (1) // INTER_D.cpp : Defines the entry point for the application. #include "stdafx.h" #include "INTER_DE.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) {

5 jc/md/lp-01/05Communication inter processus corrigé5 INTER_D (2) WCHAR wcBuffer[256] = {_T("JE SUIS UN BUFFER EN MEMOIRE PRIVEE DE INTER_D !!!")}; BUFFERINFORMATION BufferInformation; HANDLE hFileMapping; LPVOID lpMappedMemAddress; PROCESS_INFORMATION process_info_INTER_E; DWORD dwExitCode_INTER_E;

6 jc/md/lp-01/05Communication inter processus corrigé6 INTER_D (3) // Création du nom de partage hFileMapping = CreateFileMapping( INVALID_HANDLE_VALUE,NULL, PAGE_READWRITE,0,1024, _T("POUR_ACCES_MEMOIRE_PRIVEE")); if(hFileMapping == NULL) { RETAILMSG(1,(TEXT("INTER_D: Pb Création POUR_ACCES_MEMOIRE_PRIVEE.\n"))); return ExitProcess(0); }

7 jc/md/lp-01/05Communication inter processus corrigé7 INTER_D (4) // Récupération de l'adresse utilisable pour communiquer lpMappedMemAddress = MapViewOfFile( hFileMapping,FILE_MAP_WRITE,0,0,0); if(lpMappedMemAddress == NULL) { RETAILMSG(1,(TEXT("INTER_D: Pb adresse mémoire de communication\n"))); return ExitProcess(0); }

8 jc/md/lp-01/05Communication inter processus corrigé8 INTER_D (5) // Édition de messages RETAILMSG(1,(TEXT("INTER_D: Adresse du buffer: %x\n"),wcBuffer)); RETAILMSG(1,(TEXT("INTER_D: Information à transférer: %s\n"),wcBuffer)); RETAILMSG(1,(TEXT("INTER_D: Adresse mémoire pour la communication:%x\n"), lpMappedMemAddress));

9 jc/md/lp-01/05Communication inter processus corrigé9 INTER_D (6) // Récupération des permissions BufferInformation.dwProcPermissions = GetCurrentPermissions(); // Mappage de l'adresse BufferInformation.MapPtr = (WCHAR *)MapPtrToProcess( wcBuffer,GetCurrentProcess()); if(BufferInformation.MapPtr == NULL) { RETAILMSG(1,(TEXT("INTER_D: Pb adresse mappée du buffer\n"))); return 0; }

10 jc/md/lp-01/05Communication inter processus corrigé10 INTER_D (7) // Édition de ladresse après mappage RETAILMSG(1,(TEXT("INTER_D: Adresse du buffer après mappage:%x\n"), BufferInformation.MapPtr)); // Écriture en mémoire physique memcpy(lpMappedMemAddress,&BufferInformation, sizeof(BUFFERINFORMATION));

11 jc/md/lp-01/05Communication inter processus corrigé11 INTER_D (8) // Création du processus INTER_E if(!CreateProcess(_T("INTER_E.exe"),NULL,NULL, NULL,NULL,0,NULL,NULL,NULL, &process_info_INTER_E)) { RETAILMSG(1,(TEXT("INTER_D: Pb création du processus INTER_E.exe\n"))); UnmapViewOfFile(lpMappedMemAddress); return ExitProcess(0); }

12 jc/md/lp-01/05Communication inter processus corrigé12 INTER_D (9) // Attente de la fin du processus INTER_E. while(GetExitCodeProcess( process_info_INTER_E.hProcess, &dwExitCode_INTER_E), dwExitCode_INTER_E == STILL_ACTIVE) Sleep(0); RETAILMSG(1,(TEXT("INTER_D: Code de retour fourni par le processus INTER_E = %d\n"), dwExitCode_INTER_E));

13 jc/md/lp-01/05Communication inter processus corrigé13 INTER_D (10) // Libération des ressources UnmapViewOfFile(lpMappedMemAddress); UnMapPtr(BufferInformation.MapPtr); RETAILMSG(1,(TEXT("INTER_D: Fin du processus INTER_D\n"))); return ExitProcess(0); }

14 jc/md/lp-01/05Communication inter processus corrigé14 INTER_E (1) // INTER_E.cpp : Defines the entry point for the application. #include "stdafx.h" #include "INTER_DE.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) {

15 jc/md/lp-01/05Communication inter processus corrigé15 INTER_E (2) // Déclarations HANDLE hFileMapping; LPVOID lpMappedMemAddress; BUFFERINFORMATION BufferInformation; DWORD dwProcPermissions;

16 jc/md/lp-01/05Communication inter processus corrigé16 INTER_E (3) // Ouverture du handle vers la zone de mémoire partagée hFileMapping = CreateFileMapping( INVALID_HANDLE_VALUE, NULL,PAGE_READWRITE,0,1024, _T("POUR_ACCES_MEMOIRE_PRIVEE")); // Vérifier que le handle nest pas nul et que le nom choisi existe bien if(hFileMapping==NULL || !(GetLastError() == ERROR_ALREADY_EXISTS)) { RETAILMSG(1,(TEXT("INTER_E: Pb création mémoire partagée.\n"))); return ExitProcess(10000); }

17 jc/md/lp-01/05Communication inter processus corrigé17 INTER_E (4) // Récupération de l'adresse mémoire utilisable pour communiquer lpMappedMemAddress = MapViewOfFile(hFileMapping, FILE_MAP_READ,0,0,0); if(lpMappedMemAddress == NULL) { RETAILMSG(1,(TEXT("INTER_E: Pb adresse mémoire partagée.\n"))); return ExitProcess(20000); }

18 jc/md/lp-01/05Communication inter processus corrigé18 INTER_E (5) RETAILMSG(1,(TEXT("INTER_E: Adresse mémoire pour la communication: %x\n"),lpMappedMemAddress)); // Récupération et visualisation des informations passées dans la mémoire partagée memcpy(&BufferInformation,lpMappedMemAddress, sizeof(BUFFERINFORMATION)); RETAILMSG(1,(TEXT("INTER_E: Adresse du buffer en absolu: %x\n"),BufferInformation.MapPtr)); RETAILMSG(1,(TEXT("INTER_E: Permissions du processus INTER_D: %04x\n"), BufferInformation.dwProcPermissions));

19 jc/md/lp-01/05Communication inter processus corrigé19 INTER_E (6) // Sauvegarde des permissions courantes de ce processus dwProcPermissions = GetCurrentPermissions(); RETAILMSG(1,(TEXT("INTER_E: Permissions du processus INTER_E: %04x\n"), dwProcPermissions)); // Remplacement des permissions d'accès par celles du process INTER_D SetProcPermissions( BufferInformation.dwProcPermissions);

20 jc/md/lp-01/05Communication inter processus corrigé20 INTER_E (7) // Lecture et visualisation du buffer du process INTER_D RETAILMSG(1,(TEXT("INTER_E: Lecture du buffer dans INTER_D: %s\n"), BufferInformation.MapPtr)); // Restauration des permissions antérieures du process INTER_E SetProcPermissions(dwProcPermissions);

21 jc/md/lp-01/05Communication inter processus corrigé21 INTER_E (8) // Libération du lien UnmapViewOfFile(lpMappedMemAddress); RETAILMSG(1,(TEXT("INTER_E: Fin du processus INTER_E\n"))); // Libération des ressources et retour return ExitProcess(12345); }

22 jc/md/lp-01/05Communication inter processus corrigé22 Exécution de INTER_D 1724860 PID:e2db71aa TID:e2de9fae INTER_D: Adresse du buffer: 1202f9f4 1724860 PID:e2db71aa TID:e2de9fae INTER_D: Information à transférer: JE SUIS UN BUFFER EN MEMOIRE PRIVEE DE INTER_D !!! 1724880 PID:e2db71aa TID:e2de9fae INTER_D: Adresse mémoire pour la communication: 46d00000 1724880 PID:e2db71aa TID:e2de9fae INTER_D: Adresse du buffer après mappage: 1202f9f4 1724970 PID:c2f25b52 TID:c2f7cb8a INTER_E: Adresse mémoire pour la communication: 46d00000 1724970 PID:c2f25b52 TID:c2f7cb8a INTER_E: Adresse du buffer en absolu: 1202f9f4 1724970 PID:c2f25b52 TID:c2f7cb8a INTER_E: Permissions du processus INTER_D: 0101 1724970 PID:c2f25b52 TID:c2f7cb8a INTER_E: Permissions du processus INTER_E: 0201 1724980 PID:c2f25b52 TID:c2f7cb8a INTER_E: Lecture du buffer dans INTER_D: JE SUIS UN BUFFER EN MEMOIRE PRIVEE DE INTER_D !!! 1734990 PID:c2f25b52 TID:c2f7cb8a INTER_E: Fin du processus INTER_E 1735000 PID:e2db71aa TID:e2de9fae INTER_D: Code de retour fourni par le processus INTER_E= 12345 1735000 PID:e2db71aa TID:e2de9fae INTER_D: Fin du processus INTER_D

23 jc/md/lp-01/05Communication inter processus corrigé23 Essai de Remote Process Viewer Remote Process Viewer est un outil qui permet dobtenir des informations sur les processus en cours dexécution : identificateur de processus (PID), priorité, slot affecté, etc. Cest un instantané des processus pris à linstant de lancement de loutil ou quand effectue un rafraîchissement. Nous voulons utiliser cet outil pour examiner les slots de chargement des processus.

24 jc/md/lp-01/05Communication inter processus corrigé24 Modification de INTER_E (1) Pour avoir le temps de faire un rafraîchissement des informations pour Remote Process Viewer, après lancement de INTER_D nous arrêtons le processus INTER_E par une demande de confirmation dans une boîte de message. Sinon, lexécution est finie avant le rafraîchissement. Rafraîchissement –Se placer dans la fenêtre Remote Process Viewer –Menu ConnectionRefresh –Touche de fonction F5

25 jc/md/lp-01/05Communication inter processus corrigé25 Modification de INTER_E (2) À placer juste avant le message de fin : MessageBox(NULL, _T("cliquer sur 'OK pour terminer"), _T("Communication inter processus"), MB_OK); Refaire lexécutable INTER_E.exe Refaire limage à télécharger

26 jc/md/lp-01/05Communication inter processus corrigé26 Essai de INTER_D Télécharger limage dans la cible Appeler loutil « Remote Process Viewer » Choisir la cible par défaut (émulateur) Examiner les processus en cours Lancer le processus INTER_D Observer les messages dans la fenêtre de sortie Exploiter les résultats –Slots en mémoire –Permissions

27 jc/md/lp-01/05Communication inter processus corrigé27 Après chargement de limage

28 jc/md/lp-01/05Communication inter processus corrigé28 Appel de Remote Process Viewer

29 jc/md/lp-01/05Communication inter processus corrigé29 Choix de la cible par défaut

30 jc/md/lp-01/05Communication inter processus corrigé30 Processus en cours dexécution Ni INTER_D ni INTER_E ne sont présents. Il ny a que les processus en cours avant le lancement de INTER_D.

31 jc/md/lp-01/05Communication inter processus corrigé31 Actualisation Remote Process Viewer

32 jc/md/lp-01/05Communication inter processus corrigé32 Après lancement de INTER_D INTER_D et INTER_E sont actifs

33 jc/md/lp-01/05Communication inter processus corrigé33 Messages 31650 PID:2db719a TID:2db7092 INTER_D: Adresse du buffer: 1602f9f4 31650 PID:2db719a TID:2db7092 INTER_D: Information à transférer: JE SUIS UN BUFFER EN MEMOIRE PRIVEE DE INTER_D !!! 31650 PID:2db719a TID:2db7092 INTER_D: Adresse mémoire pour la communication: 46c00000 31650 PID:2db719a TID:2db7092 INTER_D: Adresse du buffer après mappage: 1602f9f4 31740 PID:a2db7d12 TID:a2db7c72 INTER_E: Adresse mémoire pour la communication: 46c00000 31740 PID:a2db7d12 TID:a2db7c72 INTER_E: Adresse du buffer en absolu: 1602f9f4 31740 PID:a2db7d12 TID:a2db7c72 INTER_E: Permissions du processus INTER_D: 0401 31740 PID:a2db7d12 TID:a2db7c72 INTER_E: Permissions du processus INTER_E: 0801 31750 PID:a2db7d12 TID:a2db7c72 INTER_E: Lecture du buffer dans INTER_D: JE SUIS UN BUFFER EN MEMOIRE PRIVEE DE INTER_D !!!

34 jc/md/lp-01/05Communication inter processus corrigé34 Détails INTER_D: Adresse du buffer: 1602f9f4 INTER_D: Information à transférer: JE SUIS UN BUFFER EN MEMOIRE PRIVEE DE INTER_D !!! INTER_D: Adresse mémoire pour la communication: 46c00000 INTER_D: Adresse du buffer après mappage: 1602f9f4 INTER_E: Adresse mémoire pour la communication: 46c00000 INTER_E: Adresse du buffer en absolu: 1602f9f4 INTER_E: Permissions du processus INTER_D: 0401 INTER_E: Permissions du processus INTER_E: 0801 INTER_E: Lecture du buffer dans INTER_D: JE SUIS UN BUFFER EN MEMOIRE PRIVEE DE INTER_D !!!

35 jc/md/lp-01/05Communication inter processus corrigé35 Exploitation des résultats INTER_A a été installé en 16000000 donc slot 11 avec une clé de 400 INTER_B a été installé en 18000000 donc slot 12 avec une clé de 800 Pendant lexécution les permissions passent à 401 et 801 donc accès en plus au slot 1 qui correspond au noyau NK.exe

36 jc/md/lp-01/05Communication inter processus corrigé36 Clé daccès à un slot Masque sur 32 bits : un bit pour 32 slots de 1 à 32

37 jc/md/lp-01/05Communication inter processus corrigé37 Place en mémoire des processus INTER_E sera en 16000000 INTER_D sera en 14000000

38 jc/md/lp-01/05Communication inter processus corrigé38 INTER_F (1) Nous indiquons les modifications à apporter dans INTER_D De plus, il faut supprimer la déclaration de wcBuffer devenue inutile Ensuite, il faut régénérer INTER_F.exe puis refaire limage

39 jc/md/lp-01/05Communication inter processus corrigé39 INTER_F (2) WCHAR *lpBuffer; BUFFERINFORMATION BufferInformation; HANDLE hFileMapping; LPVOID lpMappedMemAddress; PROCESS_INFORMATION process_info_INTER_E; DWORD dwExitCode_INTER_E; // Allocation dynamique d'espace et remplissage lpBuffer = (WCHAR*)malloc(256*sizeof(WCHAR)); wcscpy(lpBuffer,_T("Je suis un buffer de l'INTER_F !!!"));

40 jc/md/lp-01/05Communication inter processus corrigé40 INTER_F (3) // Édition de messages RETAILMSG(1,(TEXT("INTER_F: Adresse du buffer: %x\n"),lpBuffer)); RETAILMSG(1,(TEXT("INTER_F: Information à transférer: %s\n"),lpBuffer)); RETAILMSG(1,(TEXT("INTER_F: Adresse mémoire pour la communication:x\n"), lpMappedMemAddress)); // Récupération des permissions BufferInformation.dwProcPermissions = GetCurrentPermissions();

41 jc/md/lp-01/05Communication inter processus corrigé41 INTER_F (4) // Mappage de l'adresse BufferInformation.MapPtr = (WCHAR *) MapPtrToProcess(lpBuffer,GetCurrentProcess()); if(BufferInformation.MapPtr == NULL) { RETAILMSG(1,(TEXT("INTER_F: Pb adresse mappée du buffer\n"))); return 0; }

42 jc/md/lp-01/05Communication inter processus corrigé42 INTER_F (5) // Libération des ressources free(lpBuffer); UnmapViewOfFile(lpMappedMemAddress); UnMapPtr(BufferInformation.MapPtr); RETAILMSG(1,(TEXT("INTER_F: Fin du processus INTER_F\n"))); return ExitProcess(0); }

43 jc/md/lp-01/05Communication inter processus corrigé43 Exécution de INTER_F INTER_F: Adresse du buffer: 30050 INTER_F: Information à transférer: Je suis un buffer de l'INTER_F !!! INTER_F: Adresse mémoire pour la communication: 46c00000 INTER_F: Adresse du buffer après mappage: 16030050 INTER_E: Adresse mémoire pour la communication: 46c00000 INTER_E: Adresse du buffer en absolu: 16030050 INTER_E: Permissions du processus INTER_D: 0401 INTER_E: Permissions du processus INTER_E: 0801 INTER_E: Lecture du buffer dans INTER_D: Je suis un buffer de l'INTER_F !!! INTER_E: Fin du processus INTER_E INTER_F: Code de retour fourni par le processus INTER_E = 12345 INTER_F: Fin du processus INTER_F

44 jc/md/lp-01/05Communication inter processus corrigé44 Mappage de ladresse On voit ici que la fonction MapPtrToProcess dans INTER_F a bien son utilité : –Avant mappage : Adresse du buffer: 30050 –Après mappage : Adresse du buffer après mappage: 16030050 INTER_E pourra récupérer la zone qui avait été allouée dynamiquement dans INTER_F

45 jc/md/lp-01/05Communication inter processus corrigé45 Conclusion Exemples pratiques de communication dinformation entre plusieurs process situés chacun dans un espace privé.


Télécharger ppt "Jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé"

Présentations similaires


Annonces Google