#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 { 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 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 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 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 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 extra_data_; std::vector 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 { 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(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 &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 &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 sizes_; std::vector 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 &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 mod_list_; std::vector child_list_; bool is_predicate_; // no copy ctr or assignment op ILElement(const ILElement &); ILElement &operator =(const ILElement &); }; class ILSignature : public ObjectList { 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 &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 &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 &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 &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(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 &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(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(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 &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 &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(ILToken::next()); } ILField *field() const { return field_; }; virtual void Rebase(uint64_t delta_base); virtual void RemapTokens(const std::map &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(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 &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 &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 &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 &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 &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 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 data_; }; class ManifestResourceValue : public ObjectList { 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 &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 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(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 data() const { return data_; } private: uint32_t offset_; uint32_t flags_; std::string name_; ILToken *implementation_; ManifestResourceValue *value_; uint32_t name_pos_; std::vector 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(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 &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(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 &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 &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 &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(ILToken::next()); } virtual void ReadFromFile(NETArchitecture &file); virtual void WriteToFile(NETArchitecture &file); virtual void UpdateTokens(); virtual void RemapTokens(const std::map &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(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 &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(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 &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(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 &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 &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(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 &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 &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 &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 { 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 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 method_list() const { return method_list_; } void set_method_list(const std::vector &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 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 &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 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 { 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 custom_attribute_list_; std::set 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 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 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 { 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 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 children() const { return children_; } std::vector 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 children_; std::vector 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 { 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 FindAssemblies(const ILMetaData &source, const AssemblyName &name); std::string win_dir_; std::vector dotnet_dir_list_; struct ci_less : std::binary_function { bool operator() (const std::string &s1, const std::string &s2) const { return _strcmpi(s1.c_str(), s2.c_str()) < 0; } }; std::map cache_; std::map redirect_v2_map_; std::map redirect_v4_map_; std::map framework_path_map_; }; #endif