- Get rid of the KDB_MODULE_INFO and operate with LDR_DATA_TABLE_ENTRYs directly.

This saves us from some copy steps and unneeded search operations.
- Fix loading HAL.DLL symbols.
  This module is not guaranteed to be the second one in PsLoadedModuleList due to the kernel loading bootvid.dll.
- Don't duplicate code in KdbpSymFindModule and KdbpSymFindUserModule. Use a helper function instead and call it twice from KdbpSymFindModule.
- Get rid of KdbpSymFindModuleByAddress, KdbpSymFindModuleByName and KdbpSymFindModuleByIndex. Instead use a single KdbpSymFindModule for all three variants.
- Remove some unused functions and defines.

svn path=/trunk/; revision=43118
This commit is contained in:
Colin Finck 2009-09-22 21:31:55 +00:00
parent 7f582de62c
commit 4842b49169
6 changed files with 83 additions and 408 deletions

View file

@ -68,43 +68,15 @@ KdPortPutByteEx(
#if defined(KDBG) || DBG #if defined(KDBG) || DBG
VOID
KdbSymLoadUserModuleSymbols(
IN PLDR_DATA_TABLE_ENTRY LdrModule);
VOID
KdbSymFreeProcessSymbols(
IN PEPROCESS Process);
VOID
KdbSymLoadDriverSymbols(
IN PUNICODE_STRING Filename,
IN PLDR_DATA_TABLE_ENTRY Module
);
VOID
KdbSymUnloadDriverSymbols(
IN PLDR_DATA_TABLE_ENTRY ModuleObject);
VOID
KdbSymProcessBootSymbols(
IN PANSI_STRING AnsiFileName,
IN BOOLEAN FullName,
IN BOOLEAN LoadFromFile);
VOID VOID
KdbSymProcessSymbols( KdbSymProcessSymbols(
IN PANSI_STRING FileName, IN PLDR_DATA_TABLE_ENTRY LdrEntry);
IN PKD_SYMBOLS_INFO SymbolInfo);
BOOLEAN BOOLEAN
KdbSymPrintAddress( KdbSymPrintAddress(
IN PVOID Address); IN PVOID Address);
VOID
KdbDeleteProcessHook(
IN PEPROCESS Process);
NTSTATUS NTSTATUS
KdbSymGetAddressInformation( KdbSymGetAddressInformation(
IN PROSSYM_INFO RosSymInfo, IN PROSSYM_INFO RosSymInfo,
@ -113,46 +85,16 @@ KdbSymGetAddressInformation(
OUT PCH FileName OPTIONAL, OUT PCH FileName OPTIONAL,
OUT PCH FunctionName OPTIONAL OUT PCH FunctionName OPTIONAL
); );
typedef struct _KDB_MODULE_INFO
{
WCHAR Name[256];
ULONG_PTR Base;
ULONG Size;
PROSSYM_INFO RosSymInfo;
}
KDB_MODULE_INFO, *PKDB_MODULE_INFO;
/* MACROS FOR NON-KDBG BUILDS ************************************************/
# define KDB_LOADUSERMODULE_HOOK(LDRMOD) KdbSymLoadUserModuleSymbols(LDRMOD)
# define KDB_LOADDRIVER_HOOK(FILENAME, MODULE) KdbSymLoadDriverSymbols(FILENAME, MODULE)
# define KDB_UNLOADDRIVER_HOOK(MODULE) KdbSymUnloadDriverSymbols(MODULE)
# define KDB_SYMBOLFILE_HOOK(FILENAME, SYMBOLINFO) KdbSymProcessSymbols((FILENAME), (SYMBOLINFO))
#else
# define KDB_LOADUSERMODULE_HOOK(LDRMOD) do { } while (0)
# define KDB_LOADDRIVER_HOOK(FILENAME, MODULE) do { } while (0)
# define KDB_UNLOADDRIVER_HOOK(MODULE) do { } while (0)
# define KDB_SYMBOLFILE_HOOK(FILENAME, SYMBOLINFO) do { } while (0)
# define KDB_CREATE_THREAD_HOOK(CONTEXT) do { } while (0)
#endif
#if defined(KDBG) || DBG
# define KeRosPrintAddress(ADDRESS) KdbSymPrintAddress(ADDRESS)
#else
# define KeRosPrintAddress(ADDRESS) KiRosPrintAddress(ADDRESS)
#endif #endif
#ifdef KDBG #ifdef KDBG
# define KdbInit() KdbpCliInit() # define KdbInit() KdbpCliInit()
# define KdbModuleLoaded(FILENAME) KdbpCliModuleLoaded(FILENAME) # define KdbModuleLoaded(FILENAME) KdbpCliModuleLoaded(FILENAME)
# define KDB_DELETEPROCESS_HOOK(PROCESS) KdbDeleteProcessHook(PROCESS)
#else #else
# define KdbEnterDebuggerException(ER, PM, C, TF, F) kdHandleException # define KdbEnterDebuggerException(ER, PM, C, TF, F) kdHandleException
# define KdbInit() do { } while (0) # define KdbInit() do { } while (0)
# define KdbEnter() do { } while (0) # define KdbEnter() do { } while (0)
# define KdbModuleLoaded(X) do { } while (0) # define KdbModuleLoaded(X) do { } while (0)
# define KDB_DELETEPROCESS_HOOK(PROCESS) do { } while (0)
#endif #endif
/* KD ROUTINES ***************************************************************/ /* KD ROUTINES ***************************************************************/

View file

@ -135,9 +135,13 @@ KdpEnterDebuggerException(IN PKTRAP_FRAME TrapFrame,
} }
else if (ExceptionCommand == BREAKPOINT_LOAD_SYMBOLS) else if (ExceptionCommand == BREAKPOINT_LOAD_SYMBOLS)
{ {
#ifdef KDBG
PLDR_DATA_TABLE_ENTRY LdrEntry;
/* Load symbols. Currently implemented only for KDBG! */ /* Load symbols. Currently implemented only for KDBG! */
KDB_SYMBOLFILE_HOOK((PANSI_STRING)ExceptionRecord->ExceptionInformation[1], if(KdbpSymFindModule(((PKD_SYMBOLS_INFO)ExceptionRecord->ExceptionInformation[2])->BaseOfDll, NULL, -1, &LdrEntry))
(PKD_SYMBOLS_INFO)ExceptionRecord->ExceptionInformation[2]); KdbSymProcessSymbols(LdrEntry);
#endif
} }
/* This we can handle: simply bump EIP */ /* This we can handle: simply bump EIP */

View file

@ -1677,15 +1677,6 @@ continue_execution:
return ContinueType; return ContinueType;
} }
VOID
KdbDeleteProcessHook(
IN PEPROCESS Process)
{
KdbSymFreeProcessSymbols(Process);
/* FIXME: Delete breakpoints for process */
}
VOID VOID
NTAPI NTAPI
KdbpGetCommandLineSettings( KdbpGetCommandLineSettings(

View file

@ -142,16 +142,11 @@ KdbpRpnEvaluateParsedExpression(
/* from kdb_symbols.c */ /* from kdb_symbols.c */
BOOLEAN BOOLEAN
KdbpSymFindModuleByAddress(IN PVOID Address, KdbpSymFindModule(
OUT PKDB_MODULE_INFO pInfo); IN PVOID Address OPTIONAL,
IN LPCWSTR Name OPTIONAL,
BOOLEAN IN INT Index OPTIONAL,
KdbpSymFindModuleByName(IN LPCWSTR Name, OUT PLDR_DATA_TABLE_ENTRY* pLdrEntry);
OUT PKDB_MODULE_INFO pInfo);
BOOLEAN
KdbpSymFindModuleByIndex(IN INT Index,
OUT PKDB_MODULE_INFO pInfo);
/* from kdb.c */ /* from kdb.c */

View file

@ -1476,7 +1476,7 @@ KdbpCmdMod(
{ {
ULONGLONG Result = 0; ULONGLONG Result = 0;
ULONG_PTR Address; ULONG_PTR Address;
KDB_MODULE_INFO Info; PLDR_DATA_TABLE_ENTRY LdrEntry;
BOOLEAN DisplayOnlyOneModule = FALSE; BOOLEAN DisplayOnlyOneModule = FALSE;
INT i = 0; INT i = 0;
@ -1498,7 +1498,7 @@ KdbpCmdMod(
Address = (ULONG_PTR)Result; Address = (ULONG_PTR)Result;
if (!KdbpSymFindModuleByAddress((PVOID)Address, &Info)) if (!KdbpSymFindModule((PVOID)Address, NULL, -1, &LdrEntry))
{ {
KdbpPrint("No module containing address 0x%p found!\n", Address); KdbpPrint("No module containing address 0x%p found!\n", Address);
return TRUE; return TRUE;
@ -1508,7 +1508,7 @@ KdbpCmdMod(
} }
else else
{ {
if (!KdbpSymFindModuleByIndex(0, &Info)) if (!KdbpSymFindModule(NULL, NULL, 0, &LdrEntry))
{ {
ULONG_PTR ntoskrnlBase = ((ULONG_PTR)KdbpCmdMod) & 0xfff00000; ULONG_PTR ntoskrnlBase = ((ULONG_PTR)KdbpCmdMod) & 0xfff00000;
KdbpPrint(" Base Size Name\n"); KdbpPrint(" Base Size Name\n");
@ -1522,14 +1522,11 @@ KdbpCmdMod(
KdbpPrint(" Base Size Name\n"); KdbpPrint(" Base Size Name\n");
for (;;) for (;;)
{ {
KdbpPrint(" %08x %08x %ws\n", Info.Base, Info.Size, Info.Name); KdbpPrint(" %08x %08x %wZ\n", LdrEntry->DllBase, LdrEntry->SizeOfImage, &LdrEntry->BaseDllName);
if ((!DisplayOnlyOneModule && !KdbpSymFindModuleByIndex(i++, &Info)) || if(DisplayOnlyOneModule || !KdbpSymFindModule(NULL, NULL, i++, &LdrEntry))
DisplayOnlyOneModule)
{
break; break;
} }
}
return TRUE; return TRUE;
} }

View file

@ -5,6 +5,7 @@
* PURPOSE: Getting symbol information... * PURPOSE: Getting symbol information...
* *
* PROGRAMMERS: David Welch (welch@cwcom.net) * PROGRAMMERS: David Welch (welch@cwcom.net)
* Colin Finck (colin@reactos.org)
*/ */
/* INCLUDES *****************************************************************/ /* INCLUDES *****************************************************************/
@ -32,174 +33,80 @@ BOOLEAN KdbpSymbolsInitialized = FALSE;
/* FUNCTIONS ****************************************************************/ /* FUNCTIONS ****************************************************************/
/*! \brief Find a user-mode module... static BOOLEAN
KdbpSymSearchModuleList(
IN PLIST_ENTRY current_entry,
IN PLIST_ENTRY end_entry,
IN PLONG Count,
IN PVOID Address,
IN LPCWSTR Name,
IN INT Index,
OUT PLDR_DATA_TABLE_ENTRY* pLdrEntry)
{
while (current_entry && current_entry != end_entry)
{
*pLdrEntry = CONTAINING_RECORD(current_entry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks);
if ((Address && Address >= (PVOID)(*pLdrEntry)->DllBase && Address < (PVOID)((ULONG_PTR)(*pLdrEntry)->DllBase + (*pLdrEntry)->SizeOfImage)) ||
(Name && !_wcsnicmp((*pLdrEntry)->BaseDllName.Buffer, Name, (*pLdrEntry)->BaseDllName.Length / sizeof(WCHAR))) ||
(Index >= 0 && (*Count)++ == Index))
{
return TRUE;
}
current_entry = current_entry->Flink;
}
return FALSE;
}
/*! \brief Find a module...
* *
* \param Address If \a Address is not NULL the module containing \a Address * \param Address If \a Address is not NULL the module containing \a Address
* is searched. * is searched.
* \param Name If \a Name is not NULL the module named \a Name will be * \param Name If \a Name is not NULL the module named \a Name will be
* searched. * searched.
* \param Index If \a Index is >= 0 the Index'th module will be returned. * \param Index If \a Index is >= 0 the Index'th module will be returned.
* \param pInfo Pointer to a KDB_MODULE_INFO which is filled. * \param pLdrEntry Pointer to a PLDR_DATA_TABLE_ENTRY which is filled.
* *
* \retval TRUE Module was found, \a pInfo was filled. * \retval TRUE Module was found, \a pLdrEntry was filled.
* \retval FALSE No module was found. * \retval FALSE No module was found.
*
* \sa KdbpSymFindModule
*/ */
static BOOLEAN BOOLEAN
KdbpSymFindUserModule(
IN PVOID Address OPTIONAL,
IN LPCWSTR Name OPTIONAL,
IN INT Index OPTIONAL,
OUT PKDB_MODULE_INFO pInfo)
{
PLIST_ENTRY current_entry;
PLDR_DATA_TABLE_ENTRY current;
PEPROCESS CurrentProcess;
PPEB Peb = NULL;
INT Count = 0;
INT Length;
if (!KdbpSymbolsInitialized)
return FALSE;
CurrentProcess = PsGetCurrentProcess();
if (CurrentProcess)
Peb = CurrentProcess->Peb;
if (!Peb || !Peb->Ldr)
return FALSE;
current_entry = Peb->Ldr->InLoadOrderModuleList.Flink;
while (current_entry != &Peb->Ldr->InLoadOrderModuleList && current_entry)
{
current = CONTAINING_RECORD(current_entry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks);
Length = min(current->BaseDllName.Length / sizeof(WCHAR), 255);
if ((Address && (Address >= (PVOID)current->DllBase &&
Address < (PVOID)((char *)current->DllBase + current->SizeOfImage))) ||
(Name && _wcsnicmp(current->BaseDllName.Buffer, Name, Length) == 0) ||
(Index >= 0 && Count++ == Index))
{
wcsncpy(pInfo->Name, current->BaseDllName.Buffer, Length);
pInfo->Name[Length] = L'\0';
pInfo->Base = (ULONG_PTR)current->DllBase;
pInfo->Size = current->SizeOfImage;
pInfo->RosSymInfo = current->PatchInformation;
return TRUE;
}
current_entry = current_entry->Flink;
}
return FALSE;
}
/*! \brief Find a kernel-mode module...
*
* Works like \a KdbpSymFindUserModule.
*
* \sa KdbpSymFindUserModule
*/
static BOOLEAN
KdbpSymFindModule( KdbpSymFindModule(
IN PVOID Address OPTIONAL, IN PVOID Address OPTIONAL,
IN LPCWSTR Name OPTIONAL, IN LPCWSTR Name OPTIONAL,
IN INT Index OPTIONAL, IN INT Index OPTIONAL,
OUT PKDB_MODULE_INFO pInfo) OUT PLDR_DATA_TABLE_ENTRY* pLdrEntry)
{ {
PLIST_ENTRY current_entry; LONG Count = 0;
PLDR_DATA_TABLE_ENTRY current; PEPROCESS CurrentProcess;
INT Count = 0;
INT Length;
if (!KdbpSymbolsInitialized) /* First try to look up the module in the kernel module list. */
return FALSE; if(KdbpSymSearchModuleList(PsLoadedModuleList.Flink,
&PsLoadedModuleList,
current_entry = PsLoadedModuleList.Flink; &Count,
Address,
while (current_entry != &PsLoadedModuleList) Name,
Index,
pLdrEntry))
{ {
current = CONTAINING_RECORD(current_entry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks);
Length = min(current->BaseDllName.Length / sizeof(WCHAR), 255);
if ((Address && (Address >= (PVOID)current->DllBase &&
Address < (PVOID)((ULONG_PTR)current->DllBase + current->SizeOfImage))) ||
(Name && _wcsnicmp(current->BaseDllName.Buffer, Name, Length) == 0) ||
(Index >= 0 && Count++ == Index))
{
wcsncpy(pInfo->Name, current->BaseDllName.Buffer, Length);
pInfo->Name[Length] = L'\0';
pInfo->Base = (ULONG_PTR)current->DllBase;
pInfo->Size = current->SizeOfImage;
pInfo->RosSymInfo = current->PatchInformation;
return TRUE; return TRUE;
} }
current_entry = current_entry->Flink; /* That didn't succeed. Try the module list of the current process now. */
} CurrentProcess = PsGetCurrentProcess();
return KdbpSymFindUserModule(Address, Name, Index-Count, pInfo); if(!CurrentProcess || !CurrentProcess->Peb || !CurrentProcess->Peb->Ldr)
} return FALSE;
/*! \brief Find module by address... return KdbpSymSearchModuleList(CurrentProcess->Peb->Ldr->InLoadOrderModuleList.Flink,
* &CurrentProcess->Peb->Ldr->InLoadOrderModuleList,
* \param Address Any address inside the module to look for. &Count,
* \param pInfo Pointer to a KDB_MODULE_INFO struct which is filled on Address,
* success. Name,
* Index,
* \retval TRUE Success - module found. pLdrEntry);
* \retval FALSE Failure - module not found.
*
* \sa KdbpSymFindModuleByName
* \sa KdbpSymFindModuleByIndex
*/
BOOLEAN
KdbpSymFindModuleByAddress(
IN PVOID Address,
OUT PKDB_MODULE_INFO pInfo)
{
return KdbpSymFindModule(Address, NULL, -1, pInfo);
}
/*! \brief Find module by name...
*
* \param Name Name of the module to look for.
* \param pInfo Pointer to a KDB_MODULE_INFO struct which is filled on
* success.
*
* \retval TRUE Success - module found.
* \retval FALSE Failure - module not found.
*
* \sa KdbpSymFindModuleByAddress
* \sa KdbpSymFindModuleByIndex
*/
BOOLEAN
KdbpSymFindModuleByName(
IN LPCWSTR Name,
OUT PKDB_MODULE_INFO pInfo)
{
return KdbpSymFindModule(NULL, Name, -1, pInfo);
}
/*! \brief Find module by index...
*
* \param Index Index of the module to return.
* \param pInfo Pointer to a KDB_MODULE_INFO struct which is filled on
* success.
*
* \retval TRUE Success - module found.
* \retval FALSE Failure - module not found.
*
* \sa KdbpSymFindModuleByName
* \sa KdbpSymFindModuleByAddress
*/
BOOLEAN
KdbpSymFindModuleByIndex(
IN INT Index,
OUT PKDB_MODULE_INFO pInfo)
{
return KdbpSymFindModule(NULL, NULL, Index, pInfo);
} }
/*! \brief Print address... /*! \brief Print address...
@ -217,30 +124,30 @@ BOOLEAN
KdbSymPrintAddress( KdbSymPrintAddress(
IN PVOID Address) IN PVOID Address)
{ {
KDB_MODULE_INFO Info; PLDR_DATA_TABLE_ENTRY LdrEntry;
ULONG_PTR RelativeAddress; ULONG_PTR RelativeAddress;
NTSTATUS Status; NTSTATUS Status;
ULONG LineNumber; ULONG LineNumber;
CHAR FileName[256]; CHAR FileName[256];
CHAR FunctionName[256]; CHAR FunctionName[256];
if (!KdbpSymbolsInitialized || !KdbpSymFindModuleByAddress(Address, &Info)) if (!KdbpSymbolsInitialized || !KdbpSymFindModule(Address, NULL, -1, &LdrEntry))
return FALSE; return FALSE;
RelativeAddress = (ULONG_PTR) Address - Info.Base; RelativeAddress = (ULONG_PTR)Address - (ULONG_PTR)LdrEntry->DllBase;
Status = KdbSymGetAddressInformation(Info.RosSymInfo, Status = KdbSymGetAddressInformation(LdrEntry->PatchInformation,
RelativeAddress, RelativeAddress,
&LineNumber, &LineNumber,
FileName, FileName,
FunctionName); FunctionName);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
{ {
DbgPrint("<%ws:%x (%s:%d (%s))>", DbgPrint("<%wZ:%x (%s:%d (%s))>",
Info.Name, RelativeAddress, FileName, LineNumber, FunctionName); &LdrEntry->BaseDllName, RelativeAddress, FileName, LineNumber, FunctionName);
} }
else else
{ {
DbgPrint("<%ws:%x>", Info.Name, RelativeAddress); DbgPrint("<%wZ:%x>", &LdrEntry->BaseDllName, RelativeAddress);
} }
return TRUE; return TRUE;
@ -480,156 +387,10 @@ KdbpSymLoadModuleSymbols(
DPRINT("Installed symbols: %wZ %p\n", FileName, *RosSymInfo); DPRINT("Installed symbols: %wZ %p\n", FileName, *RosSymInfo);
} }
/*! \brief Unloads symbol info.
*
* \param RosSymInfo Pointer to the symbol info to unload.
*
* \sa KdbpSymLoadModuleSymbols
*/
static VOID
KdbpSymUnloadModuleSymbols(
IN PROSSYM_INFO RosSymInfo)
{
DPRINT("Unloading symbols\n");
if (RosSymInfo)
KdbpSymRemoveCachedFile(RosSymInfo);
}
/*! \brief Load symbol info for a user module.
*
* \param LdrModule Pointer to the module to load symbols for.
*/
VOID
KdbSymLoadUserModuleSymbols(
IN PLDR_DATA_TABLE_ENTRY LdrModule)
{
static WCHAR Prefix[] = L"\\??\\";
UNICODE_STRING KernelName;
DPRINT("LdrModule %p\n", LdrModule);
LdrModule->PatchInformation = NULL;
KernelName.MaximumLength = sizeof(Prefix) + LdrModule->FullDllName.Length;
KernelName.Length = KernelName.MaximumLength - sizeof(WCHAR);
KernelName.Buffer = ExAllocatePoolWithTag(NonPagedPool, KernelName.MaximumLength, TAG_KDBS);
if (!KernelName.Buffer)
return;
memcpy(KernelName.Buffer, Prefix, sizeof(Prefix) - sizeof(WCHAR));
memcpy(KernelName.Buffer + sizeof(Prefix) / sizeof(WCHAR) - 1, LdrModule->FullDllName.Buffer, LdrModule->FullDllName.Length);
KernelName.Buffer[KernelName.Length / sizeof(WCHAR)] = L'\0';
KdbpSymLoadModuleSymbols(&KernelName, (PROSSYM_INFO*)&LdrModule->PatchInformation);
ExFreePool(KernelName.Buffer);
}
/*! \brief Frees all symbols loaded for a process.
*
* \param Process Pointer to a process.
*/
VOID
KdbSymFreeProcessSymbols(
IN PEPROCESS Process)
{
PLIST_ENTRY CurrentEntry;
PLDR_DATA_TABLE_ENTRY Current;
PEPROCESS CurrentProcess;
PPEB Peb;
CurrentProcess = PsGetCurrentProcess();
if (CurrentProcess != Process)
KeAttachProcess(&Process->Pcb);
Peb = Process->Peb;
ASSERT(Peb);
ASSERT(Peb->Ldr);
CurrentEntry = Peb->Ldr->InLoadOrderModuleList.Flink;
while (CurrentEntry != &Peb->Ldr->InLoadOrderModuleList && CurrentEntry)
{
Current = CONTAINING_RECORD(CurrentEntry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks);
KdbpSymUnloadModuleSymbols(Current->PatchInformation);
CurrentEntry = CurrentEntry->Flink;
}
if (CurrentProcess != Process)
KeDetachProcess();
}
/*! \brief Load symbol info for a driver.
*
* \param Filename Filename of the driver.
* \param Module Pointer to the driver LDR_DATA_TABLE_ENTRY.
*/
VOID
KdbSymLoadDriverSymbols(
IN PUNICODE_STRING Filename,
IN PLDR_DATA_TABLE_ENTRY Module)
{
/* Load symbols for the image if available */
DPRINT("Loading driver %wZ symbols (driver @ %08x)\n", Filename, Module->DllBase);
Module->PatchInformation = NULL;
KdbpSymLoadModuleSymbols(Filename, (PROSSYM_INFO*)&Module->PatchInformation);
}
/*! \brief Unloads symbol info for a driver.
*
* \param ModuleObject Pointer to the driver LDR_DATA_TABLE_ENTRY.
*/
VOID
KdbSymUnloadDriverSymbols(
IN PLDR_DATA_TABLE_ENTRY ModuleObject)
{
/* Unload symbols for module if available */
KdbpSymUnloadModuleSymbols(ModuleObject->PatchInformation);
ModuleObject->PatchInformation = NULL;
}
VOID VOID
KdbSymProcessSymbols( KdbSymProcessSymbols(
IN PANSI_STRING AnsiFileName, IN PLDR_DATA_TABLE_ENTRY LdrEntry)
IN PKD_SYMBOLS_INFO SymbolInfo)
{ {
BOOLEAN Found = FALSE;
PLIST_ENTRY ListHead, NextEntry;
PLDR_DATA_TABLE_ENTRY LdrEntry = NULL;
//DPRINT("KdbSymProcessSymbols(%Z)\n", AnsiFileName);
/* We use PsLoadedModuleList here, otherwise (in case of
using KeLoaderBlock) all our data will be just lost */
ListHead = &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 (SymbolInfo->BaseOfDll == LdrEntry->DllBase)
{
Found = TRUE;
break;
}
/* Go to the next one */
NextEntry = NextEntry->Flink;
}
/* Exit if we didn't find the module requested */
if (!Found)
return;
DPRINT("Found LdrEntry=%p\n", LdrEntry);
if (!LoadSymbols) if (!LoadSymbols)
{ {
LdrEntry->PatchInformation = NULL; LdrEntry->PatchInformation = NULL;
@ -689,9 +450,7 @@ KdbInitialize(
PCHAR p1, p2; PCHAR p1, p2;
SHORT Found = FALSE; SHORT Found = FALSE;
CHAR YesNo; CHAR YesNo;
LIST_ENTRY *ModuleEntry; PLDR_DATA_TABLE_ENTRY LdrEntry;
PLDR_DATA_TABLE_ENTRY DataTableEntry;
KD_SYMBOLS_INFO SymbolsInfo;
DPRINT("KdbSymInit() BootPhase=%d\n", BootPhase); DPRINT("KdbSymInit() BootPhase=%d\n", BootPhase);
@ -765,29 +524,16 @@ KdbInitialize(
} }
else if (BootPhase == 1) else if (BootPhase == 1)
{ {
/* Load symbols for NTOSKRNL.EXE */ /* Load symbols for NTOSKRNL.EXE.
ModuleEntry = &KeLoaderBlock->LoadOrderListHead; It is always the first module in PsLoadedModuleList. KeLoaderBlock can't be used here as its content is just temporary. */
DataTableEntry = CONTAINING_RECORD(ModuleEntry, LdrEntry = CONTAINING_RECORD(PsLoadedModuleList.Flink, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks);
LDR_DATA_TABLE_ENTRY, InLoadOrderLinks); KdbSymProcessSymbols(LdrEntry);
SymbolsInfo.BaseOfDll = DataTableEntry->DllBase; /* Also load them for HAL.DLL.
SymbolsInfo.CheckSum = DataTableEntry->CheckSum; This module has no fixed position, so search for it. */
SymbolsInfo.ProcessId = 0; if(KdbpSymFindModule(NULL, L"HAL.DLL", -1, &LdrEntry))
SymbolsInfo.SizeOfImage = DataTableEntry->SizeOfImage; KdbSymProcessSymbols(LdrEntry);
KdbSymProcessSymbols(NULL, &SymbolsInfo);
/* and HAL.DLL */
ModuleEntry = ModuleEntry->Flink;
DataTableEntry = CONTAINING_RECORD(ModuleEntry,
LDR_DATA_TABLE_ENTRY, InLoadOrderLinks);
SymbolsInfo.BaseOfDll = DataTableEntry->DllBase;
SymbolsInfo.CheckSum = DataTableEntry->CheckSum;
SymbolsInfo.ProcessId = 0;
SymbolsInfo.SizeOfImage = DataTableEntry->SizeOfImage;
KdbSymProcessSymbols(NULL, &SymbolsInfo);
KdbpSymbolsInitialized = TRUE; KdbpSymbolsInitialized = TRUE;
} }
} }