- Rewrite KdbSymProcessBootSymbols() with respect to recent kernel changes.

- Change KdbSymInit() to match standard kd-wrapper init function.
- They are not called from anywhere, so don't expect something to either improve or break.

svn path=/trunk/; revision=27312
This commit is contained in:
Aleksey Bragin 2007-06-28 17:49:02 +00:00
parent f290d37f66
commit a0e07982e6
2 changed files with 139 additions and 122 deletions

View file

@ -79,13 +79,7 @@ VOID
KdbSymUnloadDriverSymbols(IN PLDR_DATA_TABLE_ENTRY ModuleObject); KdbSymUnloadDriverSymbols(IN PLDR_DATA_TABLE_ENTRY ModuleObject);
VOID VOID
KdbSymProcessBootSymbols(IN PUNICODE_STRING FileName); KdbSymProcessBootSymbols(IN PANSI_STRING FileName);
VOID
KdbSymInit(
IN PLDR_DATA_TABLE_ENTRY NtoskrnlTextSection,
IN PLDR_DATA_TABLE_ENTRY LdrHalTextSection
);
BOOLEAN BOOLEAN
KdbSymPrintAddress(IN PVOID Address); KdbSymPrintAddress(IN PVOID Address);
@ -215,6 +209,13 @@ KdpGdbStubInit(
struct _KD_DISPATCH_TABLE *DispatchTable, struct _KD_DISPATCH_TABLE *DispatchTable,
ULONG BootPhase); ULONG BootPhase);
VOID
STDCALL
KdbSymInit(
struct _KD_DISPATCH_TABLE *DispatchTable,
ULONG BootPhase);
/* KD ROUTINES ***************************************************************/ /* KD ROUTINES ***************************************************************/
BOOLEAN BOOLEAN

View file

