3 * Copyright (C) 1998, 1999, 2000, 2001 ReactOS Team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 * PROJECT: ReactOS kernel
21 * FILE: ntoskrnl/ke/i386/exp.c
22 * PURPOSE: Handling exceptions
23 * PROGRAMMER: David Welch (welch@cwcom.net)
28 /* INCLUDES *****************************************************************/
30 #include <ddk/ntddk.h>
32 #include <internal/ntoskrnl.h>
33 #include <internal/ke.h>
34 #include <internal/i386/segment.h>
35 #include <internal/i386/mm.h>
36 #include <internal/module.h>
37 #include <internal/mm.h>
38 #include <internal/ps.h>
39 #include <internal/trap.h>
40 #include <ntdll/ldr.h>
41 #include <internal/safe.h>
42 #include <internal/kd.h>
45 #include <internal/debug.h>
47 /* GLOBALS ******************************************************************/
49 typedef struct _SYMBOLFILE_HEADER {
50 unsigned long StabsOffset;
51 unsigned long StabsLength;
52 unsigned long StabstrOffset;
53 unsigned long StabstrLength;
54 } SYMBOLFILE_HEADER, *PSYMBOLFILE_HEADER;
56 typedef struct _IMAGE_SYMBOL_INFO_CACHE {
58 UNICODE_STRING FullName;
62 PVOID SymbolStringsBase;
63 ULONG SymbolStringsLength;
64 } IMAGE_SYMBOL_INFO_CACHE, *PIMAGE_SYMBOL_INFO_CACHE;
67 typedef struct _STAB_ENTRY {
68 unsigned long n_strx; /* index into string table of name */
69 unsigned char n_type; /* type of symbol */
70 unsigned char n_other; /* misc info (usually empty) */
71 unsigned short n_desc; /* description field */
72 unsigned long n_value; /* value of symbol */
73 } _STAB_ENTRY, *PSTAB_ENTRY;
77 * Value - Relative virtual address
83 * Value - Relative virtual address
88 * String - First containing a '/' is the compillation directory (CD)
89 * Not containing a '/' is a source file relative to CD
93 static LIST_ENTRY SymbolListHead;
94 static KSPIN_LOCK SymbolListLock;
97 LdrGetAddressInformation(IN PIMAGE_SYMBOL_INFO SymbolInfo,
98 IN ULONG_PTR RelativeAddress,
99 OUT PULONG LineNumber,
100 OUT PCH FileName OPTIONAL,
101 OUT PCH FunctionName OPTIONAL);
104 KdbLdrUnloadModuleSymbols(PIMAGE_SYMBOL_INFO SymbolInfo);
106 /* FUNCTIONS ****************************************************************/
109 KdbPrintUserAddress(PVOID address)
111 PLIST_ENTRY current_entry;
113 PEPROCESS CurrentProcess;
115 ULONG_PTR RelativeAddress;
119 CHAR FunctionName[256];
121 CurrentProcess = PsGetCurrentProcess();
122 if (NULL != CurrentProcess)
124 Peb = CurrentProcess->Peb;
129 DbgPrint("<%x>", address);
133 current_entry = Peb->Ldr->InLoadOrderModuleList.Flink;
135 while (current_entry != &Peb->Ldr->InLoadOrderModuleList &&
136 current_entry != NULL)
139 CONTAINING_RECORD(current_entry, LDR_MODULE, InLoadOrderModuleList);
141 if (address >= (PVOID)current->BaseAddress &&
142 address < (PVOID)(current->BaseAddress + current->SizeOfImage))
144 RelativeAddress = (ULONG_PTR) address - (ULONG_PTR)current->BaseAddress;
145 Status = LdrGetAddressInformation(¤t->SymbolInfo,
150 if (NT_SUCCESS(Status))
152 DbgPrint("<%wZ: %x (%s:%d (%s))>",
153 ¤t->BaseDllName, RelativeAddress, FileName, LineNumber, FunctionName);
157 DbgPrint("<%wZ: %x>", ¤t->BaseDllName, RelativeAddress);
162 current_entry = current_entry->Flink;
168 KdbPrintAddress(PVOID address)
170 PLIST_ENTRY current_entry;
171 MODULE_TEXT_SECTION* current;
172 extern LIST_ENTRY ModuleTextListHead;
173 ULONG_PTR RelativeAddress;
177 CHAR FunctionName[256];
179 current_entry = ModuleTextListHead.Flink;
181 while (current_entry != &ModuleTextListHead &&
182 current_entry != NULL)
185 CONTAINING_RECORD(current_entry, MODULE_TEXT_SECTION, ListEntry);
187 if (address >= (PVOID)current->Base &&
188 address < (PVOID)(current->Base + current->Length))
190 RelativeAddress = (ULONG_PTR) address - current->Base;
191 Status = LdrGetAddressInformation(¤t->SymbolInfo,
196 if (NT_SUCCESS(Status))
198 DbgPrint("<%ws: %x (%s:%d (%s))>",
199 current->Name, RelativeAddress, FileName, LineNumber, FunctionName);
203 DbgPrint("<%ws: %x>", current->Name, RelativeAddress);
207 current_entry = current_entry->Flink;
213 KdbFreeSymbolsProcess(PEPROCESS Process)
215 PLIST_ENTRY CurrentEntry;
217 PIMAGE_SYMBOL_INFO SymbolInfo;
218 PEPROCESS CurrentProcess;
221 CurrentProcess = PsGetCurrentProcess();
222 if (CurrentProcess != Process)
224 KeAttachProcess(Process);
230 CurrentEntry = Peb->Ldr->InLoadOrderModuleList.Flink;
231 while (CurrentEntry != &Peb->Ldr->InLoadOrderModuleList &&
232 CurrentEntry != NULL)
234 Current = CONTAINING_RECORD(CurrentEntry, LDR_MODULE,
235 InLoadOrderModuleList);
237 SymbolInfo = &Current->SymbolInfo;
238 KdbLdrUnloadModuleSymbols(SymbolInfo);
240 CurrentEntry = CurrentEntry->Flink;
242 if (CurrentProcess != Process)
249 KdbLdrInit(MODULE_TEXT_SECTION* NtoskrnlTextSection,
250 MODULE_TEXT_SECTION* LdrHalTextSection)
252 RtlZeroMemory(&NtoskrnlTextSection->SymbolInfo,
253 sizeof(NtoskrnlTextSection->SymbolInfo));
254 NtoskrnlTextSection->SymbolInfo.ImageBase =
255 NtoskrnlTextSection->OptionalHeader->ImageBase;
256 NtoskrnlTextSection->SymbolInfo.ImageSize = NtoskrnlTextSection->Length;
258 RtlZeroMemory(&LdrHalTextSection->SymbolInfo,
259 sizeof(LdrHalTextSection->SymbolInfo));
260 LdrHalTextSection->SymbolInfo.ImageBase =
261 LdrHalTextSection->OptionalHeader->ImageBase;
262 LdrHalTextSection->SymbolInfo.ImageSize = LdrHalTextSection->Length;
264 InitializeListHead(&SymbolListHead);
265 KeInitializeSpinLock(&SymbolListLock);
269 LdrpParseImageSymbols(PIMAGE_SYMBOL_INFO SymbolInfo)
270 /* Note: It is important that the symbol strings buffer not be released after
271 this function is called because the strings are still referenced */
273 PSYMBOL CurrentFileNameSymbol;
274 PSYMBOL CurrentFunctionSymbol;
275 PSYMBOL CurrentLineNumberSymbol;
277 PSTAB_ENTRY StabEntry;
280 ULONG_PTR FunRelativeAddress;
286 DPRINT("Parsing symbols.\n");
288 SymbolInfo->FileNameSymbols.SymbolCount = 0;
289 SymbolInfo->FileNameSymbols.Symbols = NULL;
290 SymbolInfo->FunctionSymbols.SymbolCount = 0;
291 SymbolInfo->FunctionSymbols.Symbols = NULL;
292 SymbolInfo->LineNumberSymbols.SymbolCount = 0;
293 SymbolInfo->LineNumberSymbols.Symbols = NULL;
294 StabsEnd = SymbolInfo->SymbolsBase + SymbolInfo->SymbolsLength;
295 StabEntry = (PSTAB_ENTRY) SymbolInfo->SymbolsBase;
296 ImageBase = SymbolInfo->ImageBase;
297 FunRelativeAddress = 0;
299 CurrentFileNameSymbol = NULL;
300 CurrentFunctionSymbol = NULL;
301 CurrentLineNumberSymbol = NULL;
302 while ((ULONG_PTR) StabEntry < (ULONG_PTR) StabsEnd)
306 if (StabEntry->n_type == N_FUN)
308 if (StabEntry->n_desc > 0)
310 assert(StabEntry->n_value >= ImageBase);
312 FunRelativeAddress = StabEntry->n_value - ImageBase;
313 FunLineNumber = StabEntry->n_desc;
315 Symbol = ExAllocatePool(NonPagedPool, sizeof(SYMBOL));
318 Symbol->SymbolType = ST_FUNCTION;
319 Symbol->RelativeAddress = FunRelativeAddress;
320 Symbol->LineNumber = FunLineNumber;
321 String = (PCHAR)SymbolInfo->SymbolStringsBase + StabEntry->n_strx;
322 RtlInitAnsiString(&Symbol->Name, String);
324 DPRINT("FUN found. '%s' %d @ %x\n",
325 Symbol->Name.Buffer, FunLineNumber, FunRelativeAddress);
328 else if (StabEntry->n_type == N_SLINE)
330 Symbol = ExAllocatePool(NonPagedPool, sizeof(SYMBOL));
333 Symbol->SymbolType = ST_LINENUMBER;
334 Symbol->RelativeAddress = FunRelativeAddress + StabEntry->n_value;
335 Symbol->LineNumber = StabEntry->n_desc;
337 DPRINT("SLINE found. %d @ %x\n",
338 Symbol->LineNumber, Symbol->RelativeAddress);
340 else if (StabEntry->n_type == N_SO)
342 Symbol = ExAllocatePool(NonPagedPool, sizeof(SYMBOL));
345 Symbol->SymbolType = ST_FILENAME;
346 Symbol->RelativeAddress = StabEntry->n_value - ImageBase;
347 Symbol->LineNumber = 0;
348 String = (PCHAR)SymbolInfo->SymbolStringsBase + StabEntry->n_strx;
349 RtlInitAnsiString(&Symbol->Name, String);
351 DPRINT("SO found. '%s' @ %x\n",
352 Symbol->Name.Buffer, Symbol->RelativeAddress);
357 switch (Symbol->SymbolType)
360 if (SymbolInfo->FileNameSymbols.Symbols == NULL)
361 SymbolInfo->FileNameSymbols.Symbols = Symbol;
363 CurrentFileNameSymbol->Next = Symbol;
365 CurrentFileNameSymbol = Symbol;
367 SymbolInfo->FileNameSymbols.SymbolCount++;
370 if (SymbolInfo->FunctionSymbols.Symbols == NULL)
371 SymbolInfo->FunctionSymbols.Symbols = Symbol;
373 CurrentFunctionSymbol->Next = Symbol;
375 CurrentFunctionSymbol = Symbol;
377 SymbolInfo->FunctionSymbols.SymbolCount++;
380 if (SymbolInfo->LineNumberSymbols.Symbols == NULL)
381 SymbolInfo->LineNumberSymbols.Symbols = Symbol;
383 CurrentLineNumberSymbol->Next = Symbol;
385 CurrentLineNumberSymbol = Symbol;
387 SymbolInfo->LineNumberSymbols.SymbolCount++;
397 LdrpGetFileName(IN PIMAGE_SYMBOL_INFO SymbolInfo,
398 IN ULONG_PTR RelativeAddress,
402 ULONG_PTR NextAddress;
405 Symbol = SymbolInfo->FileNameSymbols.Symbols;
406 while (Symbol != NULL)
408 NextSymbol = Symbol->Next;
409 if (NextSymbol != NULL)
410 NextAddress = NextSymbol->RelativeAddress;
412 NextAddress = SymbolInfo->ImageSize;
414 DPRINT("FN SEARCH: Type %d RelativeAddress %x >= Symbol->RelativeAddress %x < NextAddress %x\n",
415 Symbol->SymbolType, RelativeAddress, Symbol->RelativeAddress, NextAddress);
417 if ((Symbol->SymbolType == ST_FILENAME) &&
418 (RelativeAddress >= Symbol->RelativeAddress) &&
419 (RelativeAddress < NextAddress))
421 DPRINT("FN found\n");
422 strcpy(FileName, Symbol->Name.Buffer);
423 return STATUS_SUCCESS;
428 DPRINT("FN not found\n");
430 return STATUS_UNSUCCESSFUL;
434 LdrpGetFunctionName(IN PIMAGE_SYMBOL_INFO SymbolInfo,
435 IN ULONG_PTR RelativeAddress,
436 OUT PCH FunctionName)
439 ULONG_PTR NextAddress;
442 Symbol = SymbolInfo->FunctionSymbols.Symbols;
443 while (Symbol != NULL)
445 NextSymbol = Symbol->Next;
446 if (NextSymbol != NULL)
447 NextAddress = NextSymbol->RelativeAddress;
449 NextAddress = SymbolInfo->ImageSize;
451 DPRINT("FUN SEARCH: Type %d RelativeAddress %x >= Symbol->RelativeAddress %x < NextAddress %x\n",
452 Symbol->SymbolType, RelativeAddress, Symbol->RelativeAddress, NextAddress);
454 if ((Symbol->SymbolType == ST_FUNCTION) &&
455 (RelativeAddress >= Symbol->RelativeAddress) &&
456 (RelativeAddress < NextAddress))
461 DPRINT("FUN found\n");
463 /* Remove the extra information from the function name */
464 ExtraInfo = strchr(Symbol->Name.Buffer, ':');
465 if (ExtraInfo != NULL)
466 Length = ExtraInfo - Symbol->Name.Buffer;
468 Length = strlen(Symbol->Name.Buffer);
470 strncpy(FunctionName, Symbol->Name.Buffer, Length);
471 FunctionName[Length]=0;
472 return STATUS_SUCCESS;
477 DPRINT("FUN not found\n");
479 return STATUS_UNSUCCESSFUL;
483 LdrpGetLineNumber(IN PIMAGE_SYMBOL_INFO SymbolInfo,
484 IN ULONG_PTR RelativeAddress,
485 OUT PULONG LineNumber)
488 ULONG_PTR NextAddress;
491 Symbol = SymbolInfo->LineNumberSymbols.Symbols;
492 while (Symbol != NULL)
494 NextSymbol = Symbol->Next;
495 if (NextSymbol != NULL)
496 NextAddress = NextSymbol->RelativeAddress;
498 NextAddress = SymbolInfo->ImageSize;
500 DPRINT("LN SEARCH: Type %d RelativeAddress %x >= Symbol->RelativeAddress %x < NextAddress %x\n",
501 Symbol->SymbolType, RelativeAddress, Symbol->RelativeAddress, NextAddress);
503 if ((Symbol->SymbolType == ST_LINENUMBER) &&
504 (RelativeAddress >= Symbol->RelativeAddress) &&
505 (RelativeAddress < NextAddress))
507 DPRINT("LN found\n");
508 *LineNumber = Symbol->LineNumber;
509 return STATUS_SUCCESS;
514 DPRINT("LN not found\n");
516 return STATUS_UNSUCCESSFUL;
520 LdrGetAddressInformation(IN PIMAGE_SYMBOL_INFO SymbolInfo,
521 IN ULONG_PTR RelativeAddress,
522 OUT PULONG LineNumber,
523 OUT PCH FileName OPTIONAL,
524 OUT PCH FunctionName OPTIONAL)
530 DPRINT("RelativeAddress %p\n", RelativeAddress);
532 if (RelativeAddress >= SymbolInfo->ImageSize)
534 DPRINT("Address is not within .text section. RelativeAddress %p Length 0x%x\n",
535 RelativeAddress, SymbolInfo->ImageSize);
536 return STATUS_UNSUCCESSFUL;
539 if (!AreSymbolsParsed(SymbolInfo))
541 LdrpParseImageSymbols(SymbolInfo);
544 Status = LdrpGetLineNumber(SymbolInfo, RelativeAddress, LineNumber);
545 if (!NT_SUCCESS(Status))
552 Status = LdrpGetFileName(SymbolInfo, RelativeAddress, FileName);
553 if (!NT_SUCCESS(Status))
555 strcpy(FileName, "");
561 Status = LdrpGetFunctionName(SymbolInfo, RelativeAddress, FunctionName);
562 if (!NT_SUCCESS(Status))
564 strcpy(FunctionName, "");
568 return STATUS_SUCCESS;
572 LdrpLoadModuleSymbols(PUNICODE_STRING FileName,
573 PIMAGE_SYMBOL_INFO SymbolInfo)
575 FILE_STANDARD_INFORMATION FileStdInfo;
576 OBJECT_ATTRIBUTES ObjectAttributes;
577 WCHAR TmpFileName[MAX_PATH];
578 UNICODE_STRING SymFileName;
584 IO_STATUS_BLOCK IoStatusBlock;
585 PSYMBOLFILE_HEADER SymbolFileHeader;
587 /* Get the path to the symbol store */
588 wcscpy(TmpFileName, L"\\SystemRoot\\symbols\\");
590 /* Get the symbol filename from the module name */
591 Start = wcsrchr(FileName->Buffer, L'\\');
593 Start = FileName->Buffer;
597 Ext = wcsrchr(FileName->Buffer, L'.');
599 Length = Ext - Start;
601 Length = wcslen(Start);
603 wcsncat(TmpFileName, Start, Length);
604 wcscat(TmpFileName, L".sym");
605 RtlInitUnicodeString(&SymFileName, TmpFileName);
608 InitializeObjectAttributes(&ObjectAttributes,
614 Status = ZwOpenFile(&FileHandle,
619 FILE_SYNCHRONOUS_IO_NONALERT);
620 if (!NT_SUCCESS(Status))
622 DPRINT("Could not open symbol file: %wZ\n", &SymFileName);
626 CPRINT("Loading symbols from %wZ...\n", &SymFileName);
628 /* Get the size of the file */
629 Status = ZwQueryInformationFile(FileHandle,
633 FileStandardInformation);
634 if (!NT_SUCCESS(Status))
636 DPRINT("Could not get file size\n");
641 /* Allocate nonpageable memory for symbol file */
642 FileBuffer = ExAllocatePool(NonPagedPool,
643 FileStdInfo.EndOfFile.u.LowPart);
645 if (FileBuffer == NULL)
647 DPRINT("Could not allocate memory for symbol file\n");
652 /* Load file into memory chunk */
653 Status = ZwReadFile(FileHandle,
657 FileStdInfo.EndOfFile.u.LowPart,
659 if (!NT_SUCCESS(Status))
661 DPRINT("Could not read symbol file into memory (Status 0x%x)\n", Status);
662 ExFreePool(FileBuffer);
669 SymbolFileHeader = (PSYMBOLFILE_HEADER) FileBuffer;
670 SymbolInfo->FileBuffer = FileBuffer;
671 SymbolInfo->SymbolsBase = FileBuffer + SymbolFileHeader->StabsOffset;
672 SymbolInfo->SymbolsLength = SymbolFileHeader->StabsLength;
673 SymbolInfo->SymbolStringsBase = FileBuffer + SymbolFileHeader->StabstrOffset;
674 SymbolInfo->SymbolStringsLength = SymbolFileHeader->StabstrLength;
678 KdbLdrUnloadModuleSymbols(PIMAGE_SYMBOL_INFO SymbolInfo)
683 DPRINT("Unloading symbols\n");
685 if (SymbolInfo != NULL)
687 Symbol = SymbolInfo->FileNameSymbols.Symbols;
688 while (Symbol != NULL)
690 NextSymbol = Symbol->Next;
691 RtlFreeAnsiString(&Symbol->Name);
696 SymbolInfo->FileNameSymbols.SymbolCount = 0;
697 SymbolInfo->FileNameSymbols.Symbols = NULL;
699 Symbol = SymbolInfo->FunctionSymbols.Symbols;
700 while (Symbol != NULL)
702 NextSymbol = Symbol->Next;
703 RtlFreeAnsiString(&Symbol->Name);
708 SymbolInfo->FunctionSymbols.SymbolCount = 0;
709 SymbolInfo->FunctionSymbols.Symbols = NULL;
711 Symbol = SymbolInfo->LineNumberSymbols.Symbols;
712 while (Symbol != NULL)
714 NextSymbol = Symbol->Next;
715 RtlFreeAnsiString(&Symbol->Name);
720 SymbolInfo->LineNumberSymbols.SymbolCount = 0;
721 SymbolInfo->LineNumberSymbols.Symbols = NULL;
723 /* Don't free buffers because we cache symbol buffers
724 (eg. they are shared across processes) */
725 /* FIXME: We can free them if we do reference counting */
726 if (SymbolInfo->FileBuffer != NULL)
728 ExFreePool(SymbolInfo->FileBuffer);
729 SymbolInfo->FileBuffer = NULL;
730 SymbolInfo->SymbolsBase = NULL;
731 SymbolInfo->SymbolsLength = 0;
738 PIMAGE_SYMBOL_INFO_CACHE
739 LdrpLookupUserSymbolInfo(PLDR_MODULE LdrModule)
741 PIMAGE_SYMBOL_INFO_CACHE Current;
742 PLIST_ENTRY CurrentEntry;
745 DPRINT("Searching symbols for %S\n", LdrModule->FullDllName.Buffer);
747 KeAcquireSpinLock(&SymbolListLock, &Irql);
749 CurrentEntry = SymbolListHead.Flink;
750 while (CurrentEntry != (&SymbolListHead))
752 Current = CONTAINING_RECORD(CurrentEntry, IMAGE_SYMBOL_INFO_CACHE, ListEntry);
754 if (RtlEqualUnicodeString(&Current->FullName, &LdrModule->FullDllName, TRUE))
756 KeReleaseSpinLock(&SymbolListLock, Irql);
760 CurrentEntry = CurrentEntry->Flink;
763 KeReleaseSpinLock(&SymbolListLock, Irql);
769 KdbLdrLoadUserModuleSymbols(PLDR_MODULE LdrModule)
771 PIMAGE_SYMBOL_INFO_CACHE CacheEntry;
773 DPRINT("LdrModule %p\n", LdrModule);
775 RtlZeroMemory(&LdrModule->SymbolInfo, sizeof(LdrModule->SymbolInfo));
776 LdrModule->SymbolInfo.ImageBase = (ULONG_PTR) LdrModule->BaseAddress;
777 LdrModule->SymbolInfo.ImageSize = LdrModule->SizeOfImage;
779 CacheEntry = LdrpLookupUserSymbolInfo(LdrModule);
780 if (CacheEntry != NULL)
782 DPRINT("Symbol cache hit for %S\n", CacheEntry->FullName.Buffer);
784 LdrModule->SymbolInfo.FileBuffer = CacheEntry->FileBuffer;
785 LdrModule->SymbolInfo.SymbolsBase = CacheEntry->SymbolsBase;
786 LdrModule->SymbolInfo.SymbolsLength = CacheEntry->SymbolsLength;
787 LdrModule->SymbolInfo.SymbolStringsBase = CacheEntry->SymbolStringsBase;
788 LdrModule->SymbolInfo.SymbolStringsLength = CacheEntry->SymbolStringsLength;
792 CacheEntry = ExAllocatePool(NonPagedPool, sizeof(IMAGE_SYMBOL_INFO_CACHE));
794 RtlZeroMemory(CacheEntry, sizeof(IMAGE_SYMBOL_INFO_CACHE));
796 RtlCreateUnicodeString(&CacheEntry->FullName, LdrModule->FullDllName.Buffer);
797 assert(CacheEntry->FullName.Buffer);
798 LdrpLoadModuleSymbols(&LdrModule->FullDllName, &LdrModule->SymbolInfo);
799 CacheEntry->FileBuffer = LdrModule->SymbolInfo.FileBuffer;
800 CacheEntry->SymbolsBase = LdrModule->SymbolInfo.SymbolsBase;
801 CacheEntry->SymbolsLength = LdrModule->SymbolInfo.SymbolsLength;
802 CacheEntry->SymbolStringsBase = LdrModule->SymbolInfo.SymbolStringsBase;
803 CacheEntry->SymbolStringsLength = LdrModule->SymbolInfo.SymbolStringsLength;
804 InsertTailList(&SymbolListHead, &CacheEntry->ListEntry);
809 KdbLoadDriver(PUNICODE_STRING Filename, PMODULE_OBJECT Module)
811 /* Load symbols for the image if available */
812 LdrpLoadModuleSymbols(Filename, &Module->TextSection->SymbolInfo);
816 KdbUnloadDriver(PMODULE_OBJECT ModuleObject)
818 /* Unload symbols for module if available */
819 KdbLdrUnloadModuleSymbols(&ModuleObject->TextSection->SymbolInfo);
823 KdbProcessSymbolFile(PVOID ModuleLoadBase, PCHAR FileName, ULONG Length)
825 PMODULE_OBJECT ModuleObject;
826 UNICODE_STRING ModuleName;
827 CHAR TmpBaseName[MAX_PATH];
828 CHAR TmpFileName[MAX_PATH];
829 PSYMBOLFILE_HEADER SymbolFileHeader;
830 PIMAGE_SYMBOL_INFO SymbolInfo;
831 ANSI_STRING AnsiString;
833 DPRINT("Module %s is a symbol file\n", FileName);
835 strncpy(TmpBaseName, FileName, Length);
836 TmpBaseName[Length] = '\0';
838 DPRINT("base: %s (Length %d)\n", TmpBaseName, Length);
840 strcpy(TmpFileName, TmpBaseName);
841 strcat(TmpFileName, ".sys");
842 RtlInitAnsiString(&AnsiString, TmpFileName);
844 RtlAnsiStringToUnicodeString(&ModuleName, &AnsiString, TRUE);
845 ModuleObject = LdrGetModuleObject(&ModuleName);
846 RtlFreeUnicodeString(&ModuleName);
847 if (ModuleObject == NULL)
849 strcpy(TmpFileName, TmpBaseName);
850 strcat(TmpFileName, ".exe");
851 RtlInitAnsiString(&AnsiString, TmpFileName);
852 RtlAnsiStringToUnicodeString(&ModuleName, &AnsiString, TRUE);
853 ModuleObject = LdrGetModuleObject(&ModuleName);
854 RtlFreeUnicodeString(&ModuleName);
856 if (ModuleObject != NULL)
858 SymbolInfo = (PIMAGE_SYMBOL_INFO) &ModuleObject->TextSection->SymbolInfo;
859 SymbolFileHeader = (PSYMBOLFILE_HEADER) ModuleLoadBase;
860 SymbolInfo->FileBuffer = ModuleLoadBase;
861 SymbolInfo->SymbolsBase = ModuleLoadBase + SymbolFileHeader->StabsOffset;
862 SymbolInfo->SymbolsLength = SymbolFileHeader->StabsLength;
863 SymbolInfo->SymbolStringsBase = ModuleLoadBase + SymbolFileHeader->StabstrOffset;
864 SymbolInfo->SymbolStringsLength = SymbolFileHeader->StabstrLength;
869 KdbInitializeDriver(PMODULE_TEXT_SECTION ModuleTextSection)
871 RtlZeroMemory(&ModuleTextSection->SymbolInfo, sizeof(ModuleTextSection->SymbolInfo));
872 ModuleTextSection->SymbolInfo.ImageBase =
873 ModuleTextSection->OptionalHeader->ImageBase;
874 ModuleTextSection->SymbolInfo.ImageSize = ModuleTextSection->Length;
878 KdbLdrLoadAutoConfigDrivers(VOID)
880 UNICODE_STRING ModuleName;
881 PMODULE_OBJECT ModuleObject;
884 * Load symbols for ntoskrnl.exe and hal.dll because \SystemRoot
885 * is created after their module entries
888 RtlInitUnicodeStringFromLiteral(&ModuleName, KERNEL_MODULE_NAME);
889 ModuleObject = LdrGetModuleObject(&ModuleName);
890 if (ModuleObject != NULL)
892 LdrpLoadModuleSymbols(&ModuleName,
893 &ModuleObject->TextSection->SymbolInfo);
896 RtlInitUnicodeStringFromLiteral(&ModuleName, HAL_MODULE_NAME);
897 ModuleObject = LdrGetModuleObject(&ModuleName);
898 if (ModuleObject != NULL)
900 LdrpLoadModuleSymbols(&ModuleName,
901 &ModuleObject->TextSection->SymbolInfo);