public static unsafe object SymGetTypeInfo()

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*) &gtiexReqsValid );
                    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()