Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

234 lines
5.4 KiB

/*++
Copyright (c) 1990 Microsoft Corporation
Module Name:
kdinit.c
Abstract:
This module implements the initialization for the portable kernel debgger.
Author:
David N. Cutler 27-July-1990
Revision History:
--*/
#include "kdp.h"
#include "stdio.h"
//
// Global Data
//
BOOLEAN KdDebuggerEnabled = FALSE;
KDP_BREAKPOINT_TYPE KdpBreakpointInstruction;
ULONG KdpOweBreakpoint;
ULONG KdpNextPacketIdToSend;
ULONG KdpPacketIdExpected;
PVOID KdpNtosImageBase;
//
// KdDebugParameters contains the debug port address and baud rate
// used to initialize kernel debugger port.
//
// (They both get initialized to zero to indicate using default settings.)
// If SYSTEN hive contains the paramters , i.e. port and baud rate, system
// init code will fill in these variable with the values stored in the hive.
//
DEBUG_PARAMETERS KdDebugParameters = {0, 0};
#define BAUD_OPTION "BAUDRATE"
#define PORT_OPTION "DEBUGPORT"
BOOLEAN KdPitchDebugger = TRUE;
#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGEKD, KdInitSystem)
#endif
BOOLEAN
KdInitSystem(
IN PLOADER_PARAMETER_BLOCK LoaderBlock,
BOOLEAN StopInDebugger
)
/*++
Routine Description:
This routine initializes the portable kernel debugger.
Arguments:
LoaderBlock - Supplies a pointer to the LOADER_PARAMETER_BLOCK passed
in from the OS Loader.
StopInDebugger - Supplies a boolean value that determines whether a
debug message and breakpoint are generated.
Return Value:
None.
--*/
{
ULONG Index;
BOOLEAN Initialize;
PCHAR Options;
PCHAR BaudOption;
PCHAR PortOption;
//
// If kernel debugger is already initialized, then return.
//
if (KdDebuggerEnabled != FALSE) {
return TRUE;
}
KiDebugRoutine = KdpStub;
//
// Determine whether or not the debugger should be enabled.
//
// Note that if LoaderBlock == NULL, then KdInitSystem was called
// from BugCheck code. For this case the debugger is always enabled
// to report the bugcheck if possible.
//
if (LoaderBlock != NULL) {
KdpNtosImageBase = CONTAINING_RECORD(
(LoaderBlock->LoadOrderListHead.Flink),
LDR_DATA_TABLE_ENTRY,
InLoadOrderLinks)->DllBase;
if (LoaderBlock->LoadOptions != NULL) {
Options = LoaderBlock->LoadOptions;
_strupr(Options);
//
// If any of the port option, baud option, or debug is specified,
// then enable the debugger unless it is explictly disabled.
//
Initialize = TRUE;
PortOption = strstr(Options, PORT_OPTION);
BaudOption = strstr(Options, BAUD_OPTION);
if ((PortOption == NULL) && (BaudOption == NULL)) {
if (strstr(Options, "DEBUG") == NULL) {
Initialize = FALSE;
}
} else {
if (PortOption) {
PortOption = strstr(PortOption, "COM");
if (PortOption) {
KdDebugParameters.CommunicationPort =
atol(PortOption + 3);
}
}
if (BaudOption) {
BaudOption += strlen(BAUD_OPTION);
while (*BaudOption == ' ') {
BaudOption++;
}
if (*BaudOption != '\0') {
KdDebugParameters.BaudRate = atol(BaudOption + 1);
}
}
}
//
// If the debugger is explicitly disable, then set to NODEBUG.
//
if (strstr(Options, "NODEBUG")) {
Initialize = FALSE;
KdPitchDebugger = TRUE;
}
if (strstr(Options, "CRASHDEBUG")) {
Initialize = FALSE;
KdPitchDebugger = FALSE;
}
} else {
//
// If the load options are not specified, then set to NODEBUG.
//
KdPitchDebugger = TRUE;
Initialize = FALSE;
}
} else {
Initialize = TRUE;
}
if ((KdPortInitialize(&KdDebugParameters, LoaderBlock, Initialize) == FALSE) ||
(Initialize == FALSE)) {
return(TRUE);
}
KdPitchDebugger = FALSE;
//
// Set address of kernel debugger trap routine.
//
KiDebugRoutine = KdpTrap;
KiDebugSwitchRoutine = KdpSwitchProcessor;
KdpBreakpointInstruction = KDP_BREAKPOINT_VALUE;
KdpOweBreakpoint = FALSE;
//
// Initialize the breakpoint table.
//
for (Index = 0; Index < BREAKPOINT_TABLE_SIZE; Index += 1) {
KdpBreakpointTable[Index].Flags = 0;
KdpBreakpointTable[Index].Address = NULL;
KdpBreakpointTable[Index].DirectoryTableBase = 0L;
}
KdDebuggerEnabled = TRUE;
//
// Initialize timer facility - HACKHACK
//
KeQueryPerformanceCounter(&KdPerformanceCounterRate);
KdTimerStart.HighPart = 0L;
KdTimerStart.LowPart = 0L;
//
// Initialize ID for NEXT packet to send and Expect ID of next incoming
// packet.
//
KdpNextPacketIdToSend = INITIAL_PACKET_ID | SYNC_PACKET_ID;
KdpPacketIdExpected = INITIAL_PACKET_ID;
//
// If requested, stop in the kernel debugger.
//
if (StopInDebugger) {
DbgBreakPoint();
}
return TRUE;
}