diff --git a/tpvs17/Enchanter/dumpfile.h b/tpvs17/Enchanter/dumpfile.h new file mode 100644 index 0000000..b90ac22 --- /dev/null +++ b/tpvs17/Enchanter/dumpfile.h @@ -0,0 +1,129 @@ +#ifndef _H_DUMPFILE_H_ +#define _H_DUMPFILE_H_ + +/*! + *FileName: dumpfile.h + *Author: Pan Yingdong + *Email: bob.pan@hzleaper.com + *Created:2020/5/19 16:02 + *Note: +*/ +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; +using namespace std::chrono; + +#pragma comment(lib, "Dbghelp.lib") + +namespace NSDumpFile +{ + void CreateDumpFile(LPCWSTR lpstrDumpFilePathName, EXCEPTION_POINTERS *pException) + { + // 创建Dump文件 + // + HANDLE hDumpFile = CreateFile(lpstrDumpFilePathName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + + + // Dump信息 + // + MINIDUMP_EXCEPTION_INFORMATION dumpInfo; + dumpInfo.ExceptionPointers = pException; + dumpInfo.ThreadId = GetCurrentThreadId(); + dumpInfo.ClientPointers = TRUE; + + + // 写入Dump文件内容 + // + MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL); + + + CloseHandle(hDumpFile); + } + + + LPTOP_LEVEL_EXCEPTION_FILTER WINAPI MyDummySetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter) + { + return NULL; + } + + + BOOL PreventSetUnhandledExceptionFilter() + { + HMODULE hKernel32 = LoadLibrary(_T("kernel32.dll")); + if (hKernel32 == NULL) + return FALSE; + + + void *pOrgEntry = GetProcAddress(hKernel32, "SetUnhandledExceptionFilter"); + if (pOrgEntry == NULL) + return FALSE; + + + unsigned char newJump[100]; + DWORD dwOrgEntryAddr = (DWORD)pOrgEntry; + dwOrgEntryAddr += 5; // add 5 for 5 op-codes for jmp far + + + void *pNewFunc = &MyDummySetUnhandledExceptionFilter; + DWORD dwNewEntryAddr = (DWORD)pNewFunc; + DWORD dwRelativeAddr = dwNewEntryAddr - dwOrgEntryAddr; + + + newJump[0] = 0xE9; // JMP absolute + memcpy(&newJump[1], &dwRelativeAddr, sizeof(pNewFunc)); + SIZE_T bytesWritten; + BOOL bRet = WriteProcessMemory(GetCurrentProcess(), pOrgEntry, newJump, sizeof(pNewFunc) + 1, &bytesWritten); + return bRet; + } + + LONG WINAPI UnhandledExceptionFilterEx(struct _EXCEPTION_POINTERS *pException) + { + TCHAR szMbsFile[MAX_PATH] = { 0 }; + ::GetModuleFileName(NULL, szMbsFile, MAX_PATH); + TCHAR* pFind = _tcsrchr(szMbsFile, '\\'); + if (pFind) + { + *(pFind + 1) = 0; + + char buffer[80]; + time_t rawtime; + struct tm info; + time(&rawtime); + localtime_s(&info, &rawtime); + TCHAR szMbsFile[MAX_PATH] = { 0 }; + strftime(buffer, 80, "%Y-%m-%d %H-%M-%S", &info); + std::string strName = buffer; + strName += ".dmp"; + _stprintf_s(szMbsFile, MAX_PATH, _T("%S"), strName.c_str()); + CreateDumpFile(szMbsFile, pException); + } + + + // TODO: MiniDumpWriteDump + FatalAppExit(-1, _T("Fatal Error")); + return EXCEPTION_CONTINUE_SEARCH; + } + + + void RunCrashHandler() + { + SetUnhandledExceptionFilter(UnhandledExceptionFilterEx); + PreventSetUnhandledExceptionFilter(); + } +}; + + +#define DeclareDumpFile() NSDumpFile::RunCrashHandler(); +/* +使用方法 +在main文件中添加头文件 +main函数中调用DeclareDumpFile()即可 +*/ +#endif \ No newline at end of file