@@ -22,31 +22,31 @@ struct Screen
2222 int32_t nWidescreenHudOffset;
2323} Screen;
2424
25- injector::hook_back<void *(__cdecl*)(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9)> hb_5F27E2 ;
26- void * __cdecl sub_5F27E2 (int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9)
25+ injector::hook_back<void * (__cdecl*)(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9)> hb_5F34C0 ;
26+ void * __cdecl sub_5F34C0 (int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9)
2727{
2828 if ((a8 == 642 && a9 == 450 ) || (a8 == 640 && a9 == 448 ) || (a8 == 641 && a9 == 58 ))
29- return hb_5F27E2 .fun (a1, a2, a3, a4, a5, a6, a7, a8, a9);
29+ return hb_5F34C0 .fun (a1, a2, a3, a4, a5, a6, a7, a8, a9);
3030
3131 a5 = static_cast <int32_t >(static_cast <float >(a5) / Screen.fHudScale );
3232 a8 = static_cast <int32_t >(static_cast <float >(a8) / Screen.fHudScale );
3333 a5 += static_cast <int32_t >(Screen.fHudOffsetReal / (Screen.fWidth / 640 .0f ));
3434
35- return hb_5F27E2 .fun (a1, a2, a3, a4, a5, a6, a7, a8, a9);
35+ return hb_5F34C0 .fun (a1, a2, a3, a4, a5, a6, a7, a8, a9);
3636}
3737
38- injector::hook_back<void *(__cdecl*)(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9)> hb_5F28E2 ;
39- void * __cdecl sub_5F28E2 (int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9)
38+ injector::hook_back<void * (__cdecl*)(int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9)> hb_5F35C0 ;
39+ void * __cdecl sub_5F35C0 (int a1, int a2, int a3, int a4, int a5, int a6, int a7, int a8, int a9)
4040{
4141 a5 = static_cast <int32_t >(static_cast <float >(a5) / Screen.fHudScale );
4242 a6 = static_cast <int32_t >(static_cast <float >(a6) / Screen.fHudScale );
4343 a5 += static_cast <int32_t >(Screen.fHudOffsetReal / (Screen.fWidth / 640 .0f ));
4444
45- return hb_5F28E2 .fun (a1, a2, a3, a4, a5, a6, a7, a8, a9);
45+ return hb_5F35C0 .fun (a1, a2, a3, a4, a5, a6, a7, a8, a9);
4646}
4747
48- injector::hook_back<void *(__cdecl*)(int a1, int a2, int a3, int a4, int a5, int a6, float a7, void * a8, float a9, int a10)> hb_608BF9 ;
49- void * __cdecl sub_608BF9 (int a1, int a2, int a3, int a4, int a5, int a6, float a7, void * a8, float a9, int a10)
48+ injector::hook_back<void * (__cdecl*)(int a1, int a2, int a3, int a4, int a5, int a6, float a7, void * a8, float a9, int a10)> hb_60AC93 ;
49+ void * __cdecl sub_60AC93 (int a1, int a2, int a3, int a4, int a5, int a6, float a7, void * a8, float a9, int a10)
5050{
5151 if (Screen.nWidescreenHudOffset )
5252 {
@@ -62,10 +62,10 @@ void* __cdecl sub_608BF9(int a1, int a2, int a3, int a4, int a5, int a6, float a
6262 }
6363 }
6464
65- return hb_608BF9 .fun (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
65+ return hb_60AC93 .fun (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
6666}
6767
68- void InitSettings ()
68+ void InitCDSettings ()
6969{
7070 static std::vector<std::string> list;
7171 GetResolutionsList (list);
@@ -117,15 +117,67 @@ void InitSettings()
117117 }; injector::MakeInline<MatrixOptionsHook>(pattern.get_first (0 ), pattern.get_first (18 )); // 0x406B9F, 0x406BB1
118118}
119119
120+ void InitDVDSettings ()
121+ {
122+ static std::vector<std::string> list;
123+ GetResolutionsList (list);
124+
125+ static auto dword_4270D8 = *hook::get_pattern<uint32_t *>(" 8B 0D ? ? ? ? 8D 54 24 0C 51" , 2 );
126+ auto pattern = hook::pattern (" 8B 45 04 85 C0 74" );
127+ struct ResListHook
128+ {
129+ void operator ()(injector::reg_pack& regs)
130+ {
131+ char iniPath[MAX_PATH ];
132+ GetModuleFileNameA (NULL , iniPath, MAX_PATH );
133+ *strrchr (iniPath, ' \\ ' ) = ' \0 ' ;
134+ strcat_s (iniPath, " \\ MatrixConfig.ini" );
135+ CIniReader iniReader (iniPath);
136+ int32_t iniResX = 0 , iniResY = 0 ;
137+ std::tie (iniResX, iniResY) = GetDesktopRes ();
138+ char defVal[20 ];
139+ sprintf_s (defVal, " %dx%d" , iniResX, iniResY);
140+ auto iniRes = iniReader.ReadString (" RENDERING" , " RESOLUTION" , defVal);
141+ // sscanf_s(iniRes, "%dx%d", &iniResX, &iniResY);
142+ int32_t i = 0 , mode = 0 ;
143+ for (auto &res : list)
144+ {
145+ SendMessageA (*((HWND *)(regs.esi + 0x1460 )), 0x143u , 0 , (LPARAM )(res.c_str ()));
146+
147+ if (res == iniRes)
148+ mode = i;
149+
150+ ++i;
151+ }
152+ SendMessageA (*((HWND *)(regs.esi + 0x1460 )), 0x14Eu , mode, 0 );
153+ *dword_4270D8 = mode;
154+ }
155+ }; injector::MakeInline<ResListHook>(pattern.get_first (0 ), pattern.get_first (125 )); // 0x406055, 0x4060D2
156+
157+ pattern = hook::pattern (" 68 ? ? ? ? 50 68 ? ? ? ? 68 ? ? ? ? FF D6 8D 4C 24 0C 51" );
158+ struct MatrixOptionsHook
159+ {
160+ void operator ()(injector::reg_pack& regs)
161+ {
162+ char iniPath[MAX_PATH ];
163+ GetModuleFileNameA (NULL , iniPath, MAX_PATH );
164+ *strrchr (iniPath, ' \\ ' ) = ' \0 ' ;
165+ strcat_s (iniPath, " \\ MatrixConfig.ini" );
166+ CIniReader iniReader (iniPath);
167+ iniReader.WriteString (" RENDERING" , " RESOLUTION" , (char *)list[*dword_4270D8].c_str ());
168+ }
169+ }; injector::MakeInline<MatrixOptionsHook>(pattern.get_first (0 ), pattern.get_first (18 )); // 0x406C0F, 0x406C21
170+ }
171+
120172void Init ()
121173{
122174 CIniReader iniReader (" " );
123175 bool bFixHud = iniReader.ReadInteger (" MAIN" , " FixHud" , 1 ) != 0 ;
124176 Screen.fWidescreenHudOffset = iniReader.ReadFloat (" MAIN" , " WidescreenHudOffset" , 100 .0f );
125177
126178 auto pattern = hook::pattern (" 68 ? ? ? ? 6A 00 68 ? ? ? ? 68 ? ? ? ? FF 15 ? ? ? ? 89 85 EC FA FF FF 8B 8D" );
127- static auto dword_93B7B0 = *hook::get_pattern<int32_t *>(" A1 ? ? ? ? 89 45 E0 8B 0D ? ? ? ? 89 4D E4 33 D2 " , 1 );
128- static auto dword_93B7B4 = *hook::get_pattern<int32_t *>(" A1 ? ? ? ? 89 45 E0 8B 0D ? ? ? ? 89 4D E4 33 D2 " , 10 );
179+ static auto dword_947F60 = *hook::get_pattern<int32_t *>(" 8B ? ? ? ? 00 89 55 E0 A1 ? ? ? ? 89 45 E4 33 C9 " , 2 );
180+ static auto dword_947F64 = *hook::get_pattern<int32_t *>(" 8B ? ? ? ? 00 89 55 E0 A1 ? ? ? ? 89 45 E4 33 C9 " , 10 );
129181 struct ResHook
130182 {
131183 void operator ()(injector::reg_pack& regs)
@@ -141,8 +193,8 @@ void Init()
141193 auto iniRes = iniReader.ReadString (" RENDERING" , " RESOLUTION" , defVal);
142194 sscanf_s (iniRes.c_str (), " %dx%d" , &Screen.nWidth , &Screen.nHeight );
143195
144- *dword_93B7B0 = Screen.nWidth ;
145- *dword_93B7B4 = Screen.nHeight ;
196+ *dword_947F60 = Screen.nWidth ;
197+ *dword_947F64 = Screen.nHeight ;
146198
147199 Screen.fWidth = static_cast <float >(Screen.nWidth );
148200 Screen.fHeight = static_cast <float >(Screen.nHeight );
@@ -164,20 +216,20 @@ void Init()
164216 Screen.nWidescreenHudOffset = static_cast <int32_t >(Screen.fWidescreenHudOffset );
165217 }
166218 }
167- }; injector::MakeInline<ResHook>(pattern.get_first (0 ), pattern.get_first (186 )); // 0x7AD916, 0x7AD9D0
219+ }; injector::MakeInline<ResHook>(pattern.get_first (0 ), pattern.get_first (237 )); // 0x7B8AF0, 0x7B8BDD
168220
169221 // Aspect Ratio
170222 pattern = hook::pattern (" D9 05 ? ? ? ? D8 35 ? ? ? ? D9 1D ? ? ? ? 5D C3" );
171- static auto flt_972448 = *pattern.get_first <float *>(8 );
172- static auto flt_97244C = *pattern.get_first <float *>(14 );
223+ static auto flt_97EDA8 = *pattern.get_first <float *>(8 );
224+ static auto flt_97EDAC = *pattern.get_first <float *>(14 );
173225 struct ARHook
174226 {
175227 void operator ()(injector::reg_pack& regs)
176228 {
177- *flt_972448 = 1 .0f ;
178- *flt_97244C = 1 .0f ;
229+ *flt_97EDA8 = 1 .0f ;
230+ *flt_97EDAC = 1 .0f ;
179231 }
180- }; injector::MakeInline<ARHook>(pattern.get_first (0 ), pattern.get_first (18 )); // 0x6E6024, 0x6E6024 +18
232+ }; injector::MakeInline<ARHook>(pattern.get_first (0 ), pattern.get_first (18 )); // 0x6EAE96, 0x6EAE96 +18
181233
182234 // FMVs
183235 pattern = hook::pattern (" C7 45 10 00 00 00 00 C7 45 18 80 02 00 00 8B 45 E4" );
@@ -188,26 +240,27 @@ void Init()
188240 *(int32_t *)(regs.ebp + 0x10 ) = 0 + static_cast <int32_t >(Screen.fFMVOffset );
189241 *(int32_t *)(regs.ebp + 0x18 ) = 640 - static_cast <int32_t >(Screen.fFMVOffset + Screen.fFMVOffset );
190242 }
191- }; injector::MakeInline<FMVHook>(pattern.get_first (0 ), pattern.get_first (14 )); // 0x7B3369
243+ }; injector::MakeInline<FMVHook>(pattern.get_first (0 ), pattern.get_first (14 )); // 0x7BE620
192244
193245 if (bFixHud)
194246 {
195- pattern = hook::pattern (" 6A 02 FF 15 ? ? ? ? 83 C4 04 C7 05" ); // 0x40766C
196- hb_5F27E2 .fun = injector::MakeJMP (*pattern.get_first <void *>(157 ), sub_5F27E2 , true ).get (); // hud
197- pattern = hook::pattern (" E8 ? ? ? ? 83 C4 1C 83 3D ? ? ? ? 00 75 ? 8B 55 FC" ); // 0x403882
198- hb_5F28E2 .fun = injector::MakeJMP (injector::GetBranchDestination (pattern.get_first (0 )), sub_5F28E2 , true ).get (); // text
199- pattern = hook::pattern (" E8 ? ? ? ? 83 C4 28 8B 15 ? ? ? ? DB 42 1C" ); // 0x407013
200- hb_608BF9 .fun = injector::MakeJMP (injector::GetBranchDestination (pattern.get_first (0 )), sub_608BF9 , true ).get ();
247+ pattern = hook::pattern (" 6A 02 FF 15 ? ? ? ? 83 C4 04 C7 05" ); // 0x4076CB
248+ hb_5F34C0 .fun = injector::MakeJMP (*pattern.get_first <void *>(157 ), sub_5F34C0 , true ).get (); // hud
249+ pattern = hook::pattern (" E8 ? ? ? ? 83 C4 1C 83 3D ? ? ? ? 00 75 ? 8B 55 FC" ); // 0x403887
250+ hb_5F35C0 .fun = injector::MakeJMP (injector::GetBranchDestination (pattern.get_first (0 )), sub_5F35C0 , true ).get (); // text
251+ pattern = hook::pattern (" E8 ? ? ? ? 83 C4 28 8B 15 ? ? ? ? DB 42 1C" ); // 0x407068
252+ hb_60AC93 .fun = injector::MakeJMP (injector::GetBranchDestination (pattern.get_first (0 )), sub_60AC93 , true ).get ();
201253 }
202254}
203255
204256CEXP void InitializeASI ()
205257{
206258 std::call_once (CallbackHandler::flag, []()
207- {
208- CallbackHandler::RegisterCallback (Init, hook::pattern (" 55 8B EC 83 EC 34 56 6A 00 6A FF" ));
209- CallbackHandler::RegisterCallback (InitSettings, hook::pattern (" 8B 45 04 85 C0 74 6B 8B 15" ));
210- });
259+ {
260+ CallbackHandler::RegisterCallback (Init, hook::pattern (" 55 8B EC 83 EC 34 56 6A 00 6A FF" ));
261+ CallbackHandler::RegisterCallback (InitCDSettings, hook::pattern (" 8B 45 04 85 C0 74 6B 8B 15" ));
262+ CallbackHandler::RegisterCallback (InitDVDSettings, hook::pattern (" 8B 45 04 85 C0 74 6A A1 F8" ));
263+ });
211264}
212265
213266BOOL APIENTRY DllMain (HMODULE hModule, DWORD reason, LPVOID lpReserved)
0 commit comments