mirror of
https://github.com/reactos/reactos.git
synced 2025-08-02 00:43:11 +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);
|
||||
|
||||
VOID
|
||||
KdbSymProcessBootSymbols(IN PUNICODE_STRING FileName);
|
||||
|
||||
VOID
|
||||
KdbSymInit(
|
||||
IN PLDR_DATA_TABLE_ENTRY NtoskrnlTextSection,
|
||||
IN PLDR_DATA_TABLE_ENTRY LdrHalTextSection
|
||||
);
|
||||
KdbSymProcessBootSymbols(IN PANSI_STRING FileName);
|
||||
|
||||
BOOLEAN
|
||||
KdbSymPrintAddress(IN PVOID Address);
|
||||
|
@ -215,6 +209,13 @@ KdpGdbStubInit(
|
|||
struct _KD_DISPATCH_TABLE *DispatchTable,
|
||||
ULONG BootPhase);
|
||||
|
||||
VOID
|
||||
STDCALL
|
||||
KdbSymInit(
|
||||
struct _KD_DISPATCH_TABLE *DispatchTable,
|
||||
ULONG BootPhase);
|
||||
|
||||
|
||||
/* KD ROUTINES ***************************************************************/
|
||||
|
||||
BOOLEAN
|
||||
|
|
|
@ -587,47 +587,44 @@ KdbSymUnloadDriverSymbols(IN PLDR_DATA_TABLE_ENTRY ModuleObject)
|
|||
* \param FileName Filename for which the symbols are loaded.
|
||||
*/
|
||||
VOID
|
||||
KdbSymProcessBootSymbols(IN PUNICODE_STRING FileName)
|
||||
KdbSymProcessBootSymbols(IN PANSI_STRING AnsiFileName)
|
||||
{
|
||||
PLDR_DATA_TABLE_ENTRY ModuleObject;
|
||||
BOOLEAN Found = FALSE;
|
||||
BOOLEAN IsRaw;
|
||||
PLIST_ENTRY ListHead, NextEntry;
|
||||
PLDR_DATA_TABLE_ENTRY LdrEntry;
|
||||
PUNICODE_STRING ModuleName = FileName;
|
||||
UNICODE_STRING NtosSymName = RTL_CONSTANT_STRING(L"ntoskrnl.sym");
|
||||
UNICODE_STRING NtosName = RTL_CONSTANT_STRING(L"ntoskrnl.exe");
|
||||
BOOLEAN Found = FALSE;
|
||||
PLIST_ENTRY ListHead, NextEntry;
|
||||
PLDR_DATA_TABLE_ENTRY LdrEntry = NULL;
|
||||
WCHAR Buffer[MAX_PATH];
|
||||
UNICODE_STRING ModuleName;
|
||||
NTSTATUS Status;
|
||||
|
||||
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;
|
||||
IsRaw = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
IsRaw = FALSE;
|
||||
}
|
||||
|
||||
ModuleObject = NULL;
|
||||
|
||||
if (ModuleObject != NULL)
|
||||
{
|
||||
if (! LoadSymbols)
|
||||
{
|
||||
ModuleObject->PatchInformation = NULL;
|
||||
DPRINT1("Failed to convert Ansi to Unicode with Status=0x%08X, Length=%d\n",
|
||||
Status, ModuleName.Length);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
ListHead = &KeLoaderBlock->LoadOrderListHead;
|
||||
NextEntry = ListHead->Flink;
|
||||
while (ListHead != NextEntry)
|
||||
{
|
||||
/* Get the entry */
|
||||
LdrEntry = CONTAINING_RECORD(NextEntry,
|
||||
LDR_DATA_TABLE_ENTRY,
|
||||
InLoadOrderLinks);
|
||||
DPRINT("KdbSymProcessBootSymbols(%wZ)\n", &ModuleName);
|
||||
|
||||
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;
|
||||
break;
|
||||
|
@ -637,112 +634,131 @@ KdbSymProcessBootSymbols(IN PUNICODE_STRING FileName)
|
|||
NextEntry = NextEntry->Flink;
|
||||
}
|
||||
|
||||
if (Found)
|
||||
{
|
||||
if (ModuleObject->PatchInformation != NULL)
|
||||
{
|
||||
KdbpSymRemoveCachedFile(ModuleObject->PatchInformation);
|
||||
}
|
||||
/* Exit if we didn't find the module requested */
|
||||
if (!Found)
|
||||
return;
|
||||
|
||||
if (IsRaw)
|
||||
{
|
||||
DPRINT("Data: %p %p %wZ\n", LdrEntry->DllBase, LdrEntry->SizeOfImage, &LdrEntry->FullDllName);
|
||||
if (! RosSymCreateFromRaw(LdrEntry->DllBase,
|
||||
LdrEntry->SizeOfImage,
|
||||
(PROSSYM_INFO*)&ModuleObject->PatchInformation))
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (! RosSymCreateFromMem(LdrEntry->DllBase,
|
||||
LdrEntry->SizeOfImage,
|
||||
(PROSSYM_INFO*)&ModuleObject->PatchInformation))
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
DPRINT("Found LdrEntry=%p\n", LdrEntry);
|
||||
if (!LoadSymbols)
|
||||
{
|
||||
LdrEntry->PatchInformation = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
/* add file to cache */
|
||||
KdbpSymAddCachedFile(FileName, ModuleObject->PatchInformation);
|
||||
/* Remove symbol info if it already exists */
|
||||
if (LdrEntry->PatchInformation != NULL)
|
||||
{
|
||||
KdbpSymRemoveCachedFile(LdrEntry->PatchInformation);
|
||||
}
|
||||
|
||||
DPRINT("Installed symbols: %wZ@%08x-%08x %p\n",
|
||||
FileName,
|
||||
ModuleObject->DllBase,
|
||||
ModuleObject->SizeOfImage + (ULONG)ModuleObject->DllBase,
|
||||
ModuleObject->PatchInformation);
|
||||
}
|
||||
}
|
||||
/* Load new symbol information */
|
||||
if (! RosSymCreateFromMem(LdrEntry->DllBase,
|
||||
LdrEntry->SizeOfImage,
|
||||
(PROSSYM_INFO*)&LdrEntry->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.
|
||||
*
|
||||
* \param NtoskrnlModuleObject LDR_DATA_TABLE_ENTRY of ntoskrnl.exe
|
||||
* \param LdrHalModuleObject LDR_DATA_TABLE_ENTRY of hal.sys
|
||||
*/
|
||||
VOID
|
||||
KdbSymInit(IN PLDR_DATA_TABLE_ENTRY NtoskrnlModuleObject,
|
||||
IN PLDR_DATA_TABLE_ENTRY LdrHalModuleObject)
|
||||
STDCALL
|
||||
KdbSymInit(PKD_DISPATCH_TABLE DispatchTable,
|
||||
ULONG BootPhase)
|
||||
{
|
||||
PCHAR p1, p2;
|
||||
int Found;
|
||||
char YesNo;
|
||||
PCHAR p1, p2;
|
||||
int Found;
|
||||
char YesNo;
|
||||
|
||||
NtoskrnlModuleObject->PatchInformation = NULL;
|
||||
LdrHalModuleObject->PatchInformation = NULL;
|
||||
DPRINT("KdbSymInit() BootPhase=%d\n", BootPhase);
|
||||
|
||||
InitializeListHead(&SymbolFileListHead);
|
||||
KeInitializeSpinLock(&SymbolFileListLock);
|
||||
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);
|
||||
KeInitializeSpinLock(&SymbolFileListLock);
|
||||
|
||||
#ifdef DBG
|
||||
LoadSymbols = TRUE;
|
||||
LoadSymbols = TRUE;
|
||||
#else
|
||||
LoadSymbols = FALSE;
|
||||
LoadSymbols = FALSE;
|
||||
#endif
|
||||
|
||||
/* Check the command line for /LOADSYMBOLS, /NOLOADSYMBOLS,
|
||||
* /LOADSYMBOLS={YES|NO}, /NOLOADSYMBOLS={YES|NO} */
|
||||
p1 = KeLoaderBlock->LoadOptions;
|
||||
while('\0' != *p1 && NULL != (p2 = strchr(p1, '/')))
|
||||
{
|
||||
p2++;
|
||||
Found = 0;
|
||||
if (0 == _strnicmp(p2, "LOADSYMBOLS", 11))
|
||||
/* Check the command line for /LOADSYMBOLS, /NOLOADSYMBOLS,
|
||||
* /LOADSYMBOLS={YES|NO}, /NOLOADSYMBOLS={YES|NO} */
|
||||
ASSERT(KeLoaderBlock);
|
||||
p1 = KeLoaderBlock->LoadOptions;
|
||||
while('\0' != *p1 && NULL != (p2 = strchr(p1, '/')))
|
||||
{
|
||||
Found = +1;
|
||||
p2 += 11;
|
||||
}
|
||||
else if (0 == _strnicmp(p2, "NOLOADSYMBOLS", 13))
|
||||
{
|
||||
Found = -1;
|
||||
p2 += 13;
|
||||
}
|
||||
if (0 != Found)
|
||||
{
|
||||
while (isspace(*p2))
|
||||
p2++;
|
||||
Found = 0;
|
||||
if (0 == _strnicmp(p2, "LOADSYMBOLS", 11))
|
||||
{
|
||||
p2++;
|
||||
Found = +1;
|
||||
p2 += 11;
|
||||
}
|
||||
if ('=' == *p2)
|
||||
else if (0 == _strnicmp(p2, "NOLOADSYMBOLS", 13))
|
||||
{
|
||||
p2++;
|
||||
while (isspace(*p2))
|
||||
{
|
||||
p2++;
|
||||
}
|
||||
YesNo = toupper(*p2);
|
||||
if ('N' == YesNo || 'F' == YesNo || '0' == YesNo)
|
||||
{
|
||||
Found = -1 * Found;
|
||||
}
|
||||
Found = -1;
|
||||
p2 += 13;
|
||||
}
|
||||
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 */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue