Implement /LOADSYMBOLS and /NOLOADSYMBOLS command line option
[reactos.git] / reactos / ntoskrnl / kdbg / kdb_symbols.c
index d1ae975..b705204 100644 (file)
@@ -1,9 +1,9 @@
-/* 
+/*
  * 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;
@@ -41,6 +26,7 @@ typedef struct _IMAGE_SYMBOL_INFO_CACHE {
   PROSSYM_INFO RosSymInfo;
 } IMAGE_SYMBOL_INFO_CACHE, *PIMAGE_SYMBOL_INFO_CACHE;
 
+static BOOLEAN LoadSymbols;
 static LIST_ENTRY SymbolFileListHead;
 static KSPIN_LOCK SymbolFileListLock;
 
@@ -79,7 +65,7 @@ KdbpSymFindUserModule(IN PVOID Address  OPTIONAL,
       Peb = CurrentProcess->Peb;
     }
 
-  if (Peb == NULL)
+  if (Peb == NULL || Peb->Ldr == NULL)
     {
       return FALSE;
     }
@@ -427,10 +413,14 @@ KdbpSymLoadModuleSymbols(IN PUNICODE_STRING FileName,
   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);
@@ -454,7 +444,7 @@ KdbpSymLoadModuleSymbols(IN PUNICODE_STRING 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);
@@ -507,6 +497,8 @@ KdbSymLoadUserModuleSymbols(IN PLDR_MODULE LdrModule)
   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);
@@ -519,8 +511,6 @@ KdbSymLoadUserModuleSymbols(IN PLDR_MODULE LdrModule)
          LdrModule->FullDllName.Length);
   KernelName.Buffer[KernelName.Length / sizeof(WCHAR)] = L'\0';
 
-  LdrModule->RosSymInfo = NULL;
-
   KdbpSymLoadModuleSymbols(&KernelName, &LdrModule->RosSymInfo);
 
   ExFreePool(KernelName.Buffer);
@@ -629,6 +619,12 @@ KdbSymProcessBootSymbols(IN PCHAR FileName)
 
   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))
@@ -687,12 +683,63 @@ VOID
 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();
 }