- added a debug callback reason for plugins -> UE_PLUGIN_CALL_REASON_UNHANDLEDEXCEPTION

- now plugins are actually registered
- fixed OUTPUT_DEBUG_STRING_EVENT (DBGCode should be set before the callback, so plugins & custom handlers can change it)
This commit is contained in:
Mr. eXoDia 2014-03-11 16:14:49 +01:00
parent 8adda5ee1e
commit 3675215bf3
6 changed files with 22 additions and 6 deletions

View File

@ -23,6 +23,7 @@
#define UE_PLUGIN_CALL_REASON_PREDEBUG 1 #define UE_PLUGIN_CALL_REASON_PREDEBUG 1
#define UE_PLUGIN_CALL_REASON_EXCEPTION 2 #define UE_PLUGIN_CALL_REASON_EXCEPTION 2
#define UE_PLUGIN_CALL_REASON_POSTDEBUG 3 #define UE_PLUGIN_CALL_REASON_POSTDEBUG 3
#define UE_PLUGIN_CALL_REASON_UNHANDLEDEXCEPTION 4
#define TEE_HOOK_NRM_JUMP 1 #define TEE_HOOK_NRM_JUMP 1
#define TEE_HOOK_NRM_CALL 3 #define TEE_HOOK_NRM_CALL 3

View File

@ -23,6 +23,7 @@ const BYTE UE_HIDE_BASIC = 1;
const BYTE UE_PLUGIN_CALL_REASON_PREDEBUG = 1; const BYTE UE_PLUGIN_CALL_REASON_PREDEBUG = 1;
const BYTE UE_PLUGIN_CALL_REASON_EXCEPTION = 2; const BYTE UE_PLUGIN_CALL_REASON_EXCEPTION = 2;
const BYTE UE_PLUGIN_CALL_REASON_POSTDEBUG = 3; const BYTE UE_PLUGIN_CALL_REASON_POSTDEBUG = 3;
const BYTE UE_PLUGIN_CALL_REASON_UNHANDLEDEXCEPTION = 4;
const BYTE TEE_HOOK_NRM_JUMP = 1; const BYTE TEE_HOOK_NRM_JUMP = 1;
const BYTE TEE_HOOK_NRM_CALL = 3; const BYTE TEE_HOOK_NRM_CALL = 3;

View File

@ -33,7 +33,8 @@ enum ePluginCallReason : int
{ {
UE_PLUGIN_CALL_REASON_PREDEBUG = UE::UE_PLUGIN_CALL_REASON_PREDEBUG, UE_PLUGIN_CALL_REASON_PREDEBUG = UE::UE_PLUGIN_CALL_REASON_PREDEBUG,
UE_PLUGIN_CALL_REASON_EXCEPTION = UE::UE_PLUGIN_CALL_REASON_EXCEPTION, UE_PLUGIN_CALL_REASON_EXCEPTION = UE::UE_PLUGIN_CALL_REASON_EXCEPTION,
UE_PLUGIN_CALL_REASON_POSTDEBUG = UE::UE_PLUGIN_CALL_REASON_POSTDEBUG UE_PLUGIN_CALL_REASON_POSTDEBUG = UE::UE_PLUGIN_CALL_REASON_POSTDEBUG,
UE_PLUGIN_CALL_REASON_UNHANDLEDEXCEPTION = UE::UE_PLUGIN_CALL_REASON_UNHANDLEDEXCEPTION
}; };
enum eHookType : int enum eHookType : int

View File

@ -96,7 +96,7 @@ void EngineInitPlugins(wchar_t* szEngineFolder)
myPluginInfo.TitanReleasePlugin = (fPluginReleaseExec)GetProcAddress(myPluginInfo.PluginBaseAddress, "TitanReleasePlugin"); myPluginInfo.TitanReleasePlugin = (fPluginReleaseExec)GetProcAddress(myPluginInfo.PluginBaseAddress, "TitanReleasePlugin");
myPluginInfo.TitanRegisterPlugin = (fPluginRegister)GetProcAddress(myPluginInfo.PluginBaseAddress, "TitanRegisterPlugin"); myPluginInfo.TitanRegisterPlugin = (fPluginRegister)GetProcAddress(myPluginInfo.PluginBaseAddress, "TitanRegisterPlugin");
myPluginInfo.TitanDebuggingCallBack = (fPluginDebugExec)GetProcAddress(myPluginInfo.PluginBaseAddress, "TitanDebuggingCallBack"); myPluginInfo.TitanDebuggingCallBack = (fPluginDebugExec)GetProcAddress(myPluginInfo.PluginBaseAddress, "TitanDebuggingCallBack");
myPluginRegister = (fPluginRegister)myPluginInfo.TitanRegisterPlugin; myPluginRegister = myPluginInfo.TitanRegisterPlugin;
if(myPluginRegister != NULL) if(myPluginRegister != NULL)
{ {
__try __try
@ -113,7 +113,7 @@ void EngineInitPlugins(wchar_t* szEngineFolder)
NameHasBeenRegistered = true; NameHasBeenRegistered = true;
} }
} }
if(NameHasBeenRegistered) if(!NameHasBeenRegistered)
{ {
Plugin.push_back(myPluginInfo); Plugin.push_back(myPluginInfo);
} }

