#include "stdafx.h" #include #include #include #include "BugReporter.h" #include "StackWalker.h" #include "shellapi.h" #include "resource.h" #include #include "zlib.h" #include "shlobj.h" #ifdef _DEBUG #define new new(_NORMAL_BLOCK,__FILE__,__LINE__) #endif LPTOP_LEVEL_EXCEPTION_FILTER BugReporter::m_pExceptionFilter = NULL; _invalid_parameter_handler BugReporter::m_pInvalidParameterHandler = NULL; _purecall_handler BugReporter::m_pPureCallHandler = NULL; // based on dbghelp.h typedef BOOL (WINAPI *MINIDUMPWRITEDUMP) ( HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType, CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam ); using std::cout; using std::endl; BugReporter gs_BugReporter; static void myInvalidParameterHandler(const wchar_t* expression, const wchar_t* function, const wchar_t* file, unsigned int line, uintptr_t pReserved) { RaiseException( EXCEPTION_ACCESS_VIOLATION, EXCEPTION_NONCONTINUABLE , 0, 0); } static void myPurecallHandler() { RaiseException( EXCEPTION_ACCESS_VIOLATION, EXCEPTION_NONCONTINUABLE , 0, 0); } BugReporter::BugReporter() { LoadLibrary( L"RichEd20.dll" ); m_pExceptionCallback =0; m_szBuildVersion.reserve(1024); m_szUserLog.reserve(8192); m_szReport.reserve(8192*3); // ÇöÀç ½ÇÇà ¸ðµâÀ» ¾Ë¾Æ³½´Ù. CHAR szCurFileName[MAX_PATH]= {0,}; ::GetModuleFileNameA(NULL, szCurFileName, MAX_PATH); CHAR szDrive[MAX_PATH] = { 0, }; CHAR szDir[MAX_PATH] = { 0, }; CHAR szFileName[MAX_PATH] = { 0, }; CHAR szExt[MAX_PATH] = { 0, }; _splitpath_s(szCurFileName, szDrive, szDir, szFileName, szExt ); m_szProcessName = szCurFileName; m_nDumpLevel = BugReporter::eMiniDumpWithDataSegs; m_bEnableDump = true; m_HttpClient.SetInternet(("BugReporter Agent")); m_HttpClientForSID.SetInternet("SIDReporter Agent"); strcpy(m_szSID, "0"); m_bEnableCompress = false; m_bForceLogReporting = false; // bug time struct tm* now=NULL; time_t systemTime; time(&systemTime); now=localtime(&systemTime); CHAR szTail[MAX_PATH] = {0,}; sprintf(szTail, "_%04d³â%02d¿ù%02dÀÏ_%02d½Ã%02dºÐ%02dÃÊ", 1900+now->tm_year, now->tm_mon+1, now->tm_mday, now->tm_hour, now->tm_min, now->tm_sec); m_szStartTime = szTail; } BugReporter::~BugReporter() { } void __cdecl BugReporter::DefaultBadAllocFilter() { MessageBoxA( gs_BugReporter.GetReportingServerInfo().hWnd, "Out Of Memory.", "BugReporter : Critical Error!", MB_OK ); } void BugReporter::Enable( DumpLevel level ) { m_bEnableDump = true; m_nDumpLevel = level; m_pInvalidParameterHandler = _set_invalid_parameter_handler( myInvalidParameterHandler ); m_pPureCallHandler = _set_purecall_handler( myPurecallHandler ); m_pExceptionFilter = SetUnhandledExceptionFilter(BugReporter::Exception_Minidump); } void BugReporter::Disable() { SetUnhandledExceptionFilter( m_pExceptionFilter ); _set_invalid_parameter_handler( m_pInvalidParameterHandler ); _set_purecall_handler( m_pPureCallHandler ); } void BugReporter::AddLogA(char* fmt, ... ) { ScopeLock Lock( m_LogLock ); CHAR szBuffer[1024] = {0,}; va_list args; va_start( args, fmt ); _vsnprintf_s(szBuffer, 1024-1, fmt, args); va_end( args ); szBuffer[1024-1] = 0; AttachCurrentTimeLog(); m_szUserLog += szBuffer; m_szUserLog += "\n"; } void BugReporter::AddLogW(WCHAR* fmt, ... ) { ScopeLock Lock( m_LogLock ); CHAR szBuffer[2048] = {0,}; WCHAR wszBuffer[2048] = {0,}; va_list args; va_start( args, fmt ); _vsnwprintf_s(wszBuffer, sizeof(wszBuffer), fmt, args); va_end( args ); wszBuffer[2048-1] = 0; WideCharToMultiByte( CP_ACP, 0, wszBuffer, -1, szBuffer, 2048, NULL, NULL ); AttachCurrentTimeLog(); m_szUserLog += szBuffer; m_szUserLog += "\n"; } long BugReporter::MakeBugReportText(_EXCEPTION_POINTERS* pExceptionInfo) { ScopeLock Lock( m_LogLock ); m_szReport = ""; m_SystemInfo.Initialize(); m_szReport += "\n"; m_szReport += m_szBuildVersion; m_szReport += "\n"; m_szReport += "\n"; m_szReport += m_szStartTime; m_szReport += "\n"; m_szReport += "