mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 13:26:17 +00:00
- 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:
parent
f290d37f66
commit
a0e07982e6
2 changed files with 139 additions and 122 deletions
|
@ -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
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue