342 lines
7.1 KiB
C++
342 lines
7.1 KiB
C++
/*++
|
||
|
||
Copyright (c) 1995-1997 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
dbgwxin.cxx
|
||
|
||
Abstract:
|
||
|
||
This module contains the default ntsd debugger extensions for
|
||
IIS - WAM
|
||
|
||
Author:
|
||
|
||
DaveK 3-Oct-1997
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
#include "inetdbgp.h"
|
||
#include <wamxbase.hxx>
|
||
//
|
||
// undef these macros, which otherwise would break compile
|
||
// UNDONE remove these macros from inetdbgp.h
|
||
//
|
||
#undef malloc
|
||
#undef calloc
|
||
#undef realloc
|
||
#undef free
|
||
#include <isapip.hxx>
|
||
#include <wamobj.hxx>
|
||
|
||
# undef DBG_ASSERT
|
||
|
||
|
||
VOID
|
||
PrintWamExecInfo( WAM_EXEC_BASE * pwxinOriginal,
|
||
WAM_EXEC_BASE * pwxin,
|
||
CHAR Verbosity );
|
||
|
||
VOID
|
||
PrintWamExecInfoThunk( PVOID pwxDebuggee,
|
||
PVOID pwxDebugger,
|
||
CHAR verbosity,
|
||
DWORD iCount)
|
||
{
|
||
|
||
//
|
||
// NOTE we must thunk through this function because
|
||
// EnumLinkedList expects a PFN_LIST_ENUMERATOR,
|
||
// which is what this function is
|
||
//
|
||
|
||
PrintWamExecInfo(
|
||
(WAM_EXEC_BASE *) pwxDebuggee
|
||
, (WAM_EXEC_BASE *) pwxDebugger
|
||
, verbosity
|
||
);
|
||
|
||
|
||
return;
|
||
|
||
} // PrintWamRequestThunk()
|
||
|
||
|
||
|
||
VOID
|
||
DumpWamExecInfoList(
|
||
char * lpArgumentString
|
||
, PFN_LIST_ENUMERATOR pfnWX
|
||
)
|
||
{
|
||
CHAR Verbosity;
|
||
LIST_ENTRY * pwxListHead;
|
||
|
||
//
|
||
// set verbosity to character immediately after the 'l'
|
||
// or to '0' if none
|
||
//
|
||
|
||
lpArgumentString++;
|
||
Verbosity = (*lpArgumentString == ' ')
|
||
? '0'
|
||
: *lpArgumentString
|
||
;
|
||
lpArgumentString++;
|
||
|
||
//
|
||
// move past spaces - bail if we reach end of string
|
||
//
|
||
|
||
while (*lpArgumentString == ' ') {
|
||
lpArgumentString++;
|
||
}
|
||
|
||
if ( !*lpArgumentString ) {
|
||
PrintUsage( "wxin" );
|
||
return;
|
||
}
|
||
|
||
|
||
//
|
||
// remainder of argument string is wam address
|
||
// in debuggee process
|
||
//
|
||
|
||
WAM * pwam = (WAM *) GetExpression( lpArgumentString );
|
||
|
||
if ( !pwam ) {
|
||
|
||
dprintf(
|
||
"inetdbg.wxin: Unable to evaluate \"%s\"\n"
|
||
, lpArgumentString
|
||
);
|
||
|
||
return;
|
||
}
|
||
|
||
//
|
||
// address of list head within debuggee process
|
||
// = (wam address) + (offset of list head entry within WAM struct)
|
||
//
|
||
|
||
pwxListHead
|
||
= (LIST_ENTRY *)
|
||
( ((BYTE *) pwam) + FIELD_OFFSET(WAM, m_WamExecInfoListHead) );
|
||
|
||
if ( NULL == pwxListHead) {
|
||
|
||
dprintf( " Unable to get WamExecInfo list \n");
|
||
return;
|
||
}
|
||
|
||
EnumLinkedList(
|
||
pwxListHead
|
||
, pfnWX
|
||
, Verbosity
|
||
, sizeof( WAM_EXEC_BASE)
|
||
, FIELD_OFFSET( WAM_EXEC_BASE, _ListEntry )
|
||
);
|
||
|
||
return;
|
||
|
||
} // DumpWamExecInfoList()
|
||
|
||
|
||
|
||
|
||
DECLARE_API( wxin )
|
||
|
||
/*++
|
||
|
||
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.
|
||
|
||
--*/
|
||
{
|
||
DEFINE_CPP_VAR( WAM_EXEC_BASE, wxin );
|
||
WAM_EXEC_BASE * pwxin;
|
||
|
||
INIT_API();
|
||
|
||
while (*lpArgumentString == ' ')
|
||
lpArgumentString++;
|
||
|
||
if ( !*lpArgumentString )
|
||
{
|
||
PrintUsage( "wxin" );
|
||
return;
|
||
}
|
||
|
||
if ( *lpArgumentString == '-' )
|
||
{
|
||
lpArgumentString++;
|
||
|
||
if ( *lpArgumentString == 'h' )
|
||
{
|
||
PrintUsage( "wxin" );
|
||
return;
|
||
}
|
||
|
||
if ( *lpArgumentString == 'l' ) {
|
||
|
||
DumpWamExecInfoList(
|
||
lpArgumentString
|
||
, PrintWamExecInfoThunk
|
||
);
|
||
|
||
return;
|
||
}
|
||
|
||
} // if
|
||
|
||
//
|
||
// Treat the argument as the address of a WAM_EXEC_BASE
|
||
//
|
||
|
||
pwxin = (WAM_EXEC_BASE * ) GetExpression( lpArgumentString );
|
||
|
||
if ( !pwxin )
|
||
{
|
||
dprintf( "inetdbg.wxin: Unable to evaluate \"%s\"\n",
|
||
lpArgumentString );
|
||
|
||
return;
|
||
}
|
||
|
||
move( wxin, pwxin );
|
||
PrintWamExecInfo( pwxin, GET_CPP_VAR_PTR( WAM_EXEC_BASE, wxin), '2');
|
||
|
||
return;
|
||
|
||
} // DECLARE_API( wxin )
|
||
|
||
|
||
|
||
VOID
|
||
PrintWamExecInfo( WAM_EXEC_BASE * pwxinOriginal,
|
||
WAM_EXEC_BASE * pwxin,
|
||
CHAR Verbosity )
|
||
/*++
|
||
Description:
|
||
This function takes the WAM_EXEC_BASE object and prints out
|
||
the details for the same in the debugger. The granularity of the
|
||
deatils are controlled by the verbosity flag
|
||
|
||
Arguments:
|
||
pwxinOriginal - pointer to the location where the original WAM_EXEC_BASE
|
||
object is located.
|
||
Note: pwxinOriginal points to object inside debuggee process
|
||
pwxin - pointer to the WAM_EXEC_BASE object that is a copy
|
||
of the contents located at [pwxinOriginal]
|
||
Note: pwxin points to object inside the debugger process
|
||
Verbostiy - level of details requested.
|
||
|
||
Returns:
|
||
None
|
||
--*/
|
||
{
|
||
|
||
|
||
if ( Verbosity >= '0') {
|
||
|
||
//
|
||
// Print basic info for the WAM_EXEC_BASE object
|
||
//
|
||
|
||
dprintf(
|
||
"WAM_EXEC_BASE: %08p m_pWam = %08p m_fInProcess = %08x\n"
|
||
"\tRef count = %d \n"
|
||
"\t m_pIWamReqIIS = %08p m_pIWamReqInproc = %08p \n"
|
||
"\t m_pIWamReqSmartISA = %08p m_gipIWamRequest = %08x \n"
|
||
"\t m_dwThreadIdIIS = %08x m_dwThreadIdISA = %08x \n"
|
||
|
||
, pwxinOriginal
|
||
, pwxin->m_pWam
|
||
, pwxin->m_fInProcess
|
||
, pwxin->_cRefs
|
||
, pwxin->m_pIWamReqIIS
|
||
, pwxin->m_pIWamReqInproc
|
||
, pwxin->m_pIWamReqSmartISA
|
||
, pwxin->m_gipIWamRequest
|
||
, pwxin->m_dwThreadIdIIS
|
||
, pwxin->m_dwThreadIdISA
|
||
);
|
||
|
||
}
|
||
|
||
if ( Verbosity >= '1') {
|
||
|
||
//
|
||
// Print more details for the WAM_EXEC_BASE object
|
||
//
|
||
|
||
dprintf(
|
||
"\t _FirstThread = %08x _psExtension = %08p \n"
|
||
"\t _dwFlags = %08x _dwChildExecFlags = %08x \n"
|
||
|
||
"\t _ListEntry.Flink = %08p _ListEntry.Blink = %08p \n"
|
||
|
||
"\tASYNC_IO_INFO embedded structure: \n"
|
||
"\t _dwOutstandingIO = %d _cbLastAsyncIO = %d \n"
|
||
"\t _pfnHseIO = %08p _pvHseIOContext = %08p \n"
|
||
|
||
, 0
|
||
, pwxin->_psExtension
|
||
, pwxin->_dwFlags
|
||
, pwxin->_dwChildExecFlags
|
||
|
||
, pwxin->_ListEntry.Flink
|
||
, pwxin->_ListEntry.Blink
|
||
|
||
, pwxin->_AsyncIoInfo._dwOutstandingIO
|
||
, pwxin->_AsyncIoInfo._cbLastAsyncIO
|
||
, pwxin->_AsyncIoInfo._pfnHseIO
|
||
, pwxin->_AsyncIoInfo._pvHseIOContext
|
||
);
|
||
|
||
}
|
||
|
||
if ( Verbosity >= '2') {
|
||
|
||
//
|
||
// UNDONE print strings?
|
||
// Print all details for the WAM_EXEC_INFO object
|
||
//
|
||
|
||
}
|
||
|
||
return;
|
||
|
||
} // PrintWamExecInfo()
|
||
|
||
|
||
|
||
|