WindowsXP-SP1/windows/appcompat/shimdbc/stats.cpp
2020-09-30 16:53:49 +02:00

243 lines
9.1 KiB
C++

////////////////////////////////////////////////////////////////////////////////////
//
// 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);
}
}