- Initialize the symbols for boot load driver before the driver entry routine is called.

- Store the symbols for boot load driver within the non paged pool.

svn path=/trunk/; revision=12830
This commit is contained in:
Hartmut Birr 2005-01-05 19:06:05 +00:00
parent 6f39b3e0e0
commit a91d61b02e
3 changed files with 90 additions and 86 deletions

View file

@ -548,6 +548,7 @@ KdbpSymFindCachedFile(IN PUNICODE_STRING FileName)
DPRINT("Current->FileName %wZ FileName %wZ\n", &Current->FileName, FileName); DPRINT("Current->FileName %wZ FileName %wZ\n", &Current->FileName, FileName);
if (RtlEqualUnicodeString(&Current->FileName, FileName, TRUE)) if (RtlEqualUnicodeString(&Current->FileName, FileName, TRUE))
{ {
Current->RefCount++;
KeReleaseSpinLock(&SymbolFileListLock, Irql); KeReleaseSpinLock(&SymbolFileListLock, Irql);
DPRINT("Found cached file!\n"); DPRINT("Found cached file!\n");
return Current; return Current;
@ -690,7 +691,6 @@ KdbpSymLoadModuleSymbols(IN PUNICODE_STRING FileName,
if (CachedSymbolFile != NULL) if (CachedSymbolFile != NULL)
{ {
DPRINT("Found cached symbol file %wZ\n", &SymFileName); DPRINT("Found cached symbol file %wZ\n", &SymFileName);
CachedSymbolFile->RefCount++;
SymbolInfo->FileBuffer = CachedSymbolFile->FileBuffer; SymbolInfo->FileBuffer = CachedSymbolFile->FileBuffer;
SymbolInfo->SymbolsBase = CachedSymbolFile->SymbolsBase; SymbolInfo->SymbolsBase = CachedSymbolFile->SymbolsBase;
SymbolInfo->SymbolsLength = CachedSymbolFile->SymbolsLength; SymbolInfo->SymbolsLength = CachedSymbolFile->SymbolsLength;
@ -897,76 +897,84 @@ KdbSymUnloadDriverSymbols(IN PMODULE_OBJECT ModuleObject)
* module. * module.
* Used to load ntoskrnl and hal symbols before the SystemRoot is available to us. * Used to load ntoskrnl and hal symbols before the SystemRoot is available to us.
* *
* \param ModuleLoadBase Base address of the loaded symbol file. * \param FileName Filename for which the symbols are loaded.
* \param FileName Filename of the symbol file.
* \param Length Length of the loaded symbol file/module.
*/ */
VOID VOID
KdbSymProcessSymbolFile(IN PVOID ModuleLoadBase, KdbSymProcessBootSymbols(IN PCHAR FileName)
IN PCHAR FileName,
IN ULONG Length)
{ {
PMODULE_OBJECT ModuleObject; PMODULE_OBJECT ModuleObject;
UNICODE_STRING ModuleName; UNICODE_STRING UnicodeString;
CHAR TmpBaseName[MAX_PATH]; PLOADER_MODULE KeLoaderModules = (PLOADER_MODULE)KeLoaderBlock.ModsAddr;
CHAR TmpFileName[MAX_PATH]; CHAR SymbolName[MAX_PATH];
PSYMBOLFILE_HEADER SymbolFileHeader; PSYMBOLFILE_HEADER SymbolFileHeader;
PIMAGE_SYMBOL_INFO SymbolInfo; PIMAGE_SYMBOL_INFO SymbolInfo;
ANSI_STRING AnsiString; ANSI_STRING AnsiString;
PCHAR Extension; PCHAR Extension;
ULONG i; ULONG i;
const char *KnownExtension[] = {".exe", ".sys", ".dll"};
DPRINT("Module %s is a symbol file\n", FileName); DPRINT("KdbSymProcessBootSymbols(%s)\n", FileName);
strncpy(TmpBaseName, FileName, MAX_PATH-1); RtlInitAnsiString(&AnsiString, FileName);
TmpBaseName[MAX_PATH-1] = '\0'; RtlAnsiStringToUnicodeString(&UnicodeString, &AnsiString, TRUE);
/* remove the extension '.sym' */ ModuleObject = LdrGetModuleObject(&UnicodeString);
Extension = strrchr(TmpBaseName, '.'); RtlFreeUnicodeString(&UnicodeString);
if (Extension && 0 == _stricmp(Extension, ".sym"))
{
*Extension = 0;
}
DPRINT("base: %s (Length %d)\n", TmpBaseName, Length);
for (i = 0; i < sizeof(KnownExtension) / sizeof(*KnownExtension); i++)
{
strcpy(TmpFileName, TmpBaseName);
strcat(TmpFileName, KnownExtension[i]);
RtlInitAnsiString(&AnsiString, TmpFileName);
RtlAnsiStringToUnicodeString(&ModuleName, &AnsiString, TRUE);
ModuleObject = LdrGetModuleObject(&ModuleName);
RtlFreeUnicodeString(&ModuleName);
if (ModuleObject)
{
break;
}
}
if (ModuleObject != NULL) if (ModuleObject != NULL)
{ {
SymbolInfo = (PIMAGE_SYMBOL_INFO) &ModuleObject->TextSection->SymbolInfo; strcpy(SymbolName, FileName);
if (SymbolInfo->FileBuffer != NULL) Extension = strrchr(SymbolName, '.');
if (Extension == NULL)
{
Extension = SymbolName + strlen(SymbolName);
}
strcpy(Extension, ".sym");
for (i = 0; i < KeLoaderBlock.ModsCount; i++)
{
if (KeLoaderModules[i].Reserved == 0 && !_stricmp(SymbolName, (PCHAR)KeLoaderModules[i].String))
{
break;
}
}
if (i < KeLoaderBlock.ModsCount)
{
KeLoaderModules[i].Reserved = 1;
SymbolInfo = (PIMAGE_SYMBOL_INFO) &ModuleObject->TextSection->SymbolInfo;
if (SymbolInfo->FileBuffer != NULL)
{ {
KdbpSymRemoveCachedFile(SymbolInfo); KdbpSymRemoveCachedFile(SymbolInfo);
} }
SymbolFileHeader = (PSYMBOLFILE_HEADER) ModuleLoadBase; SymbolFileHeader = ExAllocatePool(NonPagedPool, KeLoaderModules[i].ModEnd - KeLoaderModules[i].ModStart);
SymbolInfo->FileBuffer = ModuleLoadBase; if (SymbolFileHeader == NULL)
SymbolInfo->SymbolsBase = ModuleLoadBase + SymbolFileHeader->StabsOffset; {
SymbolInfo->SymbolsLength = SymbolFileHeader->StabsLength; DPRINT("Could not allocate memory for symbol file\n");
SymbolInfo->SymbolStringsBase = ModuleLoadBase + SymbolFileHeader->StabstrOffset; return;
SymbolInfo->SymbolStringsLength = SymbolFileHeader->StabstrLength; }
DPRINT("Installed stabs: %s@%08x-%08x (%08x-%08x,%08x)\n", memcpy(SymbolFileHeader,
(PVOID)KeLoaderModules[i].ModStart,
KeLoaderModules[i].ModEnd - KeLoaderModules[i].ModStart);
SymbolInfo->FileBuffer = SymbolFileHeader;
SymbolInfo->SymbolsBase = (PVOID)SymbolFileHeader + SymbolFileHeader->StabsOffset;
SymbolInfo->SymbolsLength = SymbolFileHeader->StabsLength;
SymbolInfo->SymbolStringsBase = (PVOID)SymbolFileHeader + SymbolFileHeader->StabstrOffset;
SymbolInfo->SymbolStringsLength = SymbolFileHeader->StabstrLength;
/* add file to cache */
RtlInitAnsiString(&AnsiString, SymbolName);
RtlAnsiStringToUnicodeString(&UnicodeString, &AnsiString, TRUE);
KdbpSymAddCachedFile(&UnicodeString, SymbolInfo);
RtlFreeUnicodeString(&UnicodeString);
DPRINT("Installed stabs: %s@%08x-%08x (%08x-%08x,%08x)\n",
FileName, FileName,
ModuleObject->Base, ModuleObject->Base,
ModuleObject->Length + ModuleObject->Base, ModuleObject->Length + ModuleObject->Base,
SymbolInfo->SymbolsBase, SymbolInfo->SymbolsBase,
SymbolInfo->SymbolsLength + SymbolInfo->SymbolsBase, SymbolInfo->SymbolsLength + SymbolInfo->SymbolsBase,
SymbolInfo->SymbolStringsBase); SymbolInfo->SymbolStringsBase);
} }
}
} }
/*! \brief Initializes the KDB symbols implementation. /*! \brief Initializes the KDB symbols implementation.

View file

@ -1,4 +1,4 @@
/* $Id: kd.h,v 1.29 2004/12/09 14:20:06 royce Exp $ /* $Id$
* *
* kernel debugger prototypes * kernel debugger prototypes
*/ */
@ -109,21 +109,20 @@ VOID KdInitializeMda(VOID);
VOID KdPrintMda(PCH pch); VOID KdPrintMda(PCH pch);
#if !defined(KDBG) && !defined(DBG) #if !defined(KDBG) && !defined(DBG)
# define KDB_LOADUSERMODULE_HOOK(LDRMOD) do { } while (0) # define KDB_LOADUSERMODULE_HOOK(LDRMOD) do { } while (0)
# define KDB_DELETEPROCESS_HOOK(PROCESS) do { } while (0) # define KDB_DELETEPROCESS_HOOK(PROCESS) do { } while (0)
# define KDB_LOADDRIVER_HOOK(FILENAME, MODULE) do { } while (0) # define KDB_LOADDRIVER_HOOK(FILENAME, MODULE) do { } while (0)
# define KDB_UNLOADDRIVER_HOOK(MODULE) do { } while (0) # define KDB_UNLOADDRIVER_HOOK(MODULE) do { } while (0)
# define KDB_LOADERINIT_HOOK(NTOS, HAL) do { } while (0) # define KDB_LOADERINIT_HOOK(NTOS, HAL) do { } while (0)
# define KDB_SYMBOLFILE_HOOK(LOADBASE, FILENAME, LENGTH) do { } while (0) # define KDB_SYMBOLFILE_HOOK(FILENAME) do { } while (0)
# define KDB_CREATE_THREAD_HOOK(CONTEXT) do { } while (0) # define KDB_CREATE_THREAD_HOOK(CONTEXT) do { } while (0)
#else #else
# define KDB_LOADUSERMODULE_HOOK(LDRMOD) KdbSymLoadUserModuleSymbols(LDRMOD) # define KDB_LOADUSERMODULE_HOOK(LDRMOD) KdbSymLoadUserModuleSymbols(LDRMOD)
# define KDB_DELETEPROCESS_HOOK(PROCESS) KdbSymFreeProcessSymbols(PROCESS) # define KDB_DELETEPROCESS_HOOK(PROCESS) KdbSymFreeProcessSymbols(PROCESS)
# define KDB_LOADDRIVER_HOOK(FILENAME, MODULE) KdbSymLoadDriverSymbols(FILENAME, MODULE) # define KDB_LOADDRIVER_HOOK(FILENAME, MODULE) KdbSymLoadDriverSymbols(FILENAME, MODULE)
# define KDB_UNLOADDRIVER_HOOK(MODULE) KdbSymUnloadDriverSymbols(MODULE) # define KDB_UNLOADDRIVER_HOOK(MODULE) KdbSymUnloadDriverSymbols(MODULE)
# define KDB_LOADERINIT_HOOK(NTOS, HAL) KdbSymInit(NTOS, HAL) # define KDB_LOADERINIT_HOOK(NTOS, HAL) KdbSymInit(NTOS, HAL)
# define KDB_SYMBOLFILE_HOOK(LOADBASE, FILENAME, LENGTH) \ # define KDB_SYMBOLFILE_HOOK(FILENAME) KdbSymProcessBootSymbols(FILENAME)
KdbSymProcessSymbolFile(LOADBASE, FILENAME, LENGTH)
/*#define KDB_CREATE_THREAD_HOOK(CONTEXT) \ /*#define KDB_CREATE_THREAD_HOOK(CONTEXT) \
KdbCreateThreadHook(CONTEXT) KdbCreateThreadHook(CONTEXT)
*/ */
@ -141,9 +140,7 @@ VOID
KdbSymUnloadDriverSymbols(IN PMODULE_OBJECT ModuleObject); KdbSymUnloadDriverSymbols(IN PMODULE_OBJECT ModuleObject);
VOID VOID
KdbSymProcessSymbolFile(IN PVOID ModuleLoadBase, KdbSymProcessBootSymbols(IN PCHAR FileName);
IN PCHAR FileName,
IN ULONG Length);
VOID VOID
KdbSymInit(IN PMODULE_TEXT_SECTION NtoskrnlTextSection, KdbSymInit(IN PMODULE_TEXT_SECTION NtoskrnlTextSection,

View file

@ -448,6 +448,8 @@ IopLoadServiceModule(
&ServiceImagePath, &ServiceImagePath,
ModuleObject); ModuleObject);
KDB_SYMBOLFILE_HOOK(SearchName);
break; break;
} }
} }
@ -1135,6 +1137,9 @@ IopInitializeBuiltinDriver(
return Status; return Status;
} }
/* Load symbols */
KDB_SYMBOLFILE_HOOK(FileName);
/* /*
* Strip the file extension from ServiceName * Strip the file extension from ServiceName
*/ */
@ -1205,13 +1210,11 @@ IopInitializeBootDrivers(VOID)
if (Extension == NULL) if (Extension == NULL)
Extension = ""; Extension = "";
if (!_stricmp(Extension, ".sym")) if (!_stricmp(Extension, ".exe") || !_stricmp(Extension, ".dll"))
{
/* Pass symbol files to kernel debugger */
KDB_SYMBOLFILE_HOOK((PVOID)ModuleStart, ModuleName, ModuleSize);
}
else if (!_stricmp(Extension, ".exe") || !_stricmp(Extension, ".dll"))
{ {
/* Process symbols for *.exe and *.dll */
KDB_SYMBOLFILE_HOOK(ModuleName);
/* Log *.exe and *.dll files */ /* Log *.exe and *.dll files */
RtlCreateUnicodeStringFromAsciiz(&DriverName, ModuleName); RtlCreateUnicodeStringFromAsciiz(&DriverName, ModuleName);
IopBootLog(&DriverName, TRUE); IopBootLog(&DriverName, TRUE);
@ -1232,20 +1235,16 @@ IopInitializeBootDrivers(VOID)
} }
BootDriverCount++; BootDriverCount++;
} }
}
/* /*
* Free memory for all boot files, except ntoskrnl.exe * Free memory for all boot files, except ntoskrnl.exe.
* and symbol files, if the kernel debugger is active */
*/ for (i = 1; i < KeLoaderBlock.ModsCount; i++)
if (i != 0 /* ntoskrnl.exe is always the first module */ {
#if defined(DBG) || defined(KDBG)
&& _stricmp(Extension, ".sym") MiFreeBootDriverMemory((PVOID)KeLoaderModules[i].ModStart,
#endif KeLoaderModules[i].ModEnd - KeLoaderModules[i].ModStart);
)
{
MiFreeBootDriverMemory((PVOID)KeLoaderModules[i].ModStart,
KeLoaderModules[i].ModEnd - KeLoaderModules[i].ModStart);
}
} }
if (BootDriverCount == 0) if (BootDriverCount == 0)