/*++ 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 // // undef these macros, which otherwise would break compile // UNDONE remove these macros from inetdbgp.h // #undef malloc #undef calloc #undef realloc #undef free #include #include # 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()