Announcement

Collapse
No announcement yet.

ReadProcessMemory generiert "zwischendurch" Fehler

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • ReadProcessMemory generiert "zwischendurch" Fehler

    Hi

    Ich schreibe gerade ein Programm in C#.

    Das proggi liest Werte aus dem Ram. Hier mal ein Stück Code:

    Code:
    public class Memory
    {
       [DllImport("kernel32.dll")]
       static extern bool ReadProcessMemory(IntPtr hProcess, int lpBaseAddress, Byte[] lpBuffer, int nSize, Byte lpNumberOfBytesRead);
    
       public static float ReadFloat(int Adress)
       {
          Byte[] data = new Byte[255];
          try
          {
             ReadProcessMemory(proc.Handle, Adress, data, data.Length, 0);
          }
          catch(Exception e)
          {
             MessageBox.Show("Fehler beim Lesen im RAM: " + e.Message , "Info", MessageBoxButtons.OK, MessageBoxIcon.Information);
          }
          return BitConverter.ToSingle (data, 0);
       }
    }
    
    
    public class Player
    {
       public static float X
       {
          get { return Memory.ReadFloat(dwPlayerBase + dwPlayerX); }
       }
    }

    Dann hab ich ein Button gemacht, der folgendes tut:

    Code:
    float var1 = Player.X;
    Wenn ich jetzt den Button einfach mit der Enter Taste
    gedrückt halte, so dass die Funktion sehr schnell nacheinander
    ausgeführt wird, ist alles OK.

    Wenn ich aber

    Code:
    float var1 = Player.X;
    float var2 = Player.X;
    float var3 = Player.X;
    float var4 = Player.X;
    schreibe, dann gibts dauernd (aber nicht immer) Fehlermeldungen.
    Und zwar bei der Funktion ReadProcessMemory:



    Irgendwie überschneidet sich das ganze oder so. Keine Ahnung.
    Aber hoffe ihr habt eine Idee wie ich das auf eine gute Art
    lösen kann.

    Danke!
    mfg Juhu
    lol? wow gamecard 4 president.

  • #2
    Ist der Speicherbereich auf den du da zugreiftst managed?
    Wenn ja lies noch mal deinen Thread hier nach. Alles was dort bezüglich managed (garbage collected) Speicher gesagt wird gilt hier genauso.

    Comment


    • #3
      Woran erkenne ich, ob er managed ist?

      Guck meine zwei Buttons:

      Code:
      private void button1_Click(object sender, EventArgs e)
         {   
            float var1 = Player.X;
            float var2 = Player.X;
            float var3 = Player.X;
            float var4 = Player.X;
         }
      
      private void button2_Click(object sender, EventArgs e)
      {
            float var1 = Player.X;
      }
      Button 2 kann ich so oft und schnell hintereinander klicken wie ich will, es
      liest einfach perfekt alles aus dem Ram, NIE ein Fehler.
      Aber wenn ich Button 1 klicke gibts dauernd Fehlermeldungen.
      Einfach weil die ReadProcessMemory Funktion mehrmals nacheinander
      ausführe.

      Das ergibt doch keinen Sinn!

      ----------

      Hab jetzt eine mögliche Lösung für das Problem gefunden, indem ich
      VOR ReadProcessMemory ein Sleep(1); gemacht habe.
      Hab das schon mal versucht, aber habs immer nach der Funktion grschrieben,
      so gings nicht.

      Ich hab ein ziemlich schneller Rechner, denkt ihr, das Funktioniert so auch auf
      älteren Systemen?
      lol? wow gamecard 4 president.

      Comment


      • #4
        Woran erkenne ich, ob er managed ist?
        Welcher Prozess hat was an diese Speicherstelle geschrieben.
        Du mußt doch wissen wer das gemacht hat und ob er das über eine gemanagte Funktion des .NET Frameworks gemacht hat oder direkt über die WinAPI?

        Wenn Sleep() hilft wird das Problem aber vermutlich ein anderes sein. Welches können wir nicht klären ohne zu wissen woher die Daten kommen. Versuch mal einen Sleep(0) dann wird nur ein Taskwechsel erzwungen so das andere Prozesse/Threads erstmal drankommen bevor dein eigener Thread weiterläuft.
        Wenn das schon hilft ist die Wahrscheinlichkeit groß das es auch auf anderen Rechnern so funktioniert.

        Wenn nicht(eigentlich grundsätzlich) sollte du rausfinden was das eigentliche Problem ist und das beheben. Sleep deutet üblicherweise auf eine Race Condition hin.

        Comment


        • #5
          Ein Sleep(0) funktioniert auch. Alles perfekt.

          Wer das an die Speicherstelle schreibt? Der Prozess von dem ich das lese natürlich .
          Und der Prozess verwendet sicher kein .NET. Sondern WinAPI.

          Danke!
          lol? wow gamecard 4 president.

          Comment

          Working...
          X