void WriteStats(int num_measures, int data_lines, statistics stats, FILE **fOut) { int i; double TEMP; putc('\n', *fOut); for (i = 1; i <= num_measures; i++) { if (data_lines != 0) { stats.avg[i] /= data_lines; /*average value*/ TEMP = stats.avg[i]; stats.sig[i] = sqrt(fabs(stats.sig[i] / data_lines - TEMP * TEMP)); if (stats.sig[i] < fabs(stats.max[i]/1000)) stats.sig[i]=0; /*standard deviation*/ } } PrintOneLine("mean :", stats.avg, num_measures, fOut); PrintOneLine("sigma:", stats.sig, num_measures, fOut); PrintOneLine("max :", stats.max, num_measures, fOut); PrintOneLine("min :", stats.min, num_measures, fOut); } /*WriteStats*/
// render credits to given drawport FLOAT Credits_Render(CDrawPort *pdp) { if (!_bCreditsOn) { return 0; } CDrawPort dpWide; pdp->MakeWideScreen(&dpWide); pdp->Unlock(); dpWide.Lock(); FLOAT fTime = GetTime(); pixW = dpWide.GetWidth(); pixH = dpWide.GetHeight(); fResolutionScaling = (FLOAT)pixW / 640.0f; dpWide.SetFont( _pfdDisplayFont); pixLineHeight = floor(20*fResolutionScaling); const FLOAT fLinesPerSecond = _fSpeed; FLOAT fOffset = fTime*fLinesPerSecond; INDEX ctLinesOnScreen = pixH/pixLineHeight; INDEX iLine1 = fOffset; pixJ = iLine1*pixLineHeight-fOffset*pixLineHeight; iLine1-=ctLinesOnScreen; INDEX ctLines = _astrCredits.Count(); BOOL bOver = TRUE; for (INDEX i = iLine1; i<iLine1+ctLinesOnScreen+1; i++) { CTString *pstr = &strEmpty; INDEX iLine = i; if (iLine>=0 && iLine<ctLines) { pstr = &_astrCredits[iLine]; bOver = FALSE; } PrintOneLine(&dpWide, *pstr); } dpWide.Unlock(); pdp->Lock(); if (bOver) { return 0; } else if (ctLines-iLine1<ctLinesOnScreen) { return FLOAT(ctLines-iLine1)/ctLinesOnScreen; } else { return 1; } }
void UnassemblyUnmanaged(DWORD_PTR IP, BOOL bSuppressLines) { char filename[MAX_PATH_FNAME+1]; char line[256]; int lcount = 10; ULONG linenum = 0; ULONG64 Displacement = 0; BOOL fLineAvailable = FALSE; ULONG64 vIP = 0; if (!bSuppressLines) { ReloadSymbolWithLineInfo(); fLineAvailable = SUCCEEDED (g_ExtSymbols->GetLineByOffset (TO_CDADDR(IP), &linenum, filename, MAX_PATH_FNAME+1, NULL, &Displacement)); } ULONG FileLines = 0; ArrayHolder<ULONG64> Buffer = NULL; if (fLineAvailable) { g_ExtSymbols->GetSourceFileLineOffsets (filename, NULL, 0, &FileLines); if (FileLines == 0xFFFFFFFF || FileLines == 0) fLineAvailable = FALSE; } if (fLineAvailable) { Buffer = new ULONG64[FileLines]; if (Buffer == NULL) fLineAvailable = FALSE; } if (!fLineAvailable) { vIP = TO_CDADDR(IP); // There is no line info. Just disasm the code. while (lcount-- > 0) { if (IsInterrupt()) return; g_ExtControl->Disassemble (vIP, 0, line, 256, NULL, &vIP); ExtOut (line); } return; } g_ExtSymbols->GetSourceFileLineOffsets (filename, Buffer, FileLines, NULL); int beginLine = 0; int endLine = 0; int lastLine; linenum --; for (lastLine = linenum; lastLine >= 0; lastLine --) { if (IsInterrupt()) return; if (Buffer[lastLine] != DEBUG_INVALID_OFFSET) { g_ExtSymbols->GetNameByOffset(Buffer[lastLine],NULL,0,NULL,&Displacement); if (Displacement == 0) { beginLine = lastLine; break; } } } if (lastLine < 0) { int n = lcount / 2; lastLine = linenum-1; beginLine = lastLine; while (lastLine >= 0) { if (IsInterrupt()) return; if (Buffer[lastLine] != DEBUG_INVALID_OFFSET) { beginLine = lastLine; n --; if (n == 0) { break; } } lastLine --; } } while (beginLine > 0 && Buffer[beginLine-1] == DEBUG_INVALID_OFFSET) { if (IsInterrupt()) return; beginLine --; } int endOfFunc = 0; for (lastLine = linenum+1; (ULONG)lastLine < FileLines; lastLine ++) { if (IsInterrupt()) return; if (Buffer[lastLine] != DEBUG_INVALID_OFFSET) { g_ExtSymbols->GetNameByOffset(Buffer[lastLine],NULL,0,NULL,&Displacement); if (Displacement == 0) { endLine = lastLine; break; } endOfFunc = lastLine; } } if ((ULONG)lastLine == FileLines) { int n = lcount / 2; lastLine = linenum+1; endLine = lastLine; while ((ULONG)lastLine < FileLines) { if (IsInterrupt()) return; if (Buffer[lastLine] != DEBUG_INVALID_OFFSET) { endLine = lastLine; n --; if (n == 0) { break; } } lastLine ++; } } PVOID MappedBase = NULL; ULONG MappedSize = 0; class ToUnmap { PVOID *m_Base; public: ToUnmap (PVOID *base) :m_Base(base) {} ~ToUnmap () { if (*m_Base) { UnmapViewOfFile (*m_Base); *m_Base = NULL; } } }; ToUnmap toUnmap(&MappedBase); #define MAX_SOURCE_PATH 1024 char Found[MAX_SOURCE_PATH]; char *pFile; if (g_ExtSymbols->FindSourceFile(0, filename, DEBUG_FIND_SOURCE_BEST_MATCH | DEBUG_FIND_SOURCE_FULL_PATH, NULL, Found, sizeof(Found), NULL) != S_OK) { pFile = filename; } else { MappedBase = GenOpenMapping ( Found, &MappedSize ); pFile = Found; } lastLine = beginLine; char *pFileCh = (char*)MappedBase; if (MappedBase) { ExtOut ("%s\n", pFile); int n = beginLine; while (n > 0) { while (!(pFileCh[0] == '\r' && pFileCh[1] == 0xa)) { if (IsInterrupt()) return; pFileCh ++; } pFileCh += 2; n --; } } char filename1[MAX_PATH_FNAME+1]; for (lastLine = beginLine; lastLine < endLine; lastLine ++) { if (IsInterrupt()) return; if (MappedBase) { ExtOut ("%4d ", lastLine+1); pFileCh = PrintOneLine (pFileCh, (char*)MappedBase+MappedSize); } if (Buffer[lastLine] != DEBUG_INVALID_OFFSET) { if (MappedBase == 0) { ExtOut (">>> %s:%d\n", pFile, lastLine+1); } vIP = Buffer[lastLine]; ULONG64 vNextLineIP; int i; for (i = lastLine + 1; (ULONG)i < FileLines && Buffer[i] == DEBUG_INVALID_OFFSET; i ++) { if (IsInterrupt()) return; } if ((ULONG)i == FileLines) { vNextLineIP = 0; } else vNextLineIP = Buffer[i]; while (1) { if (IsInterrupt()) return; g_ExtControl->Disassemble (vIP, 0, line, 256, NULL, &vIP); ExtOut (line); if (vIP > vNextLineIP || vNextLineIP - vIP > 40) { if (FAILED (g_ExtSymbols->GetLineByOffset (vIP, &linenum, filename1, MAX_PATH_FNAME+1, NULL, &Displacement))) { if (lastLine != endOfFunc) { break; } if (strstr (line, "ret") || strstr (line, "jmp")) { break; } } if (linenum != (ULONG)lastLine+1 || strcmp (filename, filename1)) { break; } } else if (vIP == vNextLineIP) { break; } } } } }