diff options
Diffstat (limited to 'core/dotnetfile.h')
-rw-r--r-- | core/dotnetfile.h | 2841 |
1 files changed, 2841 insertions, 0 deletions
diff --git a/core/dotnetfile.h b/core/dotnetfile.h new file mode 100644 index 0000000..0c80a46 --- /dev/null +++ b/core/dotnetfile.h @@ -0,0 +1,2841 @@ +#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
\ No newline at end of file |