X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=win%2Finspircd_win32wrapper.cpp;h=a25544aab95f3ab891b8fe68090017652b3f99df;hb=66bc6ec1200e33c8994d237adc549026443f5ad7;hp=0e7f0172e8b9fd1fbe9ffed64641196a73414025;hpb=f40811fd6e82d62010b395d2897b46e58dfebf6c;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/win/inspircd_win32wrapper.cpp b/win/inspircd_win32wrapper.cpp index 0e7f0172e..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; @@ -366,7 +369,7 @@ int getopt_long_only(int ___argc, char *const *___argv, const char *__shortopts, #define IPC_MESSAGE_DIE 2 #define IPC_MESSAGE_RESTART 3 -void IPC::IPC(InspIRCd* Srv) : Instance(Srv) +IPC::IPC(InspIRCd* Srv) : Instance(Srv) { static DWORD buflen = 1024; static const char * pipename = "\\\\.\\mailslot\\Inspircd"; @@ -394,7 +397,7 @@ void IPC::Check() switch (action) { case IPC_MESSAGE_REHASH: - Instance->Rehash(0); + Instance->Rehash(); break; case IPC_MESSAGE_DIE: @@ -407,7 +410,7 @@ void IPC::Check() } } -void IPC::~IPC() +IPC::~IPC() { CloseHandle(hIPCPipe); } @@ -516,19 +519,16 @@ void ClearConsole() } /* Many inspircd classes contain function pointers/functors which can be changed to point at platform specific implementations - * of code. This function, called from WindowsForkStart, repoints these pointers and functors so that calls are windows - * specific. + * of code. This function repoints these pointers and functors so that calls are windows specific. */ void ChangeWindowsSpecificPointers(InspIRCd* Instance) { + Instance->Log(DEBUG,"Changing to windows specific pointer and functor set"); Instance->Config->DNSServerValidator = &ValidateWindowsDnsServer; } DWORD WindowsForkStart(InspIRCd* Instance) { - /* See the function declaration above */ - ChangeWindowsSpecificPointers(Instance); - /* Windows implementation of fork() :P */ if (owner_processid) return 0; @@ -643,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; +}