Readprocessmemory hält 0 Rückkehr
-
19-08-2019 - |
Frage
Ich entwickle derzeit ein wenig Hobby-Projekt Gesundheitsinformationen in einem Spiel auf meiner G15 Tastatur durch VB.NET angezeigt werden soll.
Wenn ich über Readprocessmemory einen API-Aufruf verwenden, hält sie Null zurückkehrt. Die MSDN-Dokumentation bezeichnet mir die Marshal.GetLastWin32Error verwenden () aufrufen, um herauszufinden, was falsch ist, und es gibt 1400:. INVALID Fenstergriff
Ich bin jetzt verwirrt darüber, ob das erste Argument der Funktion eines Fenstergriff oder eine Prozess-ID will. Egal, ich habe versucht, beide mit Findwindow und hartzucodieren den Prozess-ID, während die Anwendung ausgeführt wird (es vom Task-Manager bekommen).
ich drei verschiedene Spiele ausprobiert habe, Urban Terror, Grand Theft Auto: SA und 3D-Flipper für Fenster, bekommt die Speicheradressen von einer Anwendung Cheat Engine genannt; sie alle scheinen zum Scheitern verurteilt.
Hier ist der Code verwende ich es zu tun:
API-Aufruf:
Private Declare Function ReadProcessMemory Lib "kernel32" ( _
ByVal hProcess As Integer, _
ByVal lpBaseAddress As Integer, _
ByRef lpBuffer As Single, _
ByVal nSize As Integer, _
ByRef lpNumberOfBytesWritten As Integer _
) As Integer
Methode:
Dim address As Integer
address = &HA90C62&
Dim valueinmemory As Integer
Dim proc As Process = Process.GetCurrentProcess
For Each proc In Process.GetProcesses
If proc.MainWindowTitle = "3D Pinball for Windows - Space Cadet" Then
If ReadProcessMemory(proc.Handle.ToInt32, address, valueinmemory, 4, 0) = 0 Then
MsgBox("aww")
Else
MsgBox(CStr(valueinmemory))
End If
End If
Next
Dim lastError As Integer
lastError = Marshal.GetLastWin32Error()
MessageBox.Show(CStr(lastError))
Könnte jemand mir bitte erklären, warum es nicht funktioniert? Vielen Dank im Voraus.
Lösung
Zuerst Ihre Methodensignatur ist falsch, Einzel = Float während der ursprüngliche Parameter des LPBUF Typ ist.
Mit dieser Methode Signatur:
<DllImport("kernel32.dll", SetLastError=true)> _
Public Shared Function ReadProcessMemory( _
ByVal hProcess As IntPtr, _
ByVal lpBaseAddress As IntPtr, _
<Out()>ByVal lpBuffer() As Byte, _
ByVal dwSize as Integer, _
ByRef lpNumberOfBytesRead as Integer
) As Boolean
End Function
Zweitens glaube ich, dass der hProcess Griff einen Griff von Open Funktion, nicht der Fenstergriff.
geöffnet erwartetAndere Tipps
Danke Arul, ich habe irgendwie mein Problem behoben.
Dim address As Integer
address = &HA90C62&
Dim floatvalueinmemory() As Byte
Dim proc As Process = Process.GetCurrentProcess
For Each proc In Process.GetProcesses
If proc.MainWindowTitle = "3D Pinball for Windows - Space Cadet" Then
Dim winhandle As IntPtr = OpenProcess(PROCESS_ACCESS.PROCESS_VM_READ, True, proc.Id)
If ReadProcessMemory(winhandle, address, floatvalueinmemory, 4, 0) = 0 Then
Dim lastError As Integer
lastError = Marshal.GetLastWin32Error()
MessageBox.Show(CStr(lastError))
MsgBox("aww")
Else
MsgBox("woo")
End If
CloseHandle(winhandle)
End If
Next
Jetzt ist es nach Ansicht der Handle gültig ist und versucht, die Prozesse Speicher zu lesen, aber ich erhalte die Fehlermeldung 299:. Nur ein Teil der Readprocessmemory oder Write Anforderung abgeschlossen wurde
Hat jemand irgendwelche Ideen, wie ich vorgehen soll dieses Problem zu beheben?
Meldung 299:. Nur ein Teil der Readprocessmemory oder Write Anforderung abgeschlossen wurde die Erinnerung bedeutete, dass ich geschützt war zu lesen versuche,
Vielen Dank für Ihre Hilfe, ich werde arul Antwort als Antwort markieren.