/[RomCheater]/trunk/Win32/Sojaner.MemoryScanner/MemoryScanner.cs
ViewVC logotype

Diff of /trunk/Win32/Sojaner.MemoryScanner/MemoryScanner.cs

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 156 by william, Mon May 28 04:14:03 2012 UTC revision 166 by william, Mon May 28 08:14:02 2012 UTC
# Line 5  using System.Diagnostics; Line 5  using System.Diagnostics;
5  using System.Threading;  using System.Threading;
6  using System.Runtime.InteropServices;  using System.Runtime.InteropServices;
7  using RomCheater.Logging;  using RomCheater.Logging;
8    using RomCheater.Core;
9    using System.IO;
10    
11  namespace Sojaner.MemoryScanner  namespace Sojaner.MemoryScanner
12  {  {
# Line 66  namespace Sojaner.MemoryScanner Line 68  namespace Sojaner.MemoryScanner
68              }              }
69          }          }
70    
71          public byte[] ReadProcessMemory(IntPtr MemoryAddress, uint bytesToRead, out int bytesRead)  
72            public bool DumpMemory(string filename, uint MemoryAddress, uint bytesToRead, out int bytesRead)
73            {
74                bytesRead = 0;
75                uint byte_alignment = 102400; // write to file in 100mb chunks
76                uint address = MemoryAddress;
77                try
78                {
79                    using (FileStream fs = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
80                    {
81                        BinaryWriter bw = new BinaryWriter(fs);
82                        //foreach (byte b in data) { bw.Write(b); }
83    
84                        for (uint i = 0; i <= bytesToRead; i += byte_alignment)
85                        {
86                            byte[] buffer = new byte[byte_alignment];
87                            uint bytes_to_read = byte_alignment;
88                            IntPtr ptrBytesRead;
89                            ProcessMemoryReaderApi.ReadProcessMemory(m_hProcess, (UIntPtr)address, buffer, bytes_to_read, out ptrBytesRead);
90                            bytesRead = ptrBytesRead.ToInt32();
91                            bw.Write(buffer);
92                            bw.Flush();
93                            address += byte_alignment;
94                        }
95                        bw.Close();
96                    }
97                    return true;
98                }
99                catch (OutOfMemoryException ex)
100                {
101                    logger.Error.WriteLine("DumpMemory(): OutOfMemoryException");
102                    logger.Error.WriteLine(ex.ToString());
103                }
104                catch (Exception ex)
105                {
106                    logger.Error.WriteLine("DumpMemory(): Exception");
107                    logger.Error.WriteLine(ex.ToString());
108                }
109                return false;
110            }
111    
112            public byte[] ReadProcessMemory(uint MemoryAddress, uint bytesToRead, out int bytesRead)
113          {          {
114                bytesRead = 0;
115                uint address = MemoryAddress;
116                List<byte[]> aligned_array_list = new List<byte[]>();
117              try              try
118              {              {
119                  byte[] buffer = new byte[bytesToRead - 1];                  uint byte_alignment = 512; // 4mb alignment
120                  
121    
122                  IntPtr ptrBytesRead;                  for (uint i = 0; i <= bytesToRead; i += byte_alignment)
123                  ProcessMemoryReaderApi.ReadProcessMemory(m_hProcess, MemoryAddress, buffer, bytesToRead, out ptrBytesRead);                  {
124                        byte[] buffer = new byte[byte_alignment];
125                        uint bytes_to_read = byte_alignment;
126                        IntPtr ptrBytesRead;
127                        ProcessMemoryReaderApi.ReadProcessMemory(m_hProcess, (UIntPtr)address, buffer, bytes_to_read, out ptrBytesRead);
128                        bytesRead = ptrBytesRead.ToInt32();
129                        aligned_array_list.Add(buffer);                    
130                        address += byte_alignment;
131                    }
132    
133                  bytesRead = ptrBytesRead.ToInt32();                  //List<byte> big_array = new List<byte>();
134                    //foreach (byte[] aligned_array in aligned_array_list) { foreach (byte b in aligned_array) { big_array.Add(b); } }
135    
136                  return buffer;                  return new byte[] { };
137              }              }
138              catch (OutOfMemoryException ex)              catch (OutOfMemoryException ex)
139              {              {
# Line 89  namespace Sojaner.MemoryScanner Line 145  namespace Sojaner.MemoryScanner
145                  logger.Error.WriteLine("ReadProcessMemory(): Exception");                  logger.Error.WriteLine("ReadProcessMemory(): Exception");
146                  logger.Error.WriteLine(ex.ToString());                  logger.Error.WriteLine(ex.ToString());
147              }              }
             bytesRead = 0;  
148              return new byte[] { };              return new byte[] { };
149          }          }
150    
151          public void WriteProcessMemory(IntPtr MemoryAddress, byte[] bytesToWrite, out int bytesWritten)          public void WriteProcessMemory(UIntPtr MemoryAddress, byte[] bytesToWrite, out int bytesWritten)
152          {          {
153              IntPtr ptrBytesWritten;              IntPtr ptrBytesWritten;
154              ProcessMemoryReaderApi.WriteProcessMemory(m_hProcess, MemoryAddress, bytesToWrite, (uint)bytesToWrite.Length, out ptrBytesWritten);              ProcessMemoryReaderApi.WriteProcessMemory(m_hProcess, MemoryAddress, bytesToWrite, (uint)bytesToWrite.Length, out ptrBytesWritten);
# Line 148  namespace Sojaner.MemoryScanner Line 203  namespace Sojaner.MemoryScanner
203              //                  SIZE_T * lpNumberOfBytesRead  // number of bytes read              //                  SIZE_T * lpNumberOfBytesRead  // number of bytes read
204              //                  );              //                  );
205              [DllImport("kernel32.dll")]              [DllImport("kernel32.dll")]
206              public static extern Int32 ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [In, Out] byte[] buffer, UInt32 size, out IntPtr lpNumberOfBytesRead);              public static extern Int32 ReadProcessMemory(IntPtr hProcess, UIntPtr lpBaseAddress, [In, Out] byte[] buffer, UInt32 size, out IntPtr lpNumberOfBytesRead);
207    
208              //          BOOL WriteProcessMemory(              //          BOOL WriteProcessMemory(
209              //                  HANDLE hProcess,                // handle to process              //                  HANDLE hProcess,                // handle to process
# Line 158  namespace Sojaner.MemoryScanner Line 213  namespace Sojaner.MemoryScanner
213              //                  SIZE_T * lpNumberOfBytesWritten // count of bytes written              //                  SIZE_T * lpNumberOfBytesWritten // count of bytes written
214              //                  );              //                  );
215              [DllImport("kernel32.dll")]              [DllImport("kernel32.dll")]
216              public static extern Int32 WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [In, Out] byte[] buffer, UInt32 size, out IntPtr lpNumberOfBytesWritten);              public static extern Int32 WriteProcessMemory(IntPtr hProcess, UIntPtr lpBaseAddress, [In, Out] byte[] buffer, UInt32 size, out IntPtr lpNumberOfBytesWritten);
217    
218    
219          }          }

Legend:
Removed from v.156  
changed lines
  Added in v.166

  ViewVC Help
Powered by ViewVC 1.1.22