Symbols and Symbol Tags
Debug information about a compiled program is stored in the program database (.pdb) file as symbols that are accessible using the Debug Interface Access (DIA) SDK APIs. All symbols have a symTag and a symIndexId. The symTag value indicates the kind of symbol as defined by the SymTagEnum enumeration. The symIndexId property is a DWORD value that contains the unique identifier for every instance of a symbol.
Symbols also have properties that can contain additional information about the symbol as well as references to other symbols, most often a lexicalParent or classParent. When you query a property that contains a reference, the reference is returned as an IDiaSymbol interface. Such properties are always paired with another property by the same name but suffixed with Id, for example, lexicalParentId and classParentId. The tables in Symbol Locations, Lexical Hierarchy of Symbol Types, and Class Hierarchy of Symbol Types outline the properties for each of the different kinds of symbols. These properties may have relevant information about or references to other symbols. Because the *Id properties are simply numeric ordinal identifiers of their related properties, they are omitted from further discussions. They are referred to only where needed for parameter clarification.
When trying to access the property, if no error occurs and the symbol property has been assigned a value, the property's get_* method returns S_OK. A return value of S_FALSE indicates that the property is not valid for the current symbol.