سؤال

أقوم حاليًا بتطوير مشروع هواية صغير لعرض المعلومات الصحية في لعبة على لوحة مفاتيح G15 من خلال VB.NET.

عندما أستخدم ReadProcessMemory عبر مكالمة API ، فإنه يستمر في إرجاع الصفر. أحالتني وثائق MSDN إلى استخدام Marshal.GetLastwin32Rorror () Call لمعرفة ما هو الخطأ ويعود 1400: مقبض نافذة غير صالح.

أنا الآن مرتبك حول ما إذا كانت الوسيطة الأولى من الوظيفة تريد مقبض نافذة أو معرف العملية. بغض النظر ، لقد جربت كل من FindWindow وترميز معرف العملية أثناء تشغيل التطبيق (الحصول عليه من مدير المهام).

لقد جربت ثلاث مباريات مختلفة ، الإرهاب الحضري ، Grand Theft Auto: SA و 3D Pinball للنوافذ ، والحصول على عناوين الذاكرة من تطبيق يسمى Cheat Engine ؛ يبدو أنهم جميعا يفشلون.

إليك الرمز الذي أستخدمه للقيام بذلك:

استدعاء API:

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

طريقة:

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))

هل يمكن لأي شخص أن يشرح لي لماذا لا يعمل؟ شكرا مقدما.

هل كانت مفيدة؟

المحلول

أولاً ، يعد توقيع الطريقة خطأ ، واحد = تعويم بينما المعلمة الأصلية من نوع LPBUF.

استخدم توقيع هذه الطريقة:

<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

ثانياً ، أعتقد أن مقبض Hprocess يتوقع مقبضًا تم فتحه بواسطة وظيفة OpenProcess ، وليس مقبض النافذة.

نصائح أخرى

شكرا لك آرول ، لقد إصلاح مشكلتي.

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

الآن يعتقد أن المقبض صالح ومحاولات قراءة ذاكرة العمليات ، لكنني أتلقى رسالة الخطأ 299: تم الانتهاء من جزء فقط من طلب ReadProcessMemory أو WriteProcessMemory.

هل لدى أي شخص أي أفكار حول كيفية المضي قدمًا في حل هذه المشكلة؟

الرسالة 299: تم الانتهاء من جزء فقط من طلب ReadProcessMemory أو WriteProcessMemory يعني أن الذاكرة التي كنت أحاول قراءتها كانت محمية.

شكرًا على كل مساعدتك ، سأضع علامة على إجابة Arul كإجابة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top