55/*
66KURSE ALL SEEDS!
77Fushururu
8- Do you know demaster is going to be reborn?
8+ Are you with the Garden Master or Cid?
9+ >be non-human
10+ >pay a lot of money to build BalambGarden
11+ >after that some useless guy is the boss
12+ >no one knows about you
13+ >you are living in the basement
14+ >alone
15+
16+ Yeah... So looks like money can't buy
17+ umm... well.. life? Hey, you are student
18+ in the garden built from my money
19+ and you were trained to be missionary
20+ and then you just walk in and kill me
21+ NICE JOB
922*/
1023
1124/*
1225*
1326*
1427*/
1528DWORD IMAGE_BASE = 0;
29+ DWORD IMAGE_SIZE = 0 ;
30+ DWORD THIS_BASE = 0 ;
31+ DWORD THIS_SIZE = 0 ;
1632DWORD OPENGL_HANDLE = 0 ;
1733const char * DIRECT_IO_EXPORT_DIR = " DEMASTER_EXP\\ " ;
1834std::unique_ptr<FILE , decltype (&fclose)> logFile{ nullptr , fclose };
@@ -34,21 +50,37 @@ BOOL BATTLE_STAGE_FORCE_RELOAD;
3450
3551void OutputDebug (const char * fmt, ...)
3652{
37- #if _DEBUG
38- va_list args;
39- char tmp_str[1024 ];
53+
54+ #if _DEBUG && !JAPANESE_PATCH
55+ // DWORD fmtPtr = (DWORD)fmt;
56+ // if (
57+ // IMAGE_BASE <= fmtPtr && fmtPtr <= IMAGE_BASE + IMAGE_SIZE
58+ // ||
59+ // THIS_BASE <= fmtPtr && fmtPtr <= THIS_BASE + THIS_SIZE
60+ // )
61+ // {
62+ // return;
63+ // }
64+ // static StackWalker sw;
65+ // sw.ShowCallstack();
66+ if (IsBadReadPtr (fmt, 4 )) return ;
67+ std::string fmtString = std::string (fmt);
68+ if (fmtString.substr (0 , 7 ) == std::string (" GLERROR" ))
69+ return ;
70+ va_list args;
71+ char tmp_str[1024 ];
4072
41- va_start (args, fmt);
42- vsnprintf (tmp_str, sizeof (tmp_str), fmt, args);
43- va_end (args);
73+ va_start (args, fmt);
74+ vsnprintf (tmp_str, sizeof (tmp_str), fmt, args);
75+ va_end (args);
4476
45- printf (tmp_str);
77+ printf (tmp_str);
4678
47- if (logFile)
48- {
49- fwrite (tmp_str, sizeof (char ), strlen (tmp_str), logFile.get ());
50- fflush (logFile.get ());
51- }
79+ if (logFile)
80+ {
81+ fwrite (tmp_str, sizeof (char ), strlen (tmp_str), logFile.get ());
82+ fflush (logFile.get ());
83+ }
5284#endif
5385}
5486
@@ -149,6 +181,7 @@ void ReadConfigFile()
149181 WORLD_TEXTURES = conf.GetInteger (" " , " WORLD_TEXTURES" , 0 );
150182 TEXTURE_PATCH = conf.GetInteger (" " , " TEXTURE_PATCH" , 1 ); // this one lacks actual demaster.conf so default to 1
151183 LINEAR_PATCH = conf.GetInteger (" " , " LINEAR_PATCH" , 1 );
184+ DEBUG_PATCH = conf.GetInteger (" " , " DEBUG_PATCH" , 0 );
152185 OPENGL_HOOK = conf.GetInteger (" " , " OPENGL_HOOK" , 0 );
153186 BATTLE_STAGE_ANIMATION_DELAY = conf.GetInteger (" " , " BATTLE_STAGE_ANIMATION_DELAY" , 100 );
154187 BATTLE_STAGE_FORCE_RELOAD = conf.GetInteger (" " , " BATTLE_STAGE_FORCE_RELOAD" , 0 );
@@ -327,9 +360,16 @@ BOOL WINAPI DllMain(
327360 HMODULE IMG_BASE = GetModuleHandleA (" FFVIII_EFIGS" );
328361#endif
329362 IMAGE_BASE = (long long )IMG_BASE ;
330- OPENGL_HANDLE = (long long )GetModuleHandleA (" OPENGL32" );
331- OutputDebug (" IMAGE_BASE at: %lX; OPENGL at: %lX\n " , IMAGE_BASE , OPENGL_HANDLE );
332363
364+ MODULEINFO modinfo = {};
365+ K32GetModuleInformation (GetCurrentProcess (), IMG_BASE , &modinfo, sizeof (MODULEINFO ));
366+ IMAGE_SIZE = modinfo.SizeOfImage ;
367+
368+ THIS_BASE = (DWORD )hinstDLL;
369+ K32GetModuleInformation (GetCurrentProcess (), hinstDLL, &modinfo, sizeof (MODULEINFO ));
370+ THIS_SIZE = modinfo.SizeOfImage ;
371+
372+ OutputDebug (" IMAGE_BASE at: %lX; OPENGL at: %lX\n " , IMAGE_BASE , OPENGL_HANDLE );
333373 GetWindow ();
334374
335375 // LET'S GET THE HACKING DONE
@@ -339,13 +379,14 @@ BOOL WINAPI DllMain(
339379 ApplyUVPatch ();
340380 if (TEXTURE_PATCH && DIRECT_IO )
341381 ReplaceTextureFunction ();
342- // if (DEBUG_PATCH) //it's just one func ;-;
343- // ApplyDebugOutputPatchV2( );
382+ if (DEBUG_PATCH ) // it's just one func ;-;
383+ InjectJMP ( IMAGE_BASE + GetAddress ( NULLSUB_DEBUG ), ( DWORD )OutputDebug );
344384 if (LINEAR_PATCH )
345385 ApplyFilteringPatch ();
346386 if (OPENGL_HOOK )
347387 HookOpenGL ();
348388
389+
349390 return 1 ; // all success
350391}
351392#undef CRASHLOG
0 commit comments