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

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

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

revision 289 by william, Mon May 28 05:55:59 2012 UTC revision 290 by william, Tue Jun 5 09:30:32 2012 UTC
# Line 12  namespace Sojaner.MemoryScanner Line 12  namespace Sojaner.MemoryScanner
12      public class PEReader      public class PEReader
13      {      {
14          public PEReader(FileInfo fi) : this(fi.FullName) { }          public PEReader(FileInfo fi) : this(fi.FullName) { }
15          public PEReader(string filename) { this.Read(filename); }          public PEReader(string filename)
16            {
17                Exception ErrorInfo = null;
18                try
19                {
20                    this.Read(filename, out ErrorInfo);
21                }
22                catch (Exception ex)
23                {
24                    logger.Error.WriteLine("PEReader: Failed to read process: {0}", filename);
25                    if (ErrorInfo != null)
26                    {
27                        //logger.Error.WriteLine(ErrorInfo.GetBaseException().ToString());
28                        throw ErrorInfo;
29                    }
30                    else
31                    {
32                        //logger.Error.WriteLine(ex.GetBaseException().ToString());
33                        throw ex;
34                    }          
35                }
36            }
37    
38          #region marshalling          #region marshalling
39          private void Read(string filename)          private void Read(string filename, out Exception ErrorInfo)
40          {          {
41              logger.Debug.WriteLine("Reading Exe: {0}", filename);              ErrorInfo = null;
42                try
             using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read))  
43              {              {
44                  byte[] data = new byte[] { };                  logger.Debug.WriteLine("Reading Exe: {0}", filename);
                 GCHandle pinnedPacket = new GCHandle();  
                 int size = 0;  
                 BinaryReader br = new BinaryReader(fs);  
45    
46                  #region IMAGE_DOS_HEADER                  using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read))
47                  size = Marshal.SizeOf(typeof(IMAGE_DOS_HEADER));                  {
48                  data = br.ReadBytes(size);                      try
49                  pinnedPacket = GCHandle.Alloc(data, GCHandleType.Pinned);                      {
50                  IMAGE_DOS_HEADER DOS_HEADER = (IMAGE_DOS_HEADER)Marshal.PtrToStructure(pinnedPacket.AddrOfPinnedObject(), typeof(IMAGE_DOS_HEADER));                          byte[] data = new byte[] { };
51                  pinnedPacket.Free();                          GCHandle pinnedPacket = new GCHandle();
52                  #endregion                          int size = 0;
53                            BinaryReader br = new BinaryReader(fs);
54                  // skip the old dos stub  
55                  br.BaseStream.Seek(DOS_HEADER.e_lfanew, SeekOrigin.Begin);                          #region IMAGE_DOS_HEADER
56                            size = Marshal.SizeOf(typeof(IMAGE_DOS_HEADER));
57                  #region IMAGE_NT_HEADERS                          data = br.ReadBytes(size);
58                  size = Marshal.SizeOf(typeof(IMAGE_NT_HEADERS));                          pinnedPacket = GCHandle.Alloc(data, GCHandleType.Pinned);
59                  data = br.ReadBytes(size);                          IMAGE_DOS_HEADER DOS_HEADER = (IMAGE_DOS_HEADER)Marshal.PtrToStructure(pinnedPacket.AddrOfPinnedObject(), typeof(IMAGE_DOS_HEADER));
60                  pinnedPacket = GCHandle.Alloc(data, GCHandleType.Pinned);                          pinnedPacket.Free();
61                  IMAGE_NT_HEADERS NT_HEADER = (IMAGE_NT_HEADERS)Marshal.PtrToStructure(pinnedPacket.AddrOfPinnedObject(), typeof(IMAGE_NT_HEADERS));                          #endregion
62                  pinnedPacket.Free();  
63                  #endregion                          // skip the old dos stub
64                            br.BaseStream.Seek(DOS_HEADER.e_lfanew, SeekOrigin.Begin);
65    
66                  br.Close();                          #region IMAGE_NT_HEADERS
67                            size = Marshal.SizeOf(typeof(IMAGE_NT_HEADERS));
68                            data = br.ReadBytes(size);
69                            pinnedPacket = GCHandle.Alloc(data, GCHandleType.Pinned);
70                            IMAGE_NT_HEADERS NT_HEADER = (IMAGE_NT_HEADERS)Marshal.PtrToStructure(pinnedPacket.AddrOfPinnedObject(), typeof(IMAGE_NT_HEADERS));
71                            pinnedPacket.Free();
72                            #endregion
73    
74    
75                            br.Close();
76                        }
77                        catch (Exception ex)
78                        {
79                            ErrorInfo = ex;
80                        }
81                    }
82                }
83                catch (Exception ex)
84                {
85                    ErrorInfo = ex;
86              }              }
   
   
87          }          }
88          #endregion          #endregion
89    
# Line 121  namespace Sojaner.MemoryScanner Line 155  namespace Sojaner.MemoryScanner
155              [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]              [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
156              public char[] Signature;              public char[] Signature;
157    
158              [FieldOffset(4)]              [FieldOffset(8)]
159              public IMAGE_FILE_HEADER FileHeader;              public IMAGE_FILE_HEADER FileHeader;
160    
161              [FieldOffset(24)]              [FieldOffset(24)]

Legend:
Removed from v.289  
changed lines
  Added in v.290

  ViewVC Help
Powered by ViewVC 1.1.22