#include "HGCrash.h" #include "HGInc.h" #if defined(HG_CMP_MSC) #include #endif static HGCrashFunc g_crashFunc = NULL; static HGPointer g_crashParam = NULL; #if defined(HG_CMP_MSC) static _EXCEPTION_POINTERS* g_exceptionInfo = NULL; #endif #if defined(HG_CMP_MSC) static LONG WINAPI UnhandledExceptionFilterEx(struct _EXCEPTION_POINTERS* exceptionInfo) { g_exceptionInfo = exceptionInfo; if (NULL != g_crashFunc) g_crashFunc(exceptionInfo->ExceptionRecord->ExceptionAddress, g_crashParam); g_exceptionInfo = NULL; return EXCEPTION_EXECUTE_HANDLER; } #endif HGResult HGAPI HGBase_RegisterCrashFunc(HGCrashFunc func, HGPointer param) { if (NULL == func) { return HGBASE_ERR_INVALIDARG; } #if defined(HG_CMP_MSC) g_crashFunc = func; g_crashParam = param; SetUnhandledExceptionFilter(UnhandledExceptionFilterEx); return HGBASE_ERR_OK; #else return HGBASE_ERR_NOTIMPL; #endif } HGResult HGAPI HGBase_MakeCrashFile(const HGChar* filePath) { #if defined(HG_CMP_MSC) if (NULL == g_exceptionInfo) { return HGBASE_ERR_FAIL; } HANDLE hFile = CreateFileA(filePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == hFile) { return HGBASE_ERR_ACCESSDENIED; } MINIDUMP_EXCEPTION_INFORMATION mdei; mdei.ThreadId = GetCurrentThreadId(); mdei.ExceptionPointers = g_exceptionInfo; mdei.ClientPointers = TRUE; MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &mdei, NULL, NULL); CloseHandle(hFile); return HGBASE_ERR_OK; #else return HGBASE_ERR_NOTIMPL; #endif }