private void EnsureFixupCells() { if (_fixupCells != null) { return; } if (!_fixupOffset.HasValue) { return; } _fixupCells = new List <FixupCell>(); NibbleReader reader = new NibbleReader(_readyToRunReader.Image, _fixupOffset.Value); // The following algorithm has been loosely ported from CoreCLR, // src\vm\ceeload.inl, BOOL Module::FixupDelayListAux uint curTableIndex = reader.ReadUInt(); while (true) { uint fixupIndex = reader.ReadUInt(); // Accumulate the real rva from the delta encoded rva while (true) { ReadyToRunImportSection importSection = _readyToRunReader.ImportSections[(int)curTableIndex]; ReadyToRunImportSection.ImportSectionEntry entry = importSection.Entries[(int)fixupIndex]; _fixupCells.Add(new FixupCell(_fixupCells.Count, curTableIndex, fixupIndex, entry.Signature)); uint delta = reader.ReadUInt(); // Delta of 0 means end of entries in this table if (delta == 0) { break; } fixupIndex += delta; } uint tableIndex = reader.ReadUInt(); if (tableIndex == 0) { break; } curTableIndex = curTableIndex + tableIndex; } // Done with all entries in this table }
private FixupCell[] DecodeFixupCells(int offset) { List <FixupCell> cells = new List <FixupCell>(); NibbleReader reader = new NibbleReader(Image, offset); // The following algorithm has been loosely ported from CoreCLR, // src\vm\ceeload.inl, BOOL Module::FixupDelayListAux uint curTableIndex = reader.ReadUInt(); while (true) { uint fixupIndex = reader.ReadUInt(); // Accumulate the real rva from the delta encoded rva while (true) { ReadyToRunImportSection importSection = ImportSections[(int)curTableIndex]; ReadyToRunImportSection.ImportSectionEntry entry = importSection.Entries[(int)fixupIndex]; cells.Add(new FixupCell(cells.Count, curTableIndex, fixupIndex, entry.Signature)); uint delta = reader.ReadUInt(); // Delta of 0 means end of entries in this table if (delta == 0) { break; } fixupIndex += delta; } uint tableIndex = reader.ReadUInt(); if (tableIndex == 0) { break; } curTableIndex = curTableIndex + tableIndex; } // Done with all entries in this table return(cells.ToArray()); }