Snublefot Skrevet 4. august 2006 Del Skrevet 4. august 2006 Hei! Jeg skal designe en applikasjon i .NET som leser og skriver til andre prosesser sitt minne område, i MSDN har jeg funnet hva jeg trenger men hvordan kan dette deklareres i .NET. Det er snakk om ReadProcessMemory og WriteProcessMemory? ReadProcessMemory WriteProcessMemory Etter litt søking på nettet fant jeg dette: Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Integer, ByRef lpBaseAddress As Object, ByRef lpBuffer As Object, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Integer Jeg fant ikke tilsvarende til ReadProcessMemory, men igjen eksemplene i MSDN hjelper ikke mye da det ikke omhandler .NET. Noen som har erfaring med dette? Lenke til kommentar
lnostdal Skrevet 5. august 2006 Del Skrevet 5. august 2006 (endret) Aller først; jo, jeg vil gjerne se stumpen din. Okei, ut i fra det du har funnet om WriteProcessMemory og det som står på MSDN om ReadProccessMemory skulle deklarasjonene bli helt like bortsett fra at du kan kalle den siste parameteren for lpNumberOfBytesRead. Endret 5. august 2006 av lnostdal Lenke til kommentar
GeirGrusom Skrevet 5. august 2006 Del Skrevet 5. august 2006 Alt som begynner med lp = IntPtr eller ByRef, fordi det betyr pointer i windowsverden. BOOL = (husker ikke om dette er 16-bit eller 32-bit ) bool = byte BYTE = byte SHORT = short LONG = integer LONGLONG = long int = IntPtr DWORD = integer WORD = short char = byte TCHAR = char LPSTR = string LPTSTR = string LPCSTR = string Hvis du finner noen '*' så deklarer dem enten som ByRef eller IntPtr f.eks. LONG * parameter, blir til IntPtr, eller ByRef parameter As Long, avhengig av hva det skal hentes fra den. hvis du finner &, så skal det deklareres ByRef, men det brukes vel bortimot aldri i funksjonsdeklarering. Så hvis du har C deklerasjonen, skal du nå kunne oversette de fleste i Windows API, bortsett fra de som krever COM, det du gjør hvis du ser noen som krever et interfacer (datatype som begynner med I) så må du lete det fram i MSDN, og se hvilken dll den hører til, og legge den til som referanse. Lenke til kommentar
wolf5 Skrevet 8. august 2006 Del Skrevet 8. august 2006 (endret) Jeg har brukt denne i C#. Burde være enkel å bytte til VB.Net syntax [DllImport("kernel32.dll")] public static extern int ReadProcessMemory(int hProc, int iBaseAddr, IntPtr anyBuff, int iSize, ref int iNumOfBytesWritten); og en kodesnutt eksempel jeg har brukt: //Finn en prosess ut fra en window handle int hwnd = DLLimports.FindWindow("Klassenavn",null); if(hwnd==0) throw new Exception("Window not found"); int procID = 0; DLLimports.GetWindowThreadProcessId(hwnd, ref procID); if(procID==0) throw new Exception("Process not found"); //Hent handle til prosessen int hProcess = DLLimports.OpenProcess(0x10,false,procID); //Read access if(hProcess==0) throw new Exception("Handle not gotten"); int noofbyt = 0; //antall bytes returnert i kommende kall til readprocmem int buffsize = 100000; //Klargjør buffer IntPtr ptr = Marshal.AllocCoTaskMem(buffsize); //Less inn minne fra adresse 0 til buffsize bytes DLLimports.ReadProcessMemory(hProcess,0,ptr,buffsize,ref noofbyt); //Les ut dataene til en streng string str = Marshal.PtrToStringAnsi(ptr, noofbyt); Og en annen ting. int og IntPtr er det samme. Det kan castes frem og tilbake. IntPtr er bare en finere måte å illustrere at int'en er en peker (samt at interne .Net kall bruker IntPtr istedet for int). Så du kan bytte int med IntPtr og motsatt i win32 importene. Pleier selv ikke være veldig konsekvent på dette. Blir hips om haps. Endret 8. august 2006 av wolf5 Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå