windows-nt/Source/XPSP1/NT/com/rpc/runtime/exts/rpcexts.hxx
2020-09-26 16:20:57 +08:00

275 lines
7.2 KiB
C++

/*++
Copyright (C) Microsoft Corporation, 1997 - 2001
Module Name:
rpcexts.h
Abstract:
Common stuff for RPC debugger extensions
Author:
Mario Goertzel [MarioGo]
Revision History:
MarioGo 3/21/1997 Bits 'n pieces
GrigoriK 3/2001 Rewrote to support type information
--*/
#ifndef _RPCEXTS_HXX_
#define _RPCEXTS_HXX_
#define MIN(x, y) ( ((x) < (y)) ? x:y )
#define MAX(x, y) ( ((x) >= (y)) ? x:y )
#define MY_DECLARE_API(_x_) \
DECLARE_API( _x_ )\
{\
ULONG64 qwAddr;\
qwAddr = GetExpression(args);\
if ( !qwAddr ) {\
dprintf("Error: Failure to get address\n");\
return;\
}\
do_##_x_(qwAddr);\
return;}
extern BOOL fUseTypeInfo;
extern int AddressSize;
extern BOOL fSpew;
// The maximum number of items from a dictionary that we will print.
// This prevents huge loops when symbols are busted.
#define MAX_ITEMS_IN_DICTIONARY (128)
// We can tell the address size by the size of the handle object
#define INIT_ADDRESS_SIZE \
if (!AddressSize) \
AddressSize = GetTypeSize("HANDLE")
#define GET_RPC_VAR(VarName) \
fUseTypeInfo ? GetVar("RPCRT4!"#VarName) : VarName
#define GET_TYPE_SIZE(Type, TypeName) \
fUseTypeInfo ? GetTypeSize(#TypeName) : sizeof(Type)
#define PRINT_SIZE(Type, TypeName) \
dprintf(#Type" - 0x%x\n", GET_TYPE_SIZE(Type, TypeName));
#define PRINT_RPC_TYPE_SIZE(Type) \
dprintf(#Type" - 0x%x\n", GET_TYPE_SIZE(Type, RPCRT4!Type));
#define GET_MEMBER_TYPE_INFO(Addr, TypeString, FieldString, ULONG64Value) \
{ \
if (GetFieldValue(Addr, #TypeString, #FieldString, ULONG64Value)) \
{ \
dprintf("Unable to get field "#FieldString" of type "#TypeString" at 0x%I64x\n", Addr); \
return; \
} \
}
#define GET_MEMBER_TYPE_INFO_NORET(Addr, TypeString, FieldString, ULONG64Value) \
{ \
if (GetFieldValue(Addr, #TypeString, #FieldString, ULONG64Value)) \
{ \
dprintf("Unable to get field "#FieldString" of type "#TypeString" at 0x%I64x\n", Addr); \
} \
}
#define GET_MEMBER_TYPE_INFO_NORET_NOSPEW(Addr, TypeString, FieldString, ULONG64Value) \
{ \
if (GetFieldValue(Addr, #TypeString, #FieldString, ULONG64Value)) \
{ \
if (fSpew) \
{ \
dprintf("Unable to get field "#FieldString" of type "#TypeString" at 0x%I64x\n", Addr); \
dprintf("Disabling debugger spew...\n"); \
fSpew = FALSE; \
} \
} \
}
#define GET_MEMBER_HARDCODED(Addr, Type, Field, ULONG64Value) \
{ \
if (ReadPtr((ULONG64)&(((Type*)Addr)->Field), &ULONG64Value)) \
{ \
dprintf("Unable to read address 0x%I64x\n", &(((Type*)Addr)->Field)); \
return; \
} \
}
#define GET_MEMBER_HARDCODED_NORET(Addr, Type, Field, ULONG64Value) \
{ \
if (ReadPtr((ULONG64)&(((Type*)Addr)->Field), &ULONG64Value)) \
{ \
dprintf("Unable to read address 0x%I64x\n", &(((Type*)Addr)->Field)); \
} \
}
#define GET_MEMBER_HARDCODED_NORET_NOSPEW(Addr, Type, Field, ULONG64Value) \
{ \
if (ReadPtr((ULONG64)&(((Type*)Addr)->Field), &ULONG64Value)) \
{ \
if (fSpew) \
{ \
dprintf("Unable to read address 0x%I64x\n", &(((Type*)Addr)->Field)); \
dprintf("Disabling debugger spew...\n"); \
fSpew = FALSE; \
} \
} \
}
#define GET_MEMBER(Addr, Type, TypeString, Field, ULONG64Value) \
{ \
if (fUseTypeInfo) \
{ \
GET_MEMBER_TYPE_INFO(Addr, TypeString, Field, ULONG64Value); \
} \
else \
{ \
GET_MEMBER_HARDCODED(Addr, Type, Field, ULONG64Value); \
} \
}
#define GET_MEMBER_NORET(Addr, Type, TypeString, Field, ULONG64Value) \
{ \
if (fUseTypeInfo) \
{ \
GET_MEMBER_TYPE_INFO_NORET(Addr, TypeString, Field, ULONG64Value); \
} \
else \
{ \
GET_MEMBER_HARDCODED_NORET(Addr, Type, Field, ULONG64Value); \
} \
}
#define GET_MEMBER_NORET_NOSPEW(Addr, Type, TypeString, Field, ULONG64Value) \
{ \
if (fUseTypeInfo) \
{ \
GET_MEMBER_TYPE_INFO_NORET_NOSPEW(Addr, TypeString, Field, ULONG64Value); \
} \
else \
{ \
GET_MEMBER_HARDCODED_NORET_NOSPEW(Addr, Type, Field, ULONG64Value); \
} \
}
#define PRINT_MEMBER(Addr, Type, TypeString, Field, ULONG64Value) \
{ \
GET_MEMBER(Addr, Type, TypeString, Field, ULONG64Value); \
dprintf(#Field" - 0x%I64x\n", ULONG64Value); \
}
#define PRINT_MEMBER_DECIMAL_AND_HEX(Addr, Type, TypeString, Field, ULONG64Value) \
{ \
GET_MEMBER(Addr, Type, TypeString, Field, ULONG64Value); \
dprintf(#Field" - %I64d 0x%I64x\n", ULONG64Value, ULONG64Value); \
}
#define PRINT_MEMBER_WITH_LABEL(Addr, Type, TypeString, Field, Label, ULONG64Value) \
{ \
GET_MEMBER(Addr, Type, TypeString, Field, ULONG64Value); \
dprintf("%s - 0x%I64x\n", Label, ULONG64Value); \
}
#define PRINT_MEMBER_BOOLEAN(Addr, Type, TypeString, Field, ULONG64Value) \
{ \
GET_MEMBER(Addr, Type, TypeString, Field, ULONG64Value); \
dprintf(#Field" - %s\n", BoolString((BOOL)ULONG64Value)); \
}
#define PRINT_MEMBER_BOOLEAN_WITH_LABEL(Addr, Type, TypeString, Field, Label, ULONG64Value) \
{ \
GET_MEMBER(Addr, Type, TypeString, Field, ULONG64Value); \
dprintf("%s - %s\n", Label, BoolString((BOOL)ULONG64Value)); \
}
#define PRINT_MEMBER_SYMBOL(Addr, Type, TypeString, Field, ULONG64Value) \
{ \
GET_MEMBER(Addr, Type, TypeString, Field, ULONG64Value); \
dprintf(#Field" - %s\n", MapSymbol(ULONG64Value)); \
}
#define PRINT_OFFSET(yy, _x_) \
{dprintf(#_x_" - 0x%x\n", ((ULONG_PTR)qwAddr+offsetof(yy, _x_)));}
#define GET_OFFSET_OF(Type, TypeString, Field, Offset) \
{ \
if (fUseTypeInfo) \
{ \
GetFieldOffset(#TypeString, #Field, Offset); \
} \
else \
{ \
*Offset = offsetof(Type, Field); \
} \
}
#define GET_ADDRESS_OF(qwAddr, Type, TypeString, Field, FieldAddr, ULONGtmp) \
{ \
GET_OFFSET_OF(Type, TypeString, Field, &ULONGtmp); \
FieldAddr = qwAddr + ULONGtmp; \
}
#define PRINT_ADDRESS_OF(qwAddr, Type, TypeString, Field, ULONGtmp) \
{ \
GET_OFFSET_OF(Type, TypeString, Field, &ULONGtmp); \
dprintf(#Field" - 0x%I64x\n", qwAddr + ULONGtmp); \
}
#define PRINT_ADDRESS_OF_WITH_LABEL(qwAddr, Type, TypeString, Field, Label, ULONGtmp) \
{ \
GET_OFFSET_OF(Type, TypeString, Field, &ULONGtmp); \
dprintf(Label" - 0x%I64x\n", qwAddr + ULONGtmp); \
}
extern ULONG GetTypeSize(PUCHAR TypeName);
extern ULONG64 GetVar(PCSTR VarName);
extern char *
BoolString(
BOOL Value
);
extern
PCHAR
MapSymbol(ULONG64);
extern
RPC_CHAR *
ReadProcessRpcChar(
ULONG64 qwAddr
);
extern
BOOL
GetData(IN ULONG64 qwAddress, IN LPVOID ptr, IN ULONG size);
extern
char *
strtok(
char *String
);
// defines a variable of a given type without invoking its constructor - just a placeholder
// large enough for the class. Have in mind that it is allocated on the stack
#define NO_CONSTRUCTOR_TYPE(structName, var) \
unsigned char buf##structName[sizeof(structName)]; \
structName *var = (structName *)buf##structName;
#endif