windows-nt/Source/XPSP1/NT/inetsrv/iis/svcs/dbgext/dbgwmif.cxx

421 lines
10 KiB
C++
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*++
Copyright (c) 1995-1997 Microsoft Corporation
Module Name :
dbgwmif.cxx
Abstract:
This module contains the NTSD Debugger extensions for the
W3SVC DLL(WAMINFO and WAM_DICTATOR data structure)
Author:
Lei Jin ( leijin ) 16-09-1997
Environment:
Debugger Mode - inside NT command line debuggers
Project:
Internet Server Debugging DLL
Functions Exported:
Revision History:
--*/
/************************************************************
* Include Headers
************************************************************/
#include "inetdbgp.h"
#include "wamexec.hxx"
// include stddef.h for macro offsetof.
#include "stddef.h"
/************************************************************
* Definitions of Variables & Macros
************************************************************/
/************************************************************
* Functions
************************************************************/
CHAR * szWamInfoState[] =
{
"WIS_START",
"WIS_RUNNING",
"WIS_REPAIR",
"WIS_PAUSE",
"WIS_CPUPAUSE",
"WIS_ERROR",
"WIS_SHUTDOWN",
"WIS_END",
"WIS_MAX_STATE"
};
VOID
DumpWamDictator(
BOOL fDumpDyingList = FALSE
);
VOID
DumpWamInfo(
CWamInfo *pWamInfoOriginal,
CWamInfo *pWamInfo
);
VOID
DumpWamInfoOutProc(
CWamInfoOutProc *pOriginal,
CWamInfoOutProc *pWamInfoOutProc
);
VOID
DumpOOPList(
LIST_ENTRY * pListHead
);
VOID
DumpDyingList(
LIST_ENTRY * pListHead
);
DECLARE_API( waminfo )
/*++
Routine Description:
This function is called as an NTSD extension to format and dump
an object attributes structure.
Arguments:
hCurrentProcess - Supplies a handle to the current process (at the
time the extension was called).
hCurrentThread - Supplies a handle to the current thread (at the
time the extension was called).
CurrentPc - Supplies the current pc at the time the extension is
called.
lpExtensionApis - Supplies the address of the functions callable
by this extension.
lpArgumentString - Supplies the asciiz string that describes the
ansi string to be dumped.
Return Value:
None.
--*/
{
INIT_API();
while (*lpArgumentString == ' ')
lpArgumentString++;
if ( !*lpArgumentString )
{
PrintUsage( "waminfo" );
return;
}
if ( *lpArgumentString == '-' )
{
lpArgumentString++;
switch ( *lpArgumentString ) {
case 'g':
{
lpArgumentString++;
if (*lpArgumentString == '1')
{
DumpWamDictator(TRUE);
}
else
{
DumpWamDictator(FALSE);
}
break;
}
case 'd':
{
CWamInfo * pWamInfo = NULL;
DEFINE_CPP_VAR(CWamInfo, WamInfo);
// Arguments: -d <WamInfoAddr>
pWamInfo = ((CWamInfo * )GetExpression( lpArgumentString + 2));
if ( !pWamInfo )
{
dprintf( "inetdbg: Unable to evaluate "
"WaminfoAddr \"%s\"\n",
lpArgumentString );
break;
}
move(WamInfo, pWamInfo);
DumpWamInfo(pWamInfo, GET_CPP_VAR_PTR( CWamInfo, WamInfo));
break;
}
case 'l':
{
LIST_ENTRY * pListEntry;
// Arguments: -l <OOPListHeadAddr>
pListEntry = ((LIST_ENTRY * )GetExpression( lpArgumentString + 2));
if ( !pListEntry )
{
dprintf( "inetdbg: Unable to evaluate "
"OOPListHead \"%s\"\n",
lpArgumentString );
}
else
{
DumpOOPList(pListEntry);
}
break;
}
default:
case 'h':
{
PrintUsage( "waminfo" );
break;
}
} // switch
return;
}
} // DECLARE_API( atq )
VOID
DumpWamDictator
(
BOOL fDumpDyingList
)
{
DEFINE_CPP_VAR(WAM_DICTATOR, WamDictator);
WAM_DICTATOR ** ppWamDictator = NULL;
WAM_DICTATOR * pWamDictatorDebuggee = NULL;
WAM_DICTATOR * pWamDictator = NULL;
ppWamDictator = (WAM_DICTATOR **) GetExpression( "w3svc!g_pWamDictator");
if (!ppWamDictator)
{
dprintf("Unable to get w3svc!g_pWamDictator to dump the Wam Dictator info\n");
return;
}
//
// From the pointer to pointer to WAM_DICTATOR,
// obtain the pointer to the WAM_DICTATOR
//
moveBlock( pWamDictatorDebuggee, ppWamDictator, sizeof(WAM_DICTATOR * ));
if (!pWamDictatorDebuggee)
{
dprintf("Unable to get w3svc!g_pWamDictator to dump the Wam Dictator info.\n");
return;
}
moveBlock(WamDictator, pWamDictatorDebuggee, sizeof(WAM_DICTATOR));
pWamDictator = GET_CPP_VAR_PTR(WAM_DICTATOR, WamDictator);
dprintf("g_pWamDictator ===> %08p\n"
"\tm_pMetabase = %08p m_fCleanupInProgress = %8s\n"
"\tm_hW3SVC = %08p m_dwScheduledId = %08x\n"
"\tm_cRef = %08x m_fShutdownInProgress = %8s\n"
"\tm_DyingListHead.Flink = %08p\n"
"\tm_DyingListHead.Blink = %08p\n"
"\n\n"
,
pWamDictatorDebuggee,
pWamDictator->m_pMetabase, BoolValue(pWamDictator->m_fCleanupInProgress),
pWamDictator->m_hW3Svc, pWamDictator->m_dwScheduledId,
pWamDictator->m_cRef, BoolValue(pWamDictator->m_fShutdownInProgress),
pWamDictator->m_DyingListHead.Flink,
pWamDictator->m_DyingListHead.Blink
);
if (fDumpDyingList)
{
DumpDyingList((LIST_ENTRY *)((CHAR *)pWamDictatorDebuggee + offsetof(WAM_DICTATOR, m_DyingListHead)));
}
return;
}
VOID
DumpWamInfo
(
CWamInfo *pWamInfoOriginal,
CWamInfo *pWamInfo
)
{
dprintf("CWamInfo ===> %08p\n"
"\tm_pIWam = %08p m_pProcessEntry = %08p\n"
"\tm_cRef = %08x\n"
"\tm_cTotalRequests = %08x m_fEnableTryExcept = %8s\n"
"\tm_fInProcess = %8s m_fShutdown = %8s\n"
"\tp_m_strApplicationPath = %08p\n"
"\tp_m_WamClsid = %08p\n"
"\tm_dwState = %12s\n"
"\tm_dwIWamGipCookie = %08x\n"
"\n\n",
pWamInfoOriginal,
pWamInfo->m_pIWam, pWamInfo->m_pProcessEntry,
pWamInfo->m_cRef,
pWamInfo->m_cTotalRequests,
BoolValue(pWamInfo->m_fEnableTryExcept),
BoolValue(pWamInfo->m_fInProcess),
BoolValue(pWamInfo->m_fShuttingDown),
pWamInfo->m_strApplicationPath.m_pb,
(DWORD *)pWamInfoOriginal + offsetof(CWamInfo, m_clsidWam),
szWamInfoState[pWamInfo->m_dwState],
pWamInfo->m_dwIWamGipCookie
);
if (pWamInfo->m_fInProcess == FALSE)
{
CWamInfoOutProc * pWamInfoOutProc = NULL;
DEFINE_CPP_VAR(CWamInfoOutProc, WamInfoOutProc);
move(WamInfoOutProc, pWamInfoOriginal);
DumpWamInfoOutProc((CWamInfoOutProc*)pWamInfoOriginal, GET_CPP_VAR_PTR( CWamInfoOutProc, WamInfoOutProc));
}
return;
}
VOID
DumpWamInfoOutProc
(
CWamInfoOutProc *pOriginal,
CWamInfoOutProc *pWamInfoOutProc
)
{
dprintf("\tm_pCurrentListHead = %08p m_fInRepair = %8s\n"
"\tm_hPermitOOPEvent = %08p m_rgOOPWamReqListHead = %08p\n"
"\tm_dwThreshold = %08x m_dwWamVersion = %08x\n"
"\tm_cList = %08x m_pwServerInstance = %08p\n"
"\tm_idScheduled = %08x m_fJobEnabled = %08s\n"
"\n\n",
pWamInfoOutProc->m_pCurrentListHead,
BoolValue(pWamInfoOutProc->m_fInRepair),
pWamInfoOutProc->m_hPermitOOPEvent,
pWamInfoOutProc->m_rgRecoverListHead.Flink,
pWamInfoOutProc->m_dwThreshold, pWamInfoOutProc->m_dwWamVersion,
pWamInfoOutProc->m_cRecoverList,
pWamInfoOutProc->m_pwsiInstance,
pWamInfoOutProc->m_idScheduled,
BoolValue(pWamInfoOutProc->m_fJobEnabled)
);
return;
}
VOID
DumpOOPList
(
LIST_ENTRY * pListHead
)
{
LIST_ENTRY oopListHead;
LIST_ENTRY* poopListHead = NULL;
LIST_ENTRY* pEntry = NULL;
WAM_REQUEST* pWamRequest = NULL;
INT iCount;
DEFINE_CPP_VAR(WAM_REQUEST, WamRequest);
// move the list header into memory
move(oopListHead, pListHead);
poopListHead = GET_CPP_VAR_PTR(LIST_ENTRY, oopListHead);
for (iCount = 0, pEntry = poopListHead->Flink; pEntry != pListHead; iCount++)
{
if (CheckControlC())
{
return;
}
pWamRequest = CONTAINING_RECORD( pEntry, WAM_REQUEST, m_leOOP);
if (pWamRequest == NULL)
{
dprintf("pWamRequest is NULL, link list breaks\n");
return;
}
dprintf("[%d] WamRequest %08p \n", iCount, pWamRequest);
move(pEntry, &pEntry->Flink);
}
dprintf("End of OOP WamRequest link list\n\n");
return;
}
VOID
DumpDyingList
(
LIST_ENTRY* pListHead
)
{
LIST_ENTRY DyingListHead;
LIST_ENTRY* pDyingListHead = NULL;
LIST_ENTRY* pEntry = NULL;
CWamInfo* pWamInfo = NULL;
INT iCount;
dprintf("Dying List head %08p\n", pListHead);
// move the list header into memory
move(DyingListHead, pListHead);
pDyingListHead = GET_CPP_VAR_PTR(LIST_ENTRY, DyingListHead);
for (iCount = 0, pEntry = pDyingListHead->Flink; pEntry != pListHead; iCount++)
{
if (CheckControlC())
{
return;
}
pWamInfo = CONTAINING_RECORD( pEntry, CWamInfo, ListEntry);
if (pWamInfo == NULL)
{
dprintf("pWamInfo is NULL, link list breaks\n");
return;
}
dprintf("[%d] WamInfo %08p \n", iCount, pWamInfo);
move(pEntry, &pEntry->Flink);
}
dprintf("End of WamInfo Dying link list\n\n");
return;
}