public static PDBContainer FromBinaryReader(BinaryReader r, PEHeaderParser parser, bool parsingFile = true) { IMAGE_DATA_DIRECTORY selectDirectory = parser.NTHeader.OptionalHeader.DebuggingInformation; long addr = 0; if (parsingFile) { for (int i = 0; i < parser.SectionHeaders.Count; ++i) { var section = parser.SectionHeaders[i]; if (selectDirectory.VirtualAddress >= section.VirtualAddress && selectDirectory.VirtualAddress <= section.VirtualAddress + section.VirtualSize) { addr = selectDirectory.VirtualAddress - section.VirtualAddress + section.PointerToRawData; } } } else { addr = selectDirectory.VirtualAddress; } if (selectDirectory.Size > 0 && addr > 0) { r.BaseStream.Position = addr; byte[] buf = r.ReadBytes(unchecked ((int)selectDirectory.Size)); using (BinaryReader bufFetcher = new BinaryReader(new MemoryStream(buf))) { bufFetcher.BaseStream.Position = 0; DebugDataDirectory debugData = new DebugDataDirectory(); debugData.Characteristics = bufFetcher.ReadUInt32(); debugData.TimeDateStamp = bufFetcher.ReadUInt32(); debugData.MajorVersion = bufFetcher.ReadUInt16(); debugData.MinorVersion = bufFetcher.ReadUInt16(); debugData.Type = bufFetcher.ReadUInt32(); debugData.SizeOfData = bufFetcher.ReadUInt32(); debugData.AddressOfRawData = bufFetcher.ReadUInt32(); debugData.PointerToRawData = bufFetcher.ReadUInt32(); if (debugData.SizeOfData > 0 && debugData.PointerToRawData != 0) { PDBContainer pdbContainer = new PDBContainer(debugData.SizeOfData, parser); r.BaseStream.Position = debugData.PointerToRawData; pdbContainer.RawPdb = r.ReadBytes(unchecked ((int)debugData.SizeOfData)); pdbContainer.FillBaseInfo(0, parser.FileSize, selectDirectory.VirtualAddress); return(pdbContainer); } } } return(null); }
private bool Read(String filename, Action <PDBContainer> PDBContainerGetter = null) { using (FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read)) using (BufferedStream buffered = new BufferedStream(fs)) using (BinaryReader r = new BinaryReader(buffered)) { bool ret = ReadFromStream(r); if (ret && PDBContainerGetter != null) { PDBContainer container = PDBContainer.FromBinaryReader(r, this); if (container != null) { PDBContainerGetter(container); } } return(ret); } }