public NameTableReader(SpanStream r) { UInt32 magic = r.ReadUInt32(); if (magic != MAGIC) { throw new InvalidDataException($"Invalid verHdr magic 0x{magic:X}"); } Version = r.ReadEnum <NameTableVersion>(); switch (Version) { case NameTableVersion.Hash: hasher = HasherV1.HashData; break; case NameTableVersion.HashV2: hasher = HasherV2.HashData; break; } byte[] buf = Deserializers.ReadBuffer(r); rdr = new SpanStream(buf); Indices = Deserializers.ReadArray <UInt32>(r); NumberOfElements = r.ReadUInt32(); }
private IModule ReadModule() { if (Info.StreamNumber < 0) { return(null); } byte[] modData = StreamTable.GetStream(Info.StreamNumber); OnModuleData?.Invoke(Info, modData); SpanStream modStream = new SpanStream(modData); UInt32 signature = modStream.ReadUInt32(); modStream.Position = 0; IModule modReader; if (Enum.IsDefined(typeof(CodeViewSignature), signature)) { modReader = new CodeViewModuleReader(ctx, Info, modStream); } else { modReader = new SourceFileModuleReader(ctx, modStream); } OnModuleReaderInit?.Invoke(modReader); return(modReader); }
public NameIndexTableReader(SpanStream r) { byte[] stringTableData = Deserializers.ReadBuffer(r); rdr = new SpanStream(stringTableData); Offset_Index = Deserializers.ReadMap <uint, uint>(r); MaxIndices = r.ReadUInt32(); // reverse of Offset_Index Index_Offset = Offset_Index.ToDictionary(x => x.Value, x => x.Key); }
/// <summary> /// Reads the pages that make up the Stream Table /// </summary> /// <returns></returns> public override IEnumerable <byte[]> GetPages_StreamTable() { Memory <byte> streamTableList = GetPages_StreamTableList() .SelectMany(x => x) .ToArray(); SpanStream stream = new SpanStream(streamTableList); var numStreamTablePages = GetNumPages(Header.DirectorySize); for (int i = 0; i < numStreamTablePages; i++) { uint pageNum = stream.ReadUInt32(); yield return(ReadPage(pageNum)); } }
public static T[] ReadArray <T>(SpanStream r) where T : unmanaged { uint numElements = r.ReadUInt32(); T[] arr = new T[numElements]; int tSize = Marshal.SizeOf <T>(); for (int i = 0; i < numElements; i++) { unsafe { fixed(byte *data = r.ReadBytes(tSize)) { T element = *(T *)data; arr.SetValue(element, i); } } } return(arr); }
public static Dictionary <Tkey, Tval> ReadMap <Tkey, Tval>(SpanStream r) where Tkey : unmanaged where Tval : unmanaged { // sum of bitsizes of each member uint cardinality = r.ReadUInt32(); int numElements = r.ReadInt32(); BitSet available = new BitSet(ReadArray <UInt32>(r)); BitSet deleted = new BitSet(ReadArray <UInt32>(r)); int keySize = Marshal.SizeOf <Tkey>(); int valueSize = Marshal.SizeOf <Tval>(); Dictionary <Tkey, Tval> map = new Dictionary <Tkey, Tval>(numElements); for (int i = 0; i < numElements; i++) { if (!available.Contains(i)) { continue; } unsafe { fixed(byte *pKey = r.ReadBytes(keySize)) fixed(byte *pVal = r.ReadBytes(valueSize)) { Tkey key = *(Tkey *)pKey; Tval val = *(Tval *)pVal; map.Add(key, val); } } } return(map); }