mirror of
https://github.com/reactos/reactos.git
synced 2024-12-27 09:34:43 +00:00
Fixed null pointer exceptions.
Removed private install script. Moved stabs reading to a seperate file. Added hooks for the kernel debugger. svn path=/trunk/; revision=3245
This commit is contained in:
parent
82ad78524a
commit
e646abc58c
9 changed files with 37 additions and 818 deletions
|
@ -1,4 +1,4 @@
|
|||
/* $Id: msfs.c,v 1.2 2001/06/12 12:33:42 ekohl Exp $
|
||||
/* $Id: msfs.c,v 1.3 2002/07/17 22:56:10 dwelch Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -29,7 +29,7 @@ DriverEntry(PDRIVER_OBJECT DriverObject,
|
|||
|
||||
DbgPrint("Mailslot FSD 0.0.1\n");
|
||||
|
||||
DeviceObject->Flags = 0;
|
||||
DriverObject->Flags = 0;
|
||||
DriverObject->MajorFunction[IRP_MJ_CREATE] = MsfsCreate;
|
||||
DriverObject->MajorFunction[IRP_MJ_CREATE_MAILSLOT] =
|
||||
MsfsCreateMailslot;
|
||||
|
@ -66,7 +66,7 @@ DriverEntry(PDRIVER_OBJECT DriverObject,
|
|||
{
|
||||
return(Status);
|
||||
}
|
||||
|
||||
|
||||
/* initialize device extension */
|
||||
DeviceExtension = DeviceObject->DeviceExtension;
|
||||
InitializeListHead(&DeviceExtension->MailslotListHead);
|
||||
|
|
|
@ -1,17 +0,0 @@
|
|||
#!/bin/sh
|
||||
/sbin/modprobe loop
|
||||
echo "Installing to disk."
|
||||
mount -t vfat /home/welch/devel/bochs/10M.vga.dos /mnt/floppy -o loop,offset=8704,rw
|
||||
cp -rv reactos /mnt/floppy
|
||||
umount /mnt/floppy
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -50,7 +50,7 @@ NtSystemDebugControl(DEBUG_CONTROL_CODE ControlCode,
|
|||
case DebugQuerySpecialCalls:
|
||||
case DebugDbgBreakPoint:
|
||||
break;
|
||||
#ifdef DBG
|
||||
#ifdef KDBG
|
||||
case DebugDbgLoadSymbols:
|
||||
LdrLoadUserModuleSymbols((PLDR_MODULE) InputBuffer);
|
||||
#endif /* DBG */
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: kd.h,v 1.10 2002/07/04 19:56:35 dwelch Exp $
|
||||
/* $Id: kd.h,v 1.11 2002/07/17 22:56:10 dwelch Exp $
|
||||
*
|
||||
* kernel debugger prototypes
|
||||
*/
|
||||
|
@ -67,4 +67,14 @@ KdEnterDebuggerException(PEXCEPTION_RECORD ExceptionRecord,
|
|||
VOID KdInitializeMda(VOID);
|
||||
VOID KdPrintMda(PCH pch);
|
||||
|
||||
#ifndef KDBG
|
||||
#define KDB_DELETEPROCESS_HOOK(PROCESS)
|
||||
#define KDB_LOADDRIVER_HOOK(MODULE)
|
||||
#define KDB_UNLOADDRIVER_HOOK(MODULE)
|
||||
#else
|
||||
#define KDB_DELETEPROCESS_HOOK(PROCESS) XXXX
|
||||
#define KDB_LOADDRIVER_HOOK(MODULE) XXXX
|
||||
#define KDB_UNLOADDRIVER_HOOK(MODULE) XXXX
|
||||
#endif /* KDBG */
|
||||
|
||||
#endif /* __INCLUDE_INTERNAL_KERNEL_DEBUGGER_H */
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: pnpmgr.c,v 1.5 2002/06/10 23:03:33 ekohl Exp $
|
||||
/* $Id: pnpmgr.c,v 1.6 2002/07/17 22:56:10 dwelch Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -350,7 +350,10 @@ IopCreateDeviceNode(PDEVICE_NODE ParentNode,
|
|||
KeAcquireSpinLock(&IopDeviceTreeLock, &OldIrql);
|
||||
Node->Parent = ParentNode;
|
||||
Node->NextSibling = ParentNode->Child;
|
||||
ParentNode->Child->PrevSibling = Node;
|
||||
if (ParentNode->Child != NULL)
|
||||
{
|
||||
ParentNode->Child->PrevSibling = Node;
|
||||
}
|
||||
ParentNode->Child = Node;
|
||||
KeReleaseSpinLock(&IopDeviceTreeLock, OldIrql);
|
||||
}
|
||||
|
@ -1061,17 +1064,6 @@ IopInterrogateBusExtender(
|
|||
|
||||
DPRINT("Got %d PDOs\n", DeviceRelations->Count);
|
||||
|
||||
#ifdef DBG
|
||||
{
|
||||
ULONG i;
|
||||
|
||||
DPRINT("DeviceRelations %x\n", DeviceRelations);
|
||||
DPRINT("Count %x\n", DeviceRelations->Count);
|
||||
for (i = 0; i < DeviceRelations->Count; i++)
|
||||
DPRINT("Object(PDO) %x\n", DeviceRelations->Objects[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Create device nodes for all discovered devices */
|
||||
for (i = 0; i < DeviceRelations->Count; i++)
|
||||
{
|
||||
|
|
|
@ -45,17 +45,6 @@
|
|||
|
||||
/* GLOBALS *****************************************************************/
|
||||
|
||||
#ifdef DBG
|
||||
|
||||
NTSTATUS
|
||||
LdrGetAddressInformation(IN PIMAGE_SYMBOL_INFO SymbolInfo,
|
||||
IN ULONG_PTR RelativeAddress,
|
||||
OUT PULONG LineNumber,
|
||||
OUT PCH FileName OPTIONAL,
|
||||
OUT PCH FunctionName OPTIONAL);
|
||||
|
||||
#endif /* DBG */
|
||||
|
||||
#define _STR(x) #x
|
||||
#define STR(x) _STR(x)
|
||||
|
||||
|
@ -139,12 +128,6 @@ print_address(PVOID address)
|
|||
MODULE_TEXT_SECTION* current;
|
||||
extern LIST_ENTRY ModuleTextListHead;
|
||||
ULONG_PTR RelativeAddress;
|
||||
#ifdef DBG
|
||||
NTSTATUS Status;
|
||||
ULONG LineNumber;
|
||||
CHAR FileName[256];
|
||||
CHAR FunctionName[256];
|
||||
#endif
|
||||
|
||||
current_entry = ModuleTextListHead.Flink;
|
||||
|
||||
|
@ -158,25 +141,8 @@ print_address(PVOID address)
|
|||
address < (PVOID)(current->Base + current->Length))
|
||||
{
|
||||
RelativeAddress = (ULONG_PTR) address - current->Base;
|
||||
#ifdef DBG
|
||||
Status = LdrGetAddressInformation(¤t->SymbolInfo,
|
||||
RelativeAddress,
|
||||
&LineNumber,
|
||||
FileName,
|
||||
FunctionName);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
DbgPrint("<%ws: %x (%s:%d (%s))>",
|
||||
current->Name, RelativeAddress, FileName, LineNumber, FunctionName);
|
||||
}
|
||||
else
|
||||
{
|
||||
DbgPrint("<%ws: %x>", current->Name, RelativeAddress);
|
||||
}
|
||||
#else /* !DBG */
|
||||
DbgPrint("<%ws: %x>", current->Name, RelativeAddress);
|
||||
#endif /* !DBG */
|
||||
return(TRUE);
|
||||
DbgPrint("<%ws: %x>", current->Name, RelativeAddress);
|
||||
return(TRUE);
|
||||
}
|
||||
current_entry = current_entry->Flink;
|
||||
}
|
||||
|
|
|
@ -45,17 +45,6 @@
|
|||
|
||||
/* GLOBALS *****************************************************************/
|
||||
|
||||
#ifdef DBG
|
||||
|
||||
NTSTATUS
|
||||
LdrGetAddressInformation(IN PIMAGE_SYMBOL_INFO SymbolInfo,
|
||||
IN ULONG_PTR RelativeAddress,
|
||||
OUT PULONG LineNumber,
|
||||
OUT PCH FileName OPTIONAL,
|
||||
OUT PCH FunctionName OPTIONAL);
|
||||
|
||||
#endif /* DBG */
|
||||
|
||||
static char *ExceptionTypeStrings[] =
|
||||
{
|
||||
"Divide Error",
|
||||
|
@ -88,12 +77,6 @@ print_user_address(PVOID address)
|
|||
PEPROCESS CurrentProcess;
|
||||
PPEB Peb = NULL;
|
||||
ULONG_PTR RelativeAddress;
|
||||
#ifdef DBG
|
||||
NTSTATUS Status;
|
||||
ULONG LineNumber;
|
||||
CHAR FileName[256];
|
||||
CHAR FunctionName[256];
|
||||
#endif
|
||||
|
||||
CurrentProcess = PsGetCurrentProcess();
|
||||
if (NULL != CurrentProcess)
|
||||
|
@ -118,27 +101,10 @@ print_user_address(PVOID address)
|
|||
if (address >= (PVOID)current->BaseAddress &&
|
||||
address < (PVOID)(current->BaseAddress + current->SizeOfImage))
|
||||
{
|
||||
RelativeAddress = (ULONG_PTR) address - (ULONG_PTR)current->BaseAddress;
|
||||
#ifdef DBG
|
||||
Status = LdrGetAddressInformation(¤t->SymbolInfo,
|
||||
RelativeAddress,
|
||||
&LineNumber,
|
||||
FileName,
|
||||
FunctionName);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
DbgPrint("<%wZ: %x (%s:%d (%s))>",
|
||||
¤t->BaseDllName, RelativeAddress, FileName, LineNumber, FunctionName);
|
||||
}
|
||||
else
|
||||
{
|
||||
DbgPrint("<%wZ: %x>", ¤t->BaseDllName, RelativeAddress);
|
||||
}
|
||||
#else /* !DBG */
|
||||
DbgPrint("<%wZ: %x>", ¤t->BaseDllName, RelativeAddress);
|
||||
#endif /* !DBG */
|
||||
|
||||
return(TRUE);
|
||||
RelativeAddress =
|
||||
(ULONG_PTR) address - (ULONG_PTR)current->BaseAddress;
|
||||
DbgPrint("<%wZ: %x>", ¤t->BaseDllName, RelativeAddress);
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
current_entry = current_entry->Flink;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: loader.c,v 1.116 2002/07/17 21:04:56 dwelch Exp $
|
||||
/* $Id: loader.c,v 1.117 2002/07/17 22:56:11 dwelch Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -34,6 +34,7 @@
|
|||
#include <internal/ps.h>
|
||||
#include <internal/ldr.h>
|
||||
#include <internal/pool.h>
|
||||
#include <internal/kd.h>
|
||||
|
||||
#ifdef HALDBG
|
||||
#include <internal/ntosdbg.h>
|
||||
|
@ -46,56 +47,6 @@
|
|||
|
||||
/* GLOBALS *******************************************************************/
|
||||
|
||||
#ifdef DBG
|
||||
|
||||
typedef struct _SYMBOLFILE_HEADER {
|
||||
unsigned long StabsOffset;
|
||||
unsigned long StabsLength;
|
||||
unsigned long StabstrOffset;
|
||||
unsigned long StabstrLength;
|
||||
} SYMBOLFILE_HEADER, *PSYMBOLFILE_HEADER;
|
||||
|
||||
typedef struct _IMAGE_SYMBOL_INFO_CACHE {
|
||||
LIST_ENTRY ListEntry;
|
||||
UNICODE_STRING FullName;
|
||||
PVOID FileBuffer;
|
||||
PVOID SymbolsBase;
|
||||
ULONG SymbolsLength;
|
||||
PVOID SymbolStringsBase;
|
||||
ULONG SymbolStringsLength;
|
||||
} IMAGE_SYMBOL_INFO_CACHE, *PIMAGE_SYMBOL_INFO_CACHE;
|
||||
|
||||
|
||||
typedef struct _STAB_ENTRY {
|
||||
unsigned long n_strx; /* index into string table of name */
|
||||
unsigned char n_type; /* type of symbol */
|
||||
unsigned char n_other; /* misc info (usually empty) */
|
||||
unsigned short n_desc; /* description field */
|
||||
unsigned long n_value; /* value of symbol */
|
||||
} _STAB_ENTRY, *PSTAB_ENTRY;
|
||||
|
||||
/*
|
||||
* Desc - Line number
|
||||
* Value - Relative virtual address
|
||||
*/
|
||||
#define N_FUN 0x24
|
||||
|
||||
/*
|
||||
* Desc - Line number
|
||||
* Value - Relative virtual address
|
||||
*/
|
||||
#define N_SLINE 0x44
|
||||
|
||||
/*
|
||||
* String - First containing a '/' is the compillation directory (CD)
|
||||
* Not containing a '/' is a source file relative to CD
|
||||
*/
|
||||
#define N_SO 0x64
|
||||
|
||||
LIST_ENTRY SymbolListHead;
|
||||
|
||||
#endif /* DBG */
|
||||
|
||||
LIST_ENTRY ModuleListHead;
|
||||
KSPIN_LOCK ModuleListLock;
|
||||
|
||||
|
@ -194,11 +145,6 @@ LdrInit1(VOID)
|
|||
NtoskrnlTextSection.Length = SectionList[0].Misc.VirtualSize +
|
||||
SectionList[0].VirtualAddress;
|
||||
NtoskrnlTextSection.Name = KERNEL_MODULE_NAME;
|
||||
#ifdef DBG
|
||||
RtlZeroMemory(&NtoskrnlTextSection.SymbolInfo, sizeof(NtoskrnlTextSection.SymbolInfo));
|
||||
NtoskrnlTextSection.SymbolInfo.ImageBase = OptionalHeader->ImageBase;
|
||||
NtoskrnlTextSection.SymbolInfo.ImageSize = NtoskrnlTextSection.Length;
|
||||
#endif
|
||||
InsertTailList(&ModuleTextListHead, &NtoskrnlTextSection.ListEntry);
|
||||
|
||||
/* Setup hal.dll text section */
|
||||
|
@ -214,16 +160,7 @@ LdrInit1(VOID)
|
|||
LdrHalTextSection.Length = SectionList[0].Misc.VirtualSize +
|
||||
SectionList[0].VirtualAddress;
|
||||
LdrHalTextSection.Name = HAL_MODULE_NAME;
|
||||
#ifdef DBG
|
||||
RtlZeroMemory(&LdrHalTextSection.SymbolInfo, sizeof(LdrHalTextSection.SymbolInfo));
|
||||
LdrHalTextSection.SymbolInfo.ImageBase = OptionalHeader->ImageBase;
|
||||
LdrHalTextSection.SymbolInfo.ImageSize = LdrHalTextSection.Length;
|
||||
#endif
|
||||
InsertTailList(&ModuleTextListHead, &LdrHalTextSection.ListEntry);
|
||||
|
||||
#ifdef DBG
|
||||
InitializeListHead(&SymbolListHead);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
@ -299,546 +236,6 @@ LdrInitModuleManagement(VOID)
|
|||
&ModuleObject->ListEntry);
|
||||
}
|
||||
|
||||
#ifdef DBG
|
||||
|
||||
VOID
|
||||
LdrpParseImageSymbols(PIMAGE_SYMBOL_INFO SymbolInfo)
|
||||
/* Note: It is important that the symbol strings buffer not be released after
|
||||
this function is called because the strings are still referenced */
|
||||
{
|
||||
PSYMBOL CurrentFileNameSymbol;
|
||||
PSYMBOL CurrentFunctionSymbol;
|
||||
PSYMBOL CurrentLineNumberSymbol;
|
||||
PSYMBOL Symbol;
|
||||
PSTAB_ENTRY StabEntry;
|
||||
PVOID StabsEnd;
|
||||
PCHAR String;
|
||||
ULONG_PTR FunRelativeAddress;
|
||||
ULONG FunLineNumber;
|
||||
ULONG_PTR ImageBase;
|
||||
|
||||
assert(SymbolInfo);
|
||||
|
||||
DPRINT("Parsing symbols.\n");
|
||||
|
||||
SymbolInfo->FileNameSymbols.SymbolCount = 0;
|
||||
SymbolInfo->FileNameSymbols.Symbols = NULL;
|
||||
SymbolInfo->FunctionSymbols.SymbolCount = 0;
|
||||
SymbolInfo->FunctionSymbols.Symbols = NULL;
|
||||
SymbolInfo->LineNumberSymbols.SymbolCount = 0;
|
||||
SymbolInfo->LineNumberSymbols.Symbols = NULL;
|
||||
StabsEnd = SymbolInfo->SymbolsBase + SymbolInfo->SymbolsLength;
|
||||
StabEntry = (PSTAB_ENTRY) SymbolInfo->SymbolsBase;
|
||||
ImageBase = SymbolInfo->ImageBase;
|
||||
FunRelativeAddress = 0;
|
||||
FunLineNumber = 0;
|
||||
CurrentFileNameSymbol = NULL;
|
||||
CurrentFunctionSymbol = NULL;
|
||||
CurrentLineNumberSymbol = NULL;
|
||||
while ((ULONG_PTR) StabEntry < (ULONG_PTR) StabsEnd)
|
||||
{
|
||||
Symbol = NULL;
|
||||
|
||||
if (StabEntry->n_type == N_FUN)
|
||||
{
|
||||
if (StabEntry->n_desc > 0)
|
||||
{
|
||||
assert(StabEntry->n_value >= ImageBase);
|
||||
|
||||
FunRelativeAddress = StabEntry->n_value - ImageBase;
|
||||
FunLineNumber = StabEntry->n_desc;
|
||||
|
||||
Symbol = ExAllocatePool(NonPagedPool, sizeof(SYMBOL));
|
||||
assert(Symbol);
|
||||
Symbol->Next = NULL;
|
||||
Symbol->SymbolType = ST_FUNCTION;
|
||||
Symbol->RelativeAddress = FunRelativeAddress;
|
||||
Symbol->LineNumber = FunLineNumber;
|
||||
String = (PCHAR)SymbolInfo->SymbolStringsBase + StabEntry->n_strx;
|
||||
RtlInitAnsiString(&Symbol->Name, String);
|
||||
|
||||
DPRINT("FUN found. '%s' %d @ %x\n",
|
||||
Symbol->Name.Buffer, FunLineNumber, FunRelativeAddress);
|
||||
}
|
||||
}
|
||||
else if (StabEntry->n_type == N_SLINE)
|
||||
{
|
||||
Symbol = ExAllocatePool(NonPagedPool, sizeof(SYMBOL));
|
||||
assert(Symbol);
|
||||
Symbol->Next = NULL;
|
||||
Symbol->SymbolType = ST_LINENUMBER;
|
||||
Symbol->RelativeAddress = FunRelativeAddress + StabEntry->n_value;
|
||||
Symbol->LineNumber = StabEntry->n_desc;
|
||||
|
||||
DPRINT("SLINE found. %d @ %x\n",
|
||||
Symbol->LineNumber, Symbol->RelativeAddress);
|
||||
}
|
||||
else if (StabEntry->n_type == N_SO)
|
||||
{
|
||||
Symbol = ExAllocatePool(NonPagedPool, sizeof(SYMBOL));
|
||||
assert(Symbol);
|
||||
Symbol->Next = NULL;
|
||||
Symbol->SymbolType = ST_FILENAME;
|
||||
Symbol->RelativeAddress = StabEntry->n_value - ImageBase;
|
||||
Symbol->LineNumber = 0;
|
||||
String = (PCHAR)SymbolInfo->SymbolStringsBase + StabEntry->n_strx;
|
||||
RtlInitAnsiString(&Symbol->Name, String);
|
||||
|
||||
DPRINT("SO found. '%s' @ %x\n",
|
||||
Symbol->Name.Buffer, Symbol->RelativeAddress);
|
||||
}
|
||||
|
||||
if (Symbol != NULL)
|
||||
{
|
||||
switch (Symbol->SymbolType)
|
||||
{
|
||||
case ST_FILENAME:
|
||||
if (SymbolInfo->FileNameSymbols.Symbols == NULL)
|
||||
SymbolInfo->FileNameSymbols.Symbols = Symbol;
|
||||
else
|
||||
CurrentFileNameSymbol->Next = Symbol;
|
||||
|
||||
CurrentFileNameSymbol = Symbol;
|
||||
|
||||
SymbolInfo->FileNameSymbols.SymbolCount++;
|
||||
break;
|
||||
case ST_FUNCTION:
|
||||
if (SymbolInfo->FunctionSymbols.Symbols == NULL)
|
||||
SymbolInfo->FunctionSymbols.Symbols = Symbol;
|
||||
else
|
||||
CurrentFunctionSymbol->Next = Symbol;
|
||||
|
||||
CurrentFunctionSymbol = Symbol;
|
||||
|
||||
SymbolInfo->FunctionSymbols.SymbolCount++;
|
||||
break;
|
||||
case ST_LINENUMBER:
|
||||
if (SymbolInfo->LineNumberSymbols.Symbols == NULL)
|
||||
SymbolInfo->LineNumberSymbols.Symbols = Symbol;
|
||||
else
|
||||
CurrentLineNumberSymbol->Next = Symbol;
|
||||
|
||||
CurrentLineNumberSymbol = Symbol;
|
||||
|
||||
SymbolInfo->LineNumberSymbols.SymbolCount++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
StabEntry++;
|
||||
}
|
||||
}
|
||||
|
||||
static NTSTATUS
|
||||
LdrpGetFileName(IN PIMAGE_SYMBOL_INFO SymbolInfo,
|
||||
IN ULONG_PTR RelativeAddress,
|
||||
OUT PCH FileName)
|
||||
{
|
||||
PSYMBOL NextSymbol;
|
||||
ULONG_PTR NextAddress;
|
||||
PSYMBOL Symbol;
|
||||
|
||||
Symbol = SymbolInfo->FileNameSymbols.Symbols;
|
||||
while (Symbol != NULL)
|
||||
{
|
||||
NextSymbol = Symbol->Next;
|
||||
if (NextSymbol != NULL)
|
||||
NextAddress = NextSymbol->RelativeAddress;
|
||||
else
|
||||
NextAddress = SymbolInfo->ImageSize;
|
||||
|
||||
DPRINT("FN SEARCH: Type %d RelativeAddress %x >= Symbol->RelativeAddress %x < NextAddress %x\n",
|
||||
Symbol->SymbolType, RelativeAddress, Symbol->RelativeAddress, NextAddress);
|
||||
|
||||
if ((Symbol->SymbolType == ST_FILENAME) &&
|
||||
(RelativeAddress >= Symbol->RelativeAddress) &&
|
||||
(RelativeAddress < NextAddress))
|
||||
{
|
||||
DPRINT("FN found\n");
|
||||
strcpy(FileName, Symbol->Name.Buffer);
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
Symbol = NextSymbol;
|
||||
}
|
||||
|
||||
DPRINT("FN not found\n");
|
||||
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
static NTSTATUS
|
||||
LdrpGetFunctionName(IN PIMAGE_SYMBOL_INFO SymbolInfo,
|
||||
IN ULONG_PTR RelativeAddress,
|
||||
OUT PCH FunctionName)
|
||||
{
|
||||
PSYMBOL NextSymbol;
|
||||
ULONG_PTR NextAddress;
|
||||
PSYMBOL Symbol;
|
||||
|
||||
Symbol = SymbolInfo->FunctionSymbols.Symbols;
|
||||
while (Symbol != NULL)
|
||||
{
|
||||
NextSymbol = Symbol->Next;
|
||||
if (NextSymbol != NULL)
|
||||
NextAddress = NextSymbol->RelativeAddress;
|
||||
else
|
||||
NextAddress = SymbolInfo->ImageSize;
|
||||
|
||||
DPRINT("FUN SEARCH: Type %d RelativeAddress %x >= Symbol->RelativeAddress %x < NextAddress %x\n",
|
||||
Symbol->SymbolType, RelativeAddress, Symbol->RelativeAddress, NextAddress);
|
||||
|
||||
if ((Symbol->SymbolType == ST_FUNCTION) &&
|
||||
(RelativeAddress >= Symbol->RelativeAddress) &&
|
||||
(RelativeAddress < NextAddress))
|
||||
{
|
||||
PCHAR ExtraInfo;
|
||||
ULONG Length;
|
||||
|
||||
DPRINT("FUN found\n");
|
||||
|
||||
/* Remove the extra information from the function name */
|
||||
ExtraInfo = strchr(Symbol->Name.Buffer, ':');
|
||||
if (ExtraInfo != NULL)
|
||||
Length = ExtraInfo - Symbol->Name.Buffer;
|
||||
else
|
||||
Length = strlen(Symbol->Name.Buffer);
|
||||
|
||||
strncpy(FunctionName, Symbol->Name.Buffer, Length);
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
Symbol = NextSymbol;
|
||||
}
|
||||
|
||||
DPRINT("FUN not found\n");
|
||||
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
static NTSTATUS
|
||||
LdrpGetLineNumber(IN PIMAGE_SYMBOL_INFO SymbolInfo,
|
||||
IN ULONG_PTR RelativeAddress,
|
||||
OUT PULONG LineNumber)
|
||||
{
|
||||
PSYMBOL NextSymbol;
|
||||
ULONG_PTR NextAddress;
|
||||
PSYMBOL Symbol;
|
||||
|
||||
Symbol = SymbolInfo->LineNumberSymbols.Symbols;
|
||||
while (Symbol != NULL)
|
||||
{
|
||||
NextSymbol = Symbol->Next;
|
||||
if (NextSymbol != NULL)
|
||||
NextAddress = NextSymbol->RelativeAddress;
|
||||
else
|
||||
NextAddress = SymbolInfo->ImageSize;
|
||||
|
||||
DPRINT("LN SEARCH: Type %d RelativeAddress %x >= Symbol->RelativeAddress %x < NextAddress %x\n",
|
||||
Symbol->SymbolType, RelativeAddress, Symbol->RelativeAddress, NextAddress);
|
||||
|
||||
if ((Symbol->SymbolType == ST_LINENUMBER) &&
|
||||
(RelativeAddress >= Symbol->RelativeAddress) &&
|
||||
(RelativeAddress < NextAddress))
|
||||
{
|
||||
DPRINT("LN found\n");
|
||||
*LineNumber = Symbol->LineNumber;
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
Symbol = NextSymbol;
|
||||
}
|
||||
|
||||
DPRINT("LN not found\n");
|
||||
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
NTSTATUS
|
||||
LdrGetAddressInformation(IN PIMAGE_SYMBOL_INFO SymbolInfo,
|
||||
IN ULONG_PTR RelativeAddress,
|
||||
OUT PULONG LineNumber,
|
||||
OUT PCH FileName OPTIONAL,
|
||||
OUT PCH FunctionName OPTIONAL)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
|
||||
*LineNumber = 0;
|
||||
|
||||
DPRINT("RelativeAddress %p\n", RelativeAddress);
|
||||
|
||||
if (RelativeAddress >= SymbolInfo->ImageSize)
|
||||
{
|
||||
DPRINT("Address is not within .text section. RelativeAddress %p Length 0x%x\n",
|
||||
RelativeAddress, SymbolInfo->ImageSize);
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
if (!AreSymbolsParsed(SymbolInfo))
|
||||
{
|
||||
LdrpParseImageSymbols(SymbolInfo);
|
||||
}
|
||||
|
||||
Status = LdrpGetLineNumber(SymbolInfo, RelativeAddress, LineNumber);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
return Status;
|
||||
}
|
||||
|
||||
if (FileName)
|
||||
{
|
||||
Status = LdrpGetFileName(SymbolInfo, RelativeAddress, FileName);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
strcpy(FileName, "");
|
||||
}
|
||||
}
|
||||
|
||||
if (FunctionName)
|
||||
{
|
||||
Status = LdrpGetFunctionName(SymbolInfo, RelativeAddress, FunctionName);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
strcpy(FunctionName, "");
|
||||
}
|
||||
}
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
VOID
|
||||
LdrpLoadModuleSymbols(PUNICODE_STRING FileName,
|
||||
PIMAGE_SYMBOL_INFO SymbolInfo)
|
||||
{
|
||||
FILE_STANDARD_INFORMATION FileStdInfo;
|
||||
OBJECT_ATTRIBUTES ObjectAttributes;
|
||||
WCHAR TmpFileName[MAX_PATH];
|
||||
UNICODE_STRING SymFileName;
|
||||
LPWSTR Start, Ext;
|
||||
HANDLE FileHandle;
|
||||
PVOID FileBuffer;
|
||||
NTSTATUS Status;
|
||||
ULONG Length;
|
||||
IO_STATUS_BLOCK IoStatusBlock;
|
||||
PSYMBOLFILE_HEADER SymbolFileHeader;
|
||||
|
||||
/* Get the path to the symbol store */
|
||||
wcscpy(TmpFileName, L"\\SystemRoot\\symbols\\");
|
||||
|
||||
/* Get the symbol filename from the module name */
|
||||
Start = wcsrchr(FileName->Buffer, L'\\');
|
||||
if (Start == NULL)
|
||||
Start = FileName->Buffer;
|
||||
else
|
||||
Start++;
|
||||
|
||||
Ext = wcsrchr(FileName->Buffer, L'.');
|
||||
if (Ext != NULL)
|
||||
Length = Ext - Start;
|
||||
else
|
||||
Length = wcslen(Start);
|
||||
|
||||
wcsncat(TmpFileName, Start, Length);
|
||||
wcscat(TmpFileName, L".sym");
|
||||
RtlInitUnicodeString(&SymFileName, TmpFileName);
|
||||
|
||||
/* Open the file */
|
||||
InitializeObjectAttributes(&ObjectAttributes,
|
||||
&SymFileName,
|
||||
0,
|
||||
NULL,
|
||||
NULL);
|
||||
|
||||
Status = ZwOpenFile(&FileHandle,
|
||||
FILE_ALL_ACCESS,
|
||||
&ObjectAttributes,
|
||||
&IoStatusBlock,
|
||||
0,
|
||||
0);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT("Could not open symbol file: %wZ\n", &SymFileName);
|
||||
return;
|
||||
}
|
||||
|
||||
CPRINT("Loading symbols from %wZ...\n", &SymFileName);
|
||||
|
||||
/* Get the size of the file */
|
||||
Status = ZwQueryInformationFile(FileHandle,
|
||||
&IoStatusBlock,
|
||||
&FileStdInfo,
|
||||
sizeof(FileStdInfo),
|
||||
FileStandardInformation);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT("Could not get file size\n");
|
||||
ZwClose(FileHandle);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Allocate nonpageable memory for symbol file */
|
||||
FileBuffer = ExAllocatePool(NonPagedPool,
|
||||
FileStdInfo.EndOfFile.u.LowPart);
|
||||
|
||||
if (FileBuffer == NULL)
|
||||
{
|
||||
DPRINT("Could not allocate memory for symbol file\n");
|
||||
ZwClose(FileHandle);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Load file into memory chunk */
|
||||
Status = ZwReadFile(FileHandle,
|
||||
0, 0, 0,
|
||||
&IoStatusBlock,
|
||||
FileBuffer,
|
||||
FileStdInfo.EndOfFile.u.LowPart,
|
||||
0, 0);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
DPRINT("Could not read symbol file into memory (Status 0x%x)\n", Status);
|
||||
ExFreePool(FileBuffer);
|
||||
ZwClose(FileHandle);
|
||||
return;
|
||||
}
|
||||
|
||||
ZwClose(FileHandle);
|
||||
|
||||
SymbolFileHeader = (PSYMBOLFILE_HEADER) FileBuffer;
|
||||
SymbolInfo->FileBuffer = FileBuffer;
|
||||
SymbolInfo->SymbolsBase = FileBuffer + SymbolFileHeader->StabsOffset;
|
||||
SymbolInfo->SymbolsLength = SymbolFileHeader->StabsLength;
|
||||
SymbolInfo->SymbolStringsBase = FileBuffer + SymbolFileHeader->StabstrOffset;
|
||||
SymbolInfo->SymbolStringsLength = SymbolFileHeader->StabstrLength;
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
LdrUnloadModuleSymbols(PIMAGE_SYMBOL_INFO SymbolInfo)
|
||||
{
|
||||
PSYMBOL NextSymbol;
|
||||
PSYMBOL Symbol;
|
||||
|
||||
DPRINT("Unloading symbols\n");
|
||||
|
||||
if (SymbolInfo != NULL)
|
||||
{
|
||||
Symbol = SymbolInfo->FileNameSymbols.Symbols;
|
||||
while (Symbol != NULL)
|
||||
{
|
||||
NextSymbol = Symbol->Next;
|
||||
RtlFreeAnsiString(&Symbol->Name);
|
||||
ExFreePool(Symbol);
|
||||
Symbol = NextSymbol;
|
||||
}
|
||||
|
||||
SymbolInfo->FileNameSymbols.SymbolCount = 0;
|
||||
SymbolInfo->FileNameSymbols.Symbols = NULL;
|
||||
|
||||
Symbol = SymbolInfo->FunctionSymbols.Symbols;
|
||||
while (Symbol != NULL)
|
||||
{
|
||||
NextSymbol = Symbol->Next;
|
||||
RtlFreeAnsiString(&Symbol->Name);
|
||||
ExFreePool(Symbol);
|
||||
Symbol = NextSymbol;
|
||||
}
|
||||
|
||||
SymbolInfo->FunctionSymbols.SymbolCount = 0;
|
||||
SymbolInfo->FunctionSymbols.Symbols = NULL;
|
||||
|
||||
Symbol = SymbolInfo->LineNumberSymbols.Symbols;
|
||||
while (Symbol != NULL)
|
||||
{
|
||||
NextSymbol = Symbol->Next;
|
||||
RtlFreeAnsiString(&Symbol->Name);
|
||||
ExFreePool(Symbol);
|
||||
Symbol = NextSymbol;
|
||||
}
|
||||
|
||||
SymbolInfo->LineNumberSymbols.SymbolCount = 0;
|
||||
SymbolInfo->LineNumberSymbols.Symbols = NULL;
|
||||
#if 0
|
||||
/* Don't free buffers because we cache symbol buffers
|
||||
(eg. they are shared across processes) */
|
||||
/* FIXME: We can free them if we do reference counting */
|
||||
if (SymbolInfo->FileBuffer != NULL)
|
||||
{
|
||||
ExFreePool(SymbolInfo->FileBuffer);
|
||||
SymbolInfo->FileBuffer = NULL;
|
||||
SymbolInfo->SymbolsBase = NULL;
|
||||
SymbolInfo->SymbolsLength = 0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
PIMAGE_SYMBOL_INFO_CACHE
|
||||
LdrpLookupUserSymbolInfo(PLDR_MODULE LdrModule)
|
||||
{
|
||||
PIMAGE_SYMBOL_INFO_CACHE Current;
|
||||
PLIST_ENTRY CurrentEntry;
|
||||
KIRQL Irql;
|
||||
|
||||
DPRINT("Searching symbols for %S\n", LdrModule->FullDllName.Buffer);
|
||||
|
||||
KeAcquireSpinLock(&ModuleListLock,&Irql);
|
||||
|
||||
CurrentEntry = SymbolListHead.Flink;
|
||||
while (CurrentEntry != (&SymbolListHead))
|
||||
{
|
||||
Current = CONTAINING_RECORD(CurrentEntry, IMAGE_SYMBOL_INFO_CACHE, ListEntry);
|
||||
|
||||
if (RtlEqualUnicodeString(&Current->FullName, &LdrModule->FullDllName, TRUE))
|
||||
{
|
||||
KeReleaseSpinLock(&ModuleListLock, Irql);
|
||||
return Current;
|
||||
}
|
||||
|
||||
CurrentEntry = CurrentEntry->Flink;
|
||||
}
|
||||
|
||||
KeReleaseSpinLock(&ModuleListLock, Irql);
|
||||
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
|
||||
VOID
|
||||
LdrLoadUserModuleSymbols(PLDR_MODULE LdrModule)
|
||||
{
|
||||
PIMAGE_SYMBOL_INFO_CACHE CacheEntry;
|
||||
|
||||
DPRINT("LdrModule %p\n", LdrModule);
|
||||
|
||||
RtlZeroMemory(&LdrModule->SymbolInfo, sizeof(LdrModule->SymbolInfo));
|
||||
LdrModule->SymbolInfo.ImageBase = (ULONG_PTR) LdrModule->BaseAddress;
|
||||
LdrModule->SymbolInfo.ImageSize = LdrModule->SizeOfImage;
|
||||
|
||||
CacheEntry = LdrpLookupUserSymbolInfo(LdrModule);
|
||||
if (CacheEntry != NULL)
|
||||
{
|
||||
DPRINT("Symbol cache hit for %S\n", CacheEntry->FullName.Buffer);
|
||||
|
||||
LdrModule->SymbolInfo.FileBuffer = CacheEntry->FileBuffer;
|
||||
LdrModule->SymbolInfo.SymbolsBase = CacheEntry->SymbolsBase;
|
||||
LdrModule->SymbolInfo.SymbolsLength = CacheEntry->SymbolsLength;
|
||||
LdrModule->SymbolInfo.SymbolStringsBase = CacheEntry->SymbolStringsBase;
|
||||
LdrModule->SymbolInfo.SymbolStringsLength = CacheEntry->SymbolStringsLength;
|
||||
}
|
||||
else
|
||||
{
|
||||
CacheEntry = ExAllocatePool(NonPagedPool, sizeof(IMAGE_SYMBOL_INFO_CACHE));
|
||||
assert(CacheEntry);
|
||||
RtlZeroMemory(CacheEntry, sizeof(IMAGE_SYMBOL_INFO_CACHE));
|
||||
RtlCreateUnicodeString(&CacheEntry->FullName, LdrModule->FullDllName.Buffer);
|
||||
assert(CacheEntry->FullName.Buffer);
|
||||
LdrpLoadModuleSymbols(&LdrModule->FullDllName, &LdrModule->SymbolInfo);
|
||||
InsertTailList(&SymbolListHead, &CacheEntry->ListEntry);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* DBG */
|
||||
|
||||
|
||||
NTSTATUS
|
||||
LdrpLoadImage(PUNICODE_STRING DriverName,
|
||||
PVOID *ModuleBase,
|
||||
|
@ -1007,13 +404,11 @@ LdrLoadModule(PUNICODE_STRING Filename,
|
|||
/* Cleanup */
|
||||
ExFreePool(ModuleLoadBase);
|
||||
|
||||
#ifdef DBG
|
||||
/* Load symbols for the image if available */
|
||||
LdrpLoadModuleSymbols(Filename, &Module->TextSection->SymbolInfo);
|
||||
#endif /* DBG */
|
||||
|
||||
*ModuleObject = Module;
|
||||
|
||||
/* Hook for KDB on loading a driver. */
|
||||
KDB_LOADDRIVER_HOOK(Module);
|
||||
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
|
@ -1028,10 +423,8 @@ LdrUnloadModule(PMODULE_OBJECT ModuleObject)
|
|||
RemoveEntryList(&ModuleObject->ListEntry);
|
||||
KeReleaseSpinLock(&ModuleListLock, Irql);
|
||||
|
||||
#ifdef DBG
|
||||
/* Unload symbols for module if available */
|
||||
LdrUnloadModuleSymbols(&ModuleObject->TextSection->SymbolInfo);
|
||||
#endif /* DBG */
|
||||
/* Hook for KDB on unloading a driver. */
|
||||
KDB_UNLOADDRIVER_HOOK(ModuleObject);
|
||||
|
||||
/* Free text section */
|
||||
if (ModuleObject->TextSection != NULL)
|
||||
|
@ -1056,10 +449,6 @@ LdrInitializeBootStartDriver(PVOID ModuleLoadBase,
|
|||
PCHAR FileName,
|
||||
ULONG ModuleLength)
|
||||
{
|
||||
#ifdef DBG
|
||||
PSYMBOLFILE_HEADER SymbolFileHeader;
|
||||
PIMAGE_SYMBOL_INFO SymbolInfo;
|
||||
#endif /* DBG */
|
||||
PMODULE_OBJECT ModuleObject;
|
||||
UNICODE_STRING ModuleName;
|
||||
PDEVICE_NODE DeviceNode;
|
||||
|
@ -1074,12 +463,6 @@ LdrInitializeBootStartDriver(PVOID ModuleLoadBase,
|
|||
CHAR TextBuffer [256];
|
||||
ULONG x, y, cx, cy;
|
||||
|
||||
#ifdef DBG
|
||||
CHAR TmpBaseName[MAX_PATH];
|
||||
CHAR TmpFileName[MAX_PATH];
|
||||
ANSI_STRING AnsiString;
|
||||
#endif /* DBG */
|
||||
|
||||
HalQueryDisplayParameters(&x, &y, &cx, &cy);
|
||||
RtlFillMemory(TextBuffer, x, ' ');
|
||||
TextBuffer[x] = '\0';
|
||||
|
@ -1098,53 +481,6 @@ LdrInitializeBootStartDriver(PVOID ModuleLoadBase,
|
|||
else
|
||||
Length = strlen(FileName);
|
||||
|
||||
#ifdef DBG
|
||||
|
||||
if ((FileExt != NULL) && (strcmp(FileExt, ".sym") == 0))
|
||||
{
|
||||
DPRINT("Module %s is a symbol file\n", FileName);
|
||||
|
||||
strncpy(TmpBaseName, FileName, Length);
|
||||
TmpBaseName[Length] = '\0';
|
||||
|
||||
DPRINT("base: %s (Length %d)\n", TmpBaseName, Length);
|
||||
|
||||
strcpy(TmpFileName, TmpBaseName);
|
||||
strcat(TmpFileName, ".sys");
|
||||
RtlInitAnsiString(&AnsiString, TmpFileName);
|
||||
|
||||
RtlAnsiStringToUnicodeString(&ModuleName, &AnsiString, TRUE);
|
||||
ModuleObject = LdrGetModuleObject(&ModuleName);
|
||||
RtlFreeUnicodeString(&ModuleName);
|
||||
if (ModuleObject == NULL)
|
||||
{
|
||||
strcpy(TmpFileName, TmpBaseName);
|
||||
strcat(TmpFileName, ".exe");
|
||||
RtlInitAnsiString(&AnsiString, TmpFileName);
|
||||
RtlAnsiStringToUnicodeString(&ModuleName, &AnsiString, TRUE);
|
||||
ModuleObject = LdrGetModuleObject(&ModuleName);
|
||||
RtlFreeUnicodeString(&ModuleName);
|
||||
}
|
||||
if (ModuleObject != NULL)
|
||||
{
|
||||
SymbolInfo = (PIMAGE_SYMBOL_INFO) &ModuleObject->TextSection->SymbolInfo;
|
||||
SymbolFileHeader = (PSYMBOLFILE_HEADER) ModuleLoadBase;
|
||||
SymbolInfo->FileBuffer = ModuleLoadBase;
|
||||
SymbolInfo->SymbolsBase = ModuleLoadBase + SymbolFileHeader->StabsOffset;
|
||||
SymbolInfo->SymbolsLength = SymbolFileHeader->StabsLength;
|
||||
SymbolInfo->SymbolStringsBase = ModuleLoadBase + SymbolFileHeader->StabstrOffset;
|
||||
SymbolInfo->SymbolStringsLength = SymbolFileHeader->StabstrLength;
|
||||
}
|
||||
|
||||
return(STATUS_SUCCESS);
|
||||
}
|
||||
else
|
||||
{
|
||||
DPRINT("Module %s is non-symbol file\n", FileName);
|
||||
}
|
||||
|
||||
#endif /* !DBG */
|
||||
|
||||
if ((FileExt != NULL) && !(strcmp(FileExt, ".sys") == 0))
|
||||
{
|
||||
CPRINT("Ignoring non-driver file %s\n", FileName);
|
||||
|
@ -1802,11 +1138,6 @@ LdrPEProcessModule(PVOID ModuleLoadBase,
|
|||
RtlZeroMemory(ModuleTextSection, sizeof(MODULE_TEXT_SECTION));
|
||||
ModuleTextSection->Base = (ULONG)DriverBase;
|
||||
ModuleTextSection->Length = DriverSize;
|
||||
#ifdef DBG
|
||||
RtlZeroMemory(&ModuleTextSection->SymbolInfo, sizeof(ModuleTextSection->SymbolInfo));
|
||||
ModuleTextSection->SymbolInfo.ImageBase = PEOptionalHeader->ImageBase;
|
||||
ModuleTextSection->SymbolInfo.ImageSize = ModuleTextSection->Length;
|
||||
#endif /* DBG */
|
||||
ModuleTextSection->Name =
|
||||
ExAllocatePool(NonPagedPool,
|
||||
(wcslen(NameBuffer) + 1) * sizeof(WCHAR));
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $Id: process.c,v 1.86 2002/07/17 21:04:56 dwelch Exp $
|
||||
/* $Id: process.c,v 1.87 2002/07/17 22:56:11 dwelch Exp $
|
||||
*
|
||||
* COPYRIGHT: See COPYING in the top level directory
|
||||
* PROJECT: ReactOS kernel
|
||||
|
@ -27,6 +27,7 @@
|
|||
#include <internal/pool.h>
|
||||
#include <roscfg.h>
|
||||
#include <internal/se.h>
|
||||
#include <internal/kd.h>
|
||||
|
||||
#define NDEBUG
|
||||
#include <internal/debug.h>
|
||||
|
@ -277,34 +278,6 @@ PsInitProcessManagment(VOID)
|
|||
&SystemProcessHandle);
|
||||
}
|
||||
|
||||
#ifdef DBG
|
||||
|
||||
VOID
|
||||
PiFreeSymbols(PPEB Peb)
|
||||
{
|
||||
PLIST_ENTRY CurrentEntry;
|
||||
PLDR_MODULE Current;
|
||||
PIMAGE_SYMBOL_INFO SymbolInfo;
|
||||
|
||||
assert (Peb);
|
||||
assert (Peb->Ldr);
|
||||
|
||||
CurrentEntry = Peb->Ldr->InLoadOrderModuleList.Flink;
|
||||
while (CurrentEntry != &Peb->Ldr->InLoadOrderModuleList &&
|
||||
CurrentEntry != NULL)
|
||||
{
|
||||
Current = CONTAINING_RECORD(CurrentEntry, LDR_MODULE,
|
||||
InLoadOrderModuleList);
|
||||
|
||||
SymbolInfo = &Current->SymbolInfo;
|
||||
LdrUnloadModuleSymbols(SymbolInfo);
|
||||
|
||||
CurrentEntry = CurrentEntry->Flink;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* DBG */
|
||||
|
||||
VOID STDCALL
|
||||
PiDeleteProcess(PVOID ObjectBody)
|
||||
{
|
||||
|
@ -325,10 +298,8 @@ PiDeleteProcess(PVOID ObjectBody)
|
|||
RemoveEntryList(&Process->ProcessListEntry);
|
||||
KeReleaseSpinLock(&PsProcessListLock, oldIrql);
|
||||
|
||||
#ifdef DBG
|
||||
PiFreeSymbols(Process->Peb);
|
||||
#endif /* DBG */
|
||||
|
||||
/* KDB hook */
|
||||
KDB_DELETEPROCESS_HOOK(Process);
|
||||
|
||||
ObDereferenceObject(Process->Token);
|
||||
|
||||
|
|
Loading…
Reference in a new issue