View File

@ -427,6 +427,12 @@ __declspec(dllexport) void TITCALL DebugLoop()
case OUTPUT_DEBUG_STRING_EVENT: case OUTPUT_DEBUG_STRING_EVENT:
{ {
//http://maximumcrack.wordpress.com/2009/06/22/outputdebugstring-awesomeness/ (the final advice is incorrect, but still helpful)
DBGCode = DBG_EXCEPTION_NOT_HANDLED; //pass exception to debuggee
if(engineExecutePluginCallBack)
{
ExtensionManagerPluginDebugCallBack(&DBGEvent, UE_PLUGIN_CALL_REASON_UNHANDLEDEXCEPTION);
}
//debug string callback //debug string callback
if(DBGCustomHandler->chOutputDebugString != NULL) if(DBGCustomHandler->chOutputDebugString != NULL)
{ {
@ -440,8 +446,6 @@ __declspec(dllexport) void TITCALL DebugLoop()
DBGCustomHandler->chOutputDebugString = NULL; DBGCustomHandler->chOutputDebugString = NULL;
} }
} }
//http://maximumcrack.wordpress.com/2009/06/22/outputdebugstring-awesomeness/ (the final advice is incorrect, but still helpful)
DBGCode = DBG_EXCEPTION_NOT_HANDLED; //pass exception to debuggee
} }
break; break;
@ -1289,6 +1293,10 @@ __declspec(dllexport) void TITCALL DebugLoop()
//general unhandled exception callback //general unhandled exception callback
if(DBGCode==DBG_EXCEPTION_NOT_HANDLED) if(DBGCode==DBG_EXCEPTION_NOT_HANDLED)
{ {
if(engineExecutePluginCallBack)
{
ExtensionManagerPluginDebugCallBack(&DBGEvent, UE_PLUGIN_CALL_REASON_UNHANDLEDEXCEPTION);
}
if(DBGCustomHandler->chUnhandledException != NULL) if(DBGCustomHandler->chUnhandledException != NULL)
{ {
myCustomHandler = (fCustomHandler)((LPVOID)DBGCustomHandler->chUnhandledException); myCustomHandler = (fCustomHandler)((LPVOID)DBGCustomHandler->chUnhandledException);
@ -1322,7 +1330,11 @@ __declspec(dllexport) void TITCALL DebugLoop()
case RIP_EVENT: case RIP_EVENT:
{ {
DBGCode = DBG_EXCEPTION_NOT_HANDLED; //fix an anti-debug trick DBGCode = DBG_EXCEPTION_NOT_HANDLED; //fix an anti-debug trick
//system breakpoint callback if(engineExecutePluginCallBack)
{
ExtensionManagerPluginDebugCallBack(&DBGEvent, UE_PLUGIN_CALL_REASON_UNHANDLEDEXCEPTION);
}
//rip event callback
if(DBGCustomHandler->chRipEvent != NULL) if(DBGCustomHandler->chRipEvent != NULL)
{ {
myCustomHandler = (fCustomHandler)((LPVOID)DBGCustomHandler->chRipEvent); myCustomHandler = (fCustomHandler)((LPVOID)DBGCustomHandler->chRipEvent);

View File

@ -309,6 +309,7 @@ typedef struct HOOK_ENTRY
#define UE_PLUGIN_CALL_REASON_PREDEBUG 1 #define UE_PLUGIN_CALL_REASON_PREDEBUG 1
#define UE_PLUGIN_CALL_REASON_EXCEPTION 2 #define UE_PLUGIN_CALL_REASON_EXCEPTION 2
#define UE_PLUGIN_CALL_REASON_POSTDEBUG 3 #define UE_PLUGIN_CALL_REASON_POSTDEBUG 3
#define UE_PLUGIN_CALL_REASON_UNHANDLEDEXCEPTION 4
#define UE_ENGINE_ALOW_MODULE_LOADING 1 #define UE_ENGINE_ALOW_MODULE_LOADING 1
#define UE_ENGINE_AUTOFIX_FORWARDERS 2 #define UE_ENGINE_AUTOFIX_FORWARDERS 2