508 lines
12 KiB
C++
508 lines
12 KiB
C++
// Borland-compatible Microsoft.Net definitions
|
|
// Only the most important headers are declared
|
|
//
|
|
// The second half of the file contains the structures saved in the
|
|
// database
|
|
|
|
#ifndef __MYCOR_H
|
|
#define __MYCOR_H
|
|
#pragma pack(push, 1)
|
|
|
|
#ifdef __NT__
|
|
typedef wchar_t wchar;
|
|
#else
|
|
typedef wchar16_t wchar;
|
|
#endif
|
|
|
|
#ifndef _WINDOWS_ // define some MS Windows symbols if <windows.h> is not included
|
|
|
|
#define __int8 char
|
|
#ifdef __GNUC__
|
|
#define __cdecl
|
|
#define __stdcall
|
|
#endif
|
|
|
|
typedef int32 HRESULT;
|
|
#define S_OK 0
|
|
#define S_FALSE (!S_OK)
|
|
#define E_FAIL 0x80004005
|
|
#define SEVERITY_SUCCESS 0
|
|
#define SEVERITY_ERROR 1
|
|
#define FACILITY_URT 19
|
|
#define MAKE_HRESULT(sev,fac,code) \
|
|
((HRESULT) (((uint32)(sev)<<31) | ((uint32)(fac)<<16) | ((uint32)(code))) )
|
|
#define EMAKEHR(val) MAKE_HRESULT(SEVERITY_ERROR, FACILITY_URT, val)
|
|
#define SMAKEHR(val) MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_URT, val)
|
|
#define META_E_BAD_SIGNATURE EMAKEHR(0x1192) // Bad binary signature
|
|
#define FAILED(hr) (((HRESULT)(hr)) < 0)
|
|
#define SUCCEEDED(hr) (((HRESULT)(hr)) >= 0)
|
|
#undef UNALIGNED
|
|
#define UNALIGNED
|
|
|
|
typedef uchar BYTE;
|
|
typedef short SHORT;
|
|
typedef ushort USHORT;
|
|
typedef ushort WORD;
|
|
typedef uint32 ULONG;
|
|
typedef uint ULONG32;
|
|
typedef uint32 DWORD;
|
|
typedef uint64 DWORD64;
|
|
typedef void *LPVOID;
|
|
typedef bool BOOL;
|
|
typedef int32 LONG;
|
|
typedef uint32 ULONG;
|
|
typedef int64 LONGLONG;
|
|
typedef uint64 ULONGLONG;
|
|
typedef wchar *LPWSTR;
|
|
typedef const void *UVCP_CONSTANT;
|
|
typedef ULONG &LPCWSTR;
|
|
typedef float FLOAT;
|
|
typedef double DOUBLE;
|
|
typedef uint32 SCODE;
|
|
typedef void *BSTR; // http://msdn.microsoft.com/en-us/library/windows/desktop/ms221069(v=vs.85).aspx
|
|
typedef void *PVOID;
|
|
typedef int INT;
|
|
typedef uint UINT;
|
|
typedef char CHAR;
|
|
typedef DOUBLE DATE;
|
|
|
|
class IUnknown;
|
|
|
|
struct OSINFO
|
|
{
|
|
DWORD dwOSPlatformId;
|
|
DWORD dwOSMajorVersion;
|
|
DWORD dwOSMinorVersion;
|
|
};
|
|
|
|
struct ASSEMBLYMETADATA
|
|
{
|
|
USHORT usMajorVersion;
|
|
USHORT usMinorVersion;
|
|
USHORT usBuildNumber;
|
|
USHORT usRevisionNumber;
|
|
LPWSTR szLocale;
|
|
ULONG cbLocale;
|
|
DWORD *rdwProcessor;
|
|
ULONG ulProcessor;
|
|
OSINFO *rOS;
|
|
ULONG ulOS;
|
|
};
|
|
|
|
struct GUID
|
|
{
|
|
uint32 Data1;
|
|
ushort Data2;
|
|
ushort Data3;
|
|
uchar Data4[8];
|
|
};
|
|
|
|
struct IMAGE_DATA_DIRECTORY
|
|
{
|
|
uint32 VirtualAddress;
|
|
uint32 Size;
|
|
};
|
|
|
|
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms221061(v=vs.85).aspx
|
|
typedef struct tagDEC
|
|
{
|
|
USHORT wReserved;
|
|
union
|
|
{
|
|
struct
|
|
{
|
|
BYTE scale;
|
|
BYTE sign;
|
|
};
|
|
USHORT signscale;
|
|
};
|
|
ULONG Hi32;
|
|
union
|
|
{
|
|
struct
|
|
{
|
|
ULONG Lo32;
|
|
ULONG Mid32;
|
|
};
|
|
ULONGLONG Lo64;
|
|
};
|
|
} DECIMAL;
|
|
|
|
|
|
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms221223(v=vs.85).aspx
|
|
typedef union tagCY
|
|
{
|
|
struct
|
|
{
|
|
unsigned long Lo;
|
|
long Hi;
|
|
};
|
|
LONGLONG int64;
|
|
} CY, CURRENCY;
|
|
|
|
|
|
typedef struct tagSAFEARRAYBOUND
|
|
{
|
|
ULONG cElements;
|
|
LONG lLbound;
|
|
} SAFEARRAYBOUND, *LPSAFEARRAYBOUND;
|
|
|
|
|
|
// http://msdn.microsoft.com/en-us/library/9ec8025b-4763-4526-ab45-390c5d8b3b1e(VS.85)
|
|
typedef struct tagSAFEARRAY
|
|
{
|
|
USHORT cDims;
|
|
USHORT fFeatures;
|
|
ULONG cbElements;
|
|
ULONG cLocks;
|
|
PVOID pvData;
|
|
SAFEARRAYBOUND rgsabound[1];
|
|
} SAFEARRAY, *LPSAFEARRAY;
|
|
|
|
|
|
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms221627(v=vs.85).aspx
|
|
typedef unsigned short VARTYPE;
|
|
typedef uint16 VARIANT_BOOL;
|
|
typedef uint16 _VARIANT_BOOL;
|
|
struct IRecordInfo;
|
|
typedef struct tagVARIANT
|
|
{
|
|
union
|
|
{
|
|
struct
|
|
{
|
|
VARTYPE vt;
|
|
WORD wReserved1;
|
|
WORD wReserved2;
|
|
WORD wReserved3;
|
|
union
|
|
{
|
|
LONGLONG llVal;
|
|
LONG lVal;
|
|
BYTE bVal;
|
|
SHORT iVal;
|
|
FLOAT fltVal;
|
|
DOUBLE dblVal;
|
|
VARIANT_BOOL boolVal;
|
|
/* _VARIANT_BOOL bool; */
|
|
SCODE scode;
|
|
CY cyVal;
|
|
DATE date;
|
|
BSTR bstrVal;
|
|
IUnknown *punkVal;
|
|
/* IDispatch *pdispVal; */
|
|
SAFEARRAY *parray;
|
|
BYTE *pbVal;
|
|
SHORT *piVal;
|
|
LONG *plVal;
|
|
LONGLONG *pllVal;
|
|
FLOAT *pfltVal;
|
|
DOUBLE *pdblVal;
|
|
VARIANT_BOOL *pboolVal;
|
|
/* _VARIANT_BOOL *pbool; */
|
|
SCODE *pscode;
|
|
CY *pcyVal;
|
|
DATE *pdate;
|
|
BSTR *pbstrVal;
|
|
/* IUnknown **ppunkVal; */
|
|
/* IDispatch **ppdispVal; */
|
|
SAFEARRAY **pparray;
|
|
/* VARIANT *pvarVal; */
|
|
PVOID byref;
|
|
CHAR cVal;
|
|
USHORT uiVal;
|
|
ULONG ulVal;
|
|
ULONGLONG ullVal;
|
|
INT intVal;
|
|
UINT uintVal;
|
|
DECIMAL *pdecVal;
|
|
CHAR *pcVal;
|
|
USHORT *puiVal;
|
|
ULONG *pulVal;
|
|
ULONGLONG *pullVal;
|
|
INT *pintVal;
|
|
UINT *puintVal;
|
|
struct /*__tagBRECORD*/
|
|
{
|
|
PVOID pvRecord;
|
|
IRecordInfo *pRecInfo;
|
|
} /* __VARIANT_NAME_4*/;
|
|
} /* __VARIANT_NAME_3*/;
|
|
} /* __VARIANT_NAME_2*/;
|
|
DECIMAL decVal;
|
|
};
|
|
} VARIANT, *LPVARIANT, VARIANTARG, *LPVARIANTARG;
|
|
|
|
#define VT_EMPTY 0x0000
|
|
#define VT_NULL 0x0001
|
|
#define VT_I2 0x0002
|
|
#define VT_I4 0x0003
|
|
#define VT_R4 0x0004
|
|
#define VT_R8 0x0005
|
|
#define VT_CY 0x0006
|
|
#define VT_DATE 0x0007
|
|
#define VT_BSTR 0x0008
|
|
#define VT_DISPATCH 0x0009
|
|
#define VT_ERROR 0x000A
|
|
#define VT_BOOL 0x000B
|
|
#define VT_VARIANT 0x000C
|
|
#define VT_UNKNOWN 0x000D
|
|
#define VT_DECIMAL 0x000E
|
|
#define VT_I1 0x0010
|
|
#define VT_UI1 0x0011
|
|
#define VT_UI2 0x0012
|
|
#define VT_UI4 0x0013
|
|
#define VT_I8 0x0014
|
|
#define VT_UI8 0x0015
|
|
#define VT_INT 0x0016
|
|
#define VT_UINT 0x0017
|
|
#define VT_VOID 0x0018
|
|
#define VT_HRESULT 0x0019
|
|
#define VT_PTR 0x001A
|
|
#define VT_SAFEARRAY 0x001B
|
|
#define VT_CARRAY 0x001C
|
|
#define VT_USERDEFINED 0x001D
|
|
#define VT_LPSTR 0x001E
|
|
#define VT_LPWSTR 0x001F
|
|
#define VT_RECORD 0x0024
|
|
#define VT_INT_PTR 0x0025
|
|
#define VT_UINT_PTR 0x0026
|
|
#define VT_ARRAY 0x2000
|
|
#define VT_BYREF 0x4000
|
|
|
|
|
|
|
|
#define VariantInit(v_ptr) (v_ptr)->vt = VT_EMPTY
|
|
|
|
inline HRESULT VariantClear(VARIANTARG *pVar)
|
|
{
|
|
memset(pVar, 0, sizeof(VARIANT));
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
#define HRESULT_CODE(hr) ((hr) & 0xFFFF)
|
|
#define SCODE_CODE(sc) ((sc) & 0xFFFF)
|
|
|
|
|
|
#define CLDB_S_TRUNCATION SMAKEHR(0x1106)
|
|
#define CLDB_E_TRUNCATION EMAKEHR(0x1106)
|
|
|
|
|
|
#endif // __UNIX__
|
|
|
|
#include "corhdr.h"
|
|
#include "cor.h"
|
|
|
|
//--------------------------------------------------------------------
|
|
// what netnode tag
|
|
#define CLITAG_MDA 0 // the assembly mda is here at index 0
|
|
#define CLITAG_MTK 1 // the scope mtk is here at index 0
|
|
#define CLITAG_STRUCT 'a' // the structure itself is saved here
|
|
#define CLITAG_NAME 'b' // char *name (deprecated for strings, see CLITAG_STRING)
|
|
// saved as blob
|
|
#define CLITAG_VALUE 'c' // void *pval
|
|
#define CLITAG_SIG 'd' // PCOR_SIGNATURE[]
|
|
#define CLITAG_OTHER 'e' // mdToken others[]
|
|
//#define CLITAG_TITLE 'f' // assembly title
|
|
//#define CLITAG_DESCR 'g' // assembly description
|
|
//#define CLITAG_ALIAS 'h' // assembly alias
|
|
#define CLITAG_PUBKEY 'i' // public key blob
|
|
#define CLITAG_PINV 'k' // pinvoke_info_t
|
|
#define CLITAG_PNAME 'l' // name of pinvoke method
|
|
#define CLITAG_LAYOUT 'm' // layout_info_t
|
|
#define CLITAG_OFFSETS 'n' // COR_FIELD_OFFSET[]
|
|
#define CLITAG_CUST 'o' // custom attribute blob
|
|
#define CLITAG_TOKEN 'p' // ea: method, field, property, event token is here
|
|
#define CLITAG_CLASS 'q' // ea: typedef token
|
|
#define CLITAG_STRING 'r' // ea: address of string's bytes in .strings segment
|
|
#define CLITAG_CLASSEND 's' // ea: typedef token
|
|
#define CLITAG_TRY 't' // ea: try block start/cor_exception_info_t
|
|
#define CLITAG_BEND 'u' // ea: block end
|
|
#define CLITAG_HASH 'v' // hash
|
|
#define CLITAG_FRVA 'x' // field rva
|
|
#define CLITAG_EXCEPTION 128 // exception blocks: several indexes
|
|
|
|
// enumeration blobs
|
|
// global enumerations have index 0
|
|
#define CLITAG_PARAMS 'A'
|
|
#define CLITAG_FIELDS 'B'
|
|
#define CLITAG_METHODS 'C'
|
|
#define CLITAG_EVENTS 'D'
|
|
#define CLITAG_PROPERTIES 'E'
|
|
#define CLITAG_INTERFACES 'F'
|
|
#define CLITAG_TYPEDEFS 'G'
|
|
#define CLITAG_TYPEREFS 'H'
|
|
#define CLITAG_TYPESPECS 'I'
|
|
#define CLITAG_USERSTRINGS 'J'
|
|
#define CLITAG_CUSTATTRS 'K'
|
|
#define CLITAG_MODULEREFS 'L'
|
|
#define CLITAG_MEMBERREFS 'M' // 'N' shouldn't be used (as well as 'V')
|
|
|
|
|
|
struct param_info_t // +name +value
|
|
{
|
|
mdToken method;
|
|
ULONG n;
|
|
ULONG flags;
|
|
DWORD deftype;
|
|
};
|
|
|
|
struct field_info_t // +name +sig +value
|
|
{
|
|
mdToken owner;
|
|
ULONG flags;
|
|
DWORD deftype;
|
|
ea_t ea;
|
|
};
|
|
|
|
struct method_info_t // +name +sig +params
|
|
{
|
|
mdToken owner;
|
|
DWORD flags;
|
|
ULONG rva; // ea later
|
|
DWORD implflags;
|
|
mdToken lvars;
|
|
uint32 maxstack;
|
|
uint32 methodflags;
|
|
};
|
|
|
|
struct pinvoke_info_t // +pname
|
|
{
|
|
DWORD mappingflags;
|
|
mdToken dlltok;
|
|
};
|
|
|
|
struct property_info_t // +name +sig +other_tokens +value
|
|
{
|
|
mdToken owner;
|
|
ULONG flags;
|
|
DWORD deftype;
|
|
mdToken setter, getter;
|
|
// mdToken backing; disappeared in Beta2
|
|
ea_t ea;
|
|
};
|
|
|
|
struct event_info_t // +name +other_tokens
|
|
{
|
|
mdToken owner;
|
|
ULONG flags;
|
|
mdToken type;
|
|
mdToken addon, removeon, fire;
|
|
ea_t ea;
|
|
};
|
|
|
|
struct interfaceimpl_info_t
|
|
{
|
|
mdToken inttok;
|
|
};
|
|
|
|
struct typedef_info_t // +name +fields +methods +layout +offsets
|
|
{
|
|
DWORD flags;
|
|
mdToken super;
|
|
};
|
|
|
|
struct layout_info_t
|
|
{
|
|
DWORD packsize;
|
|
ULONG classsize;
|
|
ULONG noffsets;
|
|
};
|
|
|
|
struct typeref_info_t // +name
|
|
{
|
|
mdToken scope;
|
|
};
|
|
|
|
struct moduleref_info_t // +name
|
|
{
|
|
};
|
|
|
|
struct memberref_info_t // +name +sig
|
|
{
|
|
mdToken owner;
|
|
};
|
|
|
|
struct typespec_info_t // +sig
|
|
{
|
|
};
|
|
|
|
struct userstring_info_t // +name
|
|
{
|
|
};
|
|
|
|
struct custattr_info_t // +blob
|
|
{
|
|
mdToken owner;
|
|
mdToken type;
|
|
};
|
|
|
|
struct assembly_info_t // +name +orig +title +desc +alias
|
|
{
|
|
ULONG hash;
|
|
DWORD flags;
|
|
USHORT usMajorVersion;
|
|
USHORT usMinorVersion;
|
|
USHORT usRevisionNumber;
|
|
USHORT usBuildNumber;
|
|
};
|
|
|
|
struct assemblyref_info_t // +name +orig +hash
|
|
{
|
|
DWORD flags;
|
|
// mdToken exeloc;
|
|
USHORT usMajorVersion;
|
|
USHORT usMinorVersion;
|
|
USHORT usRevisionNumber;
|
|
USHORT usBuildNumber;
|
|
};
|
|
|
|
struct file_info_t // +name +hash
|
|
{
|
|
DWORD flags;
|
|
};
|
|
|
|
struct comtype_info_t // +name +descr
|
|
{
|
|
ULONG flags;
|
|
mdToken impl, type, exeloc;
|
|
};
|
|
|
|
struct cor_module_info_t // +name
|
|
{
|
|
mdToken mtk;
|
|
GUID mid;
|
|
};
|
|
|
|
struct cor_exception_info_t
|
|
{
|
|
ULONG flags;
|
|
ULONG param;
|
|
};
|
|
|
|
struct longname_director_t
|
|
{
|
|
char zero;
|
|
uval_t node;
|
|
};
|
|
CASSERT(sizeof(longname_director_t) == 1 + sizeof(uval_t));
|
|
|
|
//------------------------------------------------------------------------
|
|
ea_t get_free_address(void);
|
|
void expand(ea_t ea);
|
|
void define_class(mdToken, const char *name, ea_t ea1, ea_t ea2);
|
|
mdToken define_method(mdToken method, const char *name, method_info_t &b, ea_t *ea);
|
|
void supset(ea_t idx, const void *body, int size, char tag);
|
|
ssize_t supstr(ea_t idx, char *buf, size_t bufsize, char tag);
|
|
void altset(ea_t idx, ea_t val, char tag);
|
|
void setblob(ea_t idx, const void *body, int size, char tag);
|
|
void save_name(ea_t idx, const qstring &name);
|
|
qstring retrieve_name(ea_t idx);
|
|
uint32 get_constant_element_type_raw_size(CorElementType type, uint32 chars);
|
|
|
|
bool load_metadata(const void *metadata, size_t metasize);
|
|
|
|
#pragma pack(pop)
|
|
#endif // define __MYCOR_H
|