ciddu42
Messages postés23Date d'inscriptiondimanche 11 avril 2004StatutMembreDernière intervention19 novembre 2019
-
30 janv. 2007 à 15:35
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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;
//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;
// 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;
}
//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
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....
cs_louis14
Messages postés793Date d'inscriptionmardi 8 juillet 2003StatutMembreDernière intervention10 février 20218 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.