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);
        }