ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/RomCheater/trunk/RomCheater.CorePlugins/Config/PCSX2Config.cs
Revision: 389
Committed: Tue Jun 19 12:47:26 2012 UTC (10 years, 9 months ago) by william
File size: 8649 byte(s)
Log Message:

File Contents

# Content
1 #define DISALLOW_VERBOSE_LOGGING // when defined will disallow verbose logging for performance reasons
2 using System;
3 using System.Collections.Generic;
4 using System.Linq;
5 using System.Text;
6 using RomCheater.PluginFramework.Core;
7 using System.IO;
8 using System.Diagnostics;
9 using RomCheater.Logging;
10 using Sojaner.MemoryScanner.MemoryProviers;
11 using RomCheater.PluginFramework.Interfaces;
12
13 namespace RomCheater.CorePlugins.Config
14 {
15 public sealed class PCSX2Config : ConfigPlugin
16 {
17 #region Configuration Memvers
18 const string PCXS2_PROCESS_MAGIC = "pcsx2";
19 const string PCXS2_LOOKUP_MAGIC_001 = "pcsx2";
20 const string PCXS2_LOOKUP_MAGIC_002 = "compiled on";
21 const uint VTLB_VADDR_OFFSET_DEBUG = 0x20000000;
22 const uint VTLB_VADDR_SIZE = 0x02000000;
23 #endregion
24 public PCSX2Config() : base(false) { }
25 public PCSX2Config(bool doinit) : base(doinit) { }
26 protected override bool IsNotValidProcess(ProcContainer proc)
27 {
28 bool isDebug = false;
29 uint VTLB_RELEASE_OFFSET = 0;
30 bool notvalid = !IsValidPSX2Process(proc.ProcessInfo.Id, out isDebug, out VTLB_RELEASE_OFFSET, proc);
31
32 this.MemoryRangeStart = VTLB_RELEASE_OFFSET;
33 if (isDebug)
34 this.MemoryRangeStart = VTLB_VADDR_OFFSET_DEBUG;
35
36 this.MemoryRangeSize = VTLB_VADDR_SIZE;
37
38 if (notvalid)
39 {
40 #if !DISALLOW_VERBOSE_LOGGING
41 logger.VerboseDebug.WriteLine(" Not Allowing process {0} to be added because it was filterd out", proc.Name);
42 #endif
43 }
44 else
45 {
46 #if !DISALLOW_VERBOSE_LOGGING
47 logger.VerboseDebug.WriteLine(" Allowing process {0} to be added", proc.Name);
48 #endif
49 }
50 return notvalid;
51 }
52 #region IPluginBase Members
53 public override Guid ID
54 {
55 get
56 {
57 return new GuidGenerator(typeof(PCSX2Config).FullName).Guid;
58 }
59 }
60 public override string Name
61 {
62 get { return "PCSX2 Configuration Plugin"; }
63 }
64 public override string Description
65 {
66 get { return "This plugin provides a configuration suitable for use with PCSX2"; }
67 }
68 #endregion
69 private bool IsValidPSX2Process(int pid, out bool isDebug, out uint VTLB_RELEASE_OFFSET, ProcContainer proc)
70 {
71 bool isValid = false;
72 isDebug = false;
73 VTLB_RELEASE_OFFSET = 0;
74 try
75 {
76 Process p = null;
77
78 try
79 {
80 p = Process.GetProcessById(pid);
81 }
82 catch { return false; }
83
84 string filename = p.MainModule.FileName;
85 FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
86 // BinaryReader r = new BinaryReader(fs);
87 // byte[] exe_check = new byte[] {
88 // 0x4D, 0x5A, 0x90, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00,
89 // 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
90 // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
91 // 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
92 // 0x0E, 0x1F, 0xBA, 0x0E, 0x00, 0xB4, 0x09, 0xCD, 0x21, 0xB8, 0x01, 0x4C, 0xCD, 0x21, 0x54, 0x68,
93 // 0x69, 0x73, 0x20, 0x70, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x63, 0x61, 0x6E, 0x6E, 0x6F,
94 // 0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x75, 0x6E, 0x20, 0x69, 0x6E, 0x20, 0x44, 0x4F, 0x53, 0x20,
95 // 0x6D, 0x6F, 0x64, 0x65, 0x2E
96 // };
97 // r.BaseStream.Seek(0, SeekOrigin.Begin);
98 // byte[] data = r.ReadBytes(exe_check.Length);
99 // bool isExe = false;
100 // for (int i = 0; i < exe_check.Length; i++) { if (exe_check[i] == data[i]) { isExe = true; } else { isExe = false; } }
101 // r.Close();
102 // if (!isExe)
103 // {
104 //#if !DISALLOW_VERBOSE_LOGGING
105 // logger.VerboseDebug.WriteLine(" Process: {0} is not a valid executable file", filename);
106 //#endif
107 // isValid = false;
108 // }
109 // else
110 // {
111 // check for valid pcsx2 exe
112 fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
113 StreamReader sr = new StreamReader(fs);
114 string found_string = sr.ReadToEnd();
115 if (found_string.ToLower().Contains(PCXS2_LOOKUP_MAGIC_001.ToLower()) && found_string.ToLower().Contains(PCXS2_LOOKUP_MAGIC_002.ToLower()))
116 {
117 isValid = true;
118 #if !DISALLOW_VERBOSE_LOGGING
119 logger.VerboseDebug.WriteLine(" Process: {0} found MAGIC LOOKUP {1} and {2}", filename, PCXS2_LOOKUP_MAGIC_001.ToLower(), PCXS2_LOOKUP_MAGIC_002.ToLower());
120 #endif
121 }
122 sr.Close();
123 // check for debug
124 fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
125 sr = new StreamReader(fs);
126 found_string = sr.ReadToEnd();
127 // DebugBreak should only be present in debug build version(s) of pcsx2
128 if (found_string.ToLower().Contains("DebugBreak".ToLower()))
129 {
130 isDebug = true;
131 #if !DISALLOW_VERBOSE_LOGGING
132 logger.VerboseDebug.WriteLine(" Process: {0} found DebugBreak", filename);
133 #endif
134 }
135 sr.Close();
136 // }
137 //this.IsDebugBuild = isDebug;
138 // run check to see if we have a later version with offset fixed at: 0x20000000
139 byte[] entrypoint_data = new byte[]{
140 0x01, 0x80, 0x1A, 0x3C, 0x78, 0x53, 0x59, 0xFF, 0x00, 0x68, 0x19, 0x40,
141 0x01, 0x80, 0x1A, 0x3C, 0x7C, 0x00, 0x39, 0x33, 0x21, 0xD0, 0x59, 0x03,
142 0x40, 0x53, 0x5A, 0x8F, 0x01, 0x80, 0x19, 0x3C, 0x08, 0x00, 0x40, 0x03,
143 0x78, 0x53, 0x39, 0xDF
144 };
145 //uint address = ramdumper.VTLB_VADDR_OFFSET_DEBUG;
146 IAcceptsProcessAndConfig pconfig = new AcceptedProcessAndConfig(this, proc.ProcessInfo);
147 GenericMemoryProvider provider = new GenericMemoryProvider(pconfig);
148 provider.OpenProvider();
149 int bytesReadSize;
150 byte[] check_data = new byte[entrypoint_data.Length];
151 provider.ReadProcessMemory(VTLB_VADDR_OFFSET_DEBUG, (uint)entrypoint_data.Length, out bytesReadSize, out check_data);
152 isDebug = check_data.SequenceEqual(entrypoint_data);
153 #if !DISALLOW_VERBOSE_LOGGING
154 logger.VerboseDebug.WriteLine(" Process: {0} isDebug: {1}", filename, isDebug.ToString());
155 #endif
156 //List<uint> addresses = new List<uint>();
157 if (!isDebug)
158 {
159 for (int i = 0x1000; i < 0x2000; i++)
160 {
161 try
162 {
163 uint t = ((uint)i << 16) | 0x5000;
164 provider.ReadProcessMemory(t, (uint)entrypoint_data.Length, out bytesReadSize, out check_data);
165 isValid = check_data.SequenceEqual(entrypoint_data);
166 if (isValid)
167 {
168 //addresses.Add(t);
169 VTLB_RELEASE_OFFSET = t;
170 #if !DISALLOW_VERBOSE_LOGGING
171 logger.VerboseDebug.WriteLine(" Process: {0} found release build entrypoint at 0x{1:x8}", filename, t);
172 #endif
173 break; //use only the first valid value
174 }
175 }
176 catch { }
177 }
178 }
179 provider.CloseProvider();
180 return isValid;
181 }
182 catch (System.ComponentModel.Win32Exception) { }
183 catch (Exception) { }
184 return isValid;
185 }
186 }
187 }