begin process at 2012 05 30 06:39:34
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

System

 > 

recuperer la memoire virtuelle


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

recuperer la memoire virtuelle

mardi 30 janvier 2007 à 15:35:27 | recuperer la memoire virtuelle

ciddu42

Membre Club
bonjour,

j'ai recuperer un petit programme en visual basic permettant de recuperer la memoire virtuelle, je l'ai traduit en C, mais j'ai un petit probleme, le programme s'arrete au bout de la deuxieme plage memoire pour n'importe quel processus utilisé sans finir ce qui lui restait a faire, le programme s'arrete a cette ligne :
*lBaseAdress[*SizeBA - 1] = (unsignedlong) mbi.BaseAddress;
, voila le programme en entier :

#include <stdio.h>
#include <windows.h>
#include <Tlhelp32.h>
 
void GetAllPrivileges()
{
HANDLE lhTokenHandle;
LUID tLuid;
TOKEN_PRIVILEGES tTokenPriv;
TOKEN_PRIVILEGES tTokenPrivNew;
unsignedlong lBufferNeeded;
HANDLE hProc;
 
//obtient le handle de ce process
hProc = GetCurrentProcess();
 
//change les droits de cette application
OpenProcessToken( hProc, TOKEN_ALL_ACCESS, &lhTokenHandle );
LookupPrivilegeValue("", SE_DEBUG_NAME, &tLuid );

//détermine le nombre de privileges à changer
tTokenPriv.PrivilegeCount = 1;
tTokenPriv.Privileges[0].Luid = tLuid;
tTokenPriv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

//autorise le privilege SE_DEBUG_NAME
AdjustTokenPrivileges( lhTokenHandle, false, &tTokenPriv, sizeof( tTokenPrivNew ), &tTokenPrivNew, &lBufferNeeded );

//ferme les handles
CloseHandle( lhTokenHandle );
}
bool GetProcessId(char *Name, unsignedlong *Pid )
{
HANDLE Hp;
PROCESSENTRY32 pe32;
 
// handle qui contient tout les handle processus
Hp = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0);
if( Hp == INVALID_HANDLE_VALUE )
{
printf("CreateToolhelp32Snapshot\n");
returnfalse;
}
 
// rentre la taille de la structure
pe32.dwSize = sizeof( PROCESSENTRY32 );
 
// retrouve les informations du premier processus
// et quitte si echoue
if( !Process32First( Hp, &pe32 ))
{
printf("Process32First\n");
CloseHandle( Hp );
returnfalse;
}
 
// recherche les informations des processus suivant
// et quitte des qu'il n'y a plus de processus
while( Process32Next( Hp, &pe32 ))
{
if( strcmp( pe32.szExeFile, Name ) == 0)
{
*Pid = pe32.th32ProcessID;
break;
}
}
 
CloseHandle( Hp );
 
if( strcmp( pe32.szExeFile, Name ) != 0)
{
printf("Processus non trouver\n");
returnfalse;
}
 
returntrue;
}
void RetrieveMemRegions(unsignedlong PID, unsignedlong **lBaseAdress, unsignedlong **lRegionSize, unsignedlong *SizeBA, unsignedlong *SizeRS)
{
HANDLE lHandle;
unsignedlong lPosMem;
unsignedlong lRet;
unsignedlong lLenMBI;
MEMORY_BASIC_INFORMATION mbi;
SYSTEM_INFO si;
 
//initialise les tableaux
*lBaseAdress = (unsignedlong*) malloc(sizeof(unsignedlong));
*lRegionSize = (unsignedlong*) malloc(sizeof(unsignedlong));
 
//obtient le handle du processus
lHandle = OpenProcess( PROCESS_ALL_ACCESS, false, PID );
 
lLenMBI = sizeof(mbi); //taille de la structure
GetSystemInfo( &si ); //obtient les infos sur les adresses de début et de fin de la plage mémoire maximum

lPosMem = (unsignedlong) si.lpMinimumApplicationAddress; //adresse la plus petite ==> part de là

 
while( lPosMem < (unsignedlong) si.lpMaximumApplicationAddress)//tant que l'adresse est inférieure à l'adresse maximale
{
mbi.RegionSize = 0;

//obtient les infos sur les régions mémoire du processus définit par son handle hProcess
lRet = VirtualQueryEx( lHandle, &lPosMem, &mbi, lLenMBI );
 
if( lRet == lLenMBI)
{
if( mbi.Type == MEM_PRIVATE && mbi.State == MEM_COMMIT )
{
//alors utilisé par le processus

if( mbi.RegionSize > 0)
{
//région non nulle, alors on la stocke dans les tableaux résultats
//les redimensionne
*SizeBA = *SizeBA + 1;
*SizeRS = *SizeRS + 1;
*lBaseAdress = (unsignedlong*) realloc( *lBaseAdress, sizeof(unsignedlong) * (*SizeBA));
*lRegionSize = (unsignedlong*) realloc( *lRegionSize, sizeof(unsignedlong) * (*SizeRS));
//stocke à la fin
*lRegionSize[*SizeRS - 1] = mbi.RegionSize;
printf("taille region %d : %d\n", *SizeRS, mbi.RegionSize);
*lBaseAdress[*SizeBA - 1] = (unsignedlong) mbi.BaseAddress;
printf("adresse page %d : %d\n", *SizeBA, (unsignedlong) mbi.BaseAddress);
}

}
//continue la recherche des régions (ajoute la taille de la région à l'adresse de départ ==> donne la prochaine adresse de départ)

//On Error GoTo ErrCapacityGestion 'dépassement de capacité pour la dernière adresse+regiosize

lPosMem = (unsignedlong) mbi.BaseAddress + mbi.RegionSize; //fait l'ajout
}
else
{
//recherche terminée
break;
}
}
//ErrCapacityGestion:
CloseHandle( lHandle ); //ferme le handle du processus
}
int main(void)
{
unsignedlong Pid, *BaseAdress, *RegionSize, SizeBA = 0, SizeRS = 0;
 
GetAllPrivileges();
if( GetProcessId("explorer.exe", &Pid ))
printf("PID : %d\n", Pid);
RetrieveMemRegions( Pid, &BaseAdress, &RegionSize, &SizeBA, &SizeRS );
 
returntrue;
}

