X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=win%2Finspircd_win32wrapper.cpp;h=a25544aab95f3ab891b8fe68090017652b3f99df;hb=66bc6ec1200e33c8994d237adc549026443f5ad7;hp=1646e39afd3d4ddc26e9d56652bbda09bf83a93a;hpb=afcf8ad536781b07bdabc1c8f4bc4c2f4ba6c3de;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/win/inspircd_win32wrapper.cpp b/win/inspircd_win32wrapper.cpp index 1646e39af..a25544aab 100644 --- a/win/inspircd_win32wrapper.cpp +++ b/win/inspircd_win32wrapper.cpp @@ -17,12 +17,15 @@ #include #include #include +#pragma comment(lib, "winmm.lib") using namespace std; #ifndef INADDR_NONE #define INADDR_NONE 0xffffffff #endif +#include + /* This MUST remain static and delcared outside the class, so that WriteProcessMemory can reference it properly */ static DWORD owner_processid = 0; @@ -640,3 +643,78 @@ bool ValidateWindowsDnsServer(ServerConfig* conf, const char* tag, const char* v } return true; } + +int gettimeofday(struct timeval * tv, void * tz) +{ + if(tv == NULL) + return -1; + + DWORD mstime = timeGetTime(); + tv->tv_sec = time(NULL); + tv->tv_usec = (mstime - (tv->tv_sec * 1000)) * 1000; + return 0; +} + +int __exceptionHandler(PEXCEPTION_POINTERS pExceptPtrs) +{ + SYSTEMTIME _time; + HANDLE hDump; + char mod[MAX_PATH*2]; + char * pMod = mod; + char dump_filename[MAX_PATH]; + MINIDUMP_EXCEPTION_INFORMATION dumpInfo; + DWORD code; + + if(pExceptPtrs == NULL) { + __try { + RaiseException(EXCEPTION_BREAKPOINT, 0, 0, NULL); + } __except(__exceptionHandler(GetExceptionInformation()), EXCEPTION_CONTINUE_EXECUTION) {} + } + + printf("Exception caught at 0x%.8X! Attempting to write crash dump file.\n", (unsigned long)pExceptPtrs->ExceptionRecord->ExceptionAddress); + + if(GetModuleFileName(0, mod, MAX_PATH*2) > 0) + { + if( (pMod = strrchr(mod, '\\')) != NULL ) + ++pMod; + else + strcpy(mod, "unk"); + } + else + strcpy(mod, "unk"); + + GetSystemTime(&_time); + snprintf(dump_filename, MAX_PATH, "dump-%s-%u-%u-%u-%u-%u-%u.dmp", + pMod, _time.wYear, _time.wMonth, _time.wDay, _time.wHour, _time.wMinute, _time.wSecond); + + hDump = CreateFile(dump_filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH, 0); + if(hDump != INVALID_HANDLE_VALUE) + { + dumpInfo.ClientPointers = FALSE; + dumpInfo.ExceptionPointers = pExceptPtrs; + dumpInfo.ThreadId = GetCurrentThreadId(); + + /* let's write a full memory dump. insp shouldn't be using much memory anyway, and it will help a lot with debugging. */ + MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDump, MiniDumpWithFullMemory, &dumpInfo, NULL, NULL); + FlushFileBuffers(hDump); + CloseHandle(hDump); + } + + /* check for a debugger */ + __asm { + pushad + pushfd + mov eax, fs:[18h] + mov eax, dword ptr [eax+30h] + mov ebx, dword ptr [eax] + mov code, ebx + popfd + popad + } + + /* break into debugger if we have one */ + if(code & 0x10000) + return EXCEPTION_CONTINUE_SEARCH; + else /* otherwise exit abnormally */ + return EXCEPTION_CONTINUE_EXECUTION; +}