private void ReadTildeStreamStart()
{
if (Diag.DiagOn) Console.WriteLine("Reading meta data tables at offset = " + Hex.Int((int)BaseStream.Position));
// pre: at beginning of tilde stream
ReadZeros(4); // reserved
verInfo.tsMajVer = ReadByte(); // check
verInfo.tsMinVer = ReadByte(); // check
byte heapSizes = ReadByte();
if (heapSizes != 0) {
md.largeStrings = (heapSizes & 0x01) != 0;
md.largeGUID = (heapSizes & 0x02) != 0;
md.largeBlob = (heapSizes & 0x04) != 0;
}
if (Diag.DiagOn) {
if (md.largeStrings) Console.WriteLine("LARGE strings index");
if (md.largeGUID) Console.WriteLine("LARGE GUID index");
if (md.largeBlob) Console.WriteLine("LARGE blob index");
}
int res = ReadByte(); // check if 1
ulong valid = ReadUInt64();
ulong sorted = this.ReadUInt64();
if (Diag.DiagOn) Console.WriteLine("Valid = " + Hex.Long(valid));
for (int i=0; i < MetaData.NumMetaDataTables; i++) {
if ((valid & FileImage.bitmasks[i]) != 0) {
tableLengths[i] = ReadUInt32();
tables[i] = new TableRow[tableLengths[i]];
md.largeIx[i] = tableLengths[i] > MetaData.maxSmlIxSize;
if (Diag.DiagOn)
Console.WriteLine("Table Ix " + Hex.Short(i) + " has length " + tableLengths[i]);
}
else tableLengths[i] = 0;
}
if (tableLengths[0] != 1) this.MetaDataError("Module table has more than one entry");
for (int i=0; i < MetaData.CIxTables.Length; i++) {
for (int j=0; j < MetaData.CIxTables[i].Length; j++) {
if (Diag.DiagOn) Console.WriteLine("CIxTables " + i + " " + j + " tableLength = " + tableLengths[MetaData.CIxTables[i][j]] + " Max = " + MetaData.CIxMaxMap[i]);
md.lgeCIx[i] = md.lgeCIx[i] ||
(tableLengths[MetaData.CIxTables[i][j]] > MetaData.CIxMaxMap[i]);
}
if (Diag.DiagOn) if (md.lgeCIx[i]) Console.WriteLine("LARGE CIx " + i );
}
}