il y a deux ligne de code que je n'ai pas reussi a traduire dans la fonction 'RetrieveMemRegions' : 'On Error GoTo ErrCapacityGestion' et donc aussi : 'ErrCapacityGestion:', si ca peut aider....

merci d'avance pour vos reponses.
mardi 30 janvier 2007 à 18:01:18 | Re : recuperer la memoire virtuelle

sam20

As tu essayer de changer "on error goto" en try?
mardi 30 janvier 2007 à 18:03:46 | Re : recuperer la memoire virtuelle

sam20

Peut tu me donner le lien du prog en vb stp ca m'interesse merci.
mercredi 31 janvier 2007 à 08:46:41 | Re : recuperer la memoire virtuelle

louis14

Je suis interressé aussi par le programme  de récupération de mémoire virtuelle.
Peux-tu m'indiquer le lien du programme en Vb . Sinon je suis preneur de ton projet pour t'aider.

louis14
mercredi 31 janvier 2007 à 09:28:31 | Re : recuperer la memoire virtuelle

BruNews

Administrateur CodeS-SourceS
Réponse acceptée !
C'est chez Richter qu'il faut prendre ses références mais assurément pas depuis VB.

http://brunews.com/brunews/download/JR4.zip
http://brunews.com/brunews/download/JR4Sources.zip
Voir le chapitre 14.

ciao...
BruNews, MVP VC++


Cette discussion est classée dans : handle, pid, unsignedlong, mbi, sizeba


Répondre à ce message

Sujets en rapport avec ce message

connaitre le pid à partir du handle d'un processus [ par cosmobob ] comment récuperer le pid d'un processus lancé avec shellexecute ? (avec createprocess j'ai fait c'est plus simple)j'ai utilisé shellexecutex, et avec PID et HANDLE [ par CleFac ] Bonjour,J'aimerai savoir comment récupérer l'HANDLE d'une fenêtre quand on connais son PID.Merci d'avance police d'edit de boite de dialogue [ par by_rabbit_08 ] Bonsoir!J'ai une boite de dialogue, crée dans un fichier resource, dans la quelle j'ai un edit. Comment est-ce que je fais changer la police de cet ed HINSTANCE / HANDLE [ par Ombitious_Developper ] Salut :Quelle est la différence entre un HANDLE et un HINSTANCE? Est ce que la conversion HANDLE-->HINSTANCE est valide? Est ce que la getoenfilename -> ??? [ par stefbuet ] salut,sur une source (http://www.cppfrance.com/code.aspx?ID=28478)j'ai extrait une fonction de la librairy créé et ais essayé de la faire fonctioner, Problème Pipes et Signaux en C sous Linux [ par shown ] Alors voilà, j'ai un problème apparemment avec la lecture dans un pipe.Je ne parviens pas à lire dans le pipe caractère par caractère.Voilà en fait ce [C/Linux]problème de fork wait [ par rt15 ] Bonjour, Le code en fin du message produit la sortie suivante : Creation du fils debut attente du fils fin de l'attente du fils Fin du fils Alors que Handle non valide a été spécifié ?!? [ par billou_13 ] Bonjour,Alors voila, depuis ce matin, je me trouve confronter avec cette erreur. J'ai un thread d'écoute dans un handlestatic HANDLE hListeningThread; Handle et hwnd c'est quoi? [ par sebastienmz ] Bonjourje me suis toujours demandé ce que c'est un handle et hwnd ________Sébastien Metthezwww.sebastien- transmission de donnees via port serie [ par seignseifer ] Bonjour tout le monde, j'ai fait un petit programme en  C++ sous Borland C++6.0, car je veux envoyer via le port serie, des information a un analyseur


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,108 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales