Index: src/mangosd/Makefile.am =================================================================== --- src/mangosd/Makefile.am (revision 3680) +++ src/mangosd/Makefile.am (working copy) @@ -39,7 +39,9 @@ ## Additional files to include when running 'make dist' # Include world daemon configuration EXTRA_DIST = \ - mangosd.conf + mangosd.conf \ + mdump.cpp \ + mdump.h ## Additional files to install sysconf_DATA = \ Index: src/mangosd/Master.cpp =================================================================== --- src/mangosd/Master.cpp (revision 3680) +++ src/mangosd/Master.cpp (working copy) @@ -42,6 +42,10 @@ #include "Network/Parse.h" #include "Network/Socket.h" +#ifdef WIN32 +#include "mdump.h" +#endif + /// \todo Warning disabling not useful under VC++2005. Can somebody say on which compiler it is useful? #pragma warning(disable:4305) @@ -80,6 +84,9 @@ /// Main function void Master::Run() { + #ifdef WIN32 + MiniDumper("mangosd.exe"); + #endif sLog.outString( "MaNGOS daemon %s", _FULLVERSION ); sLog.outString( " to stop.\n\n" ); Index: src/mangosd/mdump.cpp =================================================================== --- src/mangosd/mdump.cpp (revision 0) +++ src/mangosd/mdump.cpp (revision 0) @@ -0,0 +1,59 @@ + +#include "mdump.h" + +LPCSTR MiniDumper::m_szAppName; + +MiniDumper::MiniDumper( LPCSTR szAppName ) +{ + m_szAppName = szAppName ? _strdup(szAppName) : "Application"; + ::SetUnhandledExceptionFilter( TopLevelFilter ); +} + +LONG MiniDumper::TopLevelFilter( struct _EXCEPTION_POINTERS *pExceptionInfo ) +{ + LONG retval = EXCEPTION_CONTINUE_SEARCH; + HWND hParent = NULL; + HMODULE hDll = NULL; + char szDbgHelpPath[_MAX_PATH]; + if (GetModuleFileName(NULL, szDbgHelpPath, _MAX_PATH )) + { + char *pSlash = _tcsrchr( szDbgHelpPath, '\\' ); + if (pSlash) + { + _tcscpy( pSlash+1, "DBGHELP.DLL" ); + hDll = ::LoadLibrary( szDbgHelpPath ); + } + } + if (hDll==NULL) + hDll = ::LoadLibrary( "DBGHELP.DLL" ); + + LPCTSTR szResult = NULL; + if (hDll) + { + MINIDUMPWRITEDUMP pDump = (MINIDUMPWRITEDUMP)::GetProcAddress( hDll, "MiniDumpWriteDump" ); + if (pDump) + { + char szDumpPath[_MAX_PATH]; + SYSTEMTIME systime; + GetSystemTime(&systime); + sprintf_s(szDumpPath, "/Crash/%d-%d-%d-%d-%d-crash.dmp", systime.wDay, systime.wMonth, systime.wHour, systime.wMinute, systime.wSecond); + + HANDLE hFile = ::CreateFile( szDumpPath, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL, NULL ); + + if (hFile!=INVALID_HANDLE_VALUE) + { + _MINIDUMP_EXCEPTION_INFORMATION ExInfo; + ExInfo.ThreadId = ::GetCurrentThreadId(); + ExInfo.ExceptionPointers = pExceptionInfo; + ExInfo.ClientPointers = NULL; + // write the dump + BOOL bOK = pDump( GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL ); + if (bOK) + retval = EXCEPTION_EXECUTE_HANDLER; + ::CloseHandle(hFile); + } + } + } + return retval; +} Index: src/mangosd/mdump.h =================================================================== --- src/mangosd/mdump.h (revision 0) +++ src/mangosd/mdump.h (revision 0) @@ -0,0 +1,26 @@ +#ifndef _MDUMP_H_ +#define _MDUMP_H_ + +#include +#include +#include +#include "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 + ); + +class MiniDumper +{ +private: + static LPCSTR m_szAppName; + + static LONG WINAPI TopLevelFilter( struct _EXCEPTION_POINTERS *pExceptionInfo ); + +public: + MiniDumper( LPCSTR szAppName ); +}; +#endif //_MDUMP_H_ Index: win/VC80/mangosd.vcproj =================================================================== --- win/VC80/mangosd.vcproj (revision 3680) +++ win/VC80/mangosd.vcproj (working copy) @@ -1,7 +1,7 @@ - + @@ -260,6 +263,14 @@ > + + + +