Recuperer la memoire virtuelle

Résolu
ciddu42
Messages postés
23
Date d'inscription
dimanche 11 avril 2004
Statut
Membre
Dernière intervention
19 novembre 2019
- 30 janv. 2007 à 15:35
BruNews
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
- 31 janv. 2007 à 09:28
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.

4 réponses

BruNews
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
31 janv. 2007 à 09:28
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++
3
cs_sam20
Messages postés
184
Date d'inscription
lundi 31 juillet 2006
Statut
Membre
Dernière intervention
26 mai 2016
3
30 janv. 2007 à 18:01
As tu essayer de changer "on error goto" en try?
0
cs_sam20
Messages postés
184
Date d'inscription
lundi 31 juillet 2006
Statut
Membre
Dernière intervention
26 mai 2016
3
30 janv. 2007 à 18:03
Peut tu me donner le lien du prog en vb stp ca m'interesse merci.
0
cs_louis14
Messages postés
793
Date d'inscription
mardi 8 juillet 2003
Statut
Membre
Dernière intervention
10 février 2021
8
31 janv. 2007 à 08:46
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
0