#define MYASSERT(_cond) \ ((_cond) ? 0 : MyDbgPrintf("ASSERTION FAILED\n")) typedef int bool; // // Debugger Extension Primitives // bool dbgextReadMemory( UINT_PTR uOffset, void * pvBuffer, UINT cb, char *pszDescription ); bool dbgextReadUINT( UINT_PTR uOffset, UINT *pu, char *pszDescription ); bool dbgextReadUINT_PTR( UINT_PTR uOffset, UINT_PTR *pu, char *pszDescription ); bool dbgextReadSZ( UINT_PTR uOffset, char *szBuf, UINT cbMax, char *pszDescription ); bool dbgextWriteMemory( UINT_PTR uOffset, void * pvBuffer, UINT cb, char *pszDescription ); bool dbgextWriteUINT_PTR( UINT_PTR uOffset, UINT_PTR u, char *pszDescription ); UINT_PTR dbgextGetExpression( const char *pcszExpression ); #if 0 // Not sure what this one is about... void dbgextGetSymbol( void *offset, UCHAR *pchBuffer, UINT *pDisplacement ); #endif // 0 void dbgextDumpDLlist( UINT_PTR uOffset, UINT uContainingOffset, char *pszDescription ); typedef void (__cdecl *MYPWINDBG_OUTPUT_ROUTINE)( const char * lpFormat, ... ); extern MYPWINDBG_OUTPUT_ROUTINE g_pfnDbgPrintf; #define MyDbgPrintf g_pfnDbgPrintf // // User Commands Parsing Support and Structures // typedef struct { //TOKEN tokCmd; UINT uParam; UINT uFlags; } COMMAND; struct _TYPE_INFO; typedef void (*PFN_SPECIALIZED_DUMP)( struct _TYPE_INFO *pType, UINT_PTR uAddr, char *szFieldSpec, UINT uFlags ); #define fDUMP_ONE_LINE_SUMMARY (0x1) typedef struct { char *szName; UINT Mask; UINT Value; } BITFIELD_INFO; typedef struct _TYPE_INFO { const char * szName; const char * szShortName; UINT uTypeID; UINT uFlags; // One or more fTYPEINFO_ flags. UINT cbSize; struct _STRUCT_FIELD_INFO *rgFields; UINT uNextOffset; // If this type is a list element, this is the offset // in bytes to the next pointer. // Only valid if uFlags contains fTYPEINFO_ISLIST BITFIELD_INFO *rgBitFieldInfo; // // If this type is a bitfield, this this points // to an array of BITFIELD_INFO structs, giving // the set of valid bitfield constants that can // be held in this bitfield. // // Note -- only one of rgFields and rgBitField info // should be non-null (both can be null). // PFN_SPECIALIZED_DUMP pfnSpecializedDump; // // If nonzero, use this function instead of the standard // structure dumping routine. // UINT_PTR uCachedAddress; // Set to the address of this type that // was most recently referenced. } TYPE_INFO; #define fTYPEINFO_ISLIST (0x1<<0) #define fTYPEINFO_ISBITFIELD (0x1<<1) #define TYPEISLIST(_pType) ((_pType)->uFlags & fTYPEINFO_ISLIST) #define TYPEISBITFIELD(_pType) ((_pType)->uFlags & fTYPEINFO_ISBITFIELD) // // STRUCT_FIELD_INFO contains information about a particular field of a struct. // typedef struct _STRUCT_FIELD_INFO { const char *szFieldName; UINT uFieldOffset; // Offset in bytes from start of containing structure. UINT uFieldSize; UINT uFlags; // one or more fFI_* flags define below TYPE_INFO *pBaseType; } STRUCT_FIELD_INFO; #define fFI_PTR (0x1<<0) // Field is a pointer #define fFI_LIST (0x1<<1) // Field is a pointer to 1st element of a list #define fFI_ARRAY (0x1<<2) // Field is an array (pointer to array if // fFI_PTR is set). #define fFI_OPAQUE (0x1<<3) // Treat object as opaque, of size uObjectSize. // If set then fLIST must not be set. #define FIELD_IS_EMBEDDED_TYPE(_pFI) \ ( !((_pFI)->uFlags & (fFI_PTR|fFI_OPAQUE|fFI_ARRAY)) \ && ((_pFI)->pBaseType)) // // true iff the field is itself a valid type // #define FIELD_IS_PTR_TO_TYPE(_pFI) \ ( ((_pFI)->uFlags & fFI_PTR) \ && !((_pFI)->uFlags & (fFI_OPAQUE|fFI_ARRAY)) \ && ((_pFI)->pBaseType)) // // true iff the field is pointer to a valid type // #define FIELD_SIZE(type, field) sizeof(((type *)0)->field) // // Information about a global variable. // typedef struct { const char *szName; // of variable. const char *szShortName; TYPE_INFO *pBaseType; // could be null (unspecified). UINT uFlags; UINT cbSize; UINT_PTR uAddr; // Address in debuggee's address space. } GLOBALVAR_INFO; typedef UINT_PTR (*PFN_RESOLVE_ADDRESS)( TYPE_INFO *pType ); typedef struct { TYPE_INFO **pTypes; GLOBALVAR_INFO *pGlobals; PFN_RESOLVE_ADDRESS pfnResolveAddress; } NAMESPACE; void DumpObjects(TYPE_INFO *pType, UINT_PTR uAddr, UINT cObjects, UINT uFlags); #define fMATCH_SUBSTRING (0x1<<0) #define fMATCH_PREFIX (0x1<<1) #define fMATCH_SUFFIX (0x1<<2) void DumpStructure( TYPE_INFO *pType, UINT_PTR uAddr, char *szFieldSpec, UINT uFlags ); bool DumpMemory( UINT_PTR uAddr, UINT cb, UINT uFlags, const char *pszDescription ); typedef bool (*PFNMATCHINGFUNCTION) ( const char *szPattern, const char *szString ); bool MatchPrefix(const char *szPattern, const char *szString); bool MatchSuffix(const char *szPattern, const char *szString); bool MatchSubstring(const char *szPattern, const char *szString); bool MatchExactly(const char *szPattern, const char *szString); bool MatchAlways(const char *szPattern, const char *szString); typedef ULONG (*PFNNODEFUNC)( UINT_PTR uNodeAddr, UINT uIndex, void *pvContext ); // // PFNNODEFUNC is the prototype of the func passed into WalkList // UINT WalkList( UINT_PTR uStartAddress, UINT uNextOffset, UINT uStartIndex, UINT uEndIndex, void *pvContext, PFNNODEFUNC pFunc, char *pszDescription ); // // Visit each node in the list in turn, // reading just the next pointers. It calls pFunc for each list node // between uStartIndex and uEndIndex. It terminates under the first of // the following conditions: // * Null pointer // * ReadMemoryError // * Read past uEndIndex // * pFunc returns FALSE // void WalkDLlist( UINT_PTR uOffsetHeadList, UINT_PTR uOffsetStartLink, OPTIONAL void *pvContext, PFNNODEFUNC pFunc, UINT MaxToWalk, char *pszDescription ); ULONG NodeFunc_DumpAddress ( UINT_PTR uNodeAddr, UINT uIndex, void *pvContext ); // // This is a sample node function -- simply dumps the specfied address. // void DumpBitFields( ULONG Flags, BITFIELD_INFO rgBitFieldInfo[] ); // Dump bitfield info. //