|
|
////////////////////////////////////////////////////////////////////////////////////
//
// File: stats.cpp
//
// History: 20-Dec-00 markder Ported from v1.
//
// Desc: This file contains statistic dumping routines.
//
////////////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "globals.h"
///////////////////////////////////////////////////////////////////////////////
//
// Func: DumpVerboseStats
//
// Desc: Dumps out info about layer coverage and a shim cross-reference
//
VOID DumpVerboseStats(SdbDatabase* pDatabase, BOOL bSummary) { int i, j, k, l, m; DWORD dwTotal = 0;
// start by listing the how many exes would be fixed
// by each layer in the DB
// initialize the SEEN flag for exes
for (i = 0; i < pDatabase->m_rgExes.GetSize(); i++) { ((SdbExe *)pDatabase->m_rgExes[i])->m_bSeen = FALSE; }
for (k = 0; k < pDatabase->m_Library.m_rgLayers.GetSize(); k++) { SdbLayer *pLayer = (SdbLayer *) pDatabase->m_Library.m_rgLayers[k]; DWORD dwExesFixedByLayer = 0;
Print(_T("========================================\n")); if (!bSummary) { Print(_T("Exe entries fixed by shims from layer \"%s\":\n\n"), pLayer->m_csName); }
for (i = 0; i < pDatabase->m_rgExes.GetSize(); i++) { SdbExe *pExe = (SdbExe *)pDatabase->m_rgExes[i];
if (!pExe->m_rgShimRefs.GetSize()) {
// this has no shims and isn't a fix entry, or doesn't use shims to fix
goto nextExe; }
for (j = 0; j < pExe->m_rgShimRefs.GetSize(); j++) { SdbShimRef *pShimRef = (SdbShimRef *) pExe->m_rgShimRefs[j];
for (l = 0; l < pLayer->m_rgShimRefs.GetSize(); l++) { SdbShimRef *pLayerShimRef = (SdbShimRef *) pLayer->m_rgShimRefs[l];
if (pLayerShimRef->m_pShim == pShimRef->m_pShim) { goto nextShim; } }
// if we didn't find the shim in any layer, this isn't fixed by
// a layer, and we can try the next EXE
goto nextExe; nextShim: ; }
// we got all the way through all the shim entries, now check
// if there are any patches. If so, this couldn't be fixed
// by a layer anyhow. And if it's been seen, don't bother
// reporting it again.
if (!pExe->m_rgPatches.GetSize() && !pExe->m_bSeen) { pExe->m_bSeen = TRUE; if (!bSummary) { Print(_T(" Exe \"%s,\" App \"%s.\"\n"), pExe->m_csName, pExe->m_pApp->m_csName); } dwExesFixedByLayer++; } nextExe: ; }
Print(_T("\nTotal exes fixed by shims contained in Layer \"%s\": %d\n"), pLayer->m_csName, dwExesFixedByLayer); Print(_T("Total exes in DB: %d\n"), pDatabase->m_rgExes.GetSize()); Print(_T("Percentage of exes fixed by layer \"%s\": %.1f%%\n\n"), pLayer->m_csName, (double)dwExesFixedByLayer * 100.0 / pDatabase->m_rgExes.GetSize()); dwTotal += dwExesFixedByLayer; }
Print(_T("========================================\n")); Print(_T("\nTotal exes fixed by shims contained in ANY layer: %d\n"), dwTotal); Print(_T("Total exes in DB: %d\n"), pDatabase->m_rgExes.GetSize()); Print(_T("Percentage of exes fixed by ANY layer: %.1f%%\n\n"), (double)dwTotal * 100.0 / pDatabase->m_rgExes.GetSize());
// now check entire apps to see if they are fixed by any layers
// initialize the SEEN flag for Apps
for (i = 0; i < pDatabase->m_rgApps.GetSize(); i++) { ((SdbApp *)pDatabase->m_rgApps[i])->m_bSeen = FALSE; } dwTotal = 0;
for (k = 0; k < pDatabase->m_Library.m_rgLayers.GetSize(); k++) { SdbLayer *pLayer = (SdbLayer *) pDatabase->m_Library.m_rgLayers[k]; DWORD dwAppsFixedByLayer = 0;
Print(_T("========================================\n")); if (!bSummary) { Print(_T("App entries fixed by only shims from layer \"%s\":\n\n"), pLayer->m_csName); }
for (m = 0; m < pDatabase->m_rgApps.GetSize(); ++m) { SdbApp *pApp = (SdbApp *)pDatabase->m_rgApps[m];
for (i = 0; i < pApp->m_rgExes.GetSize(); i++) { SdbExe *pExe = (SdbExe *)pApp->m_rgExes[i];
if (!pExe->m_rgShimRefs.GetSize()) {
// this has no shims and isn't a fix entry, or doesn't use shims to fix
goto nextApp2; }
for (j = 0; j < pExe->m_rgShimRefs.GetSize(); j++) { SdbShimRef *pShimRef = (SdbShimRef *) pExe->m_rgShimRefs[j]; BOOL bShimInLayer = FALSE;
for (l = 0; l < pLayer->m_rgShimRefs.GetSize(); l++) { SdbShimRef *pLayerShimRef = (SdbShimRef *) pLayer->m_rgShimRefs[l];
if (pLayerShimRef->m_pShim == pShimRef->m_pShim) { bShimInLayer = TRUE; goto nextShim2; } }
// if we didn't find the shim in any layer, this isn't fixed by
// a layer, and we can try the next APP
if (!bShimInLayer) { goto nextApp2; } nextShim2: ; }
// we got all the way through all the shim entries, now check
// if there are any patches. If so, this couldn't be fixed
// by a layer anyhow.
if (pExe->m_rgPatches.GetSize()) { goto nextApp2; } } // well, we got all the way through the exes, and they were all
// fixed, so count this one.
if (!pApp->m_bSeen) { dwAppsFixedByLayer++; pApp->m_bSeen = TRUE; if (!bSummary) { Print(_T(" App \"%s.\"\n"), pApp->m_csName); } } nextApp2: ; }
Print(_T("\nTotal apps fixed by shims contained in Layer \"%s\": %d\n"), pLayer->m_csName, dwAppsFixedByLayer); Print(_T("Total apps in DB: %d\n"), pDatabase->m_rgApps.GetSize()); Print(_T("Percentage of apps fixed by layer \"%s\": %.1f%%\n\n"), pLayer->m_csName, (double)dwAppsFixedByLayer * 100.0 / pDatabase->m_rgApps.GetSize()); dwTotal += dwAppsFixedByLayer; }
Print(_T("========================================\n")); Print(_T("\nTotal apps fixed by shims contained in ANY layer: %d\n"), dwTotal); Print(_T("Total apps in DB: %d\n"), pDatabase->m_rgApps.GetSize()); Print(_T("Percentage of apps fixed by ANY layer: %.1f%%\n\n"), (double)dwTotal * 100.0 / pDatabase->m_rgApps.GetSize());
// Now do a cross reference of shims to apps and exes.
Print(_T("\n========================================\n")); Print(_T("Cross Reference of Shims to Apps & Exes\n"));
for (i = 0; i < pDatabase->m_Library.m_rgShims.GetSize(); ++i) { SdbShim *pShim = (SdbShim *)pDatabase->m_Library.m_rgShims[i]; DWORD dwExes = 0; DWORD dwApps = 0; TCHAR *szAppEnd = _T("s"); TCHAR *szExeEnd = _T("s");
Print(_T("\n----------------------------------------\n")); Print(_T("shim \"%s\":\n"), pShim->m_csName);
for (j = 0; j < pDatabase->m_rgApps.GetSize(); ++j) { SdbApp *pApp = (SdbApp*)pDatabase->m_rgApps[j]; BOOL bPrintedApp = FALSE;
for (k = 0; k < pApp->m_rgExes.GetSize(); ++k) { SdbExe *pExe = (SdbExe*)pApp->m_rgExes[k];
for (l = 0; l < pExe->m_rgShimRefs.GetSize(); ++l) { SdbShimRef *pShimRef = (SdbShimRef*)pExe->m_rgShimRefs[l];
if (pShimRef->m_pShim == pShim) { if (!bPrintedApp) { if (!bSummary) { Print(_T("\n App \"%s\"\n"), pApp->m_csName); } bPrintedApp = TRUE; dwApps++; }
if (!bSummary) { Print(_T(" Exe \"%s\"\n"), pExe->m_csName); } dwExes++; } } } }
if (dwApps == 1) { szAppEnd = _T(""); } if (dwExes == 1) { szExeEnd = _T(""); }
Print(_T("\nTotals for shim \"%s\": %d App%s, %d Exe%s.\n"), pShim->m_csName, dwApps, szAppEnd, dwExes, szExeEnd);
}
}
|