windows-nt/Source/XPSP1/NT/inetsrv/iis/svcs/cmp/asp51/htmldump.cpp
2020-09-26 16:20:57 +08:00

170 lines
6.1 KiB
C++

/*===================================================================
Microsoft Denali
Microsoft Confidential.
Copyright 1996 Microsoft Corporation. All Rights Reserved.
Component: ASP Status Html Dump
File: htmldump.cpp
Owner: dmitryr
This file contains the ASP status html dump code
used from IISPROBE.DLL
===================================================================*/
#include "denpre.h"
#pragma hdrstop
#include "gip.h"
#include "mtacb.h"
#include "perfdata.h"
#include "activdbg.h"
#include "dlldatax.h"
#include "txnscrpt.h"
#include "debugger.h"
#include "dbgutil.h"
#include "randgen.h"
#include "aspdmon.h"
#include "memcls.h"
#include "memchk.h"
/*===================================================================
Helper classes and functions
===================================================================*/
class CAspDump
{
private:
char *m_szBuffer;
DWORD m_dwMaxSize;
DWORD m_dwActSize;
public:
CAspDump(char *szBuffer, DWORD dwMaxSize)
{
m_szBuffer = szBuffer;
m_dwMaxSize = dwMaxSize;
m_dwActSize = 0;
}
inline void __cdecl Dump(LPCSTR fmt, ...)
{
char szStr[512];
va_list marker;
va_start(marker, fmt);
vsprintf(szStr, fmt, marker);
va_end(marker);
DWORD len = strlen(szStr);
if (len > 0 && len < (m_dwMaxSize-m_dwActSize))
{
memcpy(m_szBuffer+m_dwActSize, szStr, len+1);
m_dwActSize += len;
}
}
DWORD GetSize()
{
return m_dwActSize;
}
};
/*===================================================================
AspStatusHtmlDump
Function called from IISPROBE.DLL
Fills in the buffer with the ASP status as HTML
Parameters:
szBuffer buffer to fill in
pwdSize in - max buffer len
out - actual buffer len filled
Returns:
TRUE
===================================================================*/
extern "C"
BOOL WINAPI AspStatusHtmlDump(char *szBuffer, DWORD *pdwSize)
{
CAspDump dump(szBuffer, *pdwSize);
dump.Dump("<table border=1>\r\n");
dump.Dump("<tr><td align=center colspan=2><b>Misc. Globals</b>\r\n");
dump.Dump("<tr><td>fShutDownInProgress<td>%d\r\n", g_fShutDownInProgress);
dump.Dump("<tr><td>nApplications<td>%d\r\n", g_nApplications);
dump.Dump("<tr><td>nApplicationsRestarting<td>%d\r\n", g_nApplicationsRestarting);
dump.Dump("<tr><td>nSessions<td>%d\r\n", g_nSessions);
dump.Dump("<tr><td>nBrowserRequests<td>%d\r\n", g_nBrowserRequests);
dump.Dump("<tr><td>nSessionCleanupRequests<td>%d\r\n", g_nSessionCleanupRequests);
dump.Dump("<tr><td>nApplnCleanupRequests<td>%d\r\n", g_nApplnCleanupRequests);
dump.Dump("<tr><td>pPDM (debugger)<td>%08p\r\n", g_pPDM);
dump.Dump("<tr><td align=center colspan=2><b>Selected PerfMon Counters</b>\r\n");
dump.Dump("<tr><td>Last request's execution time, ms<td>%d\r\n", *g_PerfData.PLCounter(ID_REQEXECTIME));
dump.Dump("<tr><td>Last request's wait time, ms<td>%d\r\n", *g_PerfData.PLCounter(ID_REQWAITTIME));
dump.Dump("<tr><td>Number of executing requests<td>%d\r\n", *g_PerfData.PLCounter(ID_REQBROWSEREXEC));
dump.Dump("<tr><td>Number of requests waiting in the queue<td>%d\r\n", *g_PerfData.PLCounter(ID_REQCURRENT));
dump.Dump("<tr><td>Number of rejected requests<td>%d\r\n", *g_PerfData.PLCounter(ID_REQREJECTED));
dump.Dump("<tr><td>Total number of requests<td>%d\r\n", *g_PerfData.PLCounter(ID_REQTOTAL));
dump.Dump("<tr><td>Last session's duration, ms<td>%d\r\n", *g_PerfData.PLCounter(ID_SESSIONLIFETIME));
dump.Dump("<tr><td>Current number of sessions<td>%d\r\n", *g_PerfData.PLCounter(ID_SESSIONCURRENT));
dump.Dump("<tr><td>Total number of sessions<td>%d\r\n", *g_PerfData.PLCounter(ID_SESSIONSTOTAL));
dump.Dump("<tr><td>Number of cached templates<td>%d\r\n", *g_PerfData.PLCounter(ID_TEMPLCACHE));
dump.Dump("<tr><td>Number of pending transactions<td>%d\r\n", *g_PerfData.PLCounter(ID_TRANSPENDING));
dump.Dump("<tr><td align=center colspan=2><b>Applications</b>\r\n");
CApplnIterator ApplnIterator;
ApplnIterator.Start();
CAppln *pAppln;
while (pAppln = ApplnIterator.Next())
{
dump.Dump("<tr><td colspan=2>%08p\r\n", pAppln);
dump.Dump("<tr><td align=right>metabase key<td>%s\r\n", pAppln->GetMetabaseKey());
dump.Dump("<tr><td align=right>physical path<td>%s\r\n", pAppln->GetApplnPath(SOURCEPATHTYPE_PHYSICAL));
dump.Dump("<tr><td align=right>virtual path<td>%s\r\n", pAppln->GetApplnPath(SOURCEPATHTYPE_VIRTUAL));
dump.Dump("<tr><td align=right>number of sessions<td>%d\r\n", pAppln->GetNumSessions());
dump.Dump("<tr><td align=right>number of requests<td>%d\r\n", pAppln->GetNumRequests());
#if 0
dump.Dump("<tr><td align=right>global.asa path<td>%s\r\n", pAppln->FHasGlobalAsa() ? pAppln->GetGlobalAsa() : "n/a");
#endif
dump.Dump("<tr><td align=right>global changed?<td>%d\r\n", pAppln->FGlobalChanged());
dump.Dump("<tr><td align=right>tombstone?<td>%d\r\n", pAppln->FTombstone());
dump.Dump("<tr><td align=right>debuggable?<td>%d\r\n", pAppln->FDebuggable());
CSessionMgr *pSessionMgr = pAppln->PSessionMgr();
dump.Dump("<tr><td align=right>session manager<td>%08p\r\n", pSessionMgr);
if (pSessionMgr)
{
dump.Dump("<tr><td align=right>session killer scheduled?<td>%d\r\n", pSessionMgr->FIsSessionKillerScheduled());
dump.Dump("<tr><td align=right>session cleanup requests<td>%d\r\n", pSessionMgr->GetNumSessionCleanupRequests());
}
else
{
}
}
ApplnIterator.Stop();
dump.Dump("</table>\r\n");
*pdwSize = dump.GetSize();
return TRUE;
}