#pragma once #include "MetaDataTables.h" typedef enum TableTypes { ttModule = 0, ttTypeRef = 1, ttTypeDef = 2, ttFieldPtr = 3, ttField = 4, ttMethodPtr = 5, ttMethodDef = 6, ttParamPtr = 7, ttParam = 8, ttInterfaceImpl = 9, ttMemberRef = 10, ttConstant = 11, ttCustomAttribute = 12, ttFieldMarshal = 13, ttPermission = 14, ttClassLayout = 15, ttFieldLayout = 16, ttStandAloneSig = 17, ttEventMap = 18, ttEventPtr = 19, ttEvent = 20, ttPropertyMap = 21, ttPropertyPtr = 22, ttProperty = 23, ttMethodSemantics = 24, ttMethodImpl = 25, ttModuleRef = 26, ttTypeSpec = 27, ttImplMap = 28, //lidin book is wrong again here? It has enclog at 28 ttFieldRVA = 29, ttENCLog = 30, ttENCMap = 31, ttAssembly = 32, ttAssemblyProcessor= 33, ttAssemblyOS = 34, ttAssemblyRef = 35, ttAssemblyRefProcessor = 36, ttAssemblyRefOS = 37, ttFile = 38, ttExportedType = 39, ttManifestResource = 40, ttNestedClass = 41, ttTypeTyPar = 42, ttMethodTyPar = 43, } TableTypes; #define STRING_INDEXSIZE (m_tables.GetStringIndexSize()) #define GUID_INDEXSIZE (m_tables.GetGuidIndexSize()) #define BLOB_INDEXSIZE (m_tables.GetBlobIndexSize()) #define TABLE_ROWCOUNT(x) (m_tables.TableRowCount(x)[0]) #define TABLE_INDEXSIZE(x) (TABLE_ROWCOUNT(x) > 65535 ? 4 : 2) #define MAX_INDEXSIZE(x) (m_tables.GetMaxIndexSizeOf(x)) class CStreamTable; typedef CStreamTable* (CALLBACK* CREATEINSTANCE)(CMetadataTables *); #define DECLARE_TABLE(classname, typ, nam) \ public: \ classname##(CMetadataTables& tables) : CStreamTable(tables) {} \ UINT GetType() { return typ; } \ LPCTSTR GetName() { return _T(nam); } typedef struct TABLE_COLUMN { UINT uSize; LPCTSTR pszName; } TABLE_COLUMNS; #define BEGIN_COLUMN_MAP() \ protected: \ TABLE_COLUMN *GetColumns() \ { \ static TABLE_COLUMN map[] = { #define END_COLUMN_MAP() \ { 0, NULL } \ }; \ return map; \ } #define COLUMN_ENTRY(name, size) { size, _T(name) }, class CStreamTable { public: CStreamTable(CMetadataTables& tables); virtual ~CStreamTable(void); DWORD GetRowCount(); LPBYTE operator[](UINT uRow); virtual UINT GetType() = 0; virtual LPCTSTR GetName() = 0; template static CStreamTable * CALLBACK CreateInstance(CMetadataTables *ptables); protected: CMetadataTables& m_tables; LPBYTE m_pbData; virtual UINT GetRowSize(); virtual UINT GetColumnCount(); virtual TABLE_COLUMN *GetColumns() = 0; private: void Init(); }; class CModuleTable : public CStreamTable { DECLARE_TABLE(CModuleTable, ttModule, "Module") BEGIN_COLUMN_MAP() COLUMN_ENTRY("Generation", sizeof(WORD)) COLUMN_ENTRY("Name", STRING_INDEXSIZE) COLUMN_ENTRY("Mvid", GUID_INDEXSIZE) COLUMN_ENTRY("EncId", GUID_INDEXSIZE) COLUMN_ENTRY("EncBaseId", GUID_INDEXSIZE) END_COLUMN_MAP() }; static UINT ResolutionScopeIndex[] = {ttModule, ttModuleRef, ttAssemblyRef, ttTypeRef, 0}; class CTypeRefTable : public CStreamTable { DECLARE_TABLE(CTypeRefTable, ttTypeRef, "TypeRef") BEGIN_COLUMN_MAP() COLUMN_ENTRY("ResolutionScope", MAX_INDEXSIZE(ResolutionScopeIndex)) COLUMN_ENTRY("TypeName", STRING_INDEXSIZE) COLUMN_ENTRY("TypeNamespace", STRING_INDEXSIZE) END_COLUMN_MAP() }; static UINT TypeDefOrRefIndex[] = {ttTypeDef, ttTypeRef, ttTypeSpec, 0}; class CTypeDefTable : public CStreamTable { DECLARE_TABLE(CTypeDefTable, ttTypeDef, "TypeDef") BEGIN_COLUMN_MAP() COLUMN_ENTRY("Flags", sizeof(DWORD)) COLUMN_ENTRY("TypeName", STRING_INDEXSIZE) COLUMN_ENTRY("TypeNamespace", STRING_INDEXSIZE) COLUMN_ENTRY("Extends", MAX_INDEXSIZE(TypeDefOrRefIndex)) COLUMN_ENTRY("FieldList", TABLE_INDEXSIZE(ttField)) COLUMN_ENTRY("MethodList", TABLE_INDEXSIZE(ttMethodDef)) END_COLUMN_MAP() }; extern CREATEINSTANCE g_arTableTypes[64];