- 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,47 +587,44 @@ 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; PLIST_ENTRY ListHead, NextEntry;
BOOLEAN IsRaw; PLDR_DATA_TABLE_ENTRY LdrEntry = NULL;
PLIST_ENTRY ListHead, NextEntry; WCHAR Buffer[MAX_PATH];
PLDR_DATA_TABLE_ENTRY LdrEntry; UNICODE_STRING ModuleName;
PUNICODE_STRING ModuleName = FileName; NTSTATUS Status;
UNICODE_STRING NtosSymName = RTL_CONSTANT_STRING(L"ntoskrnl.sym");
UNICODE_STRING NtosName = RTL_CONSTANT_STRING(L"ntoskrnl.exe");
if (RtlEqualUnicodeString(FileName, &NtosSymName, TRUE)) /* Convert file name to unicode */
ModuleName.MaximumLength = (MAX_PATH-1)*sizeof(WCHAR);
ModuleName.Length = 0;
ModuleName.Buffer = Buffer;
Status = RtlAnsiStringToUnicodeString(&ModuleName, AnsiFileName, FALSE);
if (!NT_SUCCESS(Status))
{ {
ModuleName = &NtosName; DPRINT1("Failed to convert Ansi to Unicode with Status=0x%08X, Length=%d\n",
IsRaw = TRUE; Status, ModuleName.Length);
}
else
{
IsRaw = FALSE;
}
ModuleObject = NULL;
if (ModuleObject != NULL)
{
if (! LoadSymbols)
{
ModuleObject->PatchInformation = NULL;
return; return;
} }
ListHead = &KeLoaderBlock->LoadOrderListHead; DPRINT("KdbSymProcessBootSymbols(%wZ)\n", &ModuleName);
NextEntry = ListHead->Flink;
while (ListHead != NextEntry)
{
/* Get the entry */
LdrEntry = CONTAINING_RECORD(NextEntry,
LDR_DATA_TABLE_ENTRY,
InLoadOrderLinks);
if (RtlEqualUnicodeString(FileName, &LdrEntry->BaseDllName, TRUE)) /* Check which list we should use */
ListHead = (KeLoaderBlock) ? &KeLoaderBlock->LoadOrderListHead :
&PsLoadedModuleList;
/* Found module we are interested in */
NextEntry = ListHead->Flink;
while (ListHead != NextEntry)
{
/* Get the entry */
LdrEntry = CONTAINING_RECORD(NextEntry,
LDR_DATA_TABLE_ENTRY,
InLoadOrderLinks);
if (RtlEqualUnicodeString(&ModuleName, &LdrEntry->FullDllName, TRUE))
{ {
Found = TRUE; Found = TRUE;
break; break;
@ -637,112 +634,131 @@ 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->PatchInformation = NULL;
LdrEntry->SizeOfImage, return;
(PROSSYM_INFO*)&ModuleObject->PatchInformation)) }
{
return;
}
}
else
{
if (! RosSymCreateFromMem(LdrEntry->DllBase,
LdrEntry->SizeOfImage,
(PROSSYM_INFO*)&ModuleObject->PatchInformation))
{
return;
}
}
/* add file to cache */ /* Remove symbol info if it already exists */
KdbpSymAddCachedFile(FileName, ModuleObject->PatchInformation); if (LdrEntry->PatchInformation != NULL)
{
KdbpSymRemoveCachedFile(LdrEntry->PatchInformation);
}
DPRINT("Installed symbols: %wZ@%08x-%08x %p\n", /* Load new symbol information */
FileName, if (! RosSymCreateFromMem(LdrEntry->DllBase,
ModuleObject->DllBase, LdrEntry->SizeOfImage,
ModuleObject->SizeOfImage + (ULONG)ModuleObject->DllBase, (PROSSYM_INFO*)&LdrEntry->PatchInformation))
ModuleObject->PatchInformation); {
} /* Error loading symbol info, exit */
} return;
}
/* Add file to cache */
KdbpSymAddCachedFile(&ModuleName, LdrEntry->PatchInformation);
DPRINT("Installed symbols: %wZ@%08x-%08x %p\n",
&ModuleName,
LdrEntry->DllBase,
LdrEntry->SizeOfImage + (ULONG)LdrEntry->DllBase,
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;
InitializeListHead(&SymbolFileListHead); if (BootPhase == 0)
KeInitializeSpinLock(&SymbolFileListLock); {
/* 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);
KeInitializeSpinLock(&SymbolFileListLock);
#ifdef DBG #ifdef DBG
LoadSymbols = TRUE; LoadSymbols = TRUE;
#else #else
LoadSymbols = FALSE; LoadSymbols = FALSE;
#endif #endif
/* 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} */
p1 = KeLoaderBlock->LoadOptions; ASSERT(KeLoaderBlock);
while('\0' != *p1 && NULL != (p2 = strchr(p1, '/'))) p1 = KeLoaderBlock->LoadOptions;
{ while('\0' != *p1 && NULL != (p2 = strchr(p1, '/')))
p2++;
Found = 0;
if (0 == _strnicmp(p2, "LOADSYMBOLS", 11))
{ {
Found = +1; p2++;
p2 += 11; Found = 0;
} if (0 == _strnicmp(p2, "LOADSYMBOLS", 11))
else if (0 == _strnicmp(p2, "NOLOADSYMBOLS", 13))
{
Found = -1;
p2 += 13;
}
if (0 != Found)
{
while (isspace(*p2))
{ {
p2++; Found = +1;
p2 += 11;
} }
if ('=' == *p2) else if (0 == _strnicmp(p2, "NOLOADSYMBOLS", 13))
{ {
p2++; Found = -1;
while (isspace(*p2)) p2 += 13;
{
p2++;
}
YesNo = toupper(*p2);
if ('N' == YesNo || 'F' == YesNo || '0' == YesNo)
{
Found = -1 * Found;
}
} }
LoadSymbols = (0 < Found); if (0 != Found)
{
while (isspace(*p2))
{
p2++;
}
if ('=' == *p2)
{
p2++;
while (isspace(*p2))
{
p2++;
}
YesNo = toupper(*p2);
if ('N' == YesNo || 'F' == YesNo || '0' == YesNo)
{
Found = -1 * Found;
}
}
LoadSymbols = (0 < Found);
}
p1 = p2;
} }
p1 = p2;
}
RosSymInitKernelMode(); RosSymInitKernelMode();
}
} }
/* EOF */ /* EOF */