int TVPWriteHWEDumpFile( EXCEPTION_POINTERS* pExceptionPointers ) { BOOL bMiniDumpSuccessful; WCHAR szPath[MAX_PATH]; WCHAR szFileName[MAX_PATH]; const wchar_t* szAppName = TVPKirikiri; const wchar_t* szVersion = TVPGetVersionString().c_str(); TVPEnsureDataPathDirectory(); TJS_strcpy(szPath, TVPNativeDataPath.c_str()); SYSTEMTIME stLocalTime; ::GetLocalTime( &stLocalTime ); StringCchPrintf( szFileName, MAX_PATH, L"%s%s%s-%04d%02d%02d-%02d%02d%02d-%ld-%ld.dmp", szPath, szAppName, szVersion, stLocalTime.wYear, stLocalTime.wMonth, stLocalTime.wDay, stLocalTime.wHour, stLocalTime.wMinute, stLocalTime.wSecond, GetCurrentProcessId(), GetCurrentThreadId()); HANDLE hDumpFile = ::CreateFile(szFileName, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0); MINIDUMP_EXCEPTION_INFORMATION ExpParam; ExpParam.ThreadId = ::GetCurrentThreadId(); ExpParam.ExceptionPointers = pExceptionPointers; ExpParam.ClientPointers = TRUE; bMiniDumpSuccessful = MiniDumpWriteDump( ::GetCurrentProcess(), ::GetCurrentProcessId(), hDumpFile, MiniDumpWithDataSegs, &ExpParam, NULL, NULL); return EXCEPTION_EXECUTE_HANDLER; }
static void TVPWriteHWELogFile() { TVPEnsureDataPathDirectory(); TJS_nstrcpy(TVPHWExceptionLogFilename, TVPNativeDataPath.c_str()); TJS_nstrcat(TVPHWExceptionLogFilename, "hwexcept.log"); TVPHWExceptionLogHandle = CreateFile(TVPHWExceptionLogFilename, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(TVPHWExceptionLogHandle == INVALID_HANDLE_VALUE) return; DWORD filesize; filesize = GetFileSize(TVPHWExceptionLogHandle, NULL); SetFilePointer(TVPHWExceptionLogHandle, filesize, NULL, FILE_BEGIN); // write header const char headercomment[] = "THIS IS A HARDWARE EXCEPTION LOG FILE OF KIRIKIRI. " "PLEASE SEND THIS FILE TO THE AUTHOR WITH *.console.log FILE. "; DWORD written = 0; for(int i = 0; i < 4; i++) WriteFile(TVPHWExceptionLogHandle, "----", 4, &written, NULL); WriteFile(TVPHWExceptionLogHandle, headercomment, sizeof(headercomment)-1, &written, NULL); for(int i = 0; i < 4; i++) WriteFile(TVPHWExceptionLogHandle, "----", 4, &written, NULL); // write version WriteFile(TVPHWExceptionLogHandle, &TVPVersionMajor, sizeof(TVPVersionMajor), &written, NULL); WriteFile(TVPHWExceptionLogHandle, &TVPVersionMinor, sizeof(TVPVersionMinor), &written, NULL); WriteFile(TVPHWExceptionLogHandle, &TVPVersionRelease, sizeof(TVPVersionRelease), &written, NULL); WriteFile(TVPHWExceptionLogHandle, &TVPVersionBuild, sizeof(TVPVersionBuild), &written, NULL); // write tTVPHWExceptionData WriteFile(TVPHWExceptionLogHandle, &TVPLastHWExceptionData, sizeof(TVPLastHWExceptionData), &written, NULL); // close the handle if(TVPHWExceptionLogHandle != INVALID_HANDLE_VALUE) CloseHandle(TVPHWExceptionLogHandle); }
//--------------------------------------------------------------------------- void TVPAfterSystemInit() { // ensure datapath directory TVPEnsureDataPathDirectory(); // check CPU type TVPDetectCPU(); // determine OS type OSVERSIONINFO osinfo; osinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&osinfo); TVPPushEnvironNoise(&osinfo, sizeof(osinfo)); bool nt = osinfo.dwPlatformId == VER_PLATFORM_WIN32_NT; TVPSystemIsBasedOnNT = nt; TVPAllocGraphicCacheOnHeap = false; // always false since beta 20 // determine maximum graphic cache limit tTJSVariant opt; tjs_int limitmb = -1; if(TVPGetCommandLine(TJS_W("-gclim"), &opt)) { ttstr str(opt); if(str == TJS_W("auto")) limitmb = -1; else limitmb = (tjs_int)opt; } if(limitmb == -1) { if(TVPTotalPhysMemory <= 32*1024*1024) TVPGraphicCacheSystemLimit = 0; else if(TVPTotalPhysMemory <= 48*1024*1024) TVPGraphicCacheSystemLimit = 0; else if(TVPTotalPhysMemory <= 64*1024*1024) TVPGraphicCacheSystemLimit = 0; else if(TVPTotalPhysMemory <= 96*1024*1024) TVPGraphicCacheSystemLimit = 4; else if(TVPTotalPhysMemory <= 128*1024*1024) TVPGraphicCacheSystemLimit = 8; else if(TVPTotalPhysMemory <= 192*1024*1024) TVPGraphicCacheSystemLimit = 12; else if(TVPTotalPhysMemory <= 256*1024*1024) TVPGraphicCacheSystemLimit = 20; else if(TVPTotalPhysMemory <= 512*1024*1024) TVPGraphicCacheSystemLimit = 40; else TVPGraphicCacheSystemLimit = int(TVPTotalPhysMemory / (1024*1024*10)); // cachemem = physmem / 10 TVPGraphicCacheSystemLimit *= 1024*1024; } else { TVPGraphicCacheSystemLimit = limitmb * 1024*1024; } if(TVPTotalPhysMemory <= 64*1024*1024) TVPSetFontCacheForLowMem(); // TVPGraphicCacheSystemLimit = 1*1024*1024; // DEBUG // check TVPGraphicSplitOperation option if(TVPGetCommandLine(TJS_W("-gsplit"), &opt)) { ttstr str(opt); if(str == TJS_W("no")) TVPGraphicSplitOperationType = gsotNone; else if(str == TJS_W("int")) TVPGraphicSplitOperationType = gsotInterlace; else if(str == TJS_W("yes") || str == TJS_W("simple")) TVPGraphicSplitOperationType = gsotSimple; else if(str == TJS_W("bidi")) TVPGraphicSplitOperationType = gsotBiDirection; } // check TVPDefaultHoldAlpha option if(TVPGetCommandLine(TJS_W("-holdalpha"), &opt)) { ttstr str(opt); if(str == TJS_W("yes") || str == TJS_W("true")) TVPDefaultHoldAlpha = true; else TVPDefaultHoldAlpha = false; } // check TVPJPEGFastLoad option if(TVPGetCommandLine(TJS_W("-jpegdec"), &opt)) // this specifies precision for JPEG decoding { ttstr str(opt); if(str == TJS_W("normal")) TVPJPEGLoadPrecision = jlpMedium; else if(str == TJS_W("low")) TVPJPEGLoadPrecision = jlpLow; else if(str == TJS_W("high")) TVPJPEGLoadPrecision = jlpHigh; } // dump option TVPDumpOptions(); // initilaize x86 graphic routines TVPGL_IA32_Init(); // load HBeam cursor Screen->Cursors[1] = LoadCursor(HInstance, "HBEAM"); // timer precision UINT prectick = 1; if(TVPGetCommandLine(TJS_W("-timerprec"), &opt)) { ttstr str(opt); if(str == TJS_W("high")) prectick = 1; if(str == TJS_W("higher")) prectick = 5; if(str == TJS_W("normal")) prectick = 10; } // draw thread num tjs_int drawThreadNum = 1; if (TVPGetCommandLine(TJS_W("-drawthread"), &opt)) { ttstr str(opt); if (str == TJS_W("auto")) drawThreadNum = 0; else drawThreadNum = (tjs_int)opt; } TVPDrawThreadNum = drawThreadNum; if(prectick) { // retrieve minimum timer resolution TIMECAPS tc; timeGetDevCaps(&tc, sizeof(tc)); if(prectick < tc.wPeriodMin) TVPTimeBeginPeriodRes = tc.wPeriodMin; else TVPTimeBeginPeriodRes = prectick; if(TVPTimeBeginPeriodRes > tc.wPeriodMax) TVPTimeBeginPeriodRes = tc.wPeriodMax; // set timer resolution timeBeginPeriod(TVPTimeBeginPeriodRes); TVPHighTimerPeriod = true; } TVPPushEnvironNoise(&TVPCPUType, sizeof(TVPCPUType)); }