public MetaDataHeader(AssemblyBuffer buffer, CLRHeader clrHeader, SectionsHeaders sectionsHeaders)
        {
            buffer.SetIndexPointer(clrHeader.MetaData.RVA - 0x1E00);
            this.Signature       = buffer.ReadDWord();
            this.MajorVersion    = buffer.ReadWord();
            this.MinorVersion    = buffer.ReadWord();
            this.Reserved        = buffer.ReadDWord();
            this.VersionLength   = buffer.ReadDWord();
            this.VersionString   = buffer.ReadStringOfLength(this.VersionLength);
            this.Flags           = buffer.ReadWord();
            this.NumberOfStreams = buffer.ReadWord();

            this.Streams = new StreamHeader[this.NumberOfStreams];

            this.Streams[(uint)MetaDataStreamType.DEFS_AND_REFS] = new DefsAndRefsStream(buffer, clrHeader, this);
            this.Streams[(uint)MetaDataStreamType.STRINGS]       = new StringStream(buffer, clrHeader);
            // These are boiler plate.
            this.Streams[(uint)MetaDataStreamType.US]   = new StringStream(buffer, clrHeader);
            this.Streams[(uint)MetaDataStreamType.GUID] = new StringStream(buffer, clrHeader);
            this.Streams[(uint)MetaDataStreamType.BLOB] = new BlobStream(buffer, clrHeader);

            // There is a specific load order for each stream. Therefore I'm not going to iterate over them.

            this.Streams[(uint)MetaDataStreamType.STRINGS].CacheBuffer(buffer);
            this.Streams[(uint)MetaDataStreamType.STRINGS].ProcessTables(buffer);

            this.Streams[(uint)MetaDataStreamType.BLOB].CacheBuffer(buffer);
            this.Streams[(uint)MetaDataStreamType.BLOB].ProcessTables(buffer);

            this.Streams[(uint)MetaDataStreamType.DEFS_AND_REFS].CacheBuffer(buffer);
            this.Streams[(uint)MetaDataStreamType.DEFS_AND_REFS].ProcessTables(buffer);
        }
Exemplo n.º 2
0
        public CLRHeader(AssemblyBuffer buffer, OptionalHeader header, SectionsHeaders sectionsHeaders)
        {
            this.cb = buffer.ReadDWord();
            this.MajorRuntimeVersion = buffer.ReadWord();
            this.MinorRuntimeVersion = buffer.ReadWord();
            this.MetaData            = new DataDirectory(buffer);
            this.Flags = buffer.ReadDWord();

            this.EntryPointTokenOrEntryPointRVA = buffer.ReadDWord();

            this.Resources               = new DataDirectory(buffer);
            this.StrongNameSignature     = new DataDirectory(buffer);
            this.CodeManagerTable        = new DataDirectory(buffer);
            this.VTableFixups            = new DataDirectory(buffer);
            this.ExportAddressTableJumps = new DataDirectory(buffer);
            this.ManagedNativeHeader     = new DataDirectory(buffer);
        }