99 lines
2.3 KiB
C++
99 lines
2.3 KiB
C++
extern "C"
|
|
{
|
|
#if _M_IX86
|
|
|
|
EXCEPTION_DISPOSITION
|
|
_except_handler3(
|
|
struct _EXCEPTION_RECORD* ExceptionRecord,
|
|
void* EstablisherFrame,
|
|
struct _CONTEXT* ContextRecord,
|
|
void* DispatcherContext)
|
|
{
|
|
typedef EXCEPTION_DISPOSITION Function(struct _EXCEPTION_RECORD*, void*, struct _CONTEXT*, void*);
|
|
static Function* FunctionPtr;
|
|
|
|
if (!FunctionPtr)
|
|
{
|
|
HMODULE Library = LoadLibraryA("msvcrt.dll");
|
|
FunctionPtr = (Function*)GetProcAddress(Library, "_except_handler3");
|
|
}
|
|
|
|
return FunctionPtr(ExceptionRecord, EstablisherFrame, ContextRecord, DispatcherContext);
|
|
}
|
|
|
|
UINT_PTR __security_cookie = 0xBB40E64E;
|
|
|
|
extern PVOID __safe_se_handler_table[];
|
|
extern BYTE __safe_se_handler_count;
|
|
|
|
typedef struct {
|
|
DWORD Size;
|
|
DWORD TimeDateStamp;
|
|
WORD MajorVersion;
|
|
WORD MinorVersion;
|
|
DWORD GlobalFlagsClear;
|
|
DWORD GlobalFlagsSet;
|
|
DWORD CriticalSectionDefaultTimeout;
|
|
DWORD DeCommitFreeBlockThreshold;
|
|
DWORD DeCommitTotalFreeThreshold;
|
|
DWORD LockPrefixTable;
|
|
DWORD MaximumAllocationSize;
|
|
DWORD VirtualMemoryThreshold;
|
|
DWORD ProcessHeapFlags;
|
|
DWORD ProcessAffinityMask;
|
|
WORD CSDVersion;
|
|
WORD Reserved1;
|
|
DWORD EditList;
|
|
PUINT_PTR SecurityCookie;
|
|
PVOID *SEHandlerTable;
|
|
DWORD SEHandlerCount;
|
|
} IMAGE_LOAD_CONFIG_DIRECTORY32_2;
|
|
|
|
const
|
|
IMAGE_LOAD_CONFIG_DIRECTORY32_2 _load_config_used = {
|
|
sizeof(IMAGE_LOAD_CONFIG_DIRECTORY32_2),
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
&__security_cookie,
|
|
__safe_se_handler_table,
|
|
(DWORD)(DWORD_PTR) &__safe_se_handler_count
|
|
};
|
|
|
|
#elif _M_AMD64
|
|
|
|
EXCEPTION_DISPOSITION
|
|
__C_specific_handler(
|
|
struct _EXCEPTION_RECORD* ExceptionRecord,
|
|
void* EstablisherFrame,
|
|
struct _CONTEXT* ContextRecord,
|
|
struct _DISPATCHER_CONTEXT* DispatcherContext)
|
|
{
|
|
typedef EXCEPTION_DISPOSITION Function(struct _EXCEPTION_RECORD*, void*, struct _CONTEXT*, _DISPATCHER_CONTEXT*);
|
|
static Function* FunctionPtr;
|
|
|
|
if (!FunctionPtr)
|
|
{
|
|
HMODULE Library = LoadLibraryA("msvcrt.dll");
|
|
FunctionPtr = (Function*)GetProcAddress(Library, "__C_specific_handler");
|
|
}
|
|
|
|
return FunctionPtr(ExceptionRecord, EstablisherFrame, ContextRecord, DispatcherContext);
|
|
}
|
|
|
|
#endif
|
|
|
|
}
|