public int GetReaderFromCallback( [In, MarshalAs(UnmanagedType.Interface)] object metadataImport, [MarshalAs(UnmanagedType.LPWStr)] string fileName, [MarshalAs(UnmanagedType.LPWStr)] string searchPath, SymUnmanagedSearchPolicy searchPolicy, [In, MarshalAs(UnmanagedType.Interface)] object callback, [MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedReader reader) { throw new NotImplementedException(); }
public int GetReaderFromCallback( [In, MarshalAs(UnmanagedType.Interface)] object metadataImport, [MarshalAs(UnmanagedType.LPWStr)] string fileName, [MarshalAs(UnmanagedType.LPWStr)] string searchPath, SymUnmanagedSearchPolicy searchPolicy, [In, MarshalAs(UnmanagedType.Interface)] object callback, [MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedReader reader) { reader = null; return(HResult.E_NOTIMPL); }
private bool TryFindMatchingPdb( string searchPaths, string peFileExtension, // with no leading . string pdbFileName, Guid guid, uint stamp, int age, LazyMetadataImport metadataImport, SymUnmanagedSearchPolicy searchPolicy, out ISymUnmanagedReader reader) { if (searchPaths == null) { reader = null; return(false); } foreach (var searchPath in searchPaths.Split(s_searchPathSeparators, StringSplitOptions.RemoveEmptyEntries)) { // TODO: check symsrv policy if (searchPath.StartsWith("SRV*", StringComparison.OrdinalIgnoreCase)) { // TODO: continue; } if (searchPath.StartsWith("SYMSRV*", StringComparison.OrdinalIgnoreCase)) { // TODO: continue; } if (searchPath.StartsWith("CACHE*", StringComparison.OrdinalIgnoreCase)) { // TODO: continue; } foreach (var subdir in GetSearchPathSubdirectories(searchPath, peFileExtension)) { if (TryCreateReaderForMatchingPdb(Path.Combine(subdir, pdbFileName), guid, stamp, age, metadataImport, out reader)) { return(true); } } } reader = null; return(false); }
public int GetReaderForFile2( [MarshalAs(UnmanagedType.Interface)] object metadataImport, [MarshalAs(UnmanagedType.LPWStr)] string fileName, [MarshalAs(UnmanagedType.LPWStr)] string searchPath, SymUnmanagedSearchPolicy searchPolicy, [MarshalAs(UnmanagedType.Interface)] out ISymUnmanagedReader reader) { reader = null; try { var mdImport = metadataImport as IMetadataImport; if (mdImport == null || string.IsNullOrEmpty(fileName)) { return(HResult.E_INVALIDARG); } // See DIA: FLocatePdbDefault, FLocateCvFilePathHelper, FLocatePdbSymsrv, FLocateCvFilePathHelper // // 1) Try open Combine(<PE directory>, <PDB file name>) (unless RestrictReferencePath) // 2) Try open PDB path (unless RestrictOriginalPath) // 3) Search Paths - semicolon separated paths // a) searchPath parameter // b) registry (unless RestrictRegistry) // Use search paths from registry Software\Microsoft\VisualStudio\MSPDB, value SymbolSearchPath // with environment variables expanded (ExpandEnvironmentStrings) // i) try USER // ii) try MACHINE // c) environment vars // i) _NT_ALT_SYMBOL_PATH // ii) _NT_SYMBOL_PATH // ii) SystemRoot (unless RestrictSystemRoot) // // for each search path: // special paths: SRV*<server>, SYMSRV*SYMSRV.DLL*<server> => symbol server (unless RestrictSymsrv) // CACHE*<cache> => sym cache (unless RestrictSymsrv) // // A) try open <path>\symbols\<PE file extension>\<PDB file name> // B) try open <path>\<PE file extension>\<PDB file name> // C) try open <path>\<PDB file name> // // Each attempt checks if PDB ID matches. // // Search policy: all is restricted unless explicitly allowed. // After opened store to cache if CACHE* given (only the first cache?) if (!TryReadCodeViewData(fileName, out var codeViewData, out uint stamp)) { return(HResult.E_FAIL); // TODO: specific error code (ecToHresult)? } Guid guid = codeViewData.Guid; int age = codeViewData.Age; string pdbFileName = Path.GetFileName(codeViewData.Path); var lazyImport = new LazyMetadataImport(mdImport); // 1) next to the PE file if ((searchPolicy & SymUnmanagedSearchPolicy.AllowReferencePathAccess) != 0) { string peDirectory = Path.GetDirectoryName(fileName); string pdbFilePath = Path.Combine(peDirectory, pdbFileName); if (TryCreateReaderForMatchingPdb(pdbFilePath, guid, stamp, age, lazyImport, out reader)) { return(HResult.S_OK); } } // 2) PDB path as specified in Debug Directory if ((searchPolicy & SymUnmanagedSearchPolicy.AllowOriginalPathAccess) != 0) { if (TryCreateReaderForMatchingPdb(codeViewData.Path, guid, stamp, age, lazyImport, out reader)) { return(HResult.S_OK); } } // 3) Search Paths string peFileExtension = Path.GetExtension(fileName).TrimStart('.'); foreach (var searchPaths in GetSearchPathsSequence(searchPath, searchPolicy)) { if (TryFindMatchingPdb(searchPaths, peFileExtension, pdbFileName, guid, stamp, age, lazyImport, searchPolicy, out reader)) { return(HResult.S_OK); } } return(HResult.E_PDB_NOT_FOUND); } finally { InteropUtilities.TransferOwnershipOrRelease(ref metadataImport, reader); } }
private static IEnumerable <string> GetSearchPathsSequence(string searchPath, SymUnmanagedSearchPolicy searchPolicy) { // 3a) parameter yield return(searchPath); // 4b) registry if ((searchPolicy & SymUnmanagedSearchPolicy.AllowRegistryAccess) != 0) { // TODO: https://github.com/dotnet/symreader-portable/issues/48 } // 5c) environment variables: yield return(PortableShim.Environment.GetEnvironmentVariable("_NT_ALT_SYMBOL_PATH")); yield return(PortableShim.Environment.GetEnvironmentVariable("_NT_SYMBOL_PATH")); yield return(PortableShim.Environment.GetEnvironmentVariable("SystemRoot")); }
public int GetReaderForFile2( [MarshalAs(UnmanagedType.Interface)]object metadataImport, [MarshalAs(UnmanagedType.LPWStr)]string fileName, [MarshalAs(UnmanagedType.LPWStr)]string searchPath, SymUnmanagedSearchPolicy searchPolicy, [MarshalAs(UnmanagedType.Interface)]out ISymUnmanagedReader reader) { reader = null; try { var mdImport = metadataImport as IMetadataImport; if (mdImport == null || string.IsNullOrEmpty(fileName)) { return HResult.E_INVALIDARG; } // See DIA: FLocatePdbDefault, FLocateCvFilePathHelper, FLocatePdbSymsrv, FLocateCvFilePathHelper // // 1) Try open Combine(<PE directory>, <PDB file name>) (unless RestrictReferencePath) // 2) Try open PDB path (unless RestrictOriginalPath) // 3) Search Paths - semicolon separated paths // a) searchPath parameter // b) registry (unless RestrictRegistry) // Use search paths from registry Software\Microsoft\VisualStudio\MSPDB, value SymbolSearchPath // with environment variables expanded (ExpandEnvironmentStrings) // i) try USER // ii) try MACHINE // c) environment vars // i) _NT_ALT_SYMBOL_PATH // ii) _NT_SYMBOL_PATH // ii) SystemRoot (unless RestrictSystemRoot) // // for each search path: // special paths: SRV*<server>, SYMSRV*SYMSRV.DLL*<server> => symbol server (unless RestrictSymsrv) // CACHE*<cache> => sym cache (unless RestrictSymsrv) // // A) try open <path>\symbols\<PE file extension>\<PDB file name> // B) try open <path>\<PE file extension>\<PDB file name> // C) try open <path>\<PDB file name> // // Each attempt checks if PDB ID matches. // // Search policy: all is restricted unless explicitly allowed. // After opened store to cache if CACHE* given (only the first cache?) CodeViewDebugDirectoryData codeViewData; uint stamp; if (!TryReadCodeViewData(fileName, out codeViewData, out stamp)) { return HResult.E_FAIL; // TODO: specific error code (ecToHresult)? } Guid guid = codeViewData.PdbId; int age = codeViewData.Age; string pdbFileName = Path.GetFileName(codeViewData.Path); var lazyImport = new LazyMetadataImport(mdImport); // 1) next to the PE file if ((searchPolicy & SymUnmanagedSearchPolicy.AllowReferencePathAccess) != 0) { string peDirectory = Path.GetDirectoryName(fileName); string pdbFilePath = Path.Combine(peDirectory, pdbFileName); if (TryCreateReaderForMatchingPdb(pdbFilePath, guid, stamp, age, lazyImport, out reader)) { return HResult.S_OK; } } // 2) PDB path as specified in Debug Directory if ((searchPolicy & SymUnmanagedSearchPolicy.AllowOriginalPathAccess) != 0) { if (TryCreateReaderForMatchingPdb(codeViewData.Path, guid, stamp, age, lazyImport, out reader)) { return HResult.S_OK; } } // 3) Search Paths string peFileExtension = Path.GetExtension(fileName).TrimStart('.'); foreach (var searchPaths in GetSearchPathsSequence(searchPath, searchPolicy)) { if (TryFindMatchingPdb(searchPaths, peFileExtension, pdbFileName, guid, stamp, age, lazyImport, searchPolicy, out reader)) { return HResult.S_OK; } } return HResult.E_PDB_NOT_FOUND; } finally { InteropUtilities.TransferOwnershipOrRelease(ref metadataImport, reader); } }
public int GetReaderFromCallback( [In, MarshalAs(UnmanagedType.Interface)] object metadataImport, [MarshalAs(UnmanagedType.LPWStr)]string fileName, [MarshalAs(UnmanagedType.LPWStr)]string searchPath, SymUnmanagedSearchPolicy searchPolicy, [In, MarshalAs(UnmanagedType.Interface)] object callback, [MarshalAs(UnmanagedType.Interface)]out ISymUnmanagedReader reader) { reader = null; return HResult.E_NOTIMPL; }
private bool TryFindMatchingPdb( string searchPaths, string peFileExtension, // with no leading . string pdbFileName, Guid guid, uint stamp, int age, LazyMetadataImport metadataImport, SymUnmanagedSearchPolicy searchPolicy, out ISymUnmanagedReader reader) { if (searchPaths == null) { reader = null; return false; } foreach (var searchPath in searchPaths.Split(SearchPathSeparators, StringSplitOptions.RemoveEmptyEntries)) { // TODO: check symsrv policy if (searchPath.StartsWith("SRV*", StringComparison.OrdinalIgnoreCase)) { // TODO: continue; } if (searchPath.StartsWith("SYMSRV*", StringComparison.OrdinalIgnoreCase)) { // TODO: continue; } if (searchPath.StartsWith("CACHE*", StringComparison.OrdinalIgnoreCase)) { // TODO: continue; } foreach (var subdir in GetSearchPathSubdirectories(searchPath, peFileExtension)) { if (TryCreateReaderForMatchingPdb(Path.Combine(subdir, pdbFileName), guid, stamp, age, metadataImport, out reader)) { return true; } } } reader = null; return false; }
private static IEnumerable<string> GetSearchPathsSequence(string searchPath, SymUnmanagedSearchPolicy searchPolicy) { // 3a) parameter yield return searchPath; // 4b) registry if ((searchPolicy & SymUnmanagedSearchPolicy.AllowRegistryAccess) != 0) { // TODO } // 5c) environment variables: yield return PortableShim.Environment.GetEnvironmentVariable("_NT_ALT_SYMBOL_PATH"); yield return PortableShim.Environment.GetEnvironmentVariable("_NT_SYMBOL_PATH"); yield return PortableShim.Environment.GetEnvironmentVariable("SystemRoot"); }