summaryrefslogtreecommitdiff
path: root/src/tools/metainfo/mdinfo.h
blob: ccf383b8a66557cf52482fdb5fd9016de258caac (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
//
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information. 
//

#ifndef _mdinfo_h
#define _mdinfo_h

#include "winwrap.h"
#include "cor.h"
#include "corhlprpriv.h"

#ifdef FEATURE_PAL
#include <oleauto.h>
#endif

#define STRING_BUFFER_LEN 4096

typedef void (*strPassBackFn)(const char *str);

class MDInfo {
public:
    enum DUMP_FILTER
    {
        dumpDefault     = 0x00000000,               // Dump everything but debugger data.
        dumpSchema      = 0x00000002,               // Dump the metadata schema.
        dumpRaw         = 0x00000004,               // Dump the metadata in raw table format.
        dumpHeader      = 0x00000008,               // Dump just the metadata header info.
        dumpCSV         = 0x00000010,               // Dump the metadata header info in CSV format.
        dumpUnsat       = 0x00000020,               // Dump unresolved methods or memberref
        dumpAssem       = 0x00000040,
        dumpStats       = 0x00000080,               // Dump more statistics about tables.
        dumpMoreHex     = 0x00000100,               // Dump more things in hex.
        dumpValidate    = 0x00000200,               // Validate MetaData.
        dumpRawHeaps    = 0x00000400,               // Also dump the heaps in the raw dump.
        dumpNoLogo      = 0x00000800,               // Don't display the logo or MVID
        dumpNames       = 0x00001000,               // In a hex dump, display the names, as well as string #'s.
    };


public:
    MDInfo(IMetaDataImport2* pImport, IMetaDataAssemblyImport* pAssemblyImport, LPCWSTR szScope, strPassBackFn inPBFn, ULONG DumpFilter);
    MDInfo(IMetaDataDispenserEx *pDispenser, LPCWSTR  szScope, strPassBackFn inPBFn, ULONG DumpFilter=dumpDefault);
    MDInfo(IMetaDataDispenserEx *pDispenser, PBYTE pManifest, DWORD dwSize, strPassBackFn inPBFn, ULONG DumpFilter=dumpDefault);
    ~MDInfo();

    void DisplayMD(void);

#ifdef FEATURE_COMINTEROP
    LPCWSTR VariantAsString(VARIANT *pVariant);
#endif

    void DisplayVersionInfo(void);

    void DisplayScopeInfo(void);

    void DisplayGlobalFunctions(void);
    void DisplayGlobalFields(void);
    void DisplayFieldRVA(mdFieldDef field);
    void DisplayGlobalMemberRefs(void);

    void DisplayTypeDefs(void);
    void DisplayTypeDefInfo(mdTypeDef inTypeDef);
    void DisplayTypeDefProps(mdTypeDef inTypeDef);
    
    void DisplayModuleRefs(void);
    void DisplayModuleRefInfo(mdModuleRef inModuleRef);

    void DisplaySignatures(void);
    void DisplaySignatureInfo(mdSignature inSignature);

    LPCWSTR TokenName(mdToken inToken, __out_ecount(bufLen) LPWSTR buffer, ULONG bufLen);

    LPCWSTR TypeDeforRefName(mdToken inToken, __out_ecount(bufLen) LPWSTR buffer, ULONG bufLen);
    LPCWSTR TypeDefName(mdTypeDef inTypeDef, __out_ecount(bufLen) LPWSTR buffer, ULONG bufLen);
    LPCWSTR TypeRefName(mdTypeRef tr, __out_ecount(bufLen) LPWSTR buffer, ULONG bufLen);

    LPCWSTR MemberDeforRefName(mdToken inToken, __out_ecount(bufLen) LPWSTR buffer, ULONG bufLen);
    LPCWSTR MemberRefName(mdToken inMemRef, __out_ecount(bufLen) LPWSTR buffer, ULONG bufLen);
    LPCWSTR MemberName(mdToken inMember, __out_ecount(bufLen) LPWSTR buffer, ULONG bufLen);

    LPCWSTR MethodName(mdMethodDef inToken, __out_ecount(bufLen) LPWSTR buffer, ULONG bufLen);
    LPCWSTR FieldName(mdFieldDef inToken, __out_ecount(bufLen) LPWSTR buffer, ULONG bufLen);

    char *ClassFlags(DWORD flags, __out_ecount(STRING_BUFFER_LEN) char *sFlags);

    void DisplayTypeRefs(void);
    void DisplayTypeRefInfo(mdTypeRef tr);
    void DisplayTypeSpecs(void);
    void DisplayTypeSpecInfo(mdTypeSpec ts, const char *preFix);
    void DisplayMethodSpecs(void);
    void DisplayMethodSpecInfo(mdMethodSpec ms, const char *preFix);
    
    void DisplayCorNativeLink(COR_NATIVE_LINK *pCorNLnk, const char *preFix);
    void DisplayCustomAttributeInfo(mdCustomAttribute inValue, const char *preFix);
    void DisplayCustomAttributes(mdToken inToken, const char *preFix);

    void DisplayInterfaceImpls(mdTypeDef inTypeDef);
    void DisplayInterfaceImplInfo(mdInterfaceImpl inImpl);

    LPWSTR GUIDAsString(GUID inGuid, __out_ecount(bufLen) LPWSTR guidString, ULONG bufLen);

    const char *TokenTypeName(mdToken inToken);

    void DisplayMemberInfo(mdToken inMember);
    void DisplayMethodInfo(mdMethodDef method, DWORD *pflags = 0);
    void DisplayFieldInfo(mdFieldDef field, DWORD *pflags = 0);
    
    void DisplayMethods(mdTypeDef inTypeDef);
    void DisplayFields(mdTypeDef inTypeDef, COR_FIELD_OFFSET *rFieldOffset, ULONG cFieldOffset);

    void DisplaySignature(PCCOR_SIGNATURE pbSigBlob, ULONG ulSigBlob, const char *preFix);
    HRESULT GetOneElementType(PCCOR_SIGNATURE pbSigBlob, ULONG ulSigBlob, ULONG *pcb);

    void DisplayMemberRefs(mdToken tkParent, const char *preFix);
    void DisplayMemberRefInfo(mdMemberRef inMemRef, const char *preFix);

    void DisplayMethodImpls(mdTypeDef inTypeDef);

    void DisplayParams(mdMethodDef inMthDef);
    void DisplayParamInfo(mdParamDef inParam);

    void DisplayGenericParams(mdToken tk, const char *prefix);
    void DisplayGenericParamInfo(mdGenericParam tkparam, const char *prefix);

    void DisplayPropertyInfo(mdProperty inProp);
    void DisplayProperties(mdTypeDef inTypeDef);

    void DisplayEventInfo(mdEvent inEvent);
    void DisplayEvents(mdTypeDef inTypeDef);

    void DisplayPermissions(mdToken tk, const char *preFix);
    void DisplayPermissionInfo(mdPermission inPermission, const char *preFix);

    void DisplayFieldMarshal(mdToken inToken);

    void DisplayPinvokeInfo(mdToken inToken);

    void DisplayAssembly();

    void DisplayAssemblyInfo();

    void DisplayAssemblyRefs();
    void DisplayAssemblyRefInfo(mdAssemblyRef inAssemblyRef);

    void DisplayFiles();
    void DisplayFileInfo(mdFile inFile);

    void DisplayExportedTypes();
    void DisplayExportedTypeInfo(mdExportedType inExportedType);

    void DisplayManifestResources();
    void DisplayManifestResourceInfo(mdManifestResource inManifestResource);

    void DisplayASSEMBLYMETADATA(ASSEMBLYMETADATA *pMetaData);

    void DisplayUserStrings();

    void DisplayUnsatInfo();

    void DisplayRaw();
    void DumpRawHeaps();
    void DumpRaw(int iDump=1, bool bStats=false);
    void DumpRawCSV();
    void DumpRawCol(ULONG ixTbl, ULONG ixCol, ULONG rid, bool bStats);
    ULONG DumpRawColStats(ULONG ixTbl, ULONG ixCol, ULONG cRows);
    const char *DumpRawNameOfType(ULONG ulType);
    void SetVEHandlerReporter(__int64 VEHandlerReporterPtr) { m_VEHandlerReporterPtr = VEHandlerReporterPtr; };

    static void Error(const char *szError, HRESULT hr = S_OK);
private:
    void Init(strPassBackFn inPBFn, DUMP_FILTER DumpFilter); // Common initialization code.

    int DumpHex(const char *szPrefix, const void *pvData, ULONG cbData, int bText=true, ULONG nLine=16);

    int Write(__in_z __in const char *str);
    int WriteLine(__in_z __in const char *str);

    int VWrite(__in_z __in const char *str, ...);
    int VWriteLine(__in_z __in const char *str, ...);
    int VWriteMarker(__in_z __in const char *str, va_list marker);
    
    void InitSigBuffer();
    HRESULT AddToSigBuffer(__in_z __in const char *string);

    IMetaDataImport2 *m_pRegImport;
    IMetaDataImport2 *m_pImport;
    IMetaDataAssemblyImport *m_pAssemblyImport;
    strPassBackFn m_pbFn;
    __int64 m_VEHandlerReporterPtr;
    IMetaDataTables *m_pTables;
    IMetaDataTables2 *m_pTables2;

    CQuickBytes m_output;
    DUMP_FILTER m_DumpFilter;

    // temporary buffer for TypeDef or TypeRef name. Consume immediately
    // because other functions may overwrite it.
    WCHAR           m_szTempBuf[STRING_BUFFER_LEN];

    // temporary buffer for formatted string. Consume immediately before any function calls.
    char            m_tempFormatBuffer[STRING_BUFFER_LEN];

    // Signature buffer.
    CQuickBytes     m_sigBuf;
};

#endif