aboutsummaryrefslogtreecommitdiff
path: root/core/dotnetfile.h
diff options
context:
space:
mode:
Diffstat (limited to 'core/dotnetfile.h')
-rw-r--r--core/dotnetfile.h2841
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