mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 17:34:57 +00:00
Implement /LOADSYMBOLS and /NOLOADSYMBOLS command line option
Note to self: send shipping address for coffee mug to Alex svn path=/trunk/; revision=15814
This commit is contained in:
parent
170980ae6f
commit
be1ac79fa0
1 changed files with 66 additions and 2 deletions
|
@ -26,6 +26,7 @@ typedef struct _IMAGE_SYMBOL_INFO_CACHE {
|
||||||
PROSSYM_INFO RosSymInfo;
|
PROSSYM_INFO RosSymInfo;
|
||||||
} IMAGE_SYMBOL_INFO_CACHE, *PIMAGE_SYMBOL_INFO_CACHE;
|
} IMAGE_SYMBOL_INFO_CACHE, *PIMAGE_SYMBOL_INFO_CACHE;
|
||||||
|
|
||||||
|
static BOOLEAN LoadSymbols;
|
||||||
static LIST_ENTRY SymbolFileListHead;
|
static LIST_ENTRY SymbolFileListHead;
|
||||||
static KSPIN_LOCK SymbolFileListLock;
|
static KSPIN_LOCK SymbolFileListLock;
|
||||||
|
|
||||||
|
@ -415,6 +416,12 @@ KdbpSymLoadModuleSymbols(IN PUNICODE_STRING FileName,
|
||||||
/* Allow KDB to break on module load */
|
/* Allow KDB to break on module load */
|
||||||
KdbModuleLoaded(FileName);
|
KdbModuleLoaded(FileName);
|
||||||
|
|
||||||
|
if (! LoadSymbols)
|
||||||
|
{
|
||||||
|
*RosSymInfo = NULL;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Try to find cached (already loaded) symbol file */
|
/* Try to find cached (already loaded) symbol file */
|
||||||
*RosSymInfo = KdbpSymFindCachedFile(FileName);
|
*RosSymInfo = KdbpSymFindCachedFile(FileName);
|
||||||
if (*RosSymInfo != NULL)
|
if (*RosSymInfo != NULL)
|
||||||
|
@ -490,6 +497,8 @@ KdbSymLoadUserModuleSymbols(IN PLDR_MODULE LdrModule)
|
||||||
UNICODE_STRING KernelName;
|
UNICODE_STRING KernelName;
|
||||||
DPRINT("LdrModule %p\n", LdrModule);
|
DPRINT("LdrModule %p\n", LdrModule);
|
||||||
|
|
||||||
|
LdrModule->RosSymInfo = NULL;
|
||||||
|
|
||||||
KernelName.MaximumLength = sizeof(Prefix) + LdrModule->FullDllName.Length;
|
KernelName.MaximumLength = sizeof(Prefix) + LdrModule->FullDllName.Length;
|
||||||
KernelName.Length = KernelName.MaximumLength - sizeof(WCHAR);
|
KernelName.Length = KernelName.MaximumLength - sizeof(WCHAR);
|
||||||
KernelName.Buffer = ExAllocatePoolWithTag(PagedPool, KernelName.MaximumLength, TAG_KDBS);
|
KernelName.Buffer = ExAllocatePoolWithTag(PagedPool, KernelName.MaximumLength, TAG_KDBS);
|
||||||
|
@ -502,8 +511,6 @@ KdbSymLoadUserModuleSymbols(IN PLDR_MODULE LdrModule)
|
||||||
LdrModule->FullDllName.Length);
|
LdrModule->FullDllName.Length);
|
||||||
KernelName.Buffer[KernelName.Length / sizeof(WCHAR)] = L'\0';
|
KernelName.Buffer[KernelName.Length / sizeof(WCHAR)] = L'\0';
|
||||||
|
|
||||||
LdrModule->RosSymInfo = NULL;
|
|
||||||
|
|
||||||
KdbpSymLoadModuleSymbols(&KernelName, &LdrModule->RosSymInfo);
|
KdbpSymLoadModuleSymbols(&KernelName, &LdrModule->RosSymInfo);
|
||||||
|
|
||||||
ExFreePool(KernelName.Buffer);
|
ExFreePool(KernelName.Buffer);
|
||||||
|
@ -612,6 +619,12 @@ KdbSymProcessBootSymbols(IN PCHAR FileName)
|
||||||
|
|
||||||
if (ModuleObject != NULL)
|
if (ModuleObject != NULL)
|
||||||
{
|
{
|
||||||
|
if (! LoadSymbols)
|
||||||
|
{
|
||||||
|
ModuleObject->TextSection->RosSymInfo = NULL;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < KeLoaderBlock.ModsCount; i++)
|
for (i = 0; i < KeLoaderBlock.ModsCount; i++)
|
||||||
{
|
{
|
||||||
if (0 == _stricmp(FileName, (PCHAR)KeLoaderModules[i].String))
|
if (0 == _stricmp(FileName, (PCHAR)KeLoaderModules[i].String))
|
||||||
|
@ -670,12 +683,63 @@ VOID
|
||||||
KdbSymInit(IN PMODULE_TEXT_SECTION NtoskrnlTextSection,
|
KdbSymInit(IN PMODULE_TEXT_SECTION NtoskrnlTextSection,
|
||||||
IN PMODULE_TEXT_SECTION LdrHalTextSection)
|
IN PMODULE_TEXT_SECTION LdrHalTextSection)
|
||||||
{
|
{
|
||||||
|
PCHAR p1, p2;
|
||||||
|
int Found;
|
||||||
|
char YesNo;
|
||||||
|
|
||||||
NtoskrnlTextSection->RosSymInfo = NULL;
|
NtoskrnlTextSection->RosSymInfo = NULL;
|
||||||
LdrHalTextSection->RosSymInfo = NULL;
|
LdrHalTextSection->RosSymInfo = NULL;
|
||||||
|
|
||||||
InitializeListHead(&SymbolFileListHead);
|
InitializeListHead(&SymbolFileListHead);
|
||||||
KeInitializeSpinLock(&SymbolFileListLock);
|
KeInitializeSpinLock(&SymbolFileListLock);
|
||||||
|
|
||||||
|
#ifdef DBG
|
||||||
|
LoadSymbols = TRUE;
|
||||||
|
#else
|
||||||
|
LoadSymbols = FALSE;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Check the command line for /LOADSYMBOLS, /NOLOADSYMBOLS,
|
||||||
|
* /LOADSYMBOLS={YES|NO}, /NOLOADSYMBOLS={YES|NO} */
|
||||||
|
p1 = (PCHAR) KeLoaderBlock.CommandLine;
|
||||||
|
while('\0' != *p1 && NULL != (p2 = strchr(p1, '/')))
|
||||||
|
{
|
||||||
|
p2++;
|
||||||
|
Found = 0;
|
||||||
|
if (0 == _strnicmp(p2, "LOADSYMBOLS", 11))
|
||||||
|
{
|
||||||
|
Found = +1;
|
||||||
|
p2 += 11;
|
||||||
|
}
|
||||||
|
else if (0 == _strnicmp(p2, "NOLOADSYMBOLS", 13))
|
||||||
|
{
|
||||||
|
Found = -1;
|
||||||
|
p2 += 13;
|
||||||
|
}
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
RosSymInitKernelMode();
|
RosSymInitKernelMode();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue