public override void ProcessTables(AssemblyBuffer buffer) { buffer.SetIndexPointer(this.AbsoluteAddress); uint val = buffer.ReadDWord(); // Reserved. byte major = buffer.ReadByte(); // Major and minor version byte minor = buffer.ReadByte(); // Major and minor version this.HeapOffsetSizes = buffer.ReadByte(); // Bit flags for the heap index width. Ref: https://www.codeproject.com/Articles/12585/The-NET-File-Format buffer.ReadByte(); // Padding byte. this.TablesPresent = buffer.ReadQWord(); // We need to read all of the tables present in the assembly this.TablesSorted = buffer.ReadQWord(); // What tables are sorted this.TableRowTypes = this.GetPopulatedTableRowTypes(); // Check which types apply to the current stream. for (int i = 0; i < 64; i++) { if (!Enum.IsDefined(typeof(MetaDataTableType), i)) { continue; } var tableType = (MetaDataTableType)i; var bitmask = (ulong)1 << (int)tableType; if ((this.TablesPresent & bitmask) != 0 || bitmask == 0) { this.TableLengths[(ulong)tableType] = buffer.ReadDWord(); } } this.PopulateTableRows(buffer); }