|
|
//-----------------------------------------------------------------------------
//
//
// File: _dbgext.h
//
// Description:
// Defines macros for defining structures to dump in your CDB extension
//
// Usage:
// Create a head file that includes this file and defines your field
// descriptors using only the following macros:
//
// BIT MASKS:
// BEGIN_BIT_MASK_DESCRIPTOR(BitMaskName) -
// start bit mask descriptor
// BIT_MASK_VALUE(Value) -
// Give a defined value for a bit mask. Uses #Value
// to describe the value. If your bitmask values are
// defined using #defines... then only the numerical
// values will appear in the dump... use BIT_MASK_VALUE2
// instead.
// BIT_MASK_VALUE2(Value, Description) -
// Give a value and description for a bit mask.
// END_BIT_MASK_DESCRIPTOR
// Mark the end of a bit mask descriptor
//
// ENUMS:
// BEGIN_ENUM_DESCRIPTOR(BitMaskName) -
// start enum descriptor
// ENUM_VALUE(Value) -
// Give a defined value for a enum. Uses #Value
// to describe the value.
// ENUM_VALUE2(Value, Description) -
// Give a value and description for a enum.
// END__DESCRIPTOR -
// Mark the end of a enum descriptor
//
// STRUCTURES & CLASSES:
// BEGIN_FIELD_DESCRIPTOR(FieldDescriptorName) -
// start field decscritor
// FIELD3(FieldType, StructureName, FieldName) -
// define non-enum public field
// FIELD4(FieldType, StructureName, FieldName, AuxInfo) -
// define enum public field
// For FIELD4, you should pass one of the following to
// to define the aux info:
// GET_ENUM_DESCRIPTOR(x)
// GET_BITMASK_DESCRIPTOR(x)
// Where x is one of the values used to define a bit mask
// or enum.
//
// END_FIELD_DESCRIPTOR -
// Define end of field descriptors for class/struct
//
// GLOBALS: - Used to tell ptdbgext what class/structures to dump
// BEGIN_STRUCT_DESCRIPTOR -
// Marks the begining of the global stuct descriptor
// STRUCT(TypeName,FieldDescriptor) -
// Defines a struct to dump. TypeName is the name of the
// type, and FieldDescriptor is a name given in a
// BEGIN_FIELD_DESCRIPTOR.
//
// NOTE: You must define bit masks & enums before classes and structures.
// You must also define the global STRUCT_DESCRIPTOR last.
//
// **this include file with redefine the key words "protected" and "private"***
//
// Author: mikeswa
//
// Copyright (C) 1998 Microsoft Corporation
//
//-----------------------------------------------------------------------------
#ifndef ___DBGEXT_H__FIRST_PASS_
#define ___DBGEXT_H__FIRST_PASS_
#ifndef PTDBGEXT_USE_FRIEND_CLASSES
//Needed to allow access to private members of classes
#define private public
#define protected public
#endif //PTDBGEXT_USE_FRIEND_CLASSES
#define DEFINE_VALUE(VAL) \
{VAL, #VAL}, #define DEFINE_VALUE2(VAL, DESCRIPTION) \
{VAL, DESCRIPTION},
//---[ ENUM MACROS ]-----------------------------------------------------------
//
//
// Description: Enum macro definitions.... used to define enum values for
// the dump command.
//
//
//-----------------------------------------------------------------------------
#define GET_ENUM_DESCRIPTOR(ENUM_NAME) EnumValueDescrsOf_##ENUM_NAME
#define BEGIN_ENUM_DESCRIPTOR(ENUM_NAME) \
ENUM_VALUE_DESCRIPTOR GET_ENUM_DESCRIPTOR(ENUM_NAME)[] = { #define END_ENUM_DESCRIPTOR \
0 \ }; #define ENUM_VALUE(VAL) DEFINE_VALUE(VAL)
#define ENUM_VALUE2(VAL, DESCRIPTION) DEFINE_VALUE2(VAL, DESCRIPTION)
//Bit masks
//---[ BIT MASK MACROS ]-------------------------------------------------------
//
//
// Description: Bit mask macro definitions... used to define bit mask values
// for the dump command.
//
//
//-----------------------------------------------------------------------------
#define GET_BIT_MASK_DESCRIPTOR(BITMAP_NAME) BitmapValueDescrsOf_##BITMAP_NAME
#define BEGIN_BIT_MASK_DESCRIPTOR(BITMAP_NAME) \
BIT_MASK_DESCRIPTOR GET_BIT_MASK_DESCRIPTOR(BITMAP_NAME)[] = { #define END_BIT_MASK_DESCRIPTOR \
0 \ }; #define BIT_MASK_VALUE(VAL) DEFINE_VALUE(VAL)
#define BIT_MASK_VALUE2(VAL, DESCRIPTION) DEFINE_VALUE2(VAL, DESCRIPTION)
//---[ FIELD MACROS ]----------------------------------------------------------
//
//
// Description: Field descriptor macros.... used to define fields from structures
// and classes to dump.
//
//
//-----------------------------------------------------------------------------
//Field descriptor... used to define structures and classes
#define BEGIN_FIELD_DESCRIPTOR(x) \
FIELD_DESCRIPTOR x[] = { #define END_FIELD_DESCRIPTOR \
NULL_FIELD \ }; #define FIELD3(FieldType,StructureName, FieldName) \
{FieldType, #FieldName , FIELD_OFFSET(StructureName,FieldName) ,NULL}, #define FIELD4(FieldType, StructureName, FieldName, AuxInfo) \
{FieldType, #FieldName , FIELD_OFFSET(StructureName,FieldName) ,(VOID *) AuxInfo}, #ifdef PTDBGEXT_USE_FRIEND_CLASSES
#define FIELD3_PRIV(FieldType,StructureName, FieldName) \
{FieldType, #FieldName , 0 ,NULL}, #define FIELD4_PRIV(FieldType, StructureName, FieldName, AuxInfo) \
{FieldType, #FieldName , 0,(VOID *) AuxInfo}, #else //PTDBGEXT_USE_FRIEND_CLASSES not defined
#define FIELD3_PRIV(FieldType,StructureName, FieldName) \
{FieldType, #FieldName , FIELD_OFFSET(StructureName,FieldName) ,NULL}, #define FIELD4_PRIV(FieldType, StructureName, FieldName, AuxInfo) \
{FieldType, #FieldName , FIELD_OFFSET(StructureName,FieldName) ,(VOID *) AuxInfo}, #endif //PTDBGEXT_USE_FRIEND_CLASSES
//Struct descriptor
#define BEGIN_STRUCT_DESCRIPTOR \
STRUCT_DESCRIPTOR Structs[] = { #define END_STRUCT_DESCRIPTOR \
0 \ }; #define STRUCT(StructTypeName,FieldDescriptors) \
{ #StructTypeName,sizeof(StructTypeName),FieldDescriptors},
#define EMBEDDED_STRUCT(StructTypeName, FieldDescriptors, EmbeddedStructName) \
STRUCT_DESCRIPTOR EmbeddedStructName[] = \ { STRUCT(StructTypeName, FieldDescriptors) 0 };
#else //___DBGEXT_H__FIRST_PASS_ already defined...at least 2nd pass
#ifdef PTDBGEXT_USE_FRIEND_CLASSES //if not set, do not do the multipass stuff
#ifndef ___DBGEXT_H__
#define ___DBGEXT_H__
//
// As an alternative to using #defining private and protected to public, you
// may wish to use the friend class method of accessing the structure offsets.
// (If, for example, the organization of your classes are changed as a result
// of those #defining private and prctected).
//
// To do so, #define PTDBGEXT_USE_FRIEND_CLASSES and use the following
// additional macros:
//
// FIELD3_PRIV(FieldType, StructureName, FieldName) -
// define non-enum private field
// FIELD4_PRIV(FieldType, StructureName, FieldName, AuxInfo) -
// define enum private field
//
// If you use FIELD?_PRIV, then you are accessing private members of a
// class. In this case, you need to create a void (void) initialization
// function and assign it to g_pExtensionInitRoutine. It should be a
// member function of class that is a friend of all the classes you are
// interested in debugging. Suppose your field descriptors are defined
// in mydump.h, you would need to create an initialization function as
// follows:
//
// #include <mydump.h> //initial definition
// ...
// void CMyDebugExt::Init(void) {
// #include <mydump.h>
// }
//undefine previously defined macros
#undef BEGIN_FIELD_DESCRIPTOR
#undef END_FIELD_DESCRIPTOR
#undef FIELD3
#undef FIELD4
#undef FIELD3_PRIV
#undef FIELD4_PRIV
#undef GET_ENUM_DESCRIPTOR
#undef BEGIN_ENUM_DESCRIPTOR
#undef END_ENUM_DESCRIPTOR
#undef GET_BIT_MASK_DESCRIPTOR
#undef BEGIN_BIT_MASK_DESCRIPTOR
#undef END_BIT_MASK_DESCRIPTOR
#undef BEGIN_STRUCT_DESCRIPTOR
#undef STRUCT
#undef END_STRUCT_DESCRIPTOR
#undef DEFINE_VALUE
#undef DEFINE_VALUE2
#undef EMBEDDED_STRUCT
#define GET_ENUM_DESCRIPTOR(ENUM_NAME)
#define BEGIN_ENUM_DESCRIPTOR(ENUM_NAME)
#define END_ENUM_DESCRIPTOR
#define GET_BIT_MASK_DESCRIPTOR(BITMAP_NAME)
#define BEGIN_BIT_MASK_DESCRIPTOR(BITMAP_NAME)
#define END_BIT_MASK_DESCRIPTOR
#define DEFINE_VALUE(VAL)
#define DEFINE_VALUE2(VAL, DESCRIPTION)
#define BEGIN_STRUCT_DESCRIPTOR
#define STRUCT(x, y)
#define END_STRUCT_DESCRIPTOR
#define EMBEDDED_STRUCT(x, y, z)
#define BEGIN_FIELD_DESCRIPTOR(x) \
pfd = x; #define END_FIELD_DESCRIPTOR \
pfd = NULL;
#define FIELD3(FieldType,StructureName, FieldName) \
pfd++; #define FIELD4(FieldType, StructureName, FieldName, AuxInfo) \
pfd++;
//Use Field?_PRIV when dealing with private memebers. Requires 2 passes
#define FIELD3_PRIV(FieldType,StructureName, FieldName) \
pfd->Offset = FIELD_OFFSET(StructureName, FieldName); \ pfd++;
#define FIELD4_PRIV(FieldType, StructureName, FieldName, AuxInfo) \
pfd->Offset = FIELD_OFFSET(StructureName, FieldName); \ pfd++;
FIELD_DESCRIPTOR *pfd = NULL; //Variable declaration in INIT function
#else //whoops
#pragma message "WARNING: _dbgext.h included more than twice"
#endif //___DBGEXT_H__
#endif //PTDBGEXT_USE_FRIEND_CLASSES
#endif //___DBGEXT_H__FIRST_PASS_
|