diff --git a/build/windows/HGBase/HGBase.def b/build/windows/HGBase/HGBase.def
index 9f69529f..04bc705b 100644
--- a/build/windows/HGBase/HGBase.def
+++ b/build/windows/HGBase/HGBase.def
@@ -9,6 +9,8 @@ HGBase_DesEncrypt
HGBase_DesDecrypt
HGBase_MakeMd5
+HGBase_RegisterCrashFunc
+HGBase_MakeCrashFile
HGBase_CreateDll
HGBase_DestroyDll
diff --git a/build/windows/HGBase/HGBase.vcxproj b/build/windows/HGBase/HGBase.vcxproj
index 316c22f5..3dfeeb70 100644
--- a/build/windows/HGBase/HGBase.vcxproj
+++ b/build/windows/HGBase/HGBase.vcxproj
@@ -26,6 +26,7 @@
+
@@ -47,6 +48,7 @@
+
@@ -145,7 +147,7 @@
true
false
HGBase.def
- gdiplus.lib;%(AdditionalDependencies)
+ gdiplus.lib;dbghelp.lib;%(AdditionalDependencies)
@@ -171,7 +173,7 @@
true
false
HGBase.def
- gdiplus.lib;%(AdditionalDependencies)
+ gdiplus.lib;dbghelp.lib;%(AdditionalDependencies)
/LTCG %(AdditionalOptions)
@@ -196,7 +198,7 @@ copy $(OutDir)HGBase.dll $(SolutionDir)..\..\..\release\win\x86\Release\true
false
HGBase.def
- gdiplus.lib;%(AdditionalDependencies)
+ gdiplus.lib;dbghelp.lib;%(AdditionalDependencies)
@@ -222,7 +224,7 @@ copy $(OutDir)HGBase.dll $(SolutionDir)..\..\..\release\win\x86\Release\true
false
HGBase.def
- gdiplus.lib;%(AdditionalDependencies)
+ gdiplus.lib;dbghelp.lib;%(AdditionalDependencies)
/LTCG %(AdditionalOptions)
diff --git a/modules/base/HGCrash.cpp b/modules/base/HGCrash.cpp
new file mode 100644
index 00000000..1d7f5c90
--- /dev/null
+++ b/modules/base/HGCrash.cpp
@@ -0,0 +1,66 @@
+#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_FAIL;
+#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_FAIL;
+ }
+
+ 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_FAIL;
+#endif
+}
\ No newline at end of file
diff --git a/modules/base/HGCrash.h b/modules/base/HGCrash.h
new file mode 100644
index 00000000..03064177
--- /dev/null
+++ b/modules/base/HGCrash.h
@@ -0,0 +1,13 @@
+#ifndef __HGCRASH_H__
+#define __HGCRASH_H__
+
+#include "HGDef.h"
+#include "HGBaseErr.h"
+
+typedef void (*HGCrashFunc)(HGPointer crashAddr, HGPointer param);
+
+HGEXPORT HGResult HGAPI HGBase_RegisterCrashFunc(HGCrashFunc func, HGPointer param);
+
+HGEXPORT HGResult HGAPI HGBase_MakeCrashFile(const HGChar *filePath);
+
+#endif /* __HGCRASH_H__ */
\ No newline at end of file