mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
400 lines
11 KiB
400 lines
11 KiB
/*++
|
|
|
|
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 <nt.h>
|
|
#include <ntrtl.h>
|
|
#include <nturtl.h>
|
|
|
|
#undef IF_DEBUG
|
|
|
|
#include <windows.h>
|
|
#include <ntsdexts.h>
|
|
// TODO: use wdbgexts.h instead of ntsdexts.h
|
|
// #include <wdbgexts.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <wchar.h>
|
|
#include <stdlib.h>
|
|
|
|
|
|
//
|
|
// 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 <dbgutil.h>
|
|
|
|
// 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 <lkrhash.h>
|
|
|
|
# include <reftrace.h>
|
|
# include <strlog.hxx>
|
|
|
|
# include <atq.h>
|
|
# include <atqtypes.hxx>
|
|
# include <acache.hxx>
|
|
|
|
# include <iistypes.hxx>
|
|
# include <iis64.h>
|
|
|
|
# include <timer.h>
|
|
# include <issched.hxx>
|
|
# include <sched.hxx>
|
|
|
|
# include <w3p.hxx>
|
|
|
|
# define _IIS_TYPES_HXX_
|
|
typedef class IIS_SERVER_INSTANCE *PIIS_SERVER_INSTANCE;
|
|
# include <tsunamip.hxx>
|
|
# include <filehash.hxx>
|
|
# include <filecach.hxx>
|
|
|
|
/************************************************************
|
|
* 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_
|