diff --git a/Release/x32/TitanEngine.dll b/Release/x32/TitanEngine.dll index 7ca93d7..7eeb7c6 100644 Binary files a/Release/x32/TitanEngine.dll and b/Release/x32/TitanEngine.dll differ diff --git a/Release/x32/TitanEngine.exp b/Release/x32/TitanEngine.exp index 0a0f4b3..4157c7b 100644 Binary files a/Release/x32/TitanEngine.exp and b/Release/x32/TitanEngine.exp differ diff --git a/Release/x32/TitanEngine.lib b/Release/x32/TitanEngine.lib index 0302f3b..3b54761 100644 Binary files a/Release/x32/TitanEngine.lib and b/Release/x32/TitanEngine.lib differ diff --git a/Release/x32/TitanEngine_x86.a b/Release/x32/TitanEngine_x86.a index f455912..3ec1e79 100644 Binary files a/Release/x32/TitanEngine_x86.a and b/Release/x32/TitanEngine_x86.a differ diff --git a/Release/x64/TitanEngine.dll b/Release/x64/TitanEngine.dll index 78f6e23..77a4e43 100644 Binary files a/Release/x64/TitanEngine.dll and b/Release/x64/TitanEngine.dll differ diff --git a/Release/x64/TitanEngine.exp b/Release/x64/TitanEngine.exp index a37d3fb..be88c62 100644 Binary files a/Release/x64/TitanEngine.exp and b/Release/x64/TitanEngine.exp differ diff --git a/Release/x64/TitanEngine.lib b/Release/x64/TitanEngine.lib index 12f0cab..8a077ff 100644 Binary files a/Release/x64/TitanEngine.lib and b/Release/x64/TitanEngine.lib differ diff --git a/Release/x64/TitanEngine_x64.a b/Release/x64/TitanEngine_x64.a index dd98992..ae802a8 100644 Binary files a/Release/x64/TitanEngine_x64.a and b/Release/x64/TitanEngine_x64.a differ diff --git a/SDK/C/TitanEngine.h b/SDK/C/TitanEngine.h index cb1b00f..43b1a75 100644 --- a/SDK/C/TitanEngine.h +++ b/SDK/C/TitanEngine.h @@ -117,7 +117,6 @@ #define UE_CH_ALLEVENTS 22 #define UE_CH_SYSTEMBREAKPOINT 23 #define UE_CH_UNHANDLEDEXCEPTION 24 -#define UE_CH_AFTERUNHANDLEDEXCEPTION 25 #define UE_OPTION_HANDLER_RETURN_HANDLECOUNT 1 #define UE_OPTION_HANDLER_RETURN_ACCESS 2 diff --git a/SDK/CPP/TitanEngine.h b/SDK/CPP/TitanEngine.h index cb1b00f..43b1a75 100644 --- a/SDK/CPP/TitanEngine.h +++ b/SDK/CPP/TitanEngine.h @@ -117,7 +117,6 @@ #define UE_CH_ALLEVENTS 22 #define UE_CH_SYSTEMBREAKPOINT 23 #define UE_CH_UNHANDLEDEXCEPTION 24 -#define UE_CH_AFTERUNHANDLEDEXCEPTION 25 #define UE_OPTION_HANDLER_RETURN_HANDLECOUNT 1 #define UE_OPTION_HANDLER_RETURN_ACCESS 2 diff --git a/SDK/Delphi/TitanEngine.pas b/SDK/Delphi/TitanEngine.pas index 0c2f10e..8cba7df 100644 --- a/SDK/Delphi/TitanEngine.pas +++ b/SDK/Delphi/TitanEngine.pas @@ -258,6 +258,10 @@ const UE_CH_LOADDLL = 18; UE_CH_UNLOADDLL = 19; UE_CH_OUTPUTDEBUGSTRING = 20; + UE_CH_AFTEREXCEPTIONPROCESSING = 21; + UE_CH_ALLEVENTS = 22; + UE_CH_SYSTEMBREAKPOINT = 23; + UE_CH_UNHANDLEDEXCEPTION = 24; UE_FUNCTION_STDCALL = 1; UE_FUNCTION_CCALL = 2; diff --git a/SDK/LUA/TitanEngine.lua b/SDK/LUA/TitanEngine.lua index 9873d14..eaf17fc 100644 --- a/SDK/LUA/TitanEngine.lua +++ b/SDK/LUA/TitanEngine.lua @@ -116,6 +116,8 @@ UE_CH_UNLOADDLL = 19 UE_CH_OUTPUTDEBUGSTRING = 20 UE_CH_AFTEREXCEPTIONPROCESSING = 21 UE_CH_ALLEVENTS = 22 +UE_CH_SYSTEMBREAKPOINT = 23 +UE_CH_UNHANDLEDEXCEPTION = 24 UE_OPTION_HANDLER_RETURN_HANDLECOUNT = 1 UE_OPTION_HANDLER_RETURN_ACCESS = 2 diff --git a/SDK/MASM/TitanEngine.INC b/SDK/MASM/TitanEngine.INC index 2c5f07b..40b9988 100644 --- a/SDK/MASM/TitanEngine.INC +++ b/SDK/MASM/TitanEngine.INC @@ -94,6 +94,9 @@ UE_CH_UNLOADDLL EQU 19 UE_CH_OUTPUTDEBUGSTRING EQU 20 UE_CH_AFTEREXCEPTIONPROCESSING EQU 21 UE_CH_ALLEVENTS EQU 22 +UE_CH_SYSTEMBREAKPOINT EQU 23 +UE_CH_UNHANDLEDEXCEPTION EQU 24 + UE_OPTION_HANDLER_RETURN_HANDLECOUNT EQU 1 UE_OPTION_HANDLER_RETURN_ACCESS EQU 2 UE_OPTION_HANDLER_RETURN_FLAGS EQU 3 diff --git a/SDK/Python/TitanEngine.py b/SDK/Python/TitanEngine.py index 6d2a242..4692b1c 100644 --- a/SDK/Python/TitanEngine.py +++ b/SDK/Python/TitanEngine.py @@ -105,6 +105,10 @@ UE_CH_EXITPROCESS = 17 UE_CH_LOADDLL = 18 UE_CH_UNLOADDLL = 19 UE_CH_OUTPUTDEBUGSTRING = 20 +UE_CH_AFTEREXCEPTIONPROCESSING = 21 +UE_CH_ALLEVENTS = 22 +UE_CH_SYSTEMBREAKPOINT = 23 +UE_CH_UNHANDLEDEXCEPTION = 24 UE_OPTION_HANDLER_RETURN_HANDLECOUNT = 1 UE_OPTION_HANDLER_RETURN_ACCESS = 2 diff --git a/TitanEngine/TitanEngine.cpp b/TitanEngine/TitanEngine.cpp index 7caae8f..17ca399 100644 --- a/TitanEngine/TitanEngine.cpp +++ b/TitanEngine/TitanEngine.cpp @@ -15528,10 +15528,6 @@ __declspec(dllexport) void TITCALL SetCustomHandler(DWORD ExceptionId, LPVOID Ca { DBGCustomHandler->chUnhandledException = (ULONG_PTR)CallBack; } - else if(ExceptionId == UE_CH_AFTERUNHANDLEDEXCEPTION) - { - DBGCustomHandler->chAfterUnhandledException = (ULONG_PTR)CallBack; - } else if(ExceptionId == UE_CH_ALLEVENTS) { DBGCustomHandler->chEverythingElse = (ULONG_PTR)CallBack; @@ -16959,7 +16955,7 @@ __declspec(dllexport) void TITCALL DebugLoop() } else if(DBGEvent.dwDebugEventCode == EXCEPTION_DEBUG_EVENT) { - bool firstchance=false; + //bool firstchance=false; if(DBGCustomHandler->chEverythingElse != NULL) { myCustomHandler = (fCustomHandler)((LPVOID)DBGCustomHandler->chEverythingElse); @@ -16972,19 +16968,20 @@ __declspec(dllexport) void TITCALL DebugLoop() DBGCustomHandler->chEverythingElse = NULL; } } - if(DBGEvent.u.Exception.dwFirstChance == FALSE) + if(DBGEvent.u.Exception.dwFirstChance == FALSE) //second chance exception { if(!enginePassAllExceptions) { - firstchance=true; DBGCode = DBG_CONTINUE; } else { - DBGCode = DBG_EXCEPTION_NOT_HANDLED; + DBGCode = DBG_EXCEPTION_NOT_HANDLED; //let debuggee handle the exception } RtlMoveMemory(&TerminateDBGEvent, &DBGEvent, sizeof DEBUG_EVENT); } + + //handle different exception codes if(DBGEvent.u.Exception.ExceptionRecord.ExceptionCode == STATUS_BREAKPOINT) { /*if(DBGCustomHandler->chBreakPoint != NULL) @@ -17266,18 +17263,6 @@ __declspec(dllexport) void TITCALL DebugLoop() } else if(DBGEvent.u.Exception.ExceptionRecord.ExceptionCode == STATUS_SINGLE_STEP) { - /*if(DBGCustomHandler->chSingleStep != NULL) - { - myCustomHandler = (fCustomHandler)((LPVOID)DBGCustomHandler->chSingleStep); - __try - { - myCustomHandler(&DBGEvent.u.Exception.ExceptionRecord); - } - __except(EXCEPTION_EXECUTE_HANDLER) - { - DBGCustomHandler->chSingleStep = NULL; - } - }*/ if(ResetBPX == true || ResetHwBPX == true || ResetMemBPX == true) { DBGCode = DBG_CONTINUE; @@ -17535,7 +17520,7 @@ __declspec(dllexport) void TITCALL DebugLoop() EngineCloseHandle(hActiveThread); } } - if(DBGCode==DBG_EXCEPTION_NOT_HANDLED || firstchance) + if(DBGCode==DBG_EXCEPTION_NOT_HANDLED) { if(DBGCustomHandler->chSingleStep != NULL) { @@ -17739,8 +17724,9 @@ __declspec(dllexport) void TITCALL DebugLoop() { DBGCode = DBG_EXCEPTION_NOT_HANDLED; } - if(DBGCode==DBG_EXCEPTION_NOT_HANDLED || firstchance) + if(DBGCode==DBG_EXCEPTION_NOT_HANDLED) { + //TODO: re-set memory breakpoint? if(DBGCustomHandler->chPageGuard != NULL) { myCustomHandler = (fCustomHandler)((LPVOID)DBGCustomHandler->chPageGuard); @@ -17773,18 +17759,6 @@ __declspec(dllexport) void TITCALL DebugLoop() } else if(DBGEvent.u.Exception.ExceptionRecord.ExceptionCode == STATUS_ILLEGAL_INSTRUCTION) { - if(DBGCustomHandler->chIllegalInstruction != NULL) - { - myCustomHandler = (fCustomHandler)((LPVOID)DBGCustomHandler->chIllegalInstruction); - __try - { - myCustomHandler(&DBGEvent.u.Exception.ExceptionRecord); - } - __except(EXCEPTION_EXECUTE_HANDLER) - { - DBGCustomHandler->chIllegalInstruction = NULL; - } - } MaximumBreakPoints = 0; for(MaximumBreakPoints = 0; MaximumBreakPoints < BreakPointSetCount; MaximumBreakPoints++) { @@ -17980,6 +17954,21 @@ __declspec(dllexport) void TITCALL DebugLoop() { DBGCode = DBG_EXCEPTION_NOT_HANDLED; } + if(DBGCode==DBG_EXCEPTION_NOT_HANDLED) //call custom handler + { + if(DBGCustomHandler->chIllegalInstruction != NULL) + { + myCustomHandler = (fCustomHandler)((LPVOID)DBGCustomHandler->chIllegalInstruction); + __try + { + myCustomHandler(&DBGEvent.u.Exception.ExceptionRecord); + } + __except(EXCEPTION_EXECUTE_HANDLER) + { + DBGCustomHandler->chIllegalInstruction = NULL; + } + } + } } else if(DBGEvent.u.Exception.ExceptionRecord.ExceptionCode == STATUS_NONCONTINUABLE_EXCEPTION) { @@ -18093,7 +18082,9 @@ __declspec(dllexport) void TITCALL DebugLoop() } } } - if(DBGCode==DBG_EXCEPTION_NOT_HANDLED || firstchance) + + //post exception handling (for debugger exceptions) + if(DBGCode==DBG_EXCEPTION_NOT_HANDLED) { if(DBGCustomHandler->chUnhandledException != NULL) { @@ -18107,19 +18098,8 @@ __declspec(dllexport) void TITCALL DebugLoop() DBGCustomHandler->chUnhandledException = NULL; } } - if(DBGCustomHandler->chAfterUnhandledException != NULL) - { - myCustomHandler = (fCustomHandler)((LPVOID)DBGCustomHandler->chAfterUnhandledException); - __try - { - myCustomHandler(&DBGEvent.u.Exception.ExceptionRecord); - } - __except(EXCEPTION_EXECUTE_HANDLER) - { - DBGCustomHandler->chAfterUnhandledException = NULL; - } - } } + if(DBGCustomHandler->chAfterException != NULL) { myCustomHandler = (fCustomHandler)((LPVOID)DBGCustomHandler->chAfterException); @@ -18133,6 +18113,8 @@ __declspec(dllexport) void TITCALL DebugLoop() } } } + + //after handling of debug codes if(engineResumeProcessIfNoThreadIsActive) { if(!ThreaderIsAnyThreadActive()) diff --git a/TitanEngine/stdafx.h b/TitanEngine/stdafx.h index 4984a21..4174cd2 100644 --- a/TitanEngine/stdafx.h +++ b/TitanEngine/stdafx.h @@ -164,7 +164,6 @@ typedef struct ULONG_PTR chAfterException; ULONG_PTR chSystemBreakpoint; ULONG_PTR chUnhandledException; - ULONG_PTR chAfterUnhandledException; } CustomHandler, *PCustomHandler; typedef struct @@ -391,7 +390,6 @@ typedef struct HOOK_ENTRY #define UE_CH_ALLEVENTS 22 #define UE_CH_SYSTEMBREAKPOINT 23 #define UE_CH_UNHANDLEDEXCEPTION 24 -#define UE_CH_AFTERUNHANDLEDEXCEPTION 25 #define UE_OPTION_HANDLER_RETURN_HANDLECOUNT 1 #define UE_OPTION_HANDLER_RETURN_ACCESS 2 diff --git a/readme.txt b/readme.txt index f51cbbc..5f67952 100644 --- a/readme.txt +++ b/readme.txt @@ -13,4 +13,4 @@ The following things have been fixed/added (list might be incomplete): - smaller and faster DLL loaders - supports multiple calling conventions (including the callbacks) - MinGW import libraries - +- fixed exception handling