Gå til innhold

API deklarert i .NET? MSDN... win32.


Anbefalte innlegg

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
Videoannonse
Annonse

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 av lnostdal
Lenke til kommentar

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

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 av wolf5
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...