Jag håller på med ett program för att söka igenom och ändra andra programs minne, typ GameHack, men att söka igenom 4GB minne kan ju ta ett tag, så jag undrar om det finns några skyddade områden i minnet som man kan hoppa över. (Jag har hört att bara 2GB kan användas) Om det finns sådana områden, vilka adresser kan man då hoppa över? Jag är inte någon hejare på api. Jag tror dock inte att du kan gå in och läsa en annan process minnesarea, har för mig att det är ett av de grundläggande skydd som lades in när NT kom. Jag hittade lösningen själv, man kan läsa/skriva andra processers minne med ReadProcessMemory och WriteProcessMemory, och minnet som användaren kan komma åt är 0x00400000-0x80000000 (inte säker på 0x800000000, kan vara 0x80400000, säg till om jag har fel). >Där type kan vara 1, 2 eller 4, för BYTE, WORD eller DWORD, data1 är en array med DWORD, br är en DWORD, i är en DWORD och tmp är en pekare till BYTE, WORD eller DWORD, beroende på vad type är, så hänger sig loopen, eller tar en oerhörd tid på sig (vet inte vilket, har suttit i 15 minuter och väntat på att den ska köras färdigt).Minnes problem
Sv: Minnes problem
Varje process tilldelas en virtuell minnesarea på 4 GB (har för mig att det inte går att adressera mer än 2 GB för programmets egna behov, övrigt reserverat för os:et). Minnesarean är privat för processen.
/TommySv: Minnes problem
Nu har jag ett nytt problem:
När jag kör min minnesgenomsökarloop som ser ut så här:
for(i=SEARCH_MEMORY_START;i<SEARCH_MEMORY_END;i+=type)
{
ReadProcessMemory(hProcess, (LPVOID)i, tmp, type, &br);
if(tmp == dwSearchValue)
data1[dwResultIndex++] = i;
}
Där type kan vara 1, 2 eller 4, för BYTE, WORD eller DWORD, data1 är en array med DWORD, br är en DWORD, i är en DWORD och tmp är en pekare till BYTE, WORD eller DWORD, beroende på vad type är, så hänger sig loopen, eller tar en oerhörd tid på sig (vet inte vilket, har suttit i 15 minuter och väntat på att den ska köras färdigt).
Om det inte framgår så ska loopen hitta alla minnesadresser som innehåller ett värde, och sedan spara alla dessa värden i en array.
När jag körde loopen från 0x0000 till 0xFFFF gick det utmärkt.
Vad är det för fel?Sv: Minnes problem
Ja du ska ju arbeta dig igenom upp mot två miljarder anrop, sånt tar tid. Du kan ju lägga till någon slags förloppsindikator så du ser att det händer något.
Det skulle antagligen gå betydligt snabbare att hämta en större mängd data per gång och mellanlagra i en lokal buffert.
MS