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 21040 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 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
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
Rejoignez-nous