diff --git a/SDK/C/TitanEngine.h b/SDK/C/TitanEngine.h index 62b0cfa..9368d7d 100644 --- a/SDK/C/TitanEngine.h +++ b/SDK/C/TitanEngine.h @@ -23,6 +23,7 @@ #define UE_PLUGIN_CALL_REASON_PREDEBUG 1 #define UE_PLUGIN_CALL_REASON_EXCEPTION 2 #define UE_PLUGIN_CALL_REASON_POSTDEBUG 3 +#define UE_PLUGIN_CALL_REASON_UNHANDLEDEXCEPTION 4 #define TEE_HOOK_NRM_JUMP 1 #define TEE_HOOK_NRM_CALL 3 diff --git a/SDK/CPP/TitanEngine.h b/SDK/CPP/TitanEngine.h index 7617623..54657ef 100644 --- a/SDK/CPP/TitanEngine.h +++ b/SDK/CPP/TitanEngine.h @@ -23,6 +23,7 @@ const BYTE UE_HIDE_BASIC = 1; const BYTE UE_PLUGIN_CALL_REASON_PREDEBUG = 1; const BYTE UE_PLUGIN_CALL_REASON_EXCEPTION = 2; 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_CALL = 3; diff --git a/SDK/CPP/TitanEngine.hpp b/SDK/CPP/TitanEngine.hpp index e7c53ea..5dae21d 100644 --- a/SDK/CPP/TitanEngine.hpp +++ b/SDK/CPP/TitanEngine.hpp @@ -33,7 +33,8 @@ enum ePluginCallReason : int { 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_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 diff --git a/TitanEngine/Global.Engine.Extension.cpp b/TitanEngine/Global.Engine.Extension.cpp index 4f2a0ae..b1d1446 100644 --- a/TitanEngine/Global.Engine.Extension.cpp +++ b/TitanEngine/Global.Engine.Extension.cpp @@ -96,7 +96,7 @@ void EngineInitPlugins(wchar_t* szEngineFolder) myPluginInfo.TitanReleasePlugin = (fPluginReleaseExec)GetProcAddress(myPluginInfo.PluginBaseAddress, "TitanReleasePlugin"); myPluginInfo.TitanRegisterPlugin = (fPluginRegister)GetProcAddress(myPluginInfo.PluginBaseAddress, "TitanRegisterPlugin"); myPluginInfo.TitanDebuggingCallBack = (fPluginDebugExec)GetProcAddress(myPluginInfo.PluginBaseAddress, "TitanDebuggingCallBack"); - myPluginRegister = (fPluginRegister)myPluginInfo.TitanRegisterPlugin; + myPluginRegister = myPluginInfo.TitanRegisterPlugin; if(myPluginRegister != NULL) { __try @@ -113,7 +113,7 @@ void EngineInitPlugins(wchar_t* szEngineFolder) NameHasBeenRegistered = true; } } - if(NameHasBeenRegistered) + if(!NameHasBeenRegistered) { Plugin.push_back(myPluginInfo); } diff --git a/TitanEngine/TitanEngine.Debugger.DebugLoop.cpp b/TitanEngine/TitanEngine.Debugger.DebugLoop.cpp index f41898e..afdc837 100644 --- a/TitanEngine/TitanEngine.Debugger.DebugLoop.cpp +++ b/TitanEngine/TitanEngine.Debugger.DebugLoop.cpp @@ -427,6 +427,12 @@ __declspec(dllexport) void TITCALL DebugLoop() 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 if(DBGCustomHandler->chOutputDebugString != NULL) { @@ -440,8 +446,6 @@ __declspec(dllexport) void TITCALL DebugLoop() 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; @@ -1289,6 +1293,10 @@ __declspec(dllexport) void TITCALL DebugLoop() //general unhandled exception callback if(DBGCode==DBG_EXCEPTION_NOT_HANDLED) { + if(engineExecutePluginCallBack) + { + ExtensionManagerPluginDebugCallBack(&DBGEvent, UE_PLUGIN_CALL_REASON_UNHANDLEDEXCEPTION); + } if(DBGCustomHandler->chUnhandledException != NULL) { myCustomHandler = (fCustomHandler)((LPVOID)DBGCustomHandler->chUnhandledException); @@ -1322,7 +1330,11 @@ __declspec(dllexport) void TITCALL DebugLoop() case RIP_EVENT: { 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) { myCustomHandler = (fCustomHandler)((LPVOID)DBGCustomHandler->chRipEvent); diff --git a/TitanEngine/stdafx.h b/TitanEngine/stdafx.h index 1360b62..40ec07b 100644 --- a/TitanEngine/stdafx.h +++ b/TitanEngine/stdafx.h @@ -309,6 +309,7 @@ typedef struct HOOK_ENTRY #define UE_PLUGIN_CALL_REASON_PREDEBUG 1 #define UE_PLUGIN_CALL_REASON_EXCEPTION 2 #define UE_PLUGIN_CALL_REASON_POSTDEBUG 3 +#define UE_PLUGIN_CALL_REASON_UNHANDLEDEXCEPTION 4 #define UE_ENGINE_ALOW_MODULE_LOADING 1 #define UE_ENGINE_AUTOFIX_FORWARDERS 2