private string ReadHashInternal(string pdbFileHash) { var bits = new BitAccess(0); using (var read = File.Open(pdbFileHash, FileMode.Open)) { var head = new PdbFileHeader(read, bits); var reader = new PdbReader(read, head.pageSize); var dir = new MsfDirectory(reader, head, bits); bits.MinCapacity(28); reader.Seek(dir.streams[1].pages[0], 0); reader.Read(bits.Buffer, 0, 28); int ver; int sig; int age; Guid guid; bits.ReadInt32(out ver); // 0..3 Version bits.ReadInt32(out sig); // 4..7 Signature bits.ReadInt32(out age); // 8..11 Age bits.ReadGuid(out guid); // 12..27 GUID return((guid.ToString("N") + age.ToString("x")).ToUpper()); } }
/// <summary> /// </summary> /// <param name="reader"> /// </param> /// <param name="head"> /// </param> /// <param name="bits"> /// </param> internal MsfDirectory(PdbReader reader, PdbFileHeader head, BitAccess bits) { bits.MinCapacity(head.directorySize); var pages = reader.PagesFromSize(head.directorySize); // 0..n in page of directory pages. reader.Seek(head.directoryRoot, 0); bits.FillBuffer(reader.reader, pages * 4); var stream = new DataStream(head.directorySize, bits, pages); bits.MinCapacity(head.directorySize); stream.Read(reader, bits); // 0..3 in directory pages int count; bits.ReadInt32(out count); // 4..n var sizes = new int[count]; bits.ReadInt32(sizes); // n..m this.streams = new DataStream[count]; for (var i = 0; i < count; i++) { if (sizes[i] <= 0) { this.streams[i] = new DataStream(); } else { this.streams[i] = new DataStream(sizes[i], bits, reader.PagesFromSize(sizes[i])); } } }
public static PdbFunction[] LoadFunctions(Stream read, BitAccess bits, bool readAllStrings) { PdbFileHeader head = new PdbFileHeader(read, bits); PdbReader reader = new PdbReader(read, head.pageSize); MsfDirectory dir = new MsfDirectory(reader, head, bits); DbiModuleInfo[] modules = null; DbiDbgHdr header; dir.streams[1].Read(reader, bits); int nameStream = LoadPdbStream(bits); if (nameStream <= 0) { throw new PdbException("No `name' stream"); } dir.streams[nameStream].Read(reader, bits); IntHashTable names = LoadNameStream(bits); dir.streams[3].Read(reader, bits); LoadDbiStream(bits, out modules, out header, readAllStrings); ArrayList funcList = new ArrayList(); if (modules != null) { for (int m = 0; m < modules.Length; m++) { if (modules[m].stream > 0) { dir.streams[modules[m].stream].Read(reader, bits); LoadFuncsFromDbiModule(bits, modules[m], names, funcList, readAllStrings); } } } PdbFunction[] funcs = (PdbFunction[])funcList.ToArray(typeof(PdbFunction)); // After reading the functions, apply the token remapping table if it exists. if (header.snTokenRidMap != 0 && header.snTokenRidMap != 0xffff) { dir.streams[header.snTokenRidMap].Read(reader, bits); uint[] ridMap = new uint [dir.streams[header.snTokenRidMap].Length / 4]; bits.ReadUInt32(ridMap); foreach (PdbFunction func in funcs) { func.token = 0x06000000 | ridMap[func.token & 0xffffff]; } } // Array.Sort(funcs, PdbFunction.byAddress); //Array.Sort(funcs, PdbFunction.byToken); return(funcs); }
internal MsfDirectory(PdbStreamHelper reader, PdbFileHeader head, BitAccess bits) { int pages = reader.PagesFromSize(head.DirectorySize); // 0..n in page of directory pages. bits.MinCapacity(head.DirectorySize); int directoryRootPages = head.DirectoryRoot.Length; int pagesPerPage = head.PageSize / 4; int pagesToGo = pages; for (int i = 0; i < directoryRootPages; i++) { int pagesInThisPage = pagesToGo <= pagesPerPage ? pagesToGo : pagesPerPage; reader.Seek(head.DirectoryRoot[i], 0); bits.Append(reader.Reader, pagesInThisPage * 4); pagesToGo -= pagesInThisPage; } bits.Position = 0; DataStream stream = new DataStream(head.DirectorySize, bits, pages); bits.MinCapacity(head.DirectorySize); stream.Read(reader, bits); // 0..3 in directory pages int count; bits.ReadInt32(out count); // 4..n int[] sizes = new int[count]; bits.ReadInt32(sizes); // n..m _streams = new DataStream[count]; for (int i = 0; i < count; i++) { if (sizes[i] <= 0) { _streams[i] = new DataStream(); } else { _streams[i] = new DataStream( sizes[i], bits, reader.PagesFromSize(sizes[i])); } } }
public void WriteHash(string pdbFileHash, string hash) { Guid guid = new Guid(hash.Remove(32)); int age = int.Parse(hash.Substring(32), NumberStyles.HexNumber); using (var read = File.Open(pdbFileHash, FileMode.Open)) { PdbFileHeader head = new PdbFileHeader(read, bits); PdbReader reader = new PdbReader(read, head.pageSize); MsfDirectory dir = new MsfDirectory(reader, head, bits); reader.Seek(dir.streams[1].pages[0], 8); //bo przeskakujemy 8 znaków na ver i sig using (BinaryWriter writer = new BinaryWriter(read)) { writer.Write(age); writer.Write(guid.ToByteArray()); } } }
internal MsfDirectory(PdbReader reader, PdbFileHeader head, BitAccess bits) { int pages = reader.PagesFromSize(head.directorySize); // 0..n in page of directory pages. bits.MinCapacity(head.directorySize); int directoryRootPages = head.directoryRoot.Length; int pagesPerPage = head.pageSize / 4; int pagesToGo = pages; for (int i = 0; i < directoryRootPages; i++) { int pagesInThisPage = pagesToGo <= pagesPerPage ? pagesToGo : pagesPerPage; reader.Seek(head.directoryRoot[i], 0); bits.Append(reader.reader, pagesInThisPage * 4); pagesToGo -= pagesInThisPage; } bits.Position = 0; DataStream stream = new DataStream(head.directorySize, bits, pages); bits.MinCapacity(head.directorySize); stream.Read(reader, bits); // 0..3 in directory pages int count; bits.ReadInt32(out count); // 4..n int[] sizes = new int[count]; bits.ReadInt32(sizes); // n..m streams = new DataStream[count]; for (int i = 0; i < count; i++) { if (sizes[i] <= 0) { streams[i] = new DataStream(); } else { streams[i] = new DataStream(sizes[i], bits, reader.PagesFromSize(sizes[i])); } } }
private static Dictionary<uint, PdbTokenLine> LoadTokenToSourceMapping(Stream read) { var tokenToSourceMapping = new Dictionary<uint, PdbTokenLine>(); BitAccess bits = new BitAccess(512 * 1024); PdbFileHeader head = new PdbFileHeader(read, bits); PdbReader reader = new PdbReader(read, head.pageSize); MsfDirectory dir = new MsfDirectory(reader, head, bits); DbiModuleInfo[] modules = null; DbiDbgHdr header; dir.streams[1].Read(reader, bits); Dictionary<string, int> nameIndex = LoadNameIndex(bits); int nameStream; if (!nameIndex.TryGetValue("/NAMES", out nameStream)) { throw new Exception("No `name' stream"); } dir.streams[nameStream].Read(reader, bits); IntHashTable names = LoadNameStream(bits); dir.streams[3].Read(reader, bits); LoadDbiStream(bits, out modules, out header, true); ArrayList funcList = new ArrayList(); if (modules != null) { for (int m = 0; m < modules.Length; m++) { var module = modules[m]; if (module.stream > 0) { dir.streams[module.stream].Read(reader, bits); if (module.moduleName == "TokenSourceLineInfo") { LoadTokenToSourceInfo(bits, module, names, dir, nameIndex, reader, tokenToSourceMapping); } } } } return tokenToSourceMapping; }