@ -587,38 +587,35 @@ KdbSymUnloadDriverSymbols(IN PLDR_DATA_TABLE_ENTRY ModuleObject)
* \param FileName Filename for which the symbols are loaded. * \param FileName Filename for which the symbols are loaded.
*/ */
VOID VOID
KdbSymProcessBootSymbols(IN PUNICODE_STRING FileName) KdbSymProcessBootSymbols(IN PANSI_STRING AnsiFileName)
{ {
PLDR_DATA_TABLE_ENTRY ModuleObject;
BOOLEAN Found = FALSE; BOOLEAN Found = FALSE;
BOOLEAN IsRaw;
PLIST_ENTRY ListHead, NextEntry; PLIST_ENTRY ListHead, NextEntry;
PLDR_DATA_TABLE_ENTRY LdrEntry; PLDR_DATA_TABLE_ENTRY LdrEntry = NULL;
PUNICODE_STRING ModuleName = FileName; WCHAR Buffer[MAX_PATH];
UNICODE_STRING NtosSymName = RTL_CONSTANT_STRING(L"ntoskrnl.sym"); UNICODE_STRING ModuleName;
UNICODE_STRING NtosName = RTL_CONSTANT_STRING(L"ntoskrnl.exe"); NTSTATUS Status;
if (RtlEqualUnicodeString(FileName, &NtosSymName, TRUE)) /* Convert file name to unicode */
{ ModuleName.MaximumLength = (MAX_PATH-1)*sizeof(WCHAR);
ModuleName = &NtosName; ModuleName.Length = 0;
IsRaw = TRUE; ModuleName.Buffer = Buffer;
}
else
{
IsRaw = FALSE;
}
ModuleObject = NULL; Status = RtlAnsiStringToUnicodeString(&ModuleName, AnsiFileName, FALSE);
if (!NT_SUCCESS(Status))
if (ModuleObject != NULL)
{ {
if (! LoadSymbols) DPRINT1("Failed to convert Ansi to Unicode with Status=0x%08X, Length=%d\n",
{ Status, ModuleName.Length);
ModuleObject->PatchInformation = NULL;
return; return;
} }
ListHead = &KeLoaderBlock->LoadOrderListHead; DPRINT("KdbSymProcessBootSymbols(%wZ)\n", &ModuleName);
/* Check which list we should use */
ListHead = (KeLoaderBlock) ? &KeLoaderBlock->LoadOrderListHead :
&PsLoadedModuleList;
/* Found module we are interested in */
NextEntry = ListHead->Flink; NextEntry = ListHead->Flink;
while (ListHead != NextEntry) while (ListHead != NextEntry)
{ {
@ -627,7 +624,7 @@ KdbSymProcessBootSymbols(IN PUNICODE_STRING FileName)
LDR_DATA_TABLE_ENTRY, LDR_DATA_TABLE_ENTRY,
InLoadOrderLinks); InLoadOrderLinks);
if (RtlEqualUnicodeString(FileName, &LdrEntry->BaseDllName, TRUE)) if (RtlEqualUnicodeString(&ModuleName, &LdrEntry->FullDllName, TRUE))
{ {
Found = TRUE; Found = TRUE;
break; break;
@ -637,60 +634,77 @@ KdbSymProcessBootSymbols(IN PUNICODE_STRING FileName)
NextEntry = NextEntry->Flink; NextEntry = NextEntry->Flink;
} }
if (Found) /* Exit if we didn't find the module requested */
{ if (!Found)
if (ModuleObject->PatchInformation != NULL) return;
{
KdbpSymRemoveCachedFile(ModuleObject->PatchInformation);
}
if (IsRaw) DPRINT("Found LdrEntry=%p\n", LdrEntry);
{ if (!LoadSymbols)
DPRINT("Data: %p %p %wZ\n", LdrEntry->DllBase, LdrEntry->SizeOfImage, &LdrEntry->FullDllName);
if (! RosSymCreateFromRaw(LdrEntry->DllBase,
LdrEntry->SizeOfImage,
(PROSSYM_INFO*)&ModuleObject->PatchInformation))
{ {
LdrEntry->PatchInformation = NULL;
return; return;
} }
}
else /* Remove symbol info if it already exists */
if (LdrEntry->PatchInformation != NULL)
{ {
KdbpSymRemoveCachedFile(LdrEntry->PatchInformation);
}
/* Load new symbol information */
if (! RosSymCreateFromMem(LdrEntry->DllBase, if (! RosSymCreateFromMem(LdrEntry->DllBase,
LdrEntry->SizeOfImage, LdrEntry->SizeOfImage,
(PROSSYM_INFO*)&ModuleObject->PatchInformation)) (PROSSYM_INFO*)&LdrEntry->PatchInformation))
{ {
/* Error loading symbol info, exit */
return; return;
} }
}
/* add file to cache */ /* Add file to cache */
KdbpSymAddCachedFile(FileName, ModuleObject->PatchInformation); KdbpSymAddCachedFile(&ModuleName, LdrEntry->PatchInformation);
DPRINT("Installed symbols: %wZ@%08x-%08x %p\n", DPRINT("Installed symbols: %wZ@%08x-%08x %p\n",
FileName, &ModuleName,
ModuleObject->DllBase, LdrEntry->DllBase,
ModuleObject->SizeOfImage + (ULONG)ModuleObject->DllBase, LdrEntry->SizeOfImage + (ULONG)LdrEntry->DllBase,
ModuleObject->PatchInformation); LdrEntry->PatchInformation);
}
} }
VOID
STDCALL
KdbDebugPrint(PCH Message, ULONG Length)
{
} }
/*! \brief Initializes the KDB symbols implementation. /*! \brief Initializes the KDB symbols implementation.
* *
* \param NtoskrnlModuleObject LDR_DATA_TABLE_ENTRY of ntoskrnl.exe * \param NtoskrnlModuleObject LDR_DATA_TABLE_ENTRY of ntoskrnl.exe
* \param LdrHalModuleObject LDR_DATA_TABLE_ENTRY of hal.sys * \param LdrHalModuleObject LDR_DATA_TABLE_ENTRY of hal.sys
*/ */
VOID VOID
KdbSymInit(IN PLDR_DATA_TABLE_ENTRY NtoskrnlModuleObject, STDCALL
IN PLDR_DATA_TABLE_ENTRY LdrHalModuleObject) KdbSymInit(PKD_DISPATCH_TABLE DispatchTable,
ULONG BootPhase)
{ {
PCHAR p1, p2; PCHAR p1, p2;
int Found; int Found;
char YesNo; char YesNo;
NtoskrnlModuleObject->PatchInformation = NULL; DPRINT("KdbSymInit() BootPhase=%d\n", BootPhase);
LdrHalModuleObject->PatchInformation = NULL;
if (BootPhase == 0)
{
/* Write out the functions that we support for now */
DispatchTable->KdpInitRoutine = KdbSymInit;
DispatchTable->KdpPrintRoutine = KdbDebugPrint;
/* Register as a Provider */
InsertTailList(&KdProviders, &DispatchTable->KdProvidersList);
/* Perform actual initialization of symbol module */
//NtoskrnlModuleObject->PatchInformation = NULL;
//LdrHalModuleObject->PatchInformation = NULL;
InitializeListHead(&SymbolFileListHead); InitializeListHead(&SymbolFileListHead);
KeInitializeSpinLock(&SymbolFileListLock); KeInitializeSpinLock(&SymbolFileListLock);
@ -703,6 +717,7 @@ KdbSymInit(IN PLDR_DATA_TABLE_ENTRY NtoskrnlModuleObject,
/* Check the command line for /LOADSYMBOLS, /NOLOADSYMBOLS, /* Check the command line for /LOADSYMBOLS, /NOLOADSYMBOLS,
* /LOADSYMBOLS={YES|NO}, /NOLOADSYMBOLS={YES|NO} */ * /LOADSYMBOLS={YES|NO}, /NOLOADSYMBOLS={YES|NO} */
ASSERT(KeLoaderBlock);
p1 = KeLoaderBlock->LoadOptions; p1 = KeLoaderBlock->LoadOptions;
while('\0' != *p1 && NULL != (p2 = strchr(p1, '/'))) while('\0' != *p1 && NULL != (p2 = strchr(p1, '/')))
{ {
@ -744,5 +759,6 @@ KdbSymInit(IN PLDR_DATA_TABLE_ENTRY NtoskrnlModuleObject,
RosSymInitKernelMode(); RosSymInitKernelMode();
} }
}
/* EOF */ /* EOF */