Probleme Visual Basic unter Vista64Bit mit ReadProcessMemory und WriteProcessMemory

12/30/2009 09:06 Wild-Life78#1
Hallo Ihrs
Ich hoffe ihr könnt mir vllt vieleicht weiterhelfen, ich befasse mich schon seit einigen Tagen mit ReadProcessMemory und WriteProcessMemory
aber irgendwie will das ganze nicht unter Vista 64 Bit nicht funktionieren. Nachfolgender Code tut zb den Puktestand in Solitaire auslesen und in einer Textbox anzeigen. (Ist ja nur ein Beispiel) unter XP funktioniert das ganze ohne Probleme, aber unter Vista bekomme ich immer den Wert 0 zurück. Mir ist klar das die Speicheradresse unter Vista anders ist, und auch der ProcessName ist unter Vista "Solitaire" und nicht wie bei XP "Sol" die Speicheradressen habe ich voher mittels Cheat-Engine ausglesen und sind auch richtig. Trotzdem geht das unter Vista 64 Bit einfach nicht. Was muss ich ändern oder andres machen damit das ganze auch unter Vista64 läuft, es kann doch eigentlich nicht sein das man unter Vista den Speicher nicht lesen kann, oder? das mit "WriteProcessMemory"
habe ich noch garnicht getestet, Weil wenn ich nicht lesen kann brauche ich auch nicht schreiben versuchen. Bin mittlerweile echt am verzweifeln. Wäre schön wenn sich einer meiner Sache mal animmt

Hier mal das Beispiel ,das so wie es ist unter XP ohne Probleme läuft:
Code:
  Visual Basic Quellcode 

 Public Class Form1
    Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Integer, ByVal bInheritHandle As Integer, ByVal dwProcessId As Integer) As Integer
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Integer) As Integer
    Private Declare Function ReadProcessMemory Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Integer, ByVal lpBaseAddress As Integer, ByRef lpBuffer As Integer, ByVal nSize As Integer, ByRef lpNumberOfBytesWritten As Integer) As Integer
    Dim ExeName As String = "sol"  '!!Ohne ".exe"!!
    Dim Prozess1 As Process
    Public RBuff As Long

    Dim pList() As System.Diagnostics.Process = System.Diagnostics.Process.GetProcesses 'liste aller activen Processe

    Public Function ReadLong(ByVal ProcessName As Process, ByVal Address As Integer)
        Dim GameLookUp As Process() = Process.GetProcessesByName(ProcessName.ProcessName)
        If GameLookUp.Length = 0 Then
            End
        End If
        Dim processHandle As IntPtr = OpenProcess(&H1F0FFF, 0, GameLookUp(0).Id)
        ReadProcessMemory(processHandle, Address, RBuff, 4, Nothing)
        CloseHandle(processHandle)
        Return RBuff
    End Function
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        pList = System.Diagnostics.Process.GetProcesses
        For Each proc As System.Diagnostics.Process In pList
            'Dim Name As String = proc.ProcessName
            'ListBox1.Items.Add(Name)
            If proc.ProcessName = ExeName Then
                Prozess1 = proc
                Label1.ForeColor = Color.Green
                Label1.Text = "Spiel gefunden"
                TextBox1.Text = ReadLong(Prozess1, "&H000AA830")'Punktestand               
                Exit Sub
            End If
            Label1.ForeColor = Color.Red
            Label1.Text = "Game not found!"
            TextBox1.Text = Nothing
        Next
    End Sub
End Class
04/23/2012 21:03 qickly#2
Das geht nicht mehr ab Windows Vista, also Windows 7+8 können das auch nicht mehr. Wenn die trotzdem Werte ablesen willst musst du zu anderen Programmiersprachen wechslen. Es gibt ab Win Vista keine Möglichkeit mehr ReadProcessMemory einzusetzen,WriteProcessMemory klappt dennoch noch immer.
04/24/2012 21:21 hellfire1470#3
Sicher? meiner meinung nach habe ich das auch unter Win 7 hinbekommen...
mom ich durchsuche mal meine projekte


Das funktioniert bei mir wunderbar.


Dazu kommen noch diese beiden Deklarationen...
Bei mir werden Bytes ausgelesen und in diesem Fall wieder in einen Text zusammengesetzt.
Teste es einfach aus...
Du kannst auch bei Vb bleiben ;)