Hvordan å liste opp alle minnesider fordelt på alle accesible processesCreate et skjema med en knapp og et Utforsker, navngi Utforsker tvwProcessList. Navn på knappen btnProcessList.uses Windows; prosedyre TForm1.btnProcessListClick (Sender: TObject); Var i, l: integer; pid: THandle; meminfo: MEMORY_BASIC_INFORMATION; memstart: pekeren; memsize: Integer; s, attr: String; totuse: Integer; lpMsgBuf: PCHAR; pn, pidn, ln: TTreeNode, begynner btnProcessList.Enabled: = false; tvwProcessList.Items.Clear; pn: = tvwProcessList.Items.AddFirst (null, "Denne datamaskinen '); for i: = 0-2000 gjøre //begynne //PROCESS_QUERY_INFORMATION pid: = OpenProcess (PROCESS_ALL_ACCESS {PROCESS_VM_OPERATION eller PROCESS_QUERY_INFORMATION eller PROCESS_VM_WRITE}, falsk, jeg * 4); hvis pid < > 0 da begynne //legge treenode: pidn: = tvwProcessList.Items.AddChild (pn, IntToStr (i * 4 {pid})); memstart: = 0; totuse: = 0; l: = VirtualQueryEx (pid, memstart, MemInfo, sizeof (MEMORY_BASIC_INFORMATION)); while (l = sizeof (MEMORY_BASIC_INFORMATION)) gjør begynne hvis Application.Terminated deretter exit; hvis meminfo.State = MEM_COMMIT deretter begynne totuse: = totuse + meminfo.RegionSize; attr: = ''; if (0 < > meminfo.Protect og PAGE_NOACCESS) deretter attr: = attr + 'NO ACCESS'; if (0 < > meminfo.Protect og PAGE_READONLY) deretter attr: = attr + 'READONLY'; if (0 < > meminfo.Protect og PAGE_READWRITE) deretter attr: = attr + 'WRITE'; if (0 < > meminfo.Protect og PAGE_WRITECOPY) deretter attr: = attr + 'WRITECOPY'; if (0 < > meminfo.Protect og PAGE_EXECUTE) deretter attr: = attr + 'EXECUTE'; if (0 < > meminfo.Protect og PAGE_EXECUTE_READ) deretter attr: = attr + 'EXECUTE_READ'; if (0 < > meminfo.Protect og PAGE_EXECUTE_READWRITE) deretter attr: = attr + 'EXECUTE_READWRITE'; if (0 < > meminfo.Protect og PAGE_EXECUTE_WRITECOPY) deretter attr: = attr + 'EXECUTE_WRITECOPY'; if (0 < > meminfo.Protect og PAGE_GUARD) deretter attr: = attr + 'GUARD'; if (0 < > meminfo.Protect og PAGE_NOCACHE) deretter attr: = attr + 'nocache'; ln: = tvwProcessList.Items.AddChild (pidn, Format ( "attr:% d:% s, Base:% d, størrelse:% d ', [meminfo.protect, attr, heltall (meminfo.BaseAddress), meminfo.RegionSize ])); Application.ProcessMessages; slutt; heltall (memstart): = heltall (meminfo.BaseAddress) + meminfo.regionsize; heltall (memstart): = heltall (memstart) + memsize; l: = VirtualQueryEx (pid, memstart, MemInfo, sizeof (MEMORY_BASIC_INFORMATION)); slutt; pidn.Text: = Format ( 'pid:% d, tildelt:% d', [i * 4, totuse]); slutt; CloseHandle (pid); slutt; btnProcessList.Enabled: = true; ende; Explanetion: Vinduene prosess ID er alltid en multiplisere av 4. SO, tilgang prosess nr. 8 vil få tilgang til den samme prosessen som håndtak 9,10 og 11.We bare sløyfe en liste over mulige ID'er. Det finnes bedre måter å gjøre dette, men det er utenfor omfanget av denne artikkelen, og denne metoden fungerer bare fine.IF vi har openened en prosess, vi liste den første siden. Vi legger til størrelsen på denne siden til starten adressen til neste side for å retrieve.Not alle sidene er tildelt, kan vi bekrefte dette med MEM_COMMIT tag.If en side er forpliktet undersøker vi attributtene, og legge et tre node. dette kan ta en stund (spesielt legge alle disse tre noder) .Etter vi er ferdig, vi lukker processhandle med CloseHandle. Vær helt sikker på å gjøre dette !!! Ikke lukke håndtaket vil føre til morsomme resultater, og hvis du gjør dette flere ganger du kan godt ende i å måtte starte maskinen på nytt sincew alt blir treg.
Oppføring alle minne sider fordelt på alle accesible processes
Next Page:Slik oppretter en Pre-Caching System