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