33 template <
typename... Ts>
37 if (
sizeof...(
Args) > 0) {
38 MessageStorage =
formatv(Str, std::forward<Ts>(
Args)...).str();
52 case E_PDB_INVALID_SIG:
53 case E_PDB_INVALID_AGE:
66 if (SUCCEEDED(CoCreateInstance(CLSID_DiaSource,
nullptr, CLSCTX_INPROC_SERVER,
68 reinterpret_cast<LPVOID *
>(&DiaDataSource))))
73 #if !defined(_MSC_VER)
76 const wchar_t *msdia_dll = L
"msdia140.dll";
78 if (FAILED(HR = NoRegCoCreate(msdia_dll, CLSID_DiaSource, IID_IDiaDataSource,
79 reinterpret_cast<LPVOID *
>(&DiaDataSource))))
88 std::unique_ptr<IPDBSession> &Session) {
89 CComPtr<IDiaDataSource> DiaDataSource;
90 CComPtr<IDiaSession> DiaSession;
100 const wchar_t *Path16Str =
reinterpret_cast<const wchar_t *
>(Path16.data());
102 if (FAILED(HR = DiaDataSource->loadDataFromPdb(Path16Str))) {
106 if (FAILED(HR = DiaDataSource->openSession(&DiaSession)))
114 std::unique_ptr<IPDBSession> &Session) {
115 CComPtr<IDiaDataSource> DiaDataSource;
116 CComPtr<IDiaSession> DiaSession;
119 if (
auto EC =
LoadDIA(DiaDataSource))
126 const wchar_t *Path16Str =
reinterpret_cast<const wchar_t *
>(Path16.data());
128 if (FAILED(HR = DiaDataSource->loadDataForExe(Path16Str,
nullptr,
nullptr)))
131 if (FAILED(HR = DiaDataSource->openSession(&DiaSession)))
140 bool success = (S_OK == Session->get_loadAddress(&LoadAddress));
141 return (success) ? LoadAddress : 0;
145 return (S_OK == Session->put_loadAddress(
Address));
149 CComPtr<IDiaSymbol> GlobalScope;
150 if (S_OK != Session->get_globalScope(&GlobalScope))
153 auto RawSymbol = std::make_unique<DIARawSymbol>(*
this, GlobalScope);
155 std::unique_ptr<PDBSymbolExe> ExeSymbol(
162 DWORD ArgSection, ArgOffset = 0;
163 if (S_OK == Session->addressForVA(VA, &ArgSection, &ArgOffset)) {
164 Section =
static_cast<uint32_t>(ArgSection);
165 Offset =
static_cast<uint32_t>(ArgOffset);
173 DWORD ArgSection, ArgOffset = 0;
174 if (S_OK == Session->addressForRVA(RVA, &ArgSection, &ArgOffset)) {
175 Section =
static_cast<uint32_t>(ArgSection);
176 Offset =
static_cast<uint32_t>(ArgOffset);
182 std::unique_ptr<PDBSymbol>
184 CComPtr<IDiaSymbol> LocatedSymbol;
185 if (S_OK != Session->symbolById(SymbolId, &LocatedSymbol))
188 auto RawSymbol = std::make_unique<DIARawSymbol>(*
this, LocatedSymbol);
194 enum SymTagEnum EnumVal =
static_cast<enum SymTagEnum
>(
Type);
196 CComPtr<IDiaSymbol> Symbol;
197 if (S_OK != Session->findSymbolByVA(
Address, EnumVal, &Symbol)) {
198 ULONGLONG LoadAddr = 0;
199 if (S_OK != Session->get_loadAddress(&LoadAddr))
202 if (S_OK != Session->findSymbolByRVA(RVA, EnumVal, &Symbol))
205 auto RawSymbol = std::make_unique<DIARawSymbol>(*
this, Symbol);
211 enum SymTagEnum EnumVal =
static_cast<enum SymTagEnum
>(
Type);
213 CComPtr<IDiaSymbol> Symbol;
214 if (S_OK != Session->findSymbolByRVA(RVA, EnumVal, &Symbol))
217 auto RawSymbol = std::make_unique<DIARawSymbol>(*
this, Symbol);
221 std::unique_ptr<PDBSymbol>
224 enum SymTagEnum EnumVal =
static_cast<enum SymTagEnum
>(
Type);
226 CComPtr<IDiaSymbol> Symbol;
227 if (S_OK != Session->findSymbolByAddr(Sect, Offset, EnumVal, &Symbol))
230 auto RawSymbol = std::make_unique<DIARawSymbol>(*
this, Symbol);
234 std::unique_ptr<IPDBEnumLineNumbers>
242 if (S_OK != Session->findLines(RawCompiland.
getDiaSymbol(),
246 return std::make_unique<DIAEnumLineNumbers>(
LineNumbers);
249 std::unique_ptr<IPDBEnumLineNumbers>
253 ULONGLONG LoadAddr = 0;
254 if (S_OK != Session->get_loadAddress(&LoadAddr))
260 return std::make_unique<DIAEnumLineNumbers>(
LineNumbers);
263 std::unique_ptr<IPDBEnumLineNumbers>
269 return std::make_unique<DIAEnumLineNumbers>(
LineNumbers);
272 std::unique_ptr<IPDBEnumLineNumbers>
279 return std::make_unique<DIAEnumLineNumbers>(
LineNumbers);
282 std::unique_ptr<IPDBEnumSourceFiles>
286 IDiaSymbol *DiaCompiland =
nullptr;
287 CComBSTR Utf16Pattern;
289 Utf16Pattern = CComBSTR(
Pattern.data());
299 Session->findFile(DiaCompiland, Utf16Pattern.m_str, Flags, &
SourceFiles))
301 return std::make_unique<DIAEnumSourceFiles>(*
this,
SourceFiles);
304 std::unique_ptr<IPDBSourceFile>
314 std::unique_ptr<IPDBEnumChildren<PDBSymbolCompiland>>
320 return File->getCompilands();
323 std::unique_ptr<PDBSymbolCompiland>
327 if (!Compilands || Compilands->getChildCount() == 0)
329 return Compilands->getNext();
333 CComPtr<IDiaEnumSourceFiles> Files;
334 if (S_OK != Session->findFile(
nullptr,
nullptr, nsNone, &Files))
337 return std::make_unique<DIAEnumSourceFiles>(*
this, Files);
342 CComPtr<IDiaEnumSourceFiles> Files;
347 Session->findFile(RawSymbol.
getDiaSymbol(),
nullptr, nsNone, &Files))
350 return std::make_unique<DIAEnumSourceFiles>(*
this, Files);
353 std::unique_ptr<IPDBSourceFile>
355 CComPtr<IDiaSourceFile> LocatedFile;
356 if (S_OK != Session->findFileById(FileId, &LocatedFile))
359 return std::make_unique<DIASourceFile>(*
this, LocatedFile);
363 CComPtr<IDiaEnumDebugStreams> DiaEnumerator;
364 if (S_OK != Session->getEnumDebugStreams(&DiaEnumerator))
367 return std::make_unique<DIAEnumDebugStreams>(DiaEnumerator);
371 CComPtr<IDiaEnumTables> DiaEnumerator;
372 if (S_OK != Session->getEnumTables(&DiaEnumerator))
375 return std::make_unique<DIAEnumTables>(DiaEnumerator);
380 CComPtr<IDiaEnumTables> ET;
381 CComPtr<IDiaTable> Table;
384 if (Session.getEnumTables(&ET) != S_OK)
387 while (ET->Next(1, &Table, &Count) == S_OK && Count == 1) {
389 if (S_OK == Table->QueryInterface(__uuidof(
T), (
void **)&
Enumerator))
395 std::unique_ptr<IPDBEnumInjectedSources>
397 CComPtr<IDiaEnumInjectedSources> Files =
398 getTableEnumerator<IDiaEnumInjectedSources>(*Session);
402 return std::make_unique<DIAEnumInjectedSources>(Files);
405 std::unique_ptr<IPDBEnumSectionContribs>
407 CComPtr<IDiaEnumSectionContribs> Sections =
408 getTableEnumerator<IDiaEnumSectionContribs>(*Session);
412 return std::make_unique<DIAEnumSectionContribs>(*
this, Sections);
415 std::unique_ptr<IPDBEnumFrameData>
417 CComPtr<IDiaEnumFrameData> FD =
418 getTableEnumerator<IDiaEnumFrameData>(*Session);
422 return std::make_unique<DIAEnumFrameData>(FD);