jc/md/lp-01/05Communication inter processus corrigé1 Communication inter process Corrigé
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
jc/md/lp-01/05Communication inter processus corrigé3 INTER_DE.h #include typedef struct { DWORD dwProcPermissions; WCHAR *MapPtr; }BUFFERINFORMATION;
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) {
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;
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); }
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); }
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));
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; }
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));
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); }
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));
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); }
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) {
jc/md/lp-01/05Communication inter processus corrigé15 INTER_E (2) // Déclarations HANDLE hFileMapping; LPVOID lpMappedMemAddress; BUFFERINFORMATION BufferInformation; DWORD dwProcPermissions;
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); }
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); }
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));
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);
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);
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); }
jc/md/lp-01/05Communication inter processus corrigé22 Exécution de INTER_D PID:e2db71aa TID:e2de9fae INTER_D: Adresse du buffer: 1202f9f PID:e2db71aa TID:e2de9fae INTER_D: Information à transférer: JE SUIS UN BUFFER EN MEMOIRE PRIVEE DE INTER_D !!! PID:e2db71aa TID:e2de9fae INTER_D: Adresse mémoire pour la communication: 46d PID:e2db71aa TID:e2de9fae INTER_D: Adresse du buffer après mappage: 1202f9f PID:c2f25b52 TID:c2f7cb8a INTER_E: Adresse mémoire pour la communication: 46d PID:c2f25b52 TID:c2f7cb8a INTER_E: Adresse du buffer en absolu: 1202f9f PID:c2f25b52 TID:c2f7cb8a INTER_E: Permissions du processus INTER_D: PID:c2f25b52 TID:c2f7cb8a INTER_E: Permissions du processus INTER_E: PID:c2f25b52 TID:c2f7cb8a INTER_E: Lecture du buffer dans INTER_D: JE SUIS UN BUFFER EN MEMOIRE PRIVEE DE INTER_D !!! PID:c2f25b52 TID:c2f7cb8a INTER_E: Fin du processus INTER_E PID:e2db71aa TID:e2de9fae INTER_D: Code de retour fourni par le processus INTER_E= PID:e2db71aa TID:e2de9fae INTER_D: Fin du processus INTER_D
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.
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
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
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
jc/md/lp-01/05Communication inter processus corrigé27 Après chargement de limage
jc/md/lp-01/05Communication inter processus corrigé28 Appel de Remote Process Viewer
jc/md/lp-01/05Communication inter processus corrigé29 Choix de la cible par défaut
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.
jc/md/lp-01/05Communication inter processus corrigé31 Actualisation Remote Process Viewer
jc/md/lp-01/05Communication inter processus corrigé32 Après lancement de INTER_D INTER_D et INTER_E sont actifs
jc/md/lp-01/05Communication inter processus corrigé33 Messages PID:2db719a TID:2db7092 INTER_D: Adresse du buffer: 1602f9f PID:2db719a TID:2db7092 INTER_D: Information à transférer: JE SUIS UN BUFFER EN MEMOIRE PRIVEE DE INTER_D !!! PID:2db719a TID:2db7092 INTER_D: Adresse mémoire pour la communication: 46c PID:2db719a TID:2db7092 INTER_D: Adresse du buffer après mappage: 1602f9f PID:a2db7d12 TID:a2db7c72 INTER_E: Adresse mémoire pour la communication: 46c PID:a2db7d12 TID:a2db7c72 INTER_E: Adresse du buffer en absolu: 1602f9f PID:a2db7d12 TID:a2db7c72 INTER_E: Permissions du processus INTER_D: PID:a2db7d12 TID:a2db7c72 INTER_E: Permissions du processus INTER_E: PID:a2db7d12 TID:a2db7c72 INTER_E: Lecture du buffer dans INTER_D: JE SUIS UN BUFFER EN MEMOIRE PRIVEE DE INTER_D !!!
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 !!!
jc/md/lp-01/05Communication inter processus corrigé35 Exploitation des résultats INTER_A a été installé en donc slot 11 avec une clé de 400 INTER_B a été installé en 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
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
jc/md/lp-01/05Communication inter processus corrigé37 Place en mémoire des processus INTER_E sera en INTER_D sera en
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
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 !!!"));
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();
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; }
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); }
jc/md/lp-01/05Communication inter processus corrigé43 Exécution de INTER_F INTER_F: Adresse du buffer: 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: INTER_E: Adresse mémoire pour la communication: 46c00000 INTER_E: Adresse du buffer en absolu: 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 = INTER_F: Fin du processus INTER_F
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: –Après mappage : Adresse du buffer après mappage: INTER_E pourra récupérer la zone qui avait été allouée dynamiquement dans INTER_F
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é.