VMProtect/core/dotnetfile.h

2841 lines
90 KiB
C++

#ifndef DOTNETFILE_H
#define DOTNETFILE_H
#include "dotnet.h"
std::string ILName(const std::string &ret, const std::string &type, const std::string &method, const std::string &signature);
enum ILTokenType {
ttModule = (0x00 << 24),
ttTypeRef = (0x01 << 24),
ttTypeDef = (0x02 << 24),
ttField = (0x04 << 24),
ttMethodDef = (0x06 << 24),
ttParam = (0x08 << 24),
ttInterfaceImpl = (0x09 << 24),
ttMemberRef = (0x0a << 24),
ttConstant = (0x0b << 24),
ttCustomAttribute = (0x0c << 24),
ttFieldMarshal = (0x0d << 24),
ttDeclSecurity = (0x0e << 24),
ttClassLayout = (0x0f << 24),
ttFieldLayout = (0x10 << 24),
ttStandAloneSig = (0x11 << 24),
ttEventMap = (0x12 << 24),
ttEvent = (0x14 << 24),
ttPropertyMap = (0x15 << 24),
ttProperty = (0x17 << 24),
ttMethodSemantics = (0x18 << 24),
ttMethodImpl = (0x19 << 24),
ttModuleRef = (0x1a << 24),
ttTypeSpec = (0x1b << 24),
ttImplMap = (0x1c << 24),
ttFieldRVA = (0x1d << 24),
ttEncLog = (0x1e << 24),
ttEncMap = (0x1f << 24),
ttAssembly = (0x20 << 24),
ttAssemblyProcessor = (0x21 << 24),
ttAssemblyOS = (0x22 << 24),
ttAssemblyRef = (0x23 << 24),
ttAssemblyRefProcessor = (0x24 << 24),
ttAssemblyRefOS = (0x25 << 24),
ttFile = (0x26 << 24),
ttExportedType = (0x27 << 24),
ttManifestResource = (0x28 << 24),
ttNestedClass = (0x29 << 24),
ttGenericParam = (0x2a << 24),
ttMethodSpec = (0x2b << 24),
ttGenericParamConstraint = (0x2c << 24),
ttUserString = (0x70 << 24),
ttInvalid = (0xff << 24),
ttMask = (0xff << 24)
};
#define TOKEN_TYPE(id) ((id) & 0xff000000)
#define TOKEN_VALUE(id) ((id) & 0x00ffffff)
class ILData : public std::vector<uint8_t>
{
public:
ILData();
ILData(const uint8_t *data, size_t size);
uint32_t ReadEncoded(uint32_t &pos) const;
void WriteEncoded(uint32_t value);
void Read(uint32_t &pos, void *buffer, uint32_t size) const;
uint8_t ReadByte(uint32_t &pos) const;
uint16_t ReadWord(uint32_t &pos) const;
uint32_t ReadDWord(uint32_t &pos) const;
uint64_t ReadQWord(uint32_t &pos) const;
std::string ReadString(uint32_t &pos) const;
void WriteByte(uint8_t value);
void WriteWord(uint16_t value);
void WriteDWord(uint32_t value);
void WriteQWord(uint64_t value);
void Write(const void *buffer, size_t size);
void WriteString(const std::string &value);
};
class ILUserStringsTable;
class NETArchitecture;
class ILMetaData;
class ILTable;
class TokenReferenceList;
class ILToken;
class NETRuntimeFunctionList;
class ILStream : public BaseLoadCommand
{
public:
explicit ILStream(ILMetaData *owner, uint64_t address, uint32_t size, const std::string &name);
explicit ILStream(ILMetaData *owner, const ILStream &src);
virtual ILStream *Clone(ILoadCommandList *owner) const;
virtual void ReadFromFile(NETArchitecture &file) { }
virtual void WriteToFile(NETArchitecture &file);
virtual void Prepare() { }
virtual uint64_t address() const { return address_; }
virtual uint32_t size() const { return size_; }
virtual uint32_t type() const { return 0; }
virtual std::string name() const { return name_; }
virtual void Rebase(uint64_t delta_base);
void FreeByManager(MemoryManager &manager);
protected:
void set_size(uint32_t size) { size_ = size; }
private:
uint64_t address_;
uint32_t size_;
std::string name_;
};
class ILStringsStream : public ILStream
{
public:
explicit ILStringsStream(ILMetaData *owner, uint64_t address, uint32_t size, const std::string &name);
explicit ILStringsStream(ILMetaData *owner, const ILStringsStream &src);
virtual ILStream *Clone(ILoadCommandList *owner) const;
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToFile(NETArchitecture &file);
virtual void Prepare();
std::string GetString(uint32_t pos) const;
uint32_t AddString(const std::string &str);
size_t data_size() const { return data_.size(); }
private:
std::map<std::string, uint32_t> map_;
ILData data_;
};
class ILUserStringsStream : public ILStream
{
public:
explicit ILUserStringsStream(ILMetaData *owner, uint64_t address, uint32_t size, const std::string &name);
explicit ILUserStringsStream(ILMetaData *owner, const ILUserStringsStream &src);
virtual ILUserStringsStream *Clone(ILoadCommandList *owner) const;
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToFile(NETArchitecture &file);
virtual void Prepare();
std::string GetString(uint32_t pos) const;
ILData GetData(uint32_t pos, uint64_t *address) const;
uint32_t AddString(const std::string &str);
private:
std::map<std::string, uint32_t> map_;
ILData data_;
};
class ILBlobStream : public ILStream
{
public:
explicit ILBlobStream(ILMetaData *owner, uint64_t address, uint32_t size, const std::string &name);
explicit ILBlobStream(ILMetaData *owner, const ILBlobStream &src);
virtual ILStream *Clone(ILoadCommandList *owner) const;
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToFile(NETArchitecture &file);
virtual void Prepare();
ILData GetData(uint32_t pos) const;
uint32_t AddData(const ILData &value);
size_t data_size() const { return data_.size(); }
private:
std::map<ILData, uint32_t> map_;
ILData data_;
};
class ILGuidStream : public ILStream
{
public:
explicit ILGuidStream(ILMetaData *owner, uint64_t address, uint32_t size, const std::string &name);
explicit ILGuidStream(ILMetaData *owner, const ILGuidStream &src);
virtual ILStream *Clone(ILoadCommandList *owner) const;
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToFile(NETArchitecture &file);
virtual void Prepare();
ILData GetData(uint32_t pos) const;
uint32_t AddData(const ILData &value);
size_t data_size() const { return data_.size(); }
private:
std::map<ILData, uint32_t> map_;
ILData data_;
};
class ILHeapStream : public ILStream
{
public:
explicit ILHeapStream(ILMetaData *owner, uint64_t address, uint32_t size, const std::string &name);
explicit ILHeapStream(ILMetaData *owner, const ILHeapStream &src);
~ILHeapStream();
virtual ILStream *Clone(ILoadCommandList *owner) const;
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToFile(NETArchitecture &file);
uint8_t offset_sizes() const { return heap_offset_sizes_; }
ILTable *table(size_t index) const { return table_list_[index]; }
size_t count() const { return table_list_.size(); }
virtual void Rebase(uint64_t delta_base);
void UpdateTokens();
void Pack();
private:
ILTable *Add(ILTokenType type, uint32_t row_count);
uint32_t reserved_;
uint8_t major_version_;
uint8_t minor_version_;
uint8_t heap_offset_sizes_;
uint8_t reserved2_;
uint64_t mask_valid_;
uint64_t mask_sorted_;
std::vector<uint8_t> extra_data_;
std::vector<ILTable *> table_list_;
};
class TokenReference : public IObject
{
public:
explicit TokenReference(TokenReferenceList *owner, uint64_t address, uint32_t command_type);
explicit TokenReference(TokenReferenceList *owner, const TokenReference &src);
~TokenReference();
uint64_t address() const { return address_; }
void set_address(uint64_t address) { address_ = address; }
TokenReference *Clone(TokenReferenceList *owner) const;
void Rebase(uint64_t delta_base);
bool is_deleted() const { return is_deleted_; }
void set_deleted(bool is_deleted) { is_deleted_ = is_deleted; }
TokenReferenceList *owner() const { return owner_; }
void set_owner(TokenReferenceList *owner);
uint32_t command_type() const { return command_type_; }
private:
TokenReferenceList *owner_;
uint64_t address_;
bool is_deleted_;
uint32_t command_type_;
// no copy ctr or assignment op
TokenReference(const TokenReference &);
TokenReference &operator =(const TokenReference &);
};
class TokenReferenceList : public ObjectList<TokenReference>
{
public:
explicit TokenReferenceList(ILToken *owner);
explicit TokenReferenceList(ILToken *owner, const TokenReferenceList &src);
TokenReferenceList *Clone(ILToken *owner) const;
TokenReference *Add(uint64_t address, uint32_t command_type = 0);
TokenReference *GetReferenceByAddress(uint64_t address) const;
void Rebase(uint64_t delta_base);
ILToken *owner() const { return owner_; }
private:
ILToken *owner_;
};
enum ILSignatureType {
stDefault,
stC,
stStdCall,
stThisCall,
stFastCall,
stVarArg,
stField,
stLocal,
stProperty,
stUnmanaged,
stGenericinst,
stNativeVarArg,
stGeneric = 0x10,
stHasThis = 0x20,
stExplicitThis = 0x40,
};
struct EncodingDesc {
const ILTokenType *types;
size_t size;
size_t bits;
EncodingDesc(const ILTokenType *types_, size_t size_, size_t bits_) : types(types_), size(size_), bits(bits_) {}
};
class ILToken : public IObject
{
public:
ILToken(ILMetaData *meta, ILTable *owner, uint32_t id);
ILToken(ILMetaData *meta, ILTable *owner, const ILToken &src);
~ILToken();
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
uint32_t id() const { return id_; }
ILTokenType type() const { return static_cast<ILTokenType>(TOKEN_TYPE(id_)); }
uint32_t value() const { return TOKEN_VALUE(id_); }
void set_value(uint32_t value, IArchitecture *file = NULL);
void set_owner(ILMetaData *meta, ILTable *owner);
ILToken *next() const;
TokenReferenceList *reference_list() const { return reference_list_; }
virtual void ReadFromFile(NETArchitecture &file) { }
virtual void WriteToStreams(ILMetaData &data) { }
virtual void WriteToFile(NETArchitecture &file) { }
virtual void UpdateTokens() { }
virtual void RemapTokens(const std::map<ILToken *, ILToken *> &token_map) { }
virtual void Rebase(uint64_t delta_base);
bool is_deleted() const { return is_deleted_; }
void set_deleted(bool is_deleted) { is_deleted_ = is_deleted; }
ILMetaData *meta() const { return meta_; }
ILTable *owner() const { return owner_; }
virtual bool is_exported() const { return false; }
bool can_rename() const { return can_rename_; }
void set_can_rename(bool value) { can_rename_ = value; }
uint32_t Encode(const EncodingDesc &desc) const;
using IObject::CompareWith;
virtual int CompareWith(const ILToken &other) const;
protected:
std::string ReadStringFromFile(NETArchitecture &file) const;
std::string ReadUserString(uint32_t value) const;
ILData ReadBlobFromFile(NETArchitecture &file) const;
ILData ReadGUIDFromFile(NETArchitecture &file) const;
ILToken *ReadTokenFromFile(NETArchitecture &file, const EncodingDesc &desc) const;
ILToken *ReadTokenFromFile(NETArchitecture &file, ILTokenType type) const;
void WriteStringToFile(NETArchitecture &file, uint32_t pos) const;
void WriteGuidToFile(NETArchitecture &file, uint32_t pos) const;
void WriteTokenToFile(NETArchitecture &file, ILTokenType type, ILToken *token) const;
void WriteTokenListToFile(NETArchitecture &file, ILTokenType type, ILToken *token) const;
void WriteTokenToFile(NETArchitecture &file, const EncodingDesc &desc, ILToken *token) const;
void WriteBlobToFile(NETArchitecture &file, uint32_t pos) const;
private:
ILMetaData *meta_;
ILTable *owner_;
uint32_t id_;
TokenReferenceList *reference_list_;
bool is_deleted_;
bool can_rename_;
// no copy ctr or assignment op
ILToken(const ILToken &);
ILToken &operator =(const ILToken &);
};
class ILSignature;
class ILElement;
class ILModuleRef;
class ILParam;
class ILTypeDef;
class ILCustomMod : public IObject
{
public:
ILCustomMod(ILMetaData *meta);
ILCustomMod(ILMetaData *meta, const ILCustomMod &src);
ILCustomMod *Clone(ILMetaData *meta);
std::string name(bool mode = false) const;
void Parse(const ILData &data, uint32_t &id);
void WriteToData(ILData &data);
void UpdateTokens();
void RemapTokens(const std::map<ILToken*, ILToken*> &token_map);
private:
ILMetaData *meta_;
CorElementType type_;
ILToken *token_;
};
class ILArrayShape : public IObject
{
public:
ILArrayShape();
ILArrayShape(const ILArrayShape &src);
ILArrayShape *Clone();
std::string name() const;
void Parse(const ILData &data, uint32_t &id);
void WriteToData(ILData &data) const;
private:
uint32_t rank_;
std::vector<uint32_t> sizes_;
std::vector<uint32_t> lo_bounds_;
// not implemented
ILArrayShape &operator =(const ILArrayShape &);
};
class ILElement : public IObject
{
public:
ILElement(ILMetaData *meta, ILSignature *owner, CorElementType type = ELEMENT_TYPE_END, ILToken *token = NULL, ILElement *next = NULL);
ILElement(ILMetaData *meta, ILSignature *owner, const ILElement &src);
~ILElement();
ILElement *Clone(ILMetaData *meta, ILSignature *owner);
CorElementType type() const { return type_; }
std::string name(bool mode = false) const;
void Parse(const ILData &data);
void Parse(const ILData &data, uint32_t &id);
void UpdateTokens();
void WriteToData(ILData &data) const;
ILData data() const;
void RemapTokens(const std::map<ILToken*, ILToken*> &token_map);
bool is_ref() const { return byref_; }
ILToken *token() const { return token_; }
bool is_predicate() const { return is_predicate_; }
void set_is_predicate(bool is_predicate) { is_predicate_ = is_predicate; }
ILElement *next() const { return next_; }
private:
ILCustomMod *AddMod();
ILElement *AddElement();
ILMetaData *meta_;
ILSignature *owner_;
CorElementType type_;
bool byref_;
bool pinned_;
uint32_t generic_param_;
ILElement *next_;
ILToken *token_;
ILSignature *method_;
ILArrayShape *array_shape_;
std::vector<ILCustomMod*> mod_list_;
std::vector<ILElement*> child_list_;
bool is_predicate_;
// no copy ctr or assignment op
ILElement(const ILElement &);
ILElement &operator =(const ILElement &);
};
class ILSignature : public ObjectList<ILElement>
{
public:
ILSignature(ILMetaData *meta);
ILSignature(ILMetaData *meta, const ILSignature &src);
~ILSignature();
ILSignature *Clone(ILMetaData *meta);
void Parse(const ILData &data);
bool Parse(const ILData &data, uint32_t &id);
bool has_this() const { return (type_ & stHasThis) != 0; }
void set_has_this(bool value) { type_ = (ILSignatureType)(value ? (type_ | stHasThis) : (type_ & ~stHasThis)); }
bool explicit_this() const { return (type_ & stExplicitThis) != 0; }
std::string name(bool mode = false, ILSignature *gen_signature = NULL) const;
std::string type_name() const;
std::string ret_name(bool mode = false) const;
void UpdateTokens();
ILData data() const;
void WriteToData(ILData &data) const;
void RemapTokens(const std::map<ILToken*, ILToken*> &token_map);
ILElement *ret() const { return ret_; }
bool is_method() const;
bool is_field() const;
private:
ILElement *Add();
ILMetaData *meta_;
ILSignatureType type_;
uint32_t gen_param_count_;
ILElement *ret_;
// no copy ctr or assignment op
ILSignature(const ILSignature &);
ILSignature &operator =(const ILSignature &);
};
class ILAssembly : public ILToken
{
public:
ILAssembly(ILMetaData *meta, ILTable *owner, uint32_t id);
ILAssembly(ILMetaData *meta, ILTable *owner, const std::string &name);
ILAssembly(ILMetaData *meta, ILTable *owner, const ILAssembly &src);
ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToStreams(ILMetaData &data);
virtual void WriteToFile(NETArchitecture &file);
std::string full_name() const;
uint16_t major_version() const { return major_version_; }
uint16_t minor_version() const { return minor_version_; }
uint16_t build_number() const { return build_number_; }
std::string name() const { return name_; }
private:
uint32_t hash_id_;
uint16_t major_version_;
uint16_t minor_version_;
uint16_t build_number_;
uint16_t revision_number_;
uint32_t flags_;
ILData public_key_;
std::string name_;
std::string culture_;
uint32_t public_key_pos_;
uint32_t name_pos_;
uint32_t culture_pos_;
};
class ILAssemblyOS : public ILToken
{
public:
ILAssemblyOS(ILMetaData *meta, ILTable *owner, uint32_t id);
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToFile(NETArchitecture &file);
private:
uint32_t os_platform_id_;
uint32_t os_major_version_;
uint32_t os_minor_version_;
};
class ILAssemblyProcessor : public ILToken
{
public:
ILAssemblyProcessor(ILMetaData *meta, ILTable *owner, uint32_t id);
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToFile(NETArchitecture &file);
private:
uint32_t processor_;
};
class ILAssemblyRef : public ILToken
{
public:
ILAssemblyRef(ILMetaData *meta, ILTable *owner, uint32_t id);
ILAssemblyRef(ILMetaData *meta, ILTable *owner, const std::string &name);
ILAssemblyRef(ILMetaData *meta, ILTable *owner, const ILAssemblyRef &src);
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
std::string name() const { return name_; }
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToStreams(ILMetaData &data);
virtual void WriteToFile(NETArchitecture &file);
std::string full_name() const;
uint16_t major_version() const { return major_version_; }
uint16_t minor_version() const { return minor_version_; }
uint16_t build_number() const { return build_number_; }
private:
uint16_t major_version_;
uint16_t minor_version_;
uint16_t build_number_;
uint16_t revision_number_;
uint32_t flags_;
ILData public_key_or_token_;
std::string name_;
std::string culture_;
ILData hash_value_;
uint32_t public_key_or_token_pos_;
uint32_t name_pos_;
uint32_t culture_pos_;
uint32_t hash_value_pos_;
};
class ILAssemblyRefOS : public ILToken
{
public:
ILAssemblyRefOS(ILMetaData *meta, ILTable *owner, uint32_t id);
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToFile(NETArchitecture &file);
virtual void UpdateTokens();
private:
uint32_t os_platform_id_;
uint32_t os_major_version_;
uint32_t os_minor_version_;
ILAssemblyRef *assembly_ref_;
};
class ILAssemblyRefProcessor : public ILToken
{
public:
ILAssemblyRefProcessor(ILMetaData *meta, ILTable *owner, uint32_t id);
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToFile(NETArchitecture &file);
virtual void UpdateTokens();
private:
uint32_t processor_;
ILAssemblyRef *assembly_ref_;
};
class ILClassLayout : public ILToken
{
public:
ILClassLayout(ILMetaData *meta, ILTable *owner, uint32_t id);
ILClassLayout(ILMetaData *meta, ILTable *owner, const ILClassLayout &src);
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToFile(NETArchitecture &file);
virtual void UpdateTokens();
void RemapTokens(const std::map<ILToken*, ILToken*> &token_map);
private:
uint16_t packing_size_;
uint32_t class_size_;
ILTypeDef *parent_;
};
class ILConstant : public ILToken
{
public:
ILConstant(ILMetaData *meta, ILTable *owner, uint32_t id);
ILConstant(ILMetaData *meta, ILTable *owner, const ILConstant &src);
ILToken *parent() const { return parent_; }
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToStreams(ILMetaData &data);
virtual void WriteToFile(NETArchitecture &file);
virtual void UpdateTokens();
void RemapTokens(const std::map<ILToken*, ILToken*> &token_map);
virtual int CompareWith(const ILToken &other) const;
private:
uint8_t type_;
uint8_t padding_zero_;
ILToken *parent_;
ILData value_;
uint32_t value_pos_;
};
class CustomAttributeValue;
class ILCustomAttribute : public ILToken
{
public:
ILCustomAttribute(ILMetaData *meta, ILTable *owner, uint32_t id);
ILCustomAttribute(ILMetaData *meta, ILTable *owner, const ILCustomAttribute &src);
~ILCustomAttribute();
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToStreams(ILMetaData &data);
virtual void WriteToFile(NETArchitecture &file);
virtual void UpdateTokens();
virtual void RemapTokens(const std::map<ILToken*, ILToken*> &token_map);
ILToken *parent() const { return parent_; }
ILToken *type() const { return type_; }
virtual int CompareWith(const ILToken &other) const;
CustomAttributeValue *ParseValue() const;
void UpdateValue();
private:
ILToken *parent_;
ILToken *type_;
ILData value_;
CustomAttributeValue *parser_;
uint32_t value_pos_;
};
class ILDeclSecurity : public ILToken
{
public:
ILDeclSecurity(ILMetaData *meta, ILTable *owner, uint32_t id);
ILDeclSecurity(ILMetaData *meta, ILTable *owner, const ILDeclSecurity &src);
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToStreams(ILMetaData &data);
virtual void WriteToFile(NETArchitecture &file);
virtual void UpdateTokens();
private:
uint16_t action_;
ILToken *parent_;
ILData permission_set_;
uint32_t permission_set_pos_;
};
class ILEvent : public ILToken
{
public:
ILEvent(ILMetaData *meta, ILTable *owner, uint32_t id);
ILEvent(ILMetaData *meta, ILTable *owner, const ILEvent &src);
ILEvent *next() const { return reinterpret_cast<ILEvent *>(ILToken::next()); }
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToStreams(ILMetaData &data);
virtual void WriteToFile(NETArchitecture &file);
virtual void UpdateTokens();
virtual void RemapTokens(const std::map<ILToken*, ILToken*> &token_map);
ILToken *parent() const { return parent_; }
uint16_t flags() const { return flags_; }
bool is_exported() const;
std::string name() const { return name_; }
void set_name(const std::string &name) { name_ = name; }
ILTypeDef *declaring_type() const { return declaring_type_; }
void set_declaring_type(ILTypeDef *declaring_type) { declaring_type_ = declaring_type; }
private:
uint16_t flags_;
std::string name_;
ILToken *parent_;
ILTypeDef *declaring_type_;
uint32_t name_pos_;
};
class ILEventMap : public ILToken
{
public:
ILEventMap(ILMetaData *meta, ILTable *owner, uint32_t id);
ILEventMap(ILMetaData *meta, ILTable *owner, const ILEventMap &src);
ILEventMap *next() const { return reinterpret_cast<ILEventMap *>(ILToken::next()); }
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToFile(NETArchitecture &file);
virtual void UpdateTokens();
ILEvent *event_list() const { return event_list_; }
void set_event_list(ILEvent *event_list) { event_list_ = event_list; }
ILTypeDef *parent() const { return parent_; }
private:
ILTypeDef *parent_;
ILEvent *event_list_;
};
class ILField : public ILToken
{
public:
ILField(ILMetaData *meta, ILTable *owner, uint32_t id);
ILField(ILMetaData *meta, ILTable *owner, const ILField &src);
~ILField();
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
std::string name() const { return name_; }
void set_name(const std::string &name) { name_ = name; }
uint16_t flags() const { return flags_; }
ILField *next() const { return reinterpret_cast<ILField *>(ILToken::next()); }
ILTypeDef *declaring_type() const { return declaring_type_; }
void set_declaring_type(ILTypeDef *declaring_type) { declaring_type_ = declaring_type; }
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToStreams(ILMetaData &data);
virtual void WriteToFile(NETArchitecture &file);
virtual void UpdateTokens();
virtual void RemapTokens(const std::map<ILToken*, ILToken*> &token_map);
ILSignature *signature() const { return signature_; }
bool is_exported() const;
std::string full_name(bool mode = false) const;
private:
uint16_t flags_;
std::string name_;
ILSignature *signature_;
ILTypeDef *declaring_type_;
uint32_t name_pos_;
uint32_t signature_pos_;
// no copy ctr or assignment op
ILField(const ILField &);
ILField &operator =(const ILField &);
};
class ILFieldLayout : public ILToken
{
public:
ILFieldLayout(ILMetaData *meta, ILTable *owner, uint32_t id);
ILFieldLayout(ILMetaData *meta, ILTable *owner, const ILFieldLayout &src);
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToFile(NETArchitecture &file);
virtual void UpdateTokens();
void RemapTokens(const std::map<ILToken*, ILToken*> &token_map);
ILField *parent() const { return field_; }
private:
uint32_t offset_;
ILField *field_;
};
class ILFieldMarshal : public ILToken
{
public:
ILFieldMarshal(ILMetaData *meta, ILTable *owner, uint32_t id);
ILFieldMarshal(ILMetaData *meta, ILTable *owner, const ILFieldMarshal &src);
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToStreams(ILMetaData &data);
virtual void WriteToFile(NETArchitecture &file);
virtual void UpdateTokens();
private:
ILToken *parent_;
ILData native_type_;
uint32_t native_type_pos_;
};
class ILFieldRVA : public ILToken
{
public:
ILFieldRVA(ILMetaData *meta, ILTable *owner, uint32_t id);
ILFieldRVA(ILMetaData *meta, ILTable *owner, const ILFieldRVA &src);
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToFile(NETArchitecture &file);
virtual void UpdateTokens();
ILFieldRVA *next() const { return reinterpret_cast<ILFieldRVA *>(ILToken::next()); }
ILField *field() const { return field_; };
virtual void Rebase(uint64_t delta_base);
virtual void RemapTokens(const std::map<ILToken*, ILToken*> &token_map);
private:
uint64_t address_;
ILField *field_;
};
class ILFile : public ILToken
{
public:
ILFile(ILMetaData *meta, ILTable *owner, uint32_t id);
std::string name() const { return name_; }
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToStreams(ILMetaData &data);
virtual void WriteToFile(NETArchitecture &file);
private:
uint32_t flags_;
std::string name_;
ILData value_;
uint32_t name_pos_;
uint32_t value_pos_;
};
class ILGenericParam : public ILToken
{
public:
ILGenericParam(ILMetaData *meta, ILTable *owner, uint32_t id);
ILGenericParam(ILMetaData *meta, ILTable *owner, const ILGenericParam &src);
ILToken *parent() const { return parent_; }
ILGenericParam *next() const { return reinterpret_cast<ILGenericParam *>(ILToken::next()); }
std::string name() const { return name_; }
void set_name(const std::string &name) { name_ = name; }
uint16_t number() const { return number_; }
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToStreams(ILMetaData &data);
virtual void WriteToFile(NETArchitecture &file);
virtual void UpdateTokens();
void RemapTokens(const std::map<ILToken*, ILToken*> &token_map);
virtual int CompareWith(const ILToken &other) const;
private:
uint16_t number_;
uint16_t flags_;
ILToken *parent_;
std::string name_;
uint32_t name_pos_;
};
class ILGenericParamConstraint : public ILToken
{
public:
ILGenericParamConstraint(ILMetaData *meta, ILTable *owner, uint32_t id);
ILGenericParamConstraint(ILMetaData *meta, ILTable *owner, const ILGenericParamConstraint &src);
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToFile(NETArchitecture &file);
virtual void UpdateTokens();
void RemapTokens(const std::map<ILToken*, ILToken*> &token_map);
virtual int CompareWith(const ILToken &other) const;
private:
ILGenericParam *parent_;
ILToken *constraint_;
};
class ILImplMap : public ILToken
{
public:
ILImplMap(ILMetaData *meta, ILTable *owner, uint32_t id);
ILImplMap(ILMetaData *meta, ILTable *owner, const ILImplMap &src);
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToStreams(ILMetaData &data);
virtual void WriteToFile(NETArchitecture &file);
virtual void UpdateTokens();
virtual void RemapTokens(const std::map<ILToken*, ILToken*> &token_map);
virtual int CompareWith(const ILToken &other) const;
ILToken *member_forwarded() const { return member_forwarded_; }
ILModuleRef *import_scope() const { return import_scope_; }
std::string import_name() const { return import_name_; }
private:
uint16_t mapping_flags_;
ILToken *member_forwarded_;
std::string import_name_;
ILModuleRef *import_scope_;
uint32_t import_name_pos_;
};
class ILInterfaceImpl : public ILToken
{
public:
ILInterfaceImpl(ILMetaData *meta, ILTable *owner, uint32_t id);
ILInterfaceImpl(ILMetaData *meta, ILTable *owner, const ILInterfaceImpl &src);
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToFile(NETArchitecture &file);
virtual void UpdateTokens();
void RemapTokens(const std::map<ILToken*, ILToken*> &token_map);
virtual int CompareWith(const ILToken &other) const;
ILTypeDef *parent() const { return class_; }
ILToken *_interface() const { return interface_; }
private:
ILTypeDef *class_;
ILToken *interface_;
};
class ILResourceList;
class ILResource : public IObject
{
public:
ILResource(ILResourceList *owner, uint32_t type, const std::string &name, uint32_t offset, uint32_t size);
ILResource(ILResourceList *owner, const ILResource &src);
~ILResource();
std::string name() const { return name_; }
uint32_t offset() const { return offset_; }
uint32_t size() const { return size_; }
private:
ILResourceList *owner_;
uint32_t type_;
std::string name_;
uint32_t offset_;
uint32_t size_;
};
class ManifestResourceValue;
class BamlDocument;
class NETStream;
class ManifestResourceItem : public IObject
{
public:
ManifestResourceItem(ManifestResourceValue *owner, const std::string &name, uint32_t type, uint64_t address, uint32_t size, const std::vector<uint8_t> &data);
ManifestResourceItem(ManifestResourceValue *owner, const ManifestResourceItem &src);
~ManifestResourceItem();
ManifestResourceItem *Clone(ManifestResourceValue *owner) const;
std::string name() const { return name_; }
uint32_t type() const { return type_; }
uint64_t address() const { return address_; }
uint32_t size() const { return size_; }
std::vector<uint8_t> data() const;
BamlDocument *ParseBaml();
int32_t name_hash() const;
private:
ManifestResourceValue *owner_;
std::string name_;
uint32_t type_;
uint64_t address_;
uint32_t size_;
BamlDocument *baml_;
std::vector<uint8_t> data_;
};
class ManifestResourceValue : public ObjectList<ManifestResourceItem>
{
public:
ManifestResourceValue();
ManifestResourceValue(const ManifestResourceValue &src);
ManifestResourceValue *Clone() const;
void ReadFromFile(NETArchitecture &file, uint64_t address);
uint64_t address() const { return address_; };
uint32_t size() const { return size_; };
void WriteToStream(NETStream &stream);
private:
ManifestResourceItem *Add(const std::string &name, uint32_t id, uint64_t address, uint32_t size, const std::vector<uint8_t> &data);
uint64_t address_;
uint32_t size_;
uint32_t magic_;
uint32_t header_version_;
std::string reader_type_name_;
std::string set_type_name_;
uint32_t reader_version_;
std::vector<std::string> type_names_;
};
class ILManifestResource : public ILToken
{
public:
ILManifestResource(ILMetaData *meta, ILTable *owner, uint32_t id);
ILManifestResource(ILMetaData *meta, ILTable *owner, const ILManifestResource &src);
~ILManifestResource();
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
std::string name() const { return name_; }
void set_name(const std::string &name) { name_ = name; }
uint32_t offset() const { return offset_; }
void set_offset(uint32_t offset) { offset_ = offset; }
ILToken *implementation() const { return implementation_; }
void set_implementation(ILToken *token) { implementation_ = token; }
void set_flags(uint32_t flags) { flags_ = flags; }
ILManifestResource *next() const { return reinterpret_cast<ILManifestResource *>(ILToken::next()); }
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToStreams(ILMetaData &data);
virtual void WriteToFile(NETArchitecture &file);
virtual void UpdateTokens();
void UpdateValue();
ManifestResourceValue *value() const { return value_; }
std::vector<uint8_t> data() const { return data_; }
private:
uint32_t offset_;
uint32_t flags_;
std::string name_;
ILToken *implementation_;
ManifestResourceValue *value_;
uint32_t name_pos_;
std::vector<uint8_t> data_;
};
class ILMemberRef : public ILToken
{
public:
ILMemberRef(ILMetaData *meta, ILTable *owner, uint32_t id);
ILMemberRef(ILMetaData *meta, ILTable *owner, const ILMemberRef &src);
~ILMemberRef();
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
std::string name() const { return name_; }
std::string full_name(bool mode = false, ILSignature *method_gen_signature = NULL) const;
void set_name(const std::string &name) { name_ = name; }
ILMemberRef *next() const { return reinterpret_cast<ILMemberRef *>(ILToken::next()); }
ILToken *declaring_type() const { return declaring_type_; }
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToStreams(ILMetaData &data);
virtual void WriteToFile(NETArchitecture &file);
virtual void UpdateTokens();
virtual void RemapTokens(const std::map<ILToken*, ILToken*> &token_map);
ILSignature *signature() const { return signature_; }
private:
ILSignature *signature_;
ILToken *declaring_type_;
std::string name_;
uint32_t signature_pos_;
uint32_t name_pos_;
// no copy ctr or assignment op
ILMemberRef(const ILMemberRef &);
ILMemberRef &operator =(const ILMemberRef &);
};
class ILStandAloneSig;
class ILMethodDef : public ILToken
{
public:
ILMethodDef(ILMetaData *meta, ILTable *owner, uint32_t id);
ILMethodDef(ILMetaData *meta, ILTable *owner, const ILMethodDef &src);
ILMethodDef(ILMetaData *meta, ILTable *owner, const std::string &name, const ILData &signature, CorMethodAttr flags = mdPrivateScope, CorMethodImpl impl_flags = miIL);
~ILMethodDef();
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
std::string name() const { return name_; }
void set_name(const std::string &name) { name_ = name; }
ILMethodDef *next() const { return reinterpret_cast<ILMethodDef *>(ILToken::next()); }
ILParam *param_list() const { return param_list_; }
void set_param_list(ILParam *param_list) { param_list_ = param_list; }
CorMethodImpl impl_flags() const { return impl_flags_; }
CorMethodAttr flags() const { return flags_; }
void set_flags(CorMethodAttr flags) { flags_ = flags; }
uint64_t address() const { return address_; }
void set_address(uint64_t address) { address_ = address; }
ILTypeDef *declaring_type() const { return declaring_type_; }
void set_declaring_type(ILTypeDef *declaring_type) { declaring_type_ = declaring_type; }
uint32_t fat_size() const { return fat_size_; }
uint32_t code_size() const { return code_size_; }
ILStandAloneSig *locals() const { return locals_; }
void set_locals(ILStandAloneSig *locals) { locals_ = locals; }
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToStreams(ILMetaData &data);
virtual void WriteToFile(NETArchitecture &file);
virtual void UpdateTokens();
virtual void Rebase(uint64_t delta_base);
virtual void RemapTokens(const std::map<ILToken*, ILToken*> &token_map);
ILSignature *signature() const { return signature_; }
bool is_exported() const;
std::string full_name(bool mode = false, ILSignature *method_gen_signature = NULL) const;
private:
ILSignature *signature_;
uint64_t address_;
CorMethodImpl impl_flags_;
CorMethodAttr flags_;
std::string name_;
ILParam *param_list_;
ILTypeDef *declaring_type_;
uint32_t fat_size_;
uint32_t code_size_;
ILStandAloneSig *locals_;
uint32_t name_pos_;
uint32_t signature_pos_;
// no copy ctr or assignment op
ILMethodDef(const ILMethodDef &);
ILMethodDef &operator =(const ILMethodDef &);
};
class ILMethodImpl : public ILToken
{
public:
ILMethodImpl(ILMetaData *meta, ILTable *owner, uint32_t id);
ILMethodImpl(ILMetaData *meta, ILTable *owner, const ILMethodImpl &src);
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToFile(NETArchitecture &file);
virtual void UpdateTokens();
virtual int CompareWith(const ILToken &other) const;
private:
ILTypeDef *class_;
ILToken *method_body_;
ILToken *method_declaration_;
};
class ILMethodSemantics : public ILToken
{
public:
ILMethodSemantics(ILMetaData *meta, ILTable *owner, uint32_t id);
ILMethodSemantics(ILMetaData *meta, ILTable *owner, const ILMethodSemantics &src);
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToFile(NETArchitecture &file);
virtual void UpdateTokens();
virtual void RemapTokens(const std::map<ILToken*, ILToken*> &token_map);
virtual int CompareWith(const ILToken &other) const;
CorMethodSemanticsAttr flags() const { return flags_; }
ILMethodDef *method() const { return method_; }
ILToken *association() const { return association_; }
private:
CorMethodSemanticsAttr flags_;
ILMethodDef *method_;
ILToken *association_;
};
class ILMethodSpec : public ILToken
{
public:
ILMethodSpec(ILMetaData *meta, ILTable *owner, uint32_t id);
ILMethodSpec(ILMetaData *meta, ILTable *owner, const ILMethodSpec &src);
~ILMethodSpec();
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
ILToken *parent() const { return parent_; }
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToStreams(ILMetaData &data);
virtual void WriteToFile(NETArchitecture &file);
virtual void UpdateTokens();
virtual void RemapTokens(const std::map<ILToken*, ILToken*> &token_map);
ILSignature *signature() const { return signature_; }
std::string full_name(bool mode) const;
private:
ILToken *parent_;
ILSignature *signature_;
uint32_t instantiation_pos_;
// no copy ctr or assignment op
ILMethodSpec(const ILMethodSpec &);
ILMethodSpec &operator =(const ILMethodSpec &);
};
class ILModule : public ILToken
{
public:
ILModule(ILMetaData *meta, ILTable *owner, uint32_t id);
ILModule(ILMetaData *meta, ILTable *owner, const std::string &name);
ILModule(ILMetaData *meta, ILTable *owner, const ILModule &src);
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToStreams(ILMetaData &data);
virtual void WriteToFile(NETArchitecture &file);
private:
uint16_t generation_;
std::string name_;
ILData mv_id_;
ILData enc_id_;
ILData enc_base_id_;
uint32_t name_pos_;
uint32_t mv_id_pos_;
uint32_t enc_id_pos_;
uint32_t enc_base_id_pos_;
};
class ILModuleRef : public ILToken
{
public:
ILModuleRef(ILMetaData *meta, ILTable *owner, uint32_t id);
ILModuleRef(ILMetaData *meta, ILTable *owner, const ILModuleRef &src);
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
std::string name() const { return name_; }
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToStreams(ILMetaData &data);
virtual void WriteToFile(NETArchitecture &file);
private:
std::string name_;
uint32_t name_pos_;
};
class ILNestedClass : public ILToken
{
public:
ILNestedClass(ILMetaData *meta, ILTable *owner, uint32_t id);
ILNestedClass(ILMetaData *meta, ILTable *owner, const ILNestedClass &src);
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
ILTypeDef *nested_type() const { return nested_type_; }
ILTypeDef *declaring_type() const { return declaring_type_; }
ILNestedClass *next() const { return reinterpret_cast<ILNestedClass *>(ILToken::next()); }
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToFile(NETArchitecture &file);
virtual void UpdateTokens();
virtual void RemapTokens(const std::map<ILToken*, ILToken*> &token_map);
private:
ILTypeDef *nested_type_;
ILTypeDef *declaring_type_;
};
class ILParam : public ILToken
{
public:
ILParam(ILMetaData *meta, ILTable *owner, uint32_t id);
ILParam(ILMetaData *meta, ILTable *owner, const ILParam &src);
std::string name() const { return name_; }
void set_name(const std::string &name) { name_ = name; }
uint16_t flags() const { return flags_; }
ILParam *next() const { return reinterpret_cast<ILParam *>(ILToken::next()); }
ILMethodDef *parent() const { return parent_; }
void set_parent(ILMethodDef *parent) { parent_ = parent; }
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToStreams(ILMetaData &data);
virtual void WriteToFile(NETArchitecture &file);
virtual void UpdateTokens();
virtual void RemapTokens(const std::map<ILToken*, ILToken*> &token_map);
private:
uint16_t flags_;
uint16_t sequence_;
std::string name_;
ILMethodDef *parent_;
uint32_t name_pos_;
};
class ILPropertyMap;
class ILProperty : public ILToken
{
public:
ILProperty(ILMetaData *meta, ILTable *owner, uint32_t id);
ILProperty(ILMetaData *meta, ILTable *owner, const ILProperty &src);
~ILProperty();
ILTypeDef *declaring_type() const { return declaring_type_; }
void set_declaring_type(ILTypeDef *declaring_type) { declaring_type_ = declaring_type; }
ILProperty *next() const { return reinterpret_cast<ILProperty *>(ILToken::next()); }
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToStreams(ILMetaData &data);
virtual void WriteToFile(NETArchitecture &file);
virtual void UpdateTokens();
virtual void RemapTokens(const std::map<ILToken*, ILToken*> &token_map);
uint16_t flags() const { return flags_; }
bool is_exported() const;
std::string name() const { return name_; }
void set_name(const std::string &name) { name_ = name; }
private:
uint16_t flags_;
std::string name_;
ILSignature *type_;
ILTypeDef *declaring_type_;
uint32_t name_pos_;
uint32_t type_pos_;
// no copy ctr or assignment op
ILProperty(const ILProperty &);
ILProperty &operator =(const ILProperty &);
};
class ILPropertyMap : public ILToken
{
public:
ILPropertyMap(ILMetaData *meta, ILTable *owner, uint32_t id);
ILPropertyMap(ILMetaData *meta, ILTable *owner, const ILPropertyMap &src);
ILPropertyMap *next() const { return reinterpret_cast<ILPropertyMap *>(ILToken::next()); }
ILTypeDef *parent() const { return parent_; }
ILProperty *property_list() const { return property_list_; }
void set_property_list(ILProperty *property_list) { property_list_ = property_list; }
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToFile(NETArchitecture &file);
virtual void UpdateTokens();
virtual void RemapTokens(const std::map<ILToken*, ILToken*> &token_map);
bool is_exported() const;
private:
ILTypeDef *parent_;
ILProperty *property_list_;
};
class ILStandAloneSig : public ILToken
{
public:
ILStandAloneSig(ILMetaData *meta, ILTable *owner, uint32_t id);
ILStandAloneSig(ILMetaData *meta, ILTable *owner, const ILStandAloneSig &src);
ILStandAloneSig(ILMetaData *meta, ILTable *owner, const ILData &data);
~ILStandAloneSig();
virtual ILStandAloneSig *Clone(ILMetaData *meta, ILTable *owner) const;
std::string name(bool mode = false) const;
ILSignature *signature() const { return signature_; }
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToStreams(ILMetaData &data);
virtual void WriteToFile(NETArchitecture &file);
virtual void UpdateTokens();
virtual void RemapTokens(const std::map<ILToken*, ILToken*> &token_map);
private:
ILSignature *signature_;
uint32_t signature_pos_;
// no copy ctr or assignment op
ILStandAloneSig(const ILStandAloneSig &);
ILStandAloneSig &operator =(const ILStandAloneSig &);
};
class ILTypeDef : public ILToken
{
public:
ILTypeDef(ILMetaData *meta, ILTable *owner, uint32_t id);
ILTypeDef(ILMetaData *meta, ILTable *owner, ILToken *base_type, const std::string &name_space, const std::string &name, CorTypeAttr flags = tdNotPublic);
ILTypeDef(ILMetaData *meta, ILTable *owner, const ILTypeDef &src);
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
CorTypeAttr flags() const { return flags_; }
std::string name_space() const { return namespace_; }
void set_namespace(const std::string &name) { namespace_ = name; }
std::string name() const { return name_; }
void set_name(const std::string &name) { name_ = name; }
std::string full_name() const;
std::string reflection_name() const;
ILField *field_list() const { return field_list_; }
void set_field_list(ILField *field_list) { field_list_ = field_list; }
ILMethodDef *method_list() const { return method_list_; }
void set_method_list(ILMethodDef *method_list) { method_list_ = method_list; }
ILTypeDef *next() const { return reinterpret_cast<ILTypeDef *>(ILToken::next()); }
ILTypeDef *declaring_type() const { return declaring_type_; }
void set_declaring_type(ILTypeDef *declaring_type) { declaring_type_ = declaring_type; }
ILToken *base_type() const { return base_type_; }
uint32_t class_size() const { return class_size_; }
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToStreams(ILMetaData &data);
virtual void WriteToFile(NETArchitecture &file);
virtual void UpdateTokens();
void RemapTokens(const std::map<ILToken*, ILToken*> &token_map);
virtual bool is_exported() const;
void AddMethod(ILMethodDef *method);
ILField *GetField(const std::string &name) const;
ILMethodDef *GetMethod(const std::string &name, ILSignature *signature) const;
ILProperty *GetProperty(const std::string &name) const;
ILEvent *GetEvent(const std::string &name) const;
ILTypeDef *GetNested(const std::string &name) const;
ILElement *GetEnumUnderlyingType() const;
bool FindBaseType(const std::string &name) const;
bool FindImplement(const std::string &name) const;
private:
CorTypeAttr flags_;
std::string name_;
std::string namespace_;
ILToken *base_type_;
ILField *field_list_;
ILMethodDef *method_list_;
ILTypeDef *declaring_type_;
uint32_t class_size_;
uint32_t name_pos_;
uint32_t namespace_pos_;
};
class ILTypeRef : public ILToken
{
public:
ILTypeRef(ILMetaData *meta, ILTable *owner, uint32_t id);
ILTypeRef(ILMetaData *meta, ILTable *owner, const ILTypeRef &src);
ILTypeRef(ILMetaData *meta, ILTable *owner, ILToken *resolution_scope, const std::string &name_space, const std::string &name);
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
std::string name_space() const { return namespace_; }
std::string full_name(bool mode = false) const;
std::string module_name() const;
ILTypeRef *declaring_type() const;
std::string name() const { return name_; }
ILToken *resolution_scope() const { return resolution_scope_; }
virtual void ReadFromFile(NETArchitecture &file);
virtual void WriteToStreams(ILMetaData &data);
virtual void WriteToFile(NETArchitecture &file);
virtual void UpdateTokens();
virtual void RemapTokens(const std::map<ILToken*, ILToken*> &token_map);
ILTypeDef *Resolve(bool show_error) const;
private:
ILToken *resolution_scope_;
std::string name_;
std::string namespace_;
uint32_t name_pos_;
uint32_t namespace_pos_;
};
class ILTypeSpec : public ILToken
{
public:
ILTypeSpec(ILMetaData *meta, ILTable *owner, uint32_t id);
ILTypeSpec(ILMetaData *meta, ILTable *owner, const ILTypeSpec &src);
ILTypeSpec(ILMetaData *meta, ILTable *owner, ILData &data);
~ILTypeSpec();
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
std::string name(bool mode = false) { return signature_->name(mode); }
virtual void ReadFromFile(NETArchitecture &file);
void WriteToStreams(ILMetaData &data);
void WriteToFile(NETArchitecture &file);
void UpdateTokens();
void RemapTokens(const std::map<ILToken*, ILToken*> &token_map);
ILElement *info() const { return signature_; }
private:
ILElement *signature_;
uint32_t signature_pos_;
// no copy ctr or assignment op
ILTypeSpec(const ILTypeSpec &);
ILTypeSpec &operator =(const ILTypeSpec &);
};
class ILUserString : public ILToken
{
public:
ILUserString(ILMetaData *meta, ILTable *owner, uint32_t id);
ILUserString(ILMetaData *meta, ILTable *owner, const ILUserString &src);
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
std::string name() const { return name_; }
void set_name(const std::string &name) { name_ = name; }
private:
std::string name_;
};
class ILExportedType : public ILToken
{
public:
ILExportedType(ILMetaData *meta, ILTable *owner, uint32_t id);
ILExportedType(ILMetaData *meta, ILTable *owner, const ILExportedType &src);
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
virtual void ReadFromFile(NETArchitecture &file);
void WriteToStreams(ILMetaData &data);
void WriteToFile(NETArchitecture &file);
void UpdateTokens();
std::string full_name() const;
ILExportedType *declaring_type() const;
ILToken *implementation() const { return implementation_; }
private:
uint32_t flags_;
uint32_t type_def_id_;
std::string name_;
std::string namespace_;
ILToken *implementation_;
uint32_t name_pos_;
uint32_t namespace_pos_;
};
class ILEncLog : public ILToken
{
public:
ILEncLog(ILMetaData *meta, ILTable *owner, uint32_t id);
ILEncLog(ILMetaData *meta, ILTable *owner, const ILEncLog &src);
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
virtual void ReadFromFile(NETArchitecture &file);
void WriteToFile(NETArchitecture &file);
private:
uint32_t token_;
uint32_t func_code_;
};
class ILEncMap : public ILToken
{
public:
ILEncMap(ILMetaData *meta, ILTable *owner, uint32_t id);
ILEncMap(ILMetaData *meta, ILTable *owner, const ILEncMap &src);
virtual ILToken *Clone(ILMetaData *meta, ILTable *owner) const;
virtual void ReadFromFile(NETArchitecture &file);
void WriteToFile(NETArchitecture &file);
private:
uint32_t token_;
};
class ILTable : public ObjectList<ILToken>
{
public:
ILTable(ILMetaData *meta, ILTokenType type, uint32_t token_count);
ILTable(ILMetaData *meta, const ILTable &src);
ILTable *Clone(ILMetaData *meta) const;
ILTokenType type() const { return type_; }
void ReadFromFile(NETArchitecture &file);
void WriteToStreams(ILMetaData &data);
void WriteToFile(NETArchitecture &file);
void Rebase(uint64_t delta_base);
void Pack();
void UpdateTokens();
protected:
ILToken *Add(uint32_t value);
ILMetaData *meta_;
ILTokenType type_;
};
class ILUserStringsTable : public ILTable
{
public:
ILUserStringsTable(ILMetaData *meta);
ILUserStringsTable(ILMetaData *meta, const ILUserStringsTable &src);
ILUserStringsTable *Clone(ILMetaData *meta) const;
virtual void AddObject(ILToken *token);
ILToken *Add(uint32_t id) { return ILTable::Add(id); }
ILToken *GetTokenByPos(uint32_t pos) const;
private:
std::map<uint32_t, ILToken *> map_;
};
enum FrameworkType {
fwUnknown,
fwFramework,
fwCore,
fwStandard
};
struct FrameworkVersion
{
uint32_t major;
uint32_t minor;
uint32_t patch;
FrameworkVersion()
{
major = 0;
minor = 0;
patch = 0;
}
FrameworkVersion(uint32_t _major, uint32_t _minor, uint32_t _patch)
{
major = _major;
minor = _minor;
patch = _patch;
}
bool Parse(const std::string &version);
bool operator < (const FrameworkVersion &right) const
{
if (major < right.major)
return true;
if (major == right.major) {
if (minor < right.minor)
return true;
if (minor == right.minor) {
if (patch < right.patch)
return true;
}
}
return false;
}
};
struct FrameworkInfo
{
FrameworkType type;
FrameworkVersion version;
FrameworkInfo() : type(fwUnknown), version() {}
};
class ILMetaData : public BaseCommandList
{
public:
explicit ILMetaData(NETArchitecture *owner);
explicit ILMetaData(NETArchitecture *owner, const ILMetaData &src);
~ILMetaData();
ILMetaData *Clone(NETArchitecture *owner) const;
void ReadFromFile(NETArchitecture &file, uint64_t address);
void Prepare();
void WriteToFile(NETArchitecture &file);
void FreeByManager(MemoryManager &manager);
uint64_t address() const { return address_; }
uint32_t size() const { return size_; }
std::string version() const { return version_; }
FrameworkInfo framework() const { return framework_; }
ILStream *item(size_t index) const;
ILTable *table(ILTokenType type) const;
ILUserStringsTable *us_table() const { return us_table_; }
ILToken *token(uint32_t id) const;
uint32_t token_count(ILTokenType type) const;
size_t string_field_size() const { return (heap_->offset_sizes() & 1) ? sizeof(uint32_t) : sizeof(uint16_t); }
size_t guid_field_size() const { return (heap_->offset_sizes() & 2) ? sizeof(uint32_t) : sizeof(uint16_t); }
size_t blob_field_size() const { return (heap_->offset_sizes() & 4) ? sizeof(uint32_t) : sizeof(uint16_t); }
size_t string_data_size() const { return strings_ ? strings_->data_size() : 0; }
size_t guid_data_size() const { return guid_ ? guid_->data_size() : 0; }
size_t blob_data_size() const { return blob_ ? blob_->data_size() : 0; }
size_t field_size(ILTokenType type) const;
size_t field_size(const EncodingDesc &desc) const;
std::string GetUserString(uint32_t pos) const;
ILData GetUserData(uint32_t pos, uint64_t *address) const;
std::string GetString(uint32_t pos) const;
ILData GetGuid(uint32_t pos) const;
ILData GetBlob(uint32_t pos) const;
uint32_t AddUserString(const std::string &str) const;
uint32_t AddString(const std::string &str) const;
uint32_t AddGuid(const ILData &data) const;
uint32_t AddBlob(const ILData &data) const;
ILStream *GetStreamByName(const std::string &name) const;
void UpdateTokens();
virtual void Rebase(uint64_t delta_base);
ILMethodDef *GetMethod(uint64_t address) const;
ILStandAloneSig *AddStandAloneSig(const ILData &data);
ILToken *ImportType(CorElementType type);
ILToken *ImportType(const ILElement &element);
ILTypeDef *GetTypeDef(const std::string &name) const;
ILExportedType *GetExportedType(const std::string &name) const;
ILAssemblyRef *GetCoreLib() const;
ILTypeRef *ImportTypeRef(ILToken *resolution_scope, const std::string &name_space, const std::string &name);
ILTypeDef *AddTypeDef(ILToken *base_type, const std::string &name_space, const std::string &name, CorTypeAttr flags);
ILMethodDef *AddMethod(ILTypeDef *declaring_type, const std::string &name, const ILData &signature, CorMethodAttr flags, CorMethodImpl impl_flags);
ILAssemblyRef *GetAssemblyRef(const std::string &name) const;
ILMetaData *ResolveAssembly(const std::string &name, bool show_error) const;
ILTypeDef *ResolveType(const std::string &name, bool show_error);
ILTypeDef *Resolve(const ILTypeRef *type_ref, bool show_error) const;
ILTypeDef *Resolve(const ILExportedType *exported_type, bool show_error) const;
private:
ILStream *Add(uint64_t address, uint32_t size, const std::string &name);
ILToken *GetType(const ILElement &element) const;
ILToken *AddType(const ILElement &element);
ILTypeRef *GetTypeRef(ILToken *resolution_scope, const std::string &name_space, const std::string &name) const;
ILTypeRef *AddTypeRef(ILToken *resolution_scope, const std::string &name_space, const std::string &name);
uint64_t address_;
uint32_t size_;
uint32_t signature_;
uint16_t major_version_;
uint16_t minor_version_;
uint32_t reserved_;
uint16_t flags_;
std::string version_;
FrameworkInfo framework_;
ILStringsStream *strings_;
ILUserStringsStream *user_strings_;
ILBlobStream *blob_;
ILGuidStream *guid_;
ILHeapStream *heap_;
ILUserStringsTable *us_table_;
// no copy ctr or assignment op
ILMetaData(const ILMetaData &);
ILMetaData &operator =(const ILMetaData &);
};
class NETImport;
class NETImportList;
class NETImportFunction : public BaseImportFunction
{
public:
explicit NETImportFunction(NETImport *owner, uint32_t token, const std::string &name, size_t name_pos);
explicit NETImportFunction(NETImport *owner, const NETImportFunction &src);
NETImportFunction *Clone(IImport *owner) const;
virtual std::string name() const { return name_; }
virtual uint64_t address() const { return token_; }
virtual std::string display_name(bool show_ret = true) const { return show_ret ? name_ : name_.substr(name_pos_); }
virtual void Rebase(uint64_t delta_base) {}
uint32_t token() const { return token_; }
private:
uint32_t token_;
std::string name_;
size_t name_pos_;
};
class NETImport : public BaseImport
{
public:
explicit NETImport(NETImportList *owner, uint32_t token, const std::string &name);
explicit NETImport(NETImportList *owner, const NETImport &src);
NETImport *Clone(IImportList *owner) const;
NETImportFunction *item(size_t index) const;
virtual std::string name() const { return name_; }
uint32_t token() const { return token_; }
virtual bool is_sdk() const { return is_sdk_; }
void set_is_sdk(bool is_sdk) { is_sdk_ = is_sdk; }
virtual IImportFunction *Add(uint64_t address, APIType type, MapFunction *map_function) { return NULL; }
NETImportFunction *Add(uint32_t token, const std::string &name, size_t name_pos);
NETImportFunction *GetFunctionByToken(uint32_t token) const;
NETImportFunction *GetFunctionByName(const std::string &name) const;
private:
bool is_sdk_;
uint32_t token_;
std::string name_;
};
class NETImportList : public BaseImportList
{
public:
explicit NETImportList(NETArchitecture *owner);
explicit NETImportList(NETArchitecture *owner, const NETImportList &src);
virtual NETImportList *Clone(NETArchitecture *owner) const;
NETImport *item(size_t index) const;
NETImport *GetImportByName(const std::string &name) const;
void ReadFromFile(NETArchitecture &file);
NETImportFunction *GetFunctionByToken(uint32_t token) const;
void Pack();
protected:
virtual IImport *AddSDK() { return NULL; };
private:
NETImport *Add(uint32_t token, const std::string &name);
};
class NETExportList;
class NETExport : public BaseExport
{
public:
explicit NETExport(NETExportList *owner, uint64_t address, const std::string &name, size_t name_pos);
explicit NETExport(NETExportList *owner, const NETExport &src);
NETExport *Clone(IExportList *owner) const;
virtual uint64_t address() const { return address_; }
virtual std::string name() const { return name_; }
virtual std::string display_name(bool show_ret = true) const { return show_ret ? name_ : name_.substr(name_pos_); }
virtual std::string forwarded_name() const { return ""; }
virtual void Rebase(uint64_t delta_base);
private:
uint64_t address_;
std::string name_;
size_t name_pos_;
};
class NETExportList : public BaseExportList
{
public:
explicit NETExportList(NETArchitecture *owner);
explicit NETExportList(NETArchitecture *owner, const NETExportList &src);
NETExportList *Clone(NETArchitecture *owner) const;
virtual std::string name() const { return ""; }
void ReadFromFile(NETArchitecture &file);
virtual void ReadFromBuffer(Buffer &buffer, IArchitecture &file);
protected:
virtual IExport *Add(uint64_t address);
private:
NETExport *Add(uint64_t address, const std::string &name, size_t name_pos);
};
class NETRuntimeFunction : public BaseRuntimeFunction
{
public:
explicit NETRuntimeFunction(NETRuntimeFunctionList *owner, uint64_t begin, uint64_t end, uint64_t start, ILMethodDef *method);
explicit NETRuntimeFunction(NETRuntimeFunctionList *owner, const NETRuntimeFunction &src);
NETRuntimeFunction *Clone(IRuntimeFunctionList *owner) const;
virtual uint64_t address() const { return 0; }
virtual uint64_t begin() const { return begin_; }
virtual uint64_t end() const { return end_; }
uint64_t start() const { return start_; }
ILMethodDef *method() const { return method_list_.empty() ? NULL : method_list_[0]; }
std::vector<ILMethodDef *> method_list() const { return method_list_; }
void set_method_list(const std::vector<ILMethodDef *> &method_list) { method_list_ = method_list; }
virtual uint64_t unwind_address() const { return 0; }
virtual void set_begin(uint64_t begin);
virtual void set_end(uint64_t end) { end_ = end; }
virtual void set_unwind_address(uint64_t unwind_address) { }
virtual void Parse(IArchitecture &file, IFunction &dest) { }
void Rebase(uint64_t delta_base);
void AddMethod(ILMethodDef *method) { method_list_.push_back(method); }
private:
uint64_t begin_;
uint64_t end_;
uint64_t start_;
std::vector<ILMethodDef *> method_list_;
};
class NETRuntimeFunctionList : public BaseRuntimeFunctionList
{
public:
explicit NETRuntimeFunctionList();
explicit NETRuntimeFunctionList(const NETRuntimeFunctionList &src);
NETRuntimeFunctionList *Clone() const;
NETRuntimeFunction *item(size_t index) const;
void ReadFromFile(NETArchitecture &file);
virtual NETRuntimeFunction *GetFunctionByAddress(uint64_t address) const;
virtual IRuntimeFunction *Add(uint64_t address, uint64_t begin, uint64_t end, uint64_t unwind_address, IRuntimeFunction *source, const std::vector<uint8_t> &call_frame_instructions);
NETRuntimeFunction *Add(uint64_t begin, uint64_t end, uint64_t start, ILMethodDef *method);
};
class NETResource : public BaseResource
{
public:
explicit NETResource(IResource *owner, const std::string &name, uint32_t id, uint64_t address, uint32_t size);
explicit NETResource(IResource *owner, const NETResource &src);
virtual uint32_t type() const { return 0; }
virtual uint64_t address() const { return address_; }
virtual size_t size() const { return size_; }
virtual std::string name() const { return name_; }
virtual bool need_store() const { return true; }
virtual bool is_directory() const { return count() > 0; }
virtual std::string id() const { return string_format("%.4X", id_); }
virtual IResource *Clone(IResource *owner) const;
NETResource *Add(const std::string &name, uint32_t id, uint64_t address, uint32_t size);
NETResource *item(size_t index) const;
private:
std::string name_;
uint32_t id_;
uint64_t address_;
size_t size_;
};
class NETResourceList : public BaseResourceList
{
public:
explicit NETResourceList(NETArchitecture *owner);
explicit NETResourceList(NETArchitecture *owner, const NETResourceList &src);
using BaseResourceList::Clone;
NETResourceList *Clone(NETArchitecture *owner) const;
void ReadFromFile(NETArchitecture &file);
NETResource *item(size_t index) const;
private:
NETResource *Add(const std::string &name, uint32_t id, uint64_t address, uint32_t size);
};
class NETArchitecture : public BaseArchitecture
{
public:
explicit NETArchitecture(PEFile *owner);
explicit NETArchitecture(PEFile *owner, const NETArchitecture &src);
virtual ~NETArchitecture();
virtual NETArchitecture *Clone(IFile *file) const;
virtual std::string name() const { return ".NET"; }
std::string full_name() const;
virtual uint32_t type() const { return 0; }
virtual uint64_t image_base() const { return pe_->image_base(); }
virtual CallingConvention calling_convention() const { return ccStdcall; }
virtual OperandSize cpu_address_size() const { return pe_->cpu_address_size(); }
virtual uint64_t entry_point() const { return 0; }
virtual uint32_t segment_alignment() const { return pe_->segment_alignment(); }
virtual uint32_t file_alignment() const { return pe_->file_alignment(); }
uint32_t header_offset() const { return pe_->header_offset(); }
uint32_t header_size() const { return pe_->header_size(); }
virtual ILMetaData *command_list() const { return meta_data_; }
virtual PESegmentList *segment_list() const { return pe_->segment_list(); }
virtual PESectionList *section_list() const { return pe_->section_list(); }
virtual NETImportList *import_list() const { return import_list_; }
virtual NETExportList *export_list() const { return export_list_; }
virtual PEFixupList *fixup_list() const { return pe_->fixup_list(); }
virtual IRelocationList *relocation_list() const { return NULL; }
virtual IFunctionList *function_list() const { return function_list_; }
virtual IVirtualMachineList *virtual_machine_list() const { return virtual_machine_list_; }
virtual NETResourceList *resource_list() const { return resource_list_; }
virtual ISEHandlerList *seh_handler_list() const { return NULL; }
virtual NETRuntimeFunctionList *runtime_function_list() const { return runtime_function_list_; }
virtual void Save(CompileContext &ctx);
virtual bool WriteToFile();
bool WriteResources(const std::string assembly_name, Data &dest_data);
virtual bool is_executable() const;
OpenStatus ReadFromFile(uint32_t mode);
void Rebase(uint64_t delta_base);
ILMethodDef *entry_point_method() const { return entry_point_; }
void set_entry_point_method(ILMethodDef *metod) { entry_point_ = metod; }
PEArchitecture *pe() const { return pe_; }
IMAGE_COR20_HEADER header() const { return header_; }
void RenameToken(ILToken *token);
protected:
virtual bool Prepare(CompileContext &ctx);
void RenameSymbols();
private:
PEArchitecture *pe_;
IMAGE_COR20_HEADER header_;
NETImportList *import_list_;
NETExportList *export_list_;
NETResourceList *resource_list_;
NETRuntimeFunctionList *runtime_function_list_;
ILMetaData *meta_data_;
ILMethodDef *entry_point_;
IFunctionList *function_list_;
IVirtualMachineList *virtual_machine_list_;
size_t optimized_section_count_;
uint32_t resize_header_;
std::set<std::string> rename_map_;
};
class INameReference : public IObject
{
public:
virtual void UpdateName() = 0;
};
class NameReferenceList;
class BaseNameReference : public INameReference
{
public:
explicit BaseNameReference(NameReferenceList *owner);
~BaseNameReference();
private:
NameReferenceList *owner_;
};
class ResourceNameReference : public BaseNameReference
{
public:
ResourceNameReference(NameReferenceList *owner, ILManifestResource *resource, ILTypeDef *type, const std::string &add);
virtual void UpdateName();
private:
ILManifestResource *resource_;
ILTypeDef *type_;
std::string add_;
};
class StringNameReference : public BaseNameReference
{
public:
StringNameReference(NameReferenceList *owner, ILUserString *string, ILTypeDef *type);
virtual void UpdateName();
private:
ILUserString *string_;
ILTypeDef *type_;
};
class ILCommand;
class CommandNameReference : public BaseNameReference
{
public:
CommandNameReference(NameReferenceList *owner, ILCommand *command, ILTypeDef *type);
virtual void UpdateName();
private:
ILCommand *command_;
ILTypeDef *type_;
};
class CustomAttributeArgument;
class CustomAttributeNamedArgument;
class CustomAttributeNameReference : public BaseNameReference
{
public:
CustomAttributeNameReference(NameReferenceList *owner, CustomAttributeNamedArgument *arg, ILToken *token);
virtual void UpdateName();
private:
CustomAttributeNamedArgument *arg_;
ILToken *token_;
};
class MemberReference : public BaseNameReference
{
public:
MemberReference(NameReferenceList *owner, ILMemberRef *member, ILToken *token);
virtual void UpdateName();
private:
ILMemberRef *member_;
ILToken *token_;
};
class MethodReference : public BaseNameReference
{
public:
MethodReference(NameReferenceList *owner, ILMethodDef *method, ILMethodDef *source);
virtual void UpdateName();
private:
ILMethodDef *method_;
ILMethodDef *source_;
};
class TypeInfoRecord;
class BamlTypeInfoRecordReference : public BaseNameReference
{
public:
BamlTypeInfoRecordReference(NameReferenceList *owner, TypeInfoRecord *record, ILToken *token);
virtual void UpdateName();
private:
TypeInfoRecord *record_;
ILToken *token_;
};
class AttributeInfoRecord;
class BamlAttributeInfoRecordReference : public BaseNameReference
{
public:
BamlAttributeInfoRecordReference(NameReferenceList *owner, AttributeInfoRecord *record, ILToken *token);
virtual void UpdateName();
private:
AttributeInfoRecord *record_;
ILToken *token_;
};
class PropertyRecord;
class BamlPropertyRecordReference : public BaseNameReference
{
public:
BamlPropertyRecordReference(NameReferenceList *owner, PropertyRecord *record, ILToken *token);
virtual void UpdateName();
private:
PropertyRecord *record_;
ILToken *token_;
};
class NameReferenceList : public ObjectList<INameReference>
{
public:
NameReferenceList();
void AddResourceReference(ILManifestResource *resource, ILTypeDef *type, const std::string &format);
void AddStringReference(ILUserString *string, ILTypeDef *type);
void AddCommandReference(ILCommand *command, ILTypeDef *type);
void AddCustomAttributeNameReference(ILCustomAttribute *attribute, CustomAttributeNamedArgument *arg, ILToken *token);
void AddCustomAttribute(ILCustomAttribute *attribute);
void AddMemberReference(ILMemberRef *member, ILToken *token);
void AddTypeInfoRecordReference(ILManifestResource *resource, TypeInfoRecord *record, ILToken *token);
void AddAttributeInfoRecordReference(ILManifestResource *resource, AttributeInfoRecord *record, ILToken *token);
void AddPropertyRecordReference(ILManifestResource *resource, PropertyRecord *record, ILToken *token);
void AddManifestResource(ILManifestResource *resource);
void AddMethodReference(ILMethodDef *method, ILMethodDef *source);
void UpdateNames();
private:
std::set<ILCustomAttribute *> custom_attribute_list_;
std::set<ILManifestResource *> manifest_resource_list_;
};
class NETStream : public MemoryStream
{
public:
NETStream();
NETStream(AbstractStream &stream, size_t size);
virtual size_t Read(void *Buffer, size_t Count);
uint8_t ReadByte();
uint16_t ReadWord();
uint32_t ReadDWord();
bool ReadBoolean();
uint32_t ReadEncoded();
uint32_t ReadEncoded7Bit();
std::string ReadString();
std::string ReadUnicodeString();
void WriteByte(uint8_t value);
void WriteWord(uint16_t value);
void WriteDWord(uint32_t value);
void WriteEncoded7Bit(uint32_t value);
void WriteString(const std::string &value);
void WriteBoolean(bool value);
void WriteUnicodeString(const os::unicode_string &value);
void WriteEncoded(uint32_t value);
};
class BamlDocument;
enum BamlRecordType : uint8_t {
ClrEvent = 0x13,
Comment = 0x17,
AssemblyInfo = 0x1c,
AttributeInfo = 0x1f,
ConstructorParametersStart = 0x2a,
ConstructorParametersEnd = 0x2b,
ConstructorParameterType = 0x2c,
ConnectionId = 0x2d,
ContentProperty = 0x2e,
DefAttribute = 0x19,
DefAttributeKeyString = 0x26,
DefAttributeKeyType = 0x27,
DeferableContentStart = 0x25,
DefTag = 0x18,
DocumentEnd = 0x2,
DocumentStart = 0x1,
ElementEnd = 0x4,
ElementStart = 0x3,
EndAttributes = 0x1a,
KeyElementEnd = 0x29,
KeyElementStart = 0x28,
LastRecordType = 0x39,
LineNumberAndPosition = 0x35,
LinePosition = 0x36,
LiteralContent = 0xf,
NamedElementStart = 0x2f,
OptimizedStaticResource = 0x37,
PIMapping = 0x1b,
PresentationOptionsAttribute = 0x34,
ProcessingInstruction = 0x16,
Property = 0x5,
PropertyArrayEnd = 0xa,
PropertyArrayStart = 0x9,
PropertyComplexEnd = 0x8,
PropertyComplexStart = 0x7,
PropertyCustom = 0x6,
PropertyDictionaryEnd = 0xe,
PropertyDictionaryStart = 0xd,
PropertyListEnd = 0xc,
PropertyListStart = 0xb,
PropertyStringReference = 0x21,
PropertyTypeReference = 0x22,
PropertyWithConverter = 0x24,
PropertyWithExtension = 0x23,
PropertyWithStaticResourceId = 0x38,
RoutedEvent = 0x12,
StaticResourceEnd = 0x31,
StaticResourceId = 0x32,
StaticResourceStart = 0x30,
StringInfo = 0x20,
Text = 0x10,
TextWithConverter = 0x11,
TextWithId = 0x33,
TypeInfo = 0x1d,
TypeSerializerInfo = 0x1e,
XmlAttribute = 0x15,
XmlnsProperty = 0x14
};
class BamlRecord : public IObject
{
public:
BamlRecord(BamlDocument *owner);
~BamlRecord();
virtual BamlRecordType type() const = 0;
uint64_t position() const { return position_; }
void set_position(uint64_t pos) { position_ = pos; }
virtual void Read(NETStream &stream) {}
virtual void ReadDefer(size_t index) {}
virtual void Write(NETStream &stream) {}
virtual void WriteDefer(size_t index, NETStream &stream) {}
BamlDocument *owner() const { return owner_; }
protected:
uint64_t GetPosition(size_t index);
private:
BamlDocument *owner_;
uint64_t position_;
};
class SizedBamlRecord : public BamlRecord
{
public:
SizedBamlRecord(BamlDocument *owner);
uint32_t data_size() const { return data_size_; }
void Read(NETStream &stream);
void Write(NETStream &stream);
virtual void ReadData(NETStream &stream) = 0;
virtual void WriteData(NETStream &stream) = 0;
private:
uint32_t data_size_;
};
class DocumentStartRecord : public BamlRecord
{
public:
DocumentStartRecord(BamlDocument *owner);
BamlRecordType type() const { return DocumentStart; }
void Read(NETStream &file);
void Write(NETStream &file);
private:
bool load_async_;
uint32_t max_async_records_;
bool debug_baml_;
};
class DocumentEndRecord : public BamlRecord
{
public:
DocumentEndRecord(BamlDocument *owner);
BamlRecordType type() const { return DocumentEnd; }
};
class ElementStartRecord : public BamlRecord
{
public:
ElementStartRecord(BamlDocument *owner);
BamlRecordType type() const { return ElementStart; }
void Read(NETStream &stream);
void Write(NETStream &stream);
uint16_t type_id() const { return type_id_; }
private:
uint16_t type_id_;
uint8_t flags_;
};
class ElementEndRecord : public BamlRecord
{
public:
ElementEndRecord(BamlDocument *owner);
BamlRecordType type() const { return ElementEnd; }
};
class AssemblyInfoRecord : public SizedBamlRecord
{
public:
AssemblyInfoRecord(BamlDocument *owner);
BamlRecordType type() const { return AssemblyInfo; }
void ReadData(NETStream &stream);
void WriteData(NETStream &stream);
uint16_t assembly_id() const { return assembly_id_; }
std::string assembly_name() const { return assembly_name_; }
private:
uint16_t assembly_id_;
std::string assembly_name_;
};
class TypeInfoRecord : public SizedBamlRecord
{
public:
TypeInfoRecord(BamlDocument *owner);
BamlRecordType type() const { return TypeInfo; }
void ReadData(NETStream &stream);
void WriteData(NETStream &stream);
uint16_t type_id() const { return type_id_; }
uint16_t assembly_id() const { return assembly_id_; }
std::string type_name() const { return type_name_; }
void set_type_name(const std::string &name) { type_name_ = name; }
private:
uint16_t type_id_;
uint16_t assembly_id_;
std::string type_name_;
};
class XmlnsPropertyRecord : public SizedBamlRecord
{
public:
XmlnsPropertyRecord(BamlDocument *owner);
BamlRecordType type() const { return XmlnsProperty; }
void ReadData(NETStream &stream);
void WriteData(NETStream &stream);
private:
std::string prefix_;
std::string xml_namespace_;
std::vector<uint16_t> assembly_ids_;
};
class AttributeInfoRecord : public SizedBamlRecord
{
public:
AttributeInfoRecord(BamlDocument *owner);
BamlRecordType type() const { return AttributeInfo; }
void ReadData(NETStream &stream);
void WriteData(NETStream &stream);
uint16_t attribute_id() const { return attribute_id_; }
uint16_t owner_type_id() const { return owner_type_id_; }
std::string name() const { return name_; }
void set_name(const std::string &name) { name_ = name; }
private:
uint16_t attribute_id_;
uint16_t owner_type_id_;
uint8_t attribute_usage_;
std::string name_;
};
class PropertyDictionaryStartRecord : public BamlRecord
{
public:
PropertyDictionaryStartRecord(BamlDocument *owner);
BamlRecordType type() const { return PropertyDictionaryStart; }
void Read(NETStream &stream);
void Write(NETStream &stream);
private:
uint16_t attribute_id_;
};
class PropertyDictionaryEndRecord : public BamlRecord
{
public:
PropertyDictionaryEndRecord(BamlDocument *owner);
BamlRecordType type() const { return PropertyDictionaryEnd; }
};
class StringInfoRecord : public SizedBamlRecord
{
public:
StringInfoRecord(BamlDocument *owner);
BamlRecordType type() const { return StringInfo; }
void ReadData(NETStream &stream);
void WriteData(NETStream &stream);
private:
uint16_t string_id_;
std::string value_;
};
class DeferableContentStartRecord : public BamlRecord
{
public:
DeferableContentStartRecord(BamlDocument *owner);
BamlRecordType type() const { return DeferableContentStart; }
void Read(NETStream &stream);
void Write(NETStream &stream);
void ReadDefer(size_t index);
void WriteDefer(size_t index, NETStream &stream);
private:
uint32_t offset_;
uint64_t offset_pos_;
BamlRecord *record_;
};
class DefAttributeKeyStringRecord : public SizedBamlRecord
{
public:
DefAttributeKeyStringRecord(BamlDocument *owner);
BamlRecordType type() const { return DefAttributeKeyString; }
void ReadData(NETStream &stream);
void WriteData(NETStream &stream);
void ReadDefer(size_t index);
void WriteDefer(size_t index, NETStream &stream);
private:
uint16_t value_id_;
uint32_t offset_;
uint32_t offset_pos_;
bool shared_;
bool shared_set_;
BamlRecord *record_;
};
class DefAttributeKeyTypeRecord : public ElementStartRecord
{
public:
DefAttributeKeyTypeRecord(BamlDocument *owner);
BamlRecordType type() const { return DefAttributeKeyType; }
void Read(NETStream &stream);
void Write(NETStream &stream);
void ReadDefer(size_t index);
void WriteDefer(size_t index, NETStream &stream);
private:
uint32_t offset_;
bool shared_;
bool shared_set_;
uint64_t offset_pos_;
BamlRecord *record_;
};
class PropertyComplexStartRecord : public BamlRecord
{
public:
PropertyComplexStartRecord(BamlDocument *owner);
BamlRecordType type() const { return PropertyComplexStart; }
void Read(NETStream &stream);
void Write(NETStream &stream);
private:
uint16_t attribute_id_;
};
class PropertyComplexEndRecord : public BamlRecord
{
public:
PropertyComplexEndRecord(BamlDocument *owner);
BamlRecordType type() const { return PropertyComplexEnd; }
};
class PropertyTypeReferenceRecord : public PropertyComplexStartRecord
{
public:
PropertyTypeReferenceRecord(BamlDocument *owner);
BamlRecordType type() const { return PropertyTypeReference; }
void Read(NETStream &stream);
void Write(NETStream &stream);
private:
uint16_t type_id_;
};
class ContentPropertyRecord : public BamlRecord
{
public:
ContentPropertyRecord(BamlDocument *owner);
BamlRecordType type() const { return ContentProperty; }
void Read(NETStream &stream);
void Write(NETStream &stream);
private:
uint16_t attribute_id_;
};
class PropertyCustomRecord : public SizedBamlRecord
{
public:
PropertyCustomRecord(BamlDocument *owner);
BamlRecordType type() const { return PropertyCustom; }
void ReadData(NETStream &stream);
void WriteData(NETStream &stream);
private:
uint16_t attribute_id_;
uint16_t serializer_type_id_;
std::vector<uint8_t> data_;
};
class PropertyRecord : public SizedBamlRecord
{
public:
PropertyRecord(BamlDocument *owner);
BamlRecordType type() const { return Property; }
void ReadData(NETStream &stream);
void WriteData(NETStream &stream);
uint16_t attribute_id() const { return attribute_id_; }
std::string value() const { return value_; }
void set_value(const std::string &value) { value_ = value; }
private:
uint16_t attribute_id_;
std::string value_;
};
class PropertyWithConverterRecord : public PropertyRecord
{
public:
PropertyWithConverterRecord(BamlDocument *owner);
BamlRecordType type() const { return PropertyWithConverter; }
void ReadData(NETStream &stream);
void WriteData(NETStream &stream);
private:
uint16_t converter_type_id_;
};
class PIMappingRecord : public SizedBamlRecord
{
public:
PIMappingRecord(BamlDocument *owner);
BamlRecordType type() const { return PIMapping; }
void ReadData(NETStream &stream);
void WriteData(NETStream &stream);
private:
std::string xml_namespace_;
std::string clr_namespace_;
uint16_t assembly_id_;
};
class PropertyListStartRecord : public PropertyComplexStartRecord
{
public:
PropertyListStartRecord(BamlDocument *owner);
BamlRecordType type() const { return PropertyListStart; }
};
class PropertyListEndRecord : public BamlRecord
{
public:
PropertyListEndRecord(BamlDocument *owner);
BamlRecordType type() const { return PropertyListEnd; }
};
class ConnectionIdRecord : public BamlRecord
{
public:
ConnectionIdRecord(BamlDocument *owner);
BamlRecordType type() const { return ConnectionId; }
void Read(NETStream &stream);
void Write(NETStream &stream);
private:
uint32_t connection_id_;
};
class OptimizedStaticResourceRecord : public BamlRecord
{
public:
OptimizedStaticResourceRecord(BamlDocument *owner);
BamlRecordType type() const { return OptimizedStaticResource; }
void Read(NETStream &stream);
void Write(NETStream &stream);
private:
uint8_t flags_;
uint16_t value_id_;
};
class ConstructorParametersStartRecord : public BamlRecord
{
public:
ConstructorParametersStartRecord(BamlDocument *owner);
BamlRecordType type() const { return ConstructorParametersStart; }
};
class ConstructorParametersEndRecord : public BamlRecord
{
public:
ConstructorParametersEndRecord(BamlDocument *owner);
BamlRecordType type() const { return ConstructorParametersEnd; }
};
class TextRecord : public SizedBamlRecord
{
public:
TextRecord(BamlDocument *owner);
BamlRecordType type() const { return Text; }
std::string value() const { return value_; }
void ReadData(NETStream &stream);
void WriteData(NETStream &stream);
private:
std::string value_;
};
class StaticResourceIdRecord : public BamlRecord
{
public:
StaticResourceIdRecord(BamlDocument *owner);
BamlRecordType type() const { return StaticResourceId; }
void Read(NETStream &stream);
void Write(NETStream &stream);
private:
uint16_t static_resource_id_;
};
class StaticResourceEndRecord : public BamlRecord
{
public:
StaticResourceEndRecord(BamlDocument *owner);
BamlRecordType type() const { return StaticResourceEnd; }
};
class StaticResourceStartRecord : public ElementStartRecord
{
public:
StaticResourceStartRecord(BamlDocument *owner);
BamlRecordType type() const { return StaticResourceStart; }
};
class PropertyWithStaticResourceIdRecord : public StaticResourceIdRecord
{
public:
PropertyWithStaticResourceIdRecord(BamlDocument *owner);
BamlRecordType type() const { return PropertyWithStaticResourceId; }
void Read(NETStream &stream);
void Write(NETStream &stream);
private:
uint16_t attribute_id_;
};
class PropertyWithExtensionRecord : public BamlRecord
{
public:
PropertyWithExtensionRecord(BamlDocument *owner);
BamlRecordType type() const { return PropertyWithExtension; }
void Read(NETStream &stream);
void Write(NETStream &stream);
private:
uint16_t attribute_id_;
uint16_t flags_;
uint16_t value_id_;
};
class DefAttributeRecord : public SizedBamlRecord
{
public:
DefAttributeRecord(BamlDocument *owner);
BamlRecordType type() const { return DefAttribute; }
void ReadData(NETStream &stream);
void WriteData(NETStream &stream);
private:
std::string value_;
uint16_t name_id_;
};
class KeyElementStartRecord : public DefAttributeKeyTypeRecord
{
public:
KeyElementStartRecord(BamlDocument *owner);
BamlRecordType type() const { return KeyElementStart; }
};
class KeyElementEndRecord : public BamlRecord
{
public:
KeyElementEndRecord(BamlDocument *owner);
BamlRecordType type() const { return KeyElementEnd; }
};
class ConstructorParameterTypeRecord : public BamlRecord
{
public:
ConstructorParameterTypeRecord(BamlDocument *owner);
BamlRecordType type() const { return ConstructorParameterType; }
void Read(NETStream &stream);
void Write(NETStream &stream);
private:
uint16_t type_id_;
};
class TextWithConverterRecord : public TextRecord
{
public:
TextWithConverterRecord(BamlDocument *owner);
BamlRecordType type() const { return TextWithConverter; }
void ReadData(NETStream &stream);
void WriteData(NETStream &stream);
private:
uint16_t converter_type_id_;
};
class TextWithIdRecord : public TextRecord
{
public:
TextWithIdRecord(BamlDocument *owner);
BamlRecordType type() const { return TextWithId; }
void ReadData(NETStream &stream);
void WriteData(NETStream &stream);
private:
uint16_t value_id_;
};
class LineNumberAndPositionRecord : public BamlRecord
{
public:
LineNumberAndPositionRecord(BamlDocument *owner);
BamlRecordType type() const { return LineNumberAndPosition; }
void Read(NETStream &stream);
void Write(NETStream &stream);
private:
uint32_t line_number_;
uint32_t line_position_;
};
class LinePositionRecord : public BamlRecord
{
public:
LinePositionRecord(BamlDocument *owner);
BamlRecordType type() const { return LinePosition; }
void Read(NETStream &stream);
void Write(NETStream &stream);
private:
uint32_t line_position_;
};
class LiteralContentRecord : public SizedBamlRecord
{
public:
LiteralContentRecord(BamlDocument *owner);
BamlRecordType type() const { return LiteralContent; }
void ReadData(NETStream &stream);
void WriteData(NETStream &stream);
private:
std::string value_;
uint32_t reserved0_;
uint32_t reserved1_;
};
class PresentationOptionsAttributeRecord : public SizedBamlRecord
{
public:
PresentationOptionsAttributeRecord(BamlDocument *owner);
BamlRecordType type() const { return PresentationOptionsAttribute; }
void ReadData(NETStream &stream);
void WriteData(NETStream &stream);
private:
std::string value_;
uint16_t name_id_;
};
class PropertyArrayStartRecord : public PropertyComplexStartRecord
{
public:
PropertyArrayStartRecord(BamlDocument *owner);
BamlRecordType type() const { return PropertyArrayStart; }
};
class PropertyArrayEndRecord : public BamlRecord
{
public:
PropertyArrayEndRecord(BamlDocument *owner);
BamlRecordType type() const { return PropertyArrayEnd; }
};
class PropertyStringReferenceRecord : public PropertyComplexStartRecord
{
public:
PropertyStringReferenceRecord(BamlDocument *owner);
BamlRecordType type() const { return PropertyStringReference; }
void Read(NETStream &stream);
void Write(NETStream &stream);
private:
std::string value_;
uint16_t string_id_;
};
class RoutedEventRecord : public SizedBamlRecord
{
public:
RoutedEventRecord(BamlDocument *owner);
BamlRecordType type() const { return RoutedEvent; }
void ReadData(NETStream &stream);
void WriteData(NETStream &stream);
private:
uint16_t attribute_id_;
std::string value_;
};
class TypeSerializerInfoRecord : public TypeInfoRecord
{
public:
TypeSerializerInfoRecord(BamlDocument *owner);
BamlRecordType type() const { return TypeSerializerInfo; }
void ReadData(NETStream &stream);
void WriteData(NETStream &stream);
private:
uint16_t type_id_;
};
class BamlDocument : public ObjectList<BamlRecord>
{
public:
BamlDocument();
void clear();
bool ReadFromStream(NETStream &stream);
void WriteToStream(NETStream &stream);
BamlRecord *GetRecordByPosition(uint64_t pos) const;
size_t GetClosedIndex(BamlRecordType start, BamlRecordType end, size_t index);
private:
std::vector<os::unicode_char> signature_;
uint16_t reader_version_major_;
uint16_t reader_version_minor_;
uint16_t updater_version_major_;
uint16_t updater_version_minor_;
uint16_t writer_version_major_;
uint16_t writer_version_minor_;
};
class BamlElement : public IObject
{
public:
BamlElement(BamlElement *parent);
~BamlElement();
BamlElement *parent() const { return parent_; }
BamlRecord *header() const { return header_; }
BamlRecord *footer() const { return footer_; }
std::vector<BamlElement *> children() const { return children_; }
std::vector<BamlRecord *> body() const { return body_; }
bool Parse(BamlDocument *document);
ILTypeDef *type() const { return type_; }
void set_type(ILTypeDef *type) { type_ = type; }
private:
static bool is_header(BamlRecordType type);
static bool is_footer(BamlRecordType type);
static bool is_match(BamlRecordType header, BamlRecordType footer);
BamlElement *parent_;
BamlRecord *header_;
BamlRecord *footer_;
std::vector<BamlElement *> children_;
std::vector<BamlRecord *> body_;
ILTypeDef *type_;
};
class CustomAttributeArgumentList;
class CustomAttributeNamedArgumentList;
class CustomAttributeFixedArgument;
class CustomAttributeValue : public IObject
{
public:
CustomAttributeValue(ILMetaData *meta);
~CustomAttributeValue();
void clear();
void Parse(ILToken *type, const ILData &data);
void Write(ILData &data);
CustomAttributeArgumentList *fixed_list() const { return fixed_list_; }
CustomAttributeNamedArgumentList *named_list() const { return named_list_; }
private:
ILMetaData *meta_;
CustomAttributeArgumentList *fixed_list_;
CustomAttributeNamedArgumentList *named_list_;
};
class CustomAttributeArgument : public IObject
{
public:
CustomAttributeArgument(ILMetaData *meta, CustomAttributeArgumentList *owner);
~CustomAttributeArgument();
virtual ILElement *type() const = 0;
ILTypeDef *reference() const { return reference_; }
CustomAttributeArgumentList *children() const { return children_; }
CustomAttributeArgumentList *owner() const { return owner_; }
virtual void Read(const ILData &data, uint32_t &pos);
virtual void Write(ILData &data) const;
void set_value(ILData &data) { value_ = data; }
bool ToBoolean() const;
std::string ToString() const;
protected:
CustomAttributeFixedArgument *AddChild(ILElement *type);
ILElement *ReadFieldOrPropType(const ILData &data, uint32_t &id);
void ReadEnum(const ILData &data, uint32_t &id, ILToken *type);
void ReadObject(const ILData &data, uint32_t &id);
void ReadArray(const ILData &data, uint32_t &pos, ILElement *type);
void ReadValue(const ILData &data, uint32_t &pos, ILElement *type);
std::string ReadString(const ILData &data, uint32_t &id);
ILTypeDef *ReadType(const ILData &data, uint32_t &id);
void WriteFieldOrPropType(ILData &data, ILElement *type) const;
void WriteArray(ILData &data) const;
void WriteObject(ILData &data) const;
void WriteType(ILData &data, ILTypeDef *token) const;
void WriteValue(ILData &data, ILElement *type) const;
private:
ILMetaData *meta_;
CustomAttributeArgumentList *owner_;
ILData value_;
ILTypeDef *reference_;
CustomAttributeArgumentList *children_;
};
class CustomAttributeFixedArgument : public CustomAttributeArgument
{
public:
CustomAttributeFixedArgument(ILMetaData *meta, CustomAttributeArgumentList *owner, ILElement *type);
virtual ILElement *type() const { return type_; }
private:
ILElement *type_;
};
class CustomAttributeArgumentList : public ObjectList<CustomAttributeArgument>
{
public:
CustomAttributeArgumentList();
};
class CustomAttributeNamedArgument : public CustomAttributeArgument
{
public:
CustomAttributeNamedArgument(ILMetaData *meta, CustomAttributeArgumentList *owner);
~CustomAttributeNamedArgument();
virtual ILElement *type() const { return type_; }
virtual void Read(const ILData &data, uint32_t &pos);
virtual void Write(ILData &data) const;
bool is_field() const { return is_field_; }
std::string name() const { return name_; }
void set_name(const std::string &name) { name_ = name; }
private:
bool is_field_;
std::string name_;
ILElement *type_;
};
class CustomAttributeNamedArgumentList : public CustomAttributeArgumentList
{
public:
CustomAttributeNamedArgumentList();
CustomAttributeNamedArgument *item(size_t index) const;
};
struct FrameworkPathInfo
{
std::string path;
FrameworkVersion version;
FrameworkPathInfo() {}
FrameworkPathInfo(std::string _path, FrameworkVersion _version) : path(_path), version(_version) {}
};
struct FrameworkRedirectInfo
{
std::string public_key_token;
std::string version;
FrameworkRedirectInfo() {}
FrameworkRedirectInfo(const std::string &_public_key_token, const std::string &_version) : public_key_token(_public_key_token), version(_version) {}
};
struct AssemblyName
{
std::string name;
std::string version;
std::string culture;
std::string public_key_token;
AssemblyName(const std::string &name);
std::string value() const;
};
class AssemblyResolver : public IObject
{
public:
AssemblyResolver();
~AssemblyResolver();
ILMetaData *Resolve(const ILMetaData &source, const std::string &name);
void Prepare();
private:
std::vector<std::string> FindAssemblies(const ILMetaData &source, const AssemblyName &name);
std::string win_dir_;
std::vector<FrameworkPathInfo> dotnet_dir_list_;
struct ci_less : std::binary_function<std::string, std::string, bool>
{
bool operator() (const std::string &s1, const std::string &s2) const
{
return _strcmpi(s1.c_str(), s2.c_str()) < 0;
}
};
std::map<std::string, PEFile *, ci_less> cache_;
std::map<std::string, FrameworkRedirectInfo, ci_less> redirect_v2_map_;
std::map<std::string, FrameworkRedirectInfo, ci_less> redirect_v4_map_;
std::map<std::string, FrameworkInfo> framework_path_map_;
};
#endif