/*++ Copyright (c) 1996-1999 Microsoft Corporation Module Name: inetdbgp.h Abstract: Common header file for NTSDEXTS component source files. Author: Murali Krishnan (MuraliK) 22-Aug-1996 Revision History: --*/ # ifndef _INETDBGP_H_ # define _INETDBGP_H_ #include #include #include #undef IF_DEBUG #include #include // TODO: use wdbgexts.h instead of ntsdexts.h // #include #include #include #include #include #include // // To obtain the private & protected members of C++ class, // let me fake the "private" keyword // # define private public # define protected public // // Turn off dllexp et al so this DLL won't export tons of unnecessary garbage. // #define dllexp #undef _NTDDK_ #undef _WMIKM_ #define IRTL_DLLEXP #define IRTL_EXPIMP #define DLL_IMPLEMENTATION #define IMPLEMENTATION_EXPORT # include // undef these so that we can avoid linking with iisrtl # undef DBG_ASSERT # define DBG_ASSERT(exp) ((void)0) /* Do Nothing */ # undef SET_CRITICAL_SECTION_SPIN_COUNT # define SET_CRITICAL_SECTION_SPIN_COUNT(lpCS, dwSpins) \ SetCriticalSectionSpinCount(lpCS, dwSpins) # undef INITIALIZE_CRITICAL_SECTION # define INITIALIZE_CRITICAL_SECTION(lpCS) \ InitializeCriticalSection(lpCS) # undef INITIALIZE_CRITICAL_SECTION_SPIN # define INITIALIZE_CRITICAL_SECTION_SPIN(lpCS, dwSpin) \ InitializeCriticalSectionAndSpinCount(lpCS, dwSpin) #include # include # include # include # include # include # include # include # include # include # include # include # define _IIS_TYPES_HXX_ typedef class IIS_SERVER_INSTANCE *PIIS_SERVER_INSTANCE; # include # include # include /************************************************************ * Macro Definitions ************************************************************/ // Set IISRTL_NAME to the name of the DLL hosting the IIS RunTime Library #define IISRTL_NAME "iisrtl" // #define IISRTL_NAME "misrtl" // #define IISRTL_NAME "gisrtl" // TODO: make this variable configurable extern CHAR g_szIisRtlName[MAX_PATH]; LPSTR IisRtlVar( LPCSTR pszFormat); // For use as arguments to '%c%c%c%c' #define DECODE_SIGNATURE(dw) \ isprint(((dw) >> 0) & 0xFF) ? (((dw) >> 0) & 0xFF) : '?', \ isprint(((dw) >> 8) & 0xFF) ? (((dw) >> 8) & 0xFF) : '?', \ isprint(((dw) >> 16) & 0xFF) ? (((dw) >> 16) & 0xFF) : '?', \ isprint(((dw) >> 24) & 0xFF) ? (((dw) >> 24) & 0xFF) : '?' #define move(dst, src)\ __try {\ ReadMemory((LPVOID) (src), &(dst), sizeof(dst), NULL);\ } __except (EXCEPTION_EXECUTE_HANDLER) {\ return;\ } #define moveBlock(dst, src, size)\ __try {\ ReadMemory((LPVOID) (src), &(dst), (size), NULL);\ } __except (EXCEPTION_EXECUTE_HANDLER) {\ return;\ } #define MoveWithRet(dst, src, retVal)\ __try {\ ReadMemory((LPVOID) (src), &(dst), sizeof(dst), NULL);\ } __except (EXCEPTION_EXECUTE_HANDLER) {\ return retVal;\ } #define MoveBlockWithRet(dst, src, size, retVal)\ __try {\ ReadMemory((LPVOID) (src), &(dst), (size), NULL);\ } __except (EXCEPTION_EXECUTE_HANDLER) {\ return retVal;\ } #ifdef __cplusplus #define CPPMOD extern "C" #else #define CPPMOD #endif #ifndef DECLARE_API # define DECLARE_API(s) \ CPPMOD VOID \ s( \ HANDLE hCurrentProcess, \ HANDLE hCurrentThread, \ DWORD dwCurrentPc, \ PNTSD_EXTENSION_APIS lpExtensionApis, \ LPSTR lpArgumentString \ ) #endif #define INIT_API() { \ ExtensionApis = *lpExtensionApis; \ ExtensionCurrentProcess = hCurrentProcess; \ } #define dprintf (ExtensionApis.lpOutputRoutine) #define GetExpression (ExtensionApis.lpGetExpressionRoutine) #define GetSymbol (ExtensionApis.lpGetSymbolRoutine) #define Disasm (ExtensionApis.lpDisasmRoutine) #define CheckControlC (ExtensionApis.lpCheckControlCRoutine) #define ReadMemory(a,b,c,d) ReadProcessMemory( ExtensionCurrentProcess, (LPCVOID)(a), (b), (c), (d) ) #define WriteMemory(a,b,c,d) WriteProcessMemory( ExtensionCurrentProcess, (LPVOID)(a), (LPVOID)(b), (c), (d) ) #ifndef malloc # define malloc( n ) HeapAlloc( GetProcessHeap(), 0, (n) ) #endif #ifndef calloc # define calloc( n , s) HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, (n)*(s) ) #endif #ifndef realloc # define realloc( p, n ) HeapReAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, (p), (n) ) #endif #ifndef free # define free( p ) HeapFree( GetProcessHeap(), 0, (p) ) #endif #define NUM_STACK_SYMBOLS_TO_DUMP 48 #define MAX_SYMBOL_LEN 1024 # define BoolValue( b) ((b) ? " TRUE" : " FALSE") #define DumpDword( symbol ) \ { \ ULONG_PTR dw = GetExpression( "&" symbol ); \ ULONG_PTR dwValue = 0; \ \ if ( dw ) \ { \ if ( ReadMemory( (LPVOID) dw, \ &dwValue, \ sizeof(dwValue), \ NULL )) \ { \ dprintf( "\t" symbol " = %8d (0x%p)\n", \ dwValue, \ dwValue ); \ } \ } \ } // // C++ Structures typically require the constructors and most times // we may not have default constructors // => trouble in defining a copy of these struct/class inside the // Debugger extension DLL for debugger process // So we will define them as CHARACTER arrays with appropriate sizes. // This is okay, since we are not really interested in structure as is, // however, we will copy over data block from the debuggee process to // these structure variables in the debugger process. // # define DEFINE_CPP_VAR( className, classVar) \ CHAR classVar[sizeof(className)] # define GET_CPP_VAR_PTR( className, classVar) \ (className * ) &classVar /************************************************************ * Prototype Definitions ************************************************************/ extern NTSD_EXTENSION_APIS ExtensionApis; extern HANDLE ExtensionCurrentProcess; VOID dstring( CHAR * pszName, PVOID pvString, DWORD cbLen); VOID PrintLargeInteger( CHAR * pszName, LARGE_INTEGER * pli); VOID Print2Dwords( CHAR * pszN1, DWORD d1, CHAR * pszN2, DWORD d2 ); VOID PrintUsage( IN PSTR CommandName ); // // Determine if a linked list is empty. // #define IS_LIST_EMPTY( localaddr, remoteaddr, type, fieldname ) \ ( ((type *)(localaddr))->fieldname.Flink == \ (PLIST_ENTRY)( (remoteaddr) + \ FIELD_OFFSET( type, fieldname ) ) ) // // Module enumerator. // typedef struct _MODULE_INFO { ULONG_PTR DllBase; ULONG_PTR EntryPoint; ULONG SizeOfImage; CHAR BaseName[MAX_PATH]; CHAR FullName[MAX_PATH]; } MODULE_INFO, *PMODULE_INFO; typedef BOOLEAN (CALLBACK * PFN_ENUMMODULES)( IN PVOID Param, IN PMODULE_INFO ModuleInfo ); BOOLEAN EnumModules( IN PFN_ENUMMODULES EnumProc, IN PVOID Param ); BOOLEAN FindModuleByAddress( IN ULONG_PTR ModuleAddress, OUT PMODULE_INFO ModuleInfo ); // // Enumerator for NT's standard doubly linked list LIST_ENTRY // // PFN_LIST_ENUMERATOR // This is the callback function for printing the CLIENT_CONN object. // // Arguments: // pvDebuggee - pointer to object in the debuggee process // pvDebugger - pointer to object in the debugger process // verbosity - character indicating the verbosity level desired // typedef VOID (CALLBACK * PFN_LIST_ENUMERATOR)( IN PVOID pvDebugee, IN PVOID pvDebugger, IN CHAR chVerbosity, //verbosity value supplied for the enumerator IN DWORD iCount //index for the item being enumerated ); BOOL EnumLinkedList( IN LIST_ENTRY * pListHead, IN PFN_LIST_ENUMERATOR pfnListEnumerator, IN CHAR chVerbosity, IN DWORD cbSizeOfStructure, IN DWORD cbListEntryOffset ); // Enumerator for an LKRhash table node entry class CLKRLinearHashTable; class CLKRHashTable; typedef BOOL (CALLBACK * PFN_ENUM_LKRHASH)( IN const void* pvParam, IN DWORD dwSignature, IN INT nVerbose); BOOL EnumerateLKRhashTable( IN PFN_ENUM_LKRHASH pfnEnum, IN CLKRHashTable* pht, IN INT nVerbose); BOOL EnumerateLKRLinearHashTable( IN PFN_ENUM_LKRHASH pfnEnum, IN CLKRLinearHashTable* plht, IN INT nVerbose); // Functions from dbglocks.cxx const char* LockName( LOCK_LOCKTYPE lt); int LockSize( LOCK_LOCKTYPE lt); BOOL PrintLock( LOCK_LOCKTYPE lt, IN PVOID pvLock, IN INT nVerbose); // Call debugger extension in other extension DLL typedef VOID (_stdcall *PWINDBG_EXTENSION_FUNCTION)( HANDLE, HANDLE, ULONG, ULONG, PCSTR); #define DO_EXTENSION(szModule, szCommand, szArgs) \ CallExtension((szModule), (szCommand), hCurrentProcess, hCurrentThread,\ dwCurrentPc, dwProcessor, (szArgs)) NTSTATUS CallExtension( PCSTR szModuleName, PCSTR szFunction, HANDLE hCurrentProcess, HANDLE hCurrentThread, ULONG dwCurrentPc, ULONG dwProcessor, PCSTR args); /*********************************************************************** * w3svc's CLIENT_CONN functions needed by other objects **********************************************************************/ // Walks and dumps information for the client-conn list VOID DumpClientConnList( CHAR Verbosity, PFN_LIST_ENUMERATOR pfnCC); # endif // _INETDBGP_H_