in DbgProvider/internal/Native/DbgHelp.cs [3378:3552]
public static unsafe object SymGetTypeInfo( WDebugClient debugClient,
ulong modBase,
uint typeId,
IMAGEHLP_SYMBOL_TYPE_INFO getType )
{
IntPtr hProc = _GetHProcForDebugClient( debugClient );
switch( getType )
{
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_SYMINDEX:
uint symIndex = 0;
_SymGetTypeInfo( hProc, modBase, typeId, getType, (void*) &symIndex );
return symIndex;
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_SYMNAME:
IntPtr psz = IntPtr.Zero;
_SymGetTypeInfo( hProc, modBase, typeId, getType, (void*) &psz );
string s = Marshal.PtrToStringUni( psz );
Marshal.FreeHGlobal( psz );
return s;
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_SYMTAG:
SymTag tag;
_SymGetTypeInfo( hProc, modBase, typeId, getType, (void*) &tag );
return tag;
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_OFFSET:
uint offset;
_SymGetTypeInfo( hProc, modBase, typeId, getType, (void*) &offset );
return offset;
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_LENGTH:
ulong len;
_SymGetTypeInfo( hProc, modBase, typeId, getType, (void*) &len );
return len;
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_TYPE:
uint type;
_SymGetTypeInfo( hProc, modBase, typeId, getType, (void*) &type );
return type;
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_TYPEID:
uint tid;
_SymGetTypeInfo( hProc, modBase, typeId, getType, (void*) &tid );
return tid;
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_UDTKIND:
uint udtKind;
_SymGetTypeInfo( hProc, modBase, typeId, getType, (void*) &udtKind );
return (UdtKind) udtKind;
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_DATAKIND:
DataKind dataKind;
_SymGetTypeInfo( hProc, modBase, typeId, getType, (void*) &dataKind );
return dataKind;
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_COUNT:
uint count;
_SymGetTypeInfo( hProc, modBase, typeId, getType, (void*) &count );
return count;
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_LEXICALPARENT:
uint lexParent;
_SymGetTypeInfo( hProc, modBase, typeId, getType, (void*) &lexParent );
return lexParent;
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_ARRAYINDEXTYPEID:
uint arrayIdxTid;
_SymGetTypeInfo( hProc, modBase, typeId, getType, (void*) &arrayIdxTid );
return arrayIdxTid;
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_BASETYPE:
BasicType baseType;
_SymGetTypeInfo( hProc, modBase, typeId, getType, (void*) &baseType );
return baseType;
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_CHILDRENCOUNT:
uint numChildren;
_SymGetTypeInfo( hProc, modBase, typeId, getType, (void*) &numChildren );
return numChildren;
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_CLASSPARENTID:
uint classParentId;
_SymGetTypeInfo( hProc, modBase, typeId, getType, (void*) &classParentId );
return classParentId;
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_IS_REFERENCE:
// TODO: I have no idea if this is the right size; MSDN says "Boolean", not "BOOL"...
bool isRef;
_SymGetTypeInfo( hProc, modBase, typeId, getType, (void*) &isRef );
return isRef;
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_NESTED:
uint nested;
_SymGetTypeInfo( hProc, modBase, typeId, getType, (void*) &nested );
return nested;
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_FINDCHILDREN:
return FindTypeChildren( hProc, modBase, typeId );
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_ADDRESS:
ulong addr;
_SymGetTypeInfo( hProc, modBase, typeId, getType, (void*) &addr );
return addr;
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_ADDRESSOFFSET:
uint addrOffset;
_SymGetTypeInfo( hProc, modBase, typeId, getType, (void*) &addrOffset );
return addrOffset;
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_BITPOSITION:
uint bitPos;
_SymGetTypeInfo( hProc, modBase, typeId, getType, (void*) &bitPos );
return bitPos;
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_CALLING_CONVENTION:
CallingConvention callConv;
_SymGetTypeInfo( hProc, modBase, typeId, getType, (void*) &callConv );
return callConv;
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_INDIRECTVIRTUALBASECLASS:
uint isIndirVirtBase;
_SymGetTypeInfo( hProc, modBase, typeId, getType, (void*) &isIndirVirtBase );
return isIndirVirtBase != 0;
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_THISADJUST:
uint thisAdjust;
_SymGetTypeInfo( hProc, modBase, typeId, getType, (void*) &thisAdjust );
return thisAdjust;
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_VIRTUALBASECLASS:
uint virtBaseClass;
_SymGetTypeInfo( hProc, modBase, typeId, getType, (void*) &virtBaseClass );
return virtBaseClass != 0;
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_VIRTUALBASEDISPINDEX:
uint virtBaseDispIndex;
_SymGetTypeInfo( hProc, modBase, typeId, getType, (void*) &virtBaseDispIndex );
return virtBaseDispIndex;
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_VIRTUALBASEOFFSET:
uint virtBaseOffset;
_SymGetTypeInfo( hProc, modBase, typeId, getType, (void*) &virtBaseOffset );
return virtBaseOffset;
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_VIRTUALBASEPOINTEROFFSET:
uint virtBasePointerOffset;
_SymGetTypeInfo( hProc, modBase, typeId, getType, (void*) &virtBasePointerOffset );
return virtBasePointerOffset;
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_VIRTUALTABLESHAPEID:
uint shapeId;
_SymGetTypeInfo( hProc, modBase, typeId, getType, (void*) &shapeId );
return shapeId;
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_GTIEX_REQS_VALID:
ulong gtiexReqsValid;
_SymGetTypeInfo( hProc, modBase, typeId, getType, (void*) >iexReqsValid );
return gtiexReqsValid;
case IMAGEHLP_SYMBOL_TYPE_INFO.TI_GET_VALUE:
byte* pvt = stackalloc byte[ 24 ];
IntPtr pvtIntPtr = new IntPtr( pvt );
Marshal.GetNativeVariantForObject( null, pvtIntPtr ); // I'm hoping this gets me something like VT_EMPTY
_SymGetTypeInfo( hProc, modBase, typeId, getType, pvt );
return Marshal.GetObjectForNativeVariant( pvtIntPtr );
default:
throw new NotSupportedException( Util.Sprintf( "Not yet supported: {0}", getType ) );
}
} // end SymGetTypeInfo()