-/*
+/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/dbg/kdb_symbols.c
* PURPOSE: Getting symbol information...
- *
+ *
* PROGRAMMERS: David Welch (welch@cwcom.net)
*/
#include <ddk/ntddk.h>
#include <roscfg.h>
-#include <internal/ntoskrnl.h>
-#include <internal/ke.h>
-#include <internal/i386/segment.h>
-#include <internal/i386/mm.h>
-#include <internal/module.h>
-#include <internal/mm.h>
-#include <internal/ps.h>
-#include <internal/trap.h>
-#include <ntdll/ldr.h>
-#include <internal/safe.h>
-#include <internal/kd.h>
-#include <rosrtl/string.h>
+#include <ntoskrnl.h>
#include <reactos/rossym.h>
#define NDEBUG
#include <internal/debug.h>
-#include <internal/kdb.h>
-
/* GLOBALS ******************************************************************/
-#define TAG_KDBS TAG('K', 'D', 'B', 'S')
-
typedef struct _IMAGE_SYMBOL_INFO_CACHE {
LIST_ENTRY ListEntry;
ULONG RefCount;
PROSSYM_INFO RosSymInfo;
} IMAGE_SYMBOL_INFO_CACHE, *PIMAGE_SYMBOL_INFO_CACHE;
+static BOOLEAN LoadSymbols;
static LIST_ENTRY SymbolFileListHead;
static KSPIN_LOCK SymbolFileListLock;
Peb = CurrentProcess->Peb;
}
- if (Peb == NULL)
+ if (Peb == NULL || Peb->Ldr == NULL)
{
return FALSE;
}
NTSTATUS Status;
IO_STATUS_BLOCK IoStatusBlock;
-#ifdef KDBG
/* Allow KDB to break on module load */
KdbModuleLoaded(FileName);
-#endif
+
+ if (! LoadSymbols)
+ {
+ *RosSymInfo = NULL;
+ return;
+ }
/* Try to find cached (already loaded) symbol file */
*RosSymInfo = KdbpSymFindCachedFile(FileName);
&ObjectAttributes,
&IoStatusBlock,
FILE_SHARE_READ|FILE_SHARE_WRITE,
- FILE_SYNCHRONOUS_IO_NONALERT|FILE_NO_INTERMEDIATE_BUFFERING);
+ FILE_SYNCHRONOUS_IO_NONALERT);
if (!NT_SUCCESS(Status))
{
DPRINT("Could not open image file: %wZ\n", &FileName);
UNICODE_STRING KernelName;
DPRINT("LdrModule %p\n", LdrModule);
+ LdrModule->RosSymInfo = NULL;
+
KernelName.MaximumLength = sizeof(Prefix) + LdrModule->FullDllName.Length;
KernelName.Length = KernelName.MaximumLength - sizeof(WCHAR);
KernelName.Buffer = ExAllocatePoolWithTag(PagedPool, KernelName.MaximumLength, TAG_KDBS);
LdrModule->FullDllName.Length);
KernelName.Buffer[KernelName.Length / sizeof(WCHAR)] = L'\0';
- LdrModule->RosSymInfo = NULL;
-
KdbpSymLoadModuleSymbols(&KernelName, &LdrModule->RosSymInfo);
ExFreePool(KernelName.Buffer);
if (ModuleObject != NULL)
{
+ if (! LoadSymbols)
+ {
+ ModuleObject->TextSection->RosSymInfo = NULL;
+ return;
+ }
+
for (i = 0; i < KeLoaderBlock.ModsCount; i++)
{
if (0 == _stricmp(FileName, (PCHAR)KeLoaderModules[i].String))
KdbSymInit(IN PMODULE_TEXT_SECTION NtoskrnlTextSection,
IN PMODULE_TEXT_SECTION LdrHalTextSection)
{
+ PCHAR p1, p2;
+ int Found;
+ char YesNo;
+
NtoskrnlTextSection->RosSymInfo = NULL;
LdrHalTextSection->RosSymInfo = NULL;
InitializeListHead(&SymbolFileListHead);
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();
}