Skip to content

Commit e89491e

Browse files
committed
Fix SymGetDiaSession regression loading PDBs
1 parent e318e39 commit e89491e

File tree

3 files changed

+87
-14
lines changed

3 files changed

+87
-14
lines changed

phlib/include/symprv.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,16 @@ PhLoadModuleSymbolProvider(
130130
_In_ ULONG Size
131131
);
132132

133+
PHLIBAPI
134+
BOOLEAN
135+
NTAPI
136+
PhLoadFileNameSymbolProvider(
137+
_In_ PPH_SYMBOL_PROVIDER SymbolProvider,
138+
_In_ PPH_STRING FileName,
139+
_In_ ULONG64 BaseAddress,
140+
_In_ ULONG Size
141+
);
142+
133143
PHLIBAPI
134144
VOID
135145
NTAPI

phlib/symprv.c

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1034,6 +1034,70 @@ BOOLEAN PhLoadModuleSymbolProvider(
10341034
return FALSE;
10351035
}
10361036

1037+
BOOLEAN PhLoadFileNameSymbolProvider(
1038+
_In_ PPH_SYMBOL_PROVIDER SymbolProvider,
1039+
_In_ PPH_STRING FileName,
1040+
_In_ ULONG64 BaseAddress,
1041+
_In_ ULONG Size
1042+
)
1043+
{
1044+
ULONG64 baseAddress;
1045+
PPH_SYMBOL_MODULE symbolModule = NULL;
1046+
PPH_AVL_LINKS existingLinks;
1047+
PH_SYMBOL_MODULE lookupSymbolModule;
1048+
1049+
PhpRegisterSymbolProvider(SymbolProvider);
1050+
1051+
if (!SymLoadModuleExW_I)
1052+
return FALSE;
1053+
1054+
PhAcquireQueuedLockExclusive(&SymbolProvider->ModulesListLock);
1055+
lookupSymbolModule.BaseAddress = BaseAddress;
1056+
existingLinks = PhFindElementAvlTree(&SymbolProvider->ModulesSet, &lookupSymbolModule.Links);
1057+
PhReleaseQueuedLockExclusive(&SymbolProvider->ModulesListLock);
1058+
1059+
if (existingLinks)
1060+
return TRUE;
1061+
1062+
PH_LOCK_SYMBOLS();
1063+
1064+
baseAddress = SymLoadModuleExW_I(
1065+
SymbolProvider->ProcessHandle,
1066+
NULL,
1067+
FileName->Buffer,
1068+
NULL,
1069+
BaseAddress,
1070+
Size,
1071+
NULL,
1072+
0
1073+
);
1074+
1075+
PH_UNLOCK_SYMBOLS();
1076+
1077+
PhAcquireQueuedLockExclusive(&SymbolProvider->ModulesListLock);
1078+
lookupSymbolModule.BaseAddress = BaseAddress;
1079+
existingLinks = PhFindElementAvlTree(&SymbolProvider->ModulesSet, &lookupSymbolModule.Links);
1080+
1081+
if (!existingLinks)
1082+
{
1083+
symbolModule = PhAllocate(sizeof(PH_SYMBOL_MODULE));
1084+
symbolModule->BaseAddress = BaseAddress;
1085+
symbolModule->Size = Size;
1086+
PhSetReference(&symbolModule->FileName, FileName);
1087+
1088+
existingLinks = PhAddElementAvlTree(&SymbolProvider->ModulesSet, &symbolModule->Links);
1089+
assert(!existingLinks);
1090+
InsertTailList(&SymbolProvider->ModulesListHead, &symbolModule->ListEntry);
1091+
}
1092+
1093+
PhReleaseQueuedLockExclusive(&SymbolProvider->ModulesListLock);
1094+
1095+
if (baseAddress)
1096+
return TRUE;
1097+
else
1098+
return FALSE;
1099+
}
1100+
10371101
typedef struct _PHP_LOAD_PROCESS_SYMBOLS_CONTEXT
10381102
{
10391103
HANDLE LoadingSymbolsForProcessId;

tools/peview/pdb.c

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1248,23 +1248,22 @@ NTSTATUS PeDumpFileSymbols(
12481248
&size
12491249
);
12501250

1251-
if (PvpLoadDbgHelp(&PvSymbolProvider))
1251+
if (!NT_SUCCESS(status))
12521252
{
1253-
PPH_STRING fileName;
1253+
PhShowStatus(NULL, L"Unable to load the file.", status, 0);
1254+
return status;
1255+
}
12541256

1255-
if (NT_SUCCESS(PhGetProcessMappedFileName(NtCurrentProcess(), viewBase, &fileName)))
1257+
if (PvpLoadDbgHelp(&PvSymbolProvider))
1258+
{
1259+
if (PhLoadFileNameSymbolProvider(
1260+
PvSymbolProvider,
1261+
PvFileName,
1262+
(ULONG64)viewBase,
1263+
(ULONG)size
1264+
))
12561265
{
1257-
if (PhLoadModuleSymbolProvider(
1258-
PvSymbolProvider,
1259-
fileName,
1260-
(ULONG64)viewBase,
1261-
(ULONG)size
1262-
))
1263-
{
1264-
baseOfDll = (ULONG64)viewBase;
1265-
}
1266-
1267-
PhDereferenceObject(fileName);
1266+
baseOfDll = (ULONG64)viewBase;
12681267
}
12691268
}
12701269

0 commit comments

Comments
 (0)