ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/RomCheater/trunk/Win32/Sojaner.MemoryScanner/MemoryScanner.cs
(Generate patch)

Comparing trunk/Win32/Sojaner.MemoryScanner/MemoryScanner.cs (file contents):
Revision 202 by william, Thu May 31 07:29:44 2012 UTC vs.
Revision 203 by william, Thu May 31 09:03:53 2012 UTC

--- trunk/Win32/Sojaner.MemoryScanner/MemoryScanner.cs	2012/05/31 08:38:16	202
+++ trunk/Win32/Sojaner.MemoryScanner/MemoryScanner.cs	2012/05/31 09:03:53	203
@@ -84,6 +84,13 @@ namespace Sojaner.MemoryScanner
         }
         #endregion
 
+        #region ReadProcessMemory
+        public bool ReadFirstNonZeroByte(uint MemoryAddress, uint bytesToRead, out uint address)
+        {
+            RamDumper dumper = new RamDumper();
+            return dumper.ReadFirstNonZeroByte(ReadProcess, MemoryAddress, bytesToRead, out address);
+        }
+        #endregion
         #region WriteProcessMemory
         public void WriteProcessMemory(UIntPtr MemoryAddress, byte byteToWrite, out int bytesWritten)
         {
@@ -255,6 +262,81 @@ namespace Sojaner.MemoryScanner
             }
             #endregion
             #endregion
+
+            #region ReadFirstNonZeroByte
+            public bool ReadFirstNonZeroByte(Process ppid, uint MemoryAddress, uint bytesToRead, out uint address)
+            {
+                //logger.Info.WriteLine("Dumping memory (0x{0:x8}-0x{1:x8}) from pid=({2})", MemoryAddress, MemoryAddress + bytesToRead, string.Format("0x{0:x4} {1}.exe", ppid.Id, ppid.ProcessName));
+                address = 0;
+                uint byte_alignment = 1;
+                // get common init parameters
+                //InitMemoryDump(out byte_alignment);
+                uint mem_address = MemoryAddress;
+                uint _bytesToRead = bytesToRead;
+                byte[] buffer = new byte[] { };
+                try
+                {
+                    //using (MemoryStream ms = new MemoryStream())
+                    //{
+                    //    //BinaryWriter bw = new BinaryWriter(ms);
+                    //    //foreach (byte b in data) { bw.Write(b); }
+                        for (uint i = 0; i <= bytesToRead; )
+                        {
+                            if (_bytesToRead < byte_alignment)
+                            {
+                                _bytesToRead = bytesToRead;
+                                buffer = new byte[_bytesToRead];
+                            }
+                            else
+                            {
+                                _bytesToRead = byte_alignment;
+                                buffer = new byte[byte_alignment];
+                            }
+                            IntPtr ptrBytesRead;
+                            ProcessMemoryReader.ProcessMemoryReaderApi.ReadProcessMemory(m_hProcess, (UIntPtr)mem_address, buffer, _bytesToRead, out ptrBytesRead);
+                            //bw.Write(buffer);
+                            //bw.Flush();
+                            if (_bytesToRead < byte_alignment)
+                            {
+                                i += _bytesToRead;
+                                mem_address += _bytesToRead;
+                            }
+                            else
+                            {
+                                i += byte_alignment;
+                                mem_address += byte_alignment;
+                            }
+                            for (uint j = 0; j < buffer.Length; j++)
+                            {
+                                if (buffer[j] != 0)
+                                {
+                                    address = mem_address;
+                                    break;
+                                }
+                            }
+                            if (address != 0)
+                                break;
+                        }
+                    //    bw.Close();
+                    //}
+                    //logger.Info.WriteLine("Succefully dumped memory (0x{0:x8}-0x{1:x8}) from pid=({2})", MemoryAddress, MemoryAddress + bytesToRead, string.Format("0x{0:x4} {1}.exe", ppid.Id, ppid.ProcessName));
+                    return true;
+                }
+                catch (OutOfMemoryException ex)
+                {
+                    logger.Error.WriteLine("Failed to dump memory (0x{0:x8}-0x{1:x8}) from pid=({2})", MemoryAddress, MemoryAddress + bytesToRead, string.Format("0x{0:x4} {1}.exe", ppid.Id, ppid.ProcessName));
+                    logger.Error.WriteLine("DumpMemory(): OutOfMemoryException");
+                    logger.Error.WriteLine(ex.ToString());
+                }
+                catch (Exception ex)
+                {
+                    logger.Error.WriteLine("Failed to dump memory (0x{0:x8}-0x{1:x8}) from pid=({2})", MemoryAddress, MemoryAddress + bytesToRead, string.Format("0x{0:x4} {1}.exe", ppid.Id, ppid.ProcessName));
+                    logger.Error.WriteLine("DumpMemory(): Exception");
+                    logger.Error.WriteLine(ex.ToString());
+                }
+                return false;
+            }
+            #endregion
         }
         #endregion
         /// <summary>