Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parArman Vernet Modifié depuis plus de 10 années
1
jc/md/lp-01/05Communication inter processus1 Communication inter process Présentation
2
jc/md/lp-01/05Communication inter processus2 Objectif du chapitre Notions de mémoire locale, publique et partagée Passage dadresses entre deux process
3
jc/md/lp-01/05Communication inter processus3 Communications entre processus Deux ou plusieurs processus concernés Différentes informations apparaissent quand on veut coordonner le travail des processus 1.Informations chronologiques isolées 2.Informations chronologiques, avec ou sans comptage dinformations prédéfinies 3.Informations non prédéfinies à partager 4.Partage de programme Combinaison des différents cas
4
jc/md/lp-01/05Communication inter processus4 Informations chronologiques isolées Simple information fournie par un processus, sans action induite : réception dun message, fin de téléchargement, etc. En fait, il ny a pas de coopération entre processus. Information fournie par un processus et qui provoque une réponse, éventuellement par un processus différent : autodestruction dun missile quand on reçoit linformation de sortie du plan de vol, etc. Traitement par les événements
5
jc/md/lp-01/05Communication inter processus5 Informations chronologiques répétitives Les informations sont figées et provoquent toujours la même réponse prédéterminée –Dépassement dune valeur de consigne : déclenchement dun ventilateur après dépassement haut de la température, arrêt du ventilateur après dépassement bas –Arrivée et départ de jetons dune file dattente –Etc. Traitement par les événements, sémaphores, mutex, sections critiques (déjà vus)
6
jc/md/lp-01/05Communication inter processus6 Informations non prédéfinies à partager Il y a en jeu un véritable message qui peut différer à chaque occurrence : le contenu lu ou créé par le producteur doit être mis à disposition du processus consommateur. Le contenu du message peut prendre diverses formes : un texte dans un buffer, une valeur, une adresse, une clé de cryptage, une information détat (status) dorgane périphérique, etc. Il sagit là de partage dinformation
7
jc/md/lp-01/05Communication inter processus7 Partage de programme Un problème différent du problème de partage de linformation apparaît quand on veut faire bénéficier plusieurs processus dun même code. Il sagit normalement de dll, de driver ou de façon générale de programmes réutilisables. Nous baptisons ce problème partage de code. Le processus qui contient le code partagé, disons P, produit ou consomme des informations pour le compte dautres processus, disons A, B, etc. Il est difficile pour P de traiter les informations dans sa mémoire locale puis de les restituer à A, B, etc. Il est beaucoup plus judicieux de permettre à P de travailler directement dans les espaces mémoires privés de A, B, etc. Ce problème étant traité par une technique voisine de celle utilisée pour le partage dinformation, nous le traiterons à sa suite.
8
jc/md/lp-01/05Communication inter processus8 Mémoire privée et mémoire publique Mémoire privée ou locale Quand un processus est créé Windows CE lui attribue un slot disponible parmi les 32 slots. Dans cet espace la mémoire est privée, réservée au process affecté au slot. Mémoire publique ou partagée Par ailleurs, un autre espace mémoire, public cette fois, est prévu. Il est beaucoup plus vaste et accessible à tous les processus ce qui permet détablir des communications si besoin.
9
jc/md/lp-01/05Communication inter processus9 Mémoire locale (1) La zone mémoire qui correspond au slot du process est privée et protégée par des droits daccès. Ce cloisonnement et les mécanismes de permissions associés sont absolument indispensables pour créer des applications robustes car cela évite les interférences involontaires entre processus. La contrepartie est évidente : les informations traitées en mémoire locale ne sont pas communicables à priori aux autres processus.
10
jc/md/lp-01/05Communication inter processus10 Mémoire locale (2) Un processus non propriétaire dune mémoire privée peut tout de même accéder à cette zone si le propriétaire lui en a communiqué –Ladresse physique –Les clés daccès adéquates Des fonctions permettent au propriétaire de la zone privée de fournir ces informations aux autres processus dans la mémoire partagée accessible à tous. Nous utiliserons ce mécanisme pour le « partage de code ».
11
jc/md/lp-01/05Communication inter processus11 Espace vaste permettant denregistrer des quantités importantes dinformations, cest-à- dire pratiquement des fichiers. Cette zone qui est accessible à tous les processus permet donc de partager des informations entre processus –Par le système de fichier –Par une zone dadresse connue de tous les processus quand linformation est gérable directement, sans lintervention dun système de fichiers : une adresse, un buffer, un nom, etc. Mémoire publique (1)
12
jc/md/lp-01/05Communication inter processus12 Mémoire publique (2) On attribue un nom au fichier ou à lobjet mémoire de cet espace. Ce « nom de partage » géré au niveau du système pourra être retrouvé par nimporte quel processus ; ce lien conduit à des possibilités de communications entre processus. Par ailleurs, cette mémoire publique permet de réaliser des allocations de mémoire virtuelle qui dépassent les limites de lallocation dans un slot.
13
jc/md/lp-01/05Communication inter processus13 Nom de partage Nous allons créer un « nom de partage » associé à un objet mémoire ou à un fichier. Ce nom géré par le système est visible de tous les processus. Tout processus peut travailler avec lobjet associé au « nom de partage » à condition davoir les droits adéquats. Le nom est maintenu tant quau moins un processus lutilise même après rencontre dune demande de fermeture du handle associé.
14
jc/md/lp-01/05Communication inter processus14 Vue en mémoire dun fichier Windows CE autorise la gestion dun fichier en créant une correspondance entre le fichier ou lobjet mémoire situé dans lespace partageable et une zone mémoire de lespace privé du processus (Memory Mapping a File). Le processus travaille ainsi dans son espace privé laissant le système répercuter dans le fichier ou lobjet mémoire situé dans lespace partagé les modifications faites en mémoire privée.
15
jc/md/lp-01/05Communication inter processus15 Usage de la mémoire partagée (1) Création ou ouverture dun fichier en prévision de linstallation dun « mappage » en mémoire –CreateFileForMapping Lopération tient compte de droits daccès, ouvertures multiples, etc. Avec cette fonction, Windows CE crée ou ouvre un nom de fichier au niveau du système plutôt quau niveau processus. Cela rend lobjet visible par plusieurs processus.
16
jc/md/lp-01/05Communication inter processus16 Usage de la mémoire partagée (2) Association dun nom de partage qui nexiste pas encore à un fichier ou récupération dun handle sur la zone partagée si le nom de partage existe déjà –CreateFileMapping Le nom de fichier nest pas indispensable : quand il ny en a pas, le système utilise une zone en mémoire physique pour créer lobjet partagé.
17
jc/md/lp-01/05Communication inter processus17 Usage de la mémoire partagée (3) Création de la vue en mémoire du fichier et installation du lien avec lobjet associé –MapViewOfFile Libération du lien –UnmapViewOfFile La fonction UnmapViewOfFile ne ferme pas lobjet associé mais indique au système que ce processus na plus besoin de lobjet. La libération ne sera effective que lorsquil ny aura plus aucun lien sur lobjet.
18
jc/md/lp-01/05Communication inter processus18 CreateFileForMapping (1) Création dun fichier ou ouverture dun fichier existant, en vue dun mappage en mémoire HANDLE CreateFileForMapping( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile );
19
jc/md/lp-01/05Communication inter processus19 CreateFileForMapping (2) Valeur de retour : –Handle sur un nom de fichier créé –Handle sur un alias pour un fichier existant –Erreur INVALID_HANDLE_VALUE En cas de handle valide, on peut savoir si le fichier existait avant lappel On peut préciser le type des accès, autoriser les accès multiples, etc.
20
jc/md/lp-01/05Communication inter processus20 CreateFileMapping (1) Création dun objet anonyme ou nommé associé à un fichier spécifié HANDLE CreateFileMapping( HANDLE hFile, LPSECURITY _ATTRIBUTES lpFileMappingAttributes, DWORD flProtect, DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, LPCTSTR lpName );
21
jc/md/lp-01/05Communication inter processus21 CreateFileMapping (2) Valeur de retour : –Handle associé à un fichier existant –Handle sur un objet mémoire anonyme –Erreur INVALID_HANDLE_VALUE En cas de handle valide, on peut savoir si lobjet existait avant lappel On peut créer un nom de partage On peut préciser le type des accès, la taille, etc.
22
jc/md/lp-01/05Communication inter processus22 MapViewOfFile (1) Cette fonction rend visible le contenu dun fichier dans lespace dadresse du process appelant LPVOID MapViewOfFile( HANDLE hFileMappingObject, DWORD dwDesiredAccess, DWORD dwFileOffsetHigh, DWORD dwFileOffsetLow, DWORD dwNumberOfBytesToMap );
23
jc/md/lp-01/05Communication inter processus23 MapViewOfFile (2) Valeur de retour : –Adresse mémoire de la vue du fichier –Erreur : NULL
24
jc/md/lp-01/05Communication inter processus24 UnmapViewOfFile Supprime le lien mémoire qui permet de voir un fichier dans lespace dadresse du processus appelant BOOL UnmapViewOfFile( LPCVOID lpBaseAddress ); Valeur de retour –Non nulle en cas de succès
25
jc/md/lp-01/05Communication inter processus25 CreateProcess Nous utilisons cette fonction avec seulement deux paramètres ( les autres sont NULL ) : –Le nom du processus à créer, ici INTER_B –Ladresse de la structure qui contiendra les informations relatives au process Dans la structure dinformation créée au chargement de INTER_B, nous récupérons le handle de INTER_B Avec le handle de INTER_B, nous surveillons la fin du processus INTER_B
26
jc/md/lp-01/05Communication inter processus26 PROCESS_INFORMATION Structure déclarée par un typedef dans Winbase.h Membres –Handle du processus créé –Handle du thread primaire du processus –Identificateur numérique global pour le processus –Identificateur numérique global pour le thread Garnie par le noyau à la création du processus
27
jc/md/lp-01/05Communication inter processus27 ExitProcess VOID ExitProcess( UINT uExitCode ); Cette fonction termine proprement un processus –En fermant les threads et les handles –En libérant les ressources mémoires –En permettant au noyau de gérer les noms créés pour les événements, les noms de partage, etc. –En mettant à jour les indicateurs dappels de dll –Etc. La fonction fournit un code de retour au processus appelant, récupérable par la fonction GetExitCodeProcess
28
jc/md/lp-01/05Communication inter processus28 GetExitCodeProcess BOOL GetExitCodeProcess( HANDLE hProcess, LPDWORD lpExitCode ); Cette fonction permet de lire le code de retour préparé par le processus dont on donne le handle. Tant que le processus nest pas terminé, la valeur reçue est la valeur réservée STILL_ACTIVE.
29
jc/md/lp-01/05Communication inter processus29 Application INTER_A et INTER_B INTER_A et INTER_B sont des processus séparés INTER_A dispose dune information dans un fichier ou dans un buffer privé INTER_A crée un objet nommé et place le contenu de son buffer privé dans la mémoire publique INTER_B ouvre lobjet nommé et prélève linformation dans la mémoire partagée pour la placer dans son buffer privé
30
jc/md/lp-01/05Communication inter processus30 INTER_A Création du fichier dinformations à partager Création du nom de partage Établissement de la correspondance adresse Édition de messages Écriture dans le fichier Lancement du processus INTER_B Attente de la fin du process INTER_B Libération des ressources Fin du process INTER_A
31
jc/md/lp-01/05Communication inter processus31 INTER_B Édition de messages Accès au nom de partage Établissement de la correspondance adresse Lecture dans le fichier Édition de message Libération de ressource Fin du process INTER_B avec envoi dun code de retour au process appelant
32
jc/md/lp-01/05Communication inter processus32 INTER_A (1) // INTER_A.cpp : Defines the entry point for the application. #include "stdafx.h" #include /*Pour information, le typedef étant dans Winbase.h typedef struct _PROCESS_INFORMATION { HANDLE hProcess; HANDLE hThread; DWORD dwProcessId; DWORD dwThreadId; } PROCESS_INFORMATION; */
33
jc/md/lp-01/05Communication inter processus33 INTER_A (2) int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { WCHAR wcBuffer[256]={_T("JE SUIS UN BUFFER DU PROCESS INTER_A !!!")}; HANDLE hmyDataFile; HANDLE hFileMapping; LPVOID lpMappedMemAddress; PROCESS_INFORMATION process_info_INTER_B; DWORD dwExitCode_INTER_B;
34
jc/md/lp-01/05Communication inter processus34 INTER_A (3) // Création du fichier à partager hmyDataFile = CreateFileForMapping(_T("myDataFile.txt"), GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ,NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL); if(hmyDataFile == NULL) { RETAILMSG(1,(TEXT("INTER_A: Pb Création myDataFile.\n" ))); return ExitProcess(0); }
35
jc/md/lp-01/05Communication inter processus35 INTER_A (4) // Création du nom de partage hFileMapping = CreateFileMapping(hmyDataFile, NULL,PAGE_READWRITE,0,1024, _T("NOM_DE_PARTAGE_myDataFile")); if(hFileMapping == NULL) { RETAILMSG(1,(TEXT("INTER_A: Pb Création NOM_DE_PARTAGE_myDataFile.\n"))); return ExitProcess(0); }
36
jc/md/lp-01/05Communication inter processus36 INTER_A (5) // 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_A: Pb adresse mémoire de communication\n"))); return ExitProcess(0); }
37
jc/md/lp-01/05Communication inter processus37 INTER_A (6) // Édition de messages RETAILMSG(1,(TEXT("INTER_A: Adresse du buffer: %x\n"),wcBuffer)); RETAILMSG(1,(TEXT("INTER_A: Information à transférer: %s\n"),wcBuffer)); RETAILMSG(1,(TEXT("INTER_A: Adresse mémoire pour la communication: %x\n"), lpMappedMemAddress));
38
jc/md/lp-01/05Communication inter processus38 INTER_A (7) // Écriture des informatons à partager dans le fichier créé memcpy(lpMappedMemAddress,wcBuffer, sizeof wcBuffer);
39
jc/md/lp-01/05Communication inter processus39 INTER_A (8) // Création du process INTER_B if(!CreateProcess(_T("INTER_B.exe"),NULL, NULL,NULL,NULL,0,NULL,NULL,NULL, &process_info_INTER_B)) { RETAILMSG(1,(TEXT("INTER_A: Pb création INTER_B.exe\n"))); UnmapViewOfFile(lpMappedMemAddress); return ExitProcess(0); }
40
jc/md/lp-01/05Communication inter processus40 INTER_A (9) // Attente de la fin du process INTER_B. while( GetExitCodeProcess( process_info_INTER_B.hProcess, &dwExitCode_INTER_B), dwExitCode_INTER_B == STILL_ACTIVE) Sleep(0); RETAILMSG(1,(TEXT("INTER_A: dwExitCode_INTER_B = %d\n"),dwExitCode_INTER_B));
41
jc/md/lp-01/05Communication inter processus41 INTER_A (10) // Libération des ressources UnmapViewOfFile(lpMappedMemAddress); DeleteFile(_T("myDataFile.txt")); RETAILMSG(1,(TEXT("INTER_A: Fin du process INTER_A\n"))); return ExitProcess(0); }
42
jc/md/lp-01/05Communication inter processus42 INTER_B (1) // INTER_B.cpp : Defines the entry point for the application. #include "stdafx.h" #include int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) {
43
jc/md/lp-01/05Communication inter processus43 INTER_B (2) HANDLE hFileMapping; LPVOID lpMappedMemAddress; WCHAR wcBuffer[256]={_T("Je suis un buffer du process INTER_B !!!")}; RETAILMSG(1,(TEXT("INTER_B: Adresse du buffer: %x\n"),wcBuffer)); RETAILMSG(1,(TEXT("INTER_B: Buffer avant lecture: %s\n"),wcBuffer));
44
jc/md/lp-01/05Communication inter processus44 INTER_B (3) // Ouverture du handle vers la zone de mémoire partagée hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE, NULL,PAGE_READWRITE,0,1024, _T("NOM_DE_PARTAGE_myDataFile")); // 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_B: Pb création mémoire partagée.\n"))); return ExitProcess(10000); }
45
jc/md/lp-01/05Communication inter processus45 INTER_B (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_B: Pb adresse mémoire partagée.\n"))); return ExitProcess(20000); }
46
jc/md/lp-01/05Communication inter processus46 INTER_B (5) RETAILMSG(1,(TEXT("INTER_B: Adresse mémoire pour la communication: %x\n"), lpMappedMemAddress)); // Lecture de linformation memcpy(wcBuffer,lpMappedMemAddress, sizeof wcBuffer); // Contenu du buffer de INTER_B après lecture RETAILMSG(1,(TEXT("INTER_B: Buffer après lecture: %s\n"),wcBuffer));
47
jc/md/lp-01/05Communication inter processus47 INTER_B (6) // Libération du lien UnmapViewOfFile(lpMappedMemAddress); RETAILMSG(1,(TEXT("INTER_B: Fin du process INTER_B\n"))); // Libération des ressources et retour return ExitProcess(12345); }
48
jc/md/lp-01/05Communication inter processus48 BUILD INTER_A non inclus dans limage INTER_B inclus dans limage
49
jc/md/lp-01/05Communication inter processus49 Exécution de INTER_A INTER_A: Adresse du buffer: 1202f9f8 INTER_A: Information à transférer: JE SUIS UN BUFFER DU PROCESS INTER_A !!! INTER_A: Adresse mémoire pour la communication: 46800000 INTER_B: Adresse du buffer: 1402fa10 INTER_B: Buffer avant lecture: Je suis un buffer du process INTER_B !!! INTER_B: Adresse mémoire pour la communication: 46800000 INTER_B: Buffer après lecture: JE SUIS UN BUFFER DU PROCESS INTER_A !!! INTER_B: Fin du process INTER_B INTER_A: dwExitCode_INTER_B= 12345 INTER_A: Fin du process INTER_A
50
jc/md/lp-01/05Communication inter processus50 Variante Ici, linformation à partager ne concerne que le contenu dun buffer. Le passage par un fichier nest pas indispensable et on peut obtenir le même résultat en modifiant INTER_A pour que le nom de partage corresponde à une zone mémoire physique au lieu dun fichier. INTER_B ne voit aucune différence. Pour sen assurer on ne modifiera rien dans son écriture.
51
jc/md/lp-01/05Communication inter processus51 INTER_C (1) Nous modifions INTER_A en INTER_C pour travailler dans une zone mémoire physique et non plus dans un fichier. Dans INTER_A, –nous supprimons la création et la destruction du fichier –dans la création du nom de partage, nous utilisons un handle invalide Nous conservons le même nom de partage pour ne rien modifier dans INTER_B INTER_B reste inchangé
52
jc/md/lp-01/05Communication inter processus52 INTER_C (2) // Création du nom de partage hFileMapping = CreateFileMapping( INVALID_HANDLE_VALUE,NULL, PAGE_READWRITE,0,1024, _T("NOM_DE_PARTAGE_myDataFile")); if(hFileMapping == NULL) { RETAILMSG(1,(TEXT("INTER_A: Pb Création NOM_DE_PARTAGE_myDataFile.\n"))); return ExitProcess(0); }
53
jc/md/lp-01/05Communication inter processus53 Exécution de INTER_C INTER_A: Adresse du buffer: 1202f9f8 INTER_A: Information à transférer: JE SUIS UN BUFFER DU PROCESS INTER_A !!! INTER_A: Adresse mémoire pour la communication: 46800000 INTER_B: Adresse du buffer: 1402fa10 INTER_B: Buffer avant lecture: Je suis un buffer du process INTER_B !!! INTER_B: Adresse mémoire pour la communication: 46800000 INTER_B: Buffer après lecture: JE SUIS UN BUFFER DU PROCESS INTER_A !!! INTER_B: Fin du process INTER_B INTER_A: dwExitCode_INTER_B= 12345 INTER_A: Fin du process INTER_A
54
jc/md/lp-01/05Communication inter processus54 Travail à réaliser
55
jc/md/lp-01/05Communication inter processus55 Exercice Dans cette nouvelle application, nous abordons le partage de code. Sur une plate-forme émulateur, il faut créer deux applications INTER_D et INTER_E qui vont coopérer. INTER_D sera au choix, insérée ou non dans limage à télécharger INTER_E sera obligatoirement insérée dans limage à télécharger.
56
jc/md/lp-01/05Communication inter processus56 INTER_D et INTER_E INTER_D désire exécuter pour son compte le processus INTER_E. INTER_E est ici un processus séparé mais pourrait aussi être une dll. INTER_D demande à INTER_E de lire un buffer dans sa mémoire privée, pour envoyer ces informations ailleurs, par exemple sur un périphérique, dans une zone mémoire système, etc.
57
jc/md/lp-01/05Communication inter processus57 INTER_D (1) Par le mécanisme vu précédemment de communication entre processus, grâce à un nom de partage, INTER_D va proposer dans la mémoire partagée les deux informations utiles pour quun autre processus puisse lire son buffer: –Permissions courantes du processus INTER_D –Adresse du buffer en mémoire privée de INTER_D Ces deux informations sont logées dans une structure pour laquelle on crée un type propre BUFFERINFORMATION
58
jc/md/lp-01/05Communication inter processus58 INTER_D (2) Ladresse en mémoire privée correspondra à un buffer contenant des informations –Linformation est un message –Pour simplifier, nous supposons quil ny a pas de problème de longueur dinformation, sinon il faudrait placer un troisième élément dans la structure communiquée –Ici, la longueur est implicite, indiquée par le \0 qui termine le message information Libérer les ressources
59
jc/md/lp-01/05Communication inter processus59 INTER_E Récupère linformation structure de type BUFFERINFORMATION proposée par INTER_D Récupère ladresse proposée du buffer à lire Récupère les permissions pour avoir accès à lespace où se trouve le buffer, ici INTER_D Récupère et imprime le contenu de la zone lue dans une mémoire privée, ici chez INTER_D Libère les ressources utilisées Renvoie un code de retour
60
jc/md/lp-01/05Communication inter processus60 Fonctions utiles En plus des fonctions déjà rencontrées, il faut utiliser des fonctions complémentaires : GetCurrentProcess ou GetCurrentProcessId MapPtrToProcess et UnMapPtr GetCurrentPermissions SetProcPermissions CloseHandle
61
jc/md/lp-01/05Communication inter processus61 GetCurrentProcess (1) Cette fonction retourne un pseudohandle sur le processus courant. HANDLE GetCurrentProcess(void); Valeur de retour Pseudohandle sur le processus courant Ce handle sera utilisé comme argument par la fonction MapPtrToProcess.
62
jc/md/lp-01/05Communication inter processus62 GetCurrentProcess (2) Ce pseudohandle est à manier avec précautions et peut être remplacé par un handle moins dangereux construit sur lidentificateur associé au processus fourni par la fonction GetCurrentProcessId. Un pseudohandle ne doit jamais être fermé (l'utilisation de CloseHandle peut être dévastatrice)
63
jc/md/lp-01/05Communication inter processus63 GetCurrentPermissions Cette fonction récupère pour le thread courant les bits du masque interne qui gère les accès aux espaces mémoire. DWORD GetCurrentPermissions (void); Paramètres aucun Valeur de retour : les permissions du thread courant
64
jc/md/lp-01/05Communication inter processus64 SetProcPermissions Cette fonction positionne pour le thread courant les bits du masque interne qui peut gérer des accès aux espaces mémoire d autres processus. DWORD SetProcPermissions( DWORD newperms ); Valeur de retour : les anciennes permissions
65
jc/md/lp-01/05Communication inter processus65 MapPtrToProcess Cette fonction transpose une adresse dans un espace mémoire dans sa correspondante dans lespace mémoire dun processus. LPVOID MapPtrToProcess( LPVOID lpv, HANDLE hProc ); Valeur de retour : Adresse correspondante à lpv dans lespace du processus de handle hProc ou NULL en cas derreur.
66
jc/md/lp-01/05Communication inter processus66 UnMapPtr Cette fonction supprime une correspondance dadresse établie précédemment par MapPtrToProcess. LPVOID UnMapPtr( LPVOID lpv ); Valeur de retour : valeur de ladresse dans son espace de départ
67
jc/md/lp-01/05Communication inter processus67 Fichier den-tête INTER_DE.h Utilisé par INTER_D et INTER_E #include typedef struct { DWORD dwProcPermissions; WCHAR *MapPtr; } BUFFERINFORMATION;
68
jc/md/lp-01/05Communication inter processus68 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) {
69
jc/md/lp-01/05Communication inter processus69 INTER_D (2) //Déclarations 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;
70
jc/md/lp-01/05Communication inter processus70 INTER_D (3) // Création du nom de partage // TODO // Récupération de l'adresse utilisable pour communiquer // TODO // Édition de messages // TODO // Récupération des permissions // TODO
71
jc/md/lp-01/05Communication inter processus71 INTER_D (4) // Mappage de l'adresse // TODO // Édition de ladresse après mappage // TODO // Écriture en mémoire physique // TODO
72
jc/md/lp-01/05Communication inter processus72 INTER_D (5) // 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); }
73
jc/md/lp-01/05Communication inter processus73 INTER_D (6) // 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));
74
jc/md/lp-01/05Communication inter processus74 INTER_D (7) // Libération des ressources UnmapViewOfFile(lpMappedMemAddress); UnMapPtr(BufferInformation.MapPtr); RETAILMSG(1,(TEXT("INTER_D: Fin du processus INTER_D\n"))); return ExitProcess(0); }
75
jc/md/lp-01/05Communication inter processus75 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) {
76
jc/md/lp-01/05Communication inter processus76 INTER_E (2) // Déclarations HANDLE hFileMapping; LPVOID lpMappedMemAddress; BUFFERINFORMATION BufferInformation; DWORD dwProcPermissions;
77
jc/md/lp-01/05Communication inter processus77 INTER_E (3) // Ouverture du handle vers la zone de mémoire partagée // TODO // Récupération de ladresse mémoire utilisable pour communiquer // TODO // Récupération et visualisation des informations passées dans la mémoire partagée // TODO
78
jc/md/lp-01/05Communication inter processus78 INTER_E (4) // Sauvegarde des permissions courantes du processus // TODO // Remplacement des permissions d'accès par celles du processus INTER_D // TODO // Lecture, visualisation du buffer du processus INTER_D // TODO
79
jc/md/lp-01/05Communication inter processus79 INTER_E (5) // Restauration des permissions du processus INTER_E // TODO // Libération du lien // TODO // Libération des ressources et retour // TODO return ExitProcess(12345); }
80
jc/md/lp-01/05Communication inter processus80 Variante (1) Dans INTER_D le buffer alloué se trouve dans lespace propre du processus. La fonction qui établit la correspondance dadresse peut être supprimée. Ce nest plus le cas lorsque le buffer est alloué dynamiquement : il se trouve logé dans lespace réservé au slot 0. La fonction qui transforme ladresse pour obtenir sa valeur dans le slot du processus est alors indispensable.
81
jc/md/lp-01/05Communication inter processus81 Variante (2) Il nest pas illogique de laisser cet appel de fonction pour éviter de retoucher le reste du code lorsquon modifie le type dallocation. Dans INTER_F, obtenu par modification de INTER_D, nous traitons le cas dune allocation dynamique. Ce genre de manipulations aide à comprendre les problèmes de gestion de la mémoire dans Windows CE.
82
jc/md/lp-01/05Communication inter processus82 INTER_F (1) Modifications dans INTER_D pour obtenir un buffer en allocation dynamique // Déclaration WCHAR *lpBuffer; // Allocation dynamique d'espace et remplissage lpBuffer = (WCHAR*)malloc(256*sizeof(WCHAR)); wcscpy(lpBuffer,_T("Je suis un buffer de l'INTER_F !!!"));
83
jc/md/lp-01/05Communication inter processus83 INTER_F (2) // Supprimer le buffer wcBuffer // Remplacer dans le code toute utilisation de wcBuffer par lpBuffer // Libération de lespace alloué free(lpBuffer);
84
jc/md/lp-01/05Communication inter processus84 Résultats à obtenir avec INTER_D INTER_D: Adresse du buffer: 1202f9f4 INTER_D: Information à transférer: JE SUIS UN BUFFER EN MEMOIRE PRIVEE DE INTER_D !!! INTER_D: Adresse mémoire pour la communication: 46800000 INTER_D: Adresse du buffer après mappage: 1202f9f4 INTER_E: Adresse mémoire pour la communication: 46800000 INTER_E: Adresse du buffer en absolu: 1202f9f4 INTER_E: Permissions du processus INTER_D: 0101 INTER_E: Permissions du processus INTER_E: 0201 INTER_E: Lecture du buffer dans INTER_D: JE SUIS UN BUFFER EN MEMOIRE PRIVEE DE INTER_D !!! INTER_E: Fin du processus INTER_E INTER_D: Code de retour fourni par le processus INTER_E = 12345 INTER_D: Fin du processus INTER_D
85
jc/md/lp-01/05Communication inter processus85 Résultats à obtenir avec 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: 46800000 INTER_F: Adresse du buffer après mappage: 12030050 INTER_E: Adresse mémoire pour la communication: 46800000 INTER_E: Adresse du buffer en absolu: 12030050 INTER_E: Permissions du processus INTER_D: 0101 INTER_E: Permissions du processus INTER_E: 0201 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
86
jc/md/lp-01/05Communication inter processus86 Conclusion Exemples pratiques de communication dinformation entre plusieurs process situés chacun dans un espace privé.
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.