https://git.reactos.org/?p=reactos.git;a=commitdiff;h=9537653ee79376b200be87...
commit 9537653ee79376b200be87ebabd7e6ce7a30065f Author: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org AuthorDate: Sun Nov 17 16:44:22 2019 +0100 Commit: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org CommitDate: Sun Nov 17 23:21:50 2019 +0100
[NTOS:KD/KDBG] Code enhancements for KDBG/KD.
- Introduce KdpScreenAcquire() / KdpScreenRelease() helpers that allow to correctly acquire or release the screen when using INBV for "Screen-Mode" debugging.
- Introduce KdpAcquireLock() / KdpReleaseLock() helpers so as to reduce the copy-pasted code required when acquiring spin-locks in the KD debug logger functions.
- Close the opened KdpLogFileHandle file in the KdpInitDebugLog() logger in case we failed to create the logger writer thread. Also use explicit kernel-mode handle when opening the log file.
- static-ify some local variables, remove few hardcoded values, and minor formatting.
- Correctly define the INIT_FUNCTION's. --- ntoskrnl/include/internal/kd.h | 17 ++- ntoskrnl/kd/kdinit.c | 8 +- ntoskrnl/kd/kdio.c | 233 ++++++++++++++++++++++------------------- ntoskrnl/kd64/kdinit.c | 10 +- ntoskrnl/kdbg/kdb.c | 35 +++---- 5 files changed, 156 insertions(+), 147 deletions(-)
diff --git a/ntoskrnl/include/internal/kd.h b/ntoskrnl/include/internal/kd.h index 162ece58f71..ef66e2abea2 100644 --- a/ntoskrnl/include/internal/kd.h +++ b/ntoskrnl/include/internal/kd.h @@ -106,7 +106,7 @@ VOID typedef VOID (NTAPI*PKDP_PRINT_ROUTINE)( - LPSTR String, + PCHAR String, ULONG Length );
@@ -139,6 +139,12 @@ KdInitSystem( PLOADER_PARAMETER_BLOCK LoaderBlock );
+VOID +KdpScreenAcquire(VOID); + +VOID +KdpScreenRelease(VOID); + VOID NTAPI KdpScreenInit( @@ -155,7 +161,7 @@ KdpSerialInit(
VOID NTAPI -KdpInitDebugLog( +KdpDebugLogInit( struct _KD_DISPATCH_TABLE *DispatchTable, ULONG BootPhase ); @@ -193,13 +199,6 @@ BOOLEAN NTAPI KdpDetectConflicts(PCM_RESOURCE_LIST DriverList);
-VOID -NTAPI -KdpBochsDebugPrint( - IN PCH Message, - IN ULONG Length -); - BOOLEAN NTAPI KdpSafeReadMemory( diff --git a/ntoskrnl/kd/kdinit.c b/ntoskrnl/kd/kdinit.c index 3e32b160920..a73ec17ecad 100644 --- a/ntoskrnl/kd/kdinit.c +++ b/ntoskrnl/kd/kdinit.c @@ -31,7 +31,7 @@ KD_DISPATCH_TABLE DispatchTable[KdMax];
PKDP_INIT_ROUTINE InitRoutines[KdMax] = {KdpScreenInit, KdpSerialInit, - KdpInitDebugLog, + KdpDebugLogInit, KdpBochsInit, KdpKdbgInit};
@@ -39,9 +39,9 @@ extern ANSI_STRING KdpLogFileName;
/* PRIVATE FUNCTIONS *********************************************************/
+INIT_FUNCTION PCHAR NTAPI -INIT_FUNCTION KdpGetDebugMode(PCHAR Currentp2) { PCHAR p1, p2 = Currentp2; @@ -135,9 +135,9 @@ KdpGetDebugMode(PCHAR Currentp2) return p2; }
+INIT_FUNCTION VOID NTAPI -INIT_FUNCTION KdpCallInitRoutine(ULONG BootPhase) { PLIST_ENTRY CurrentEntry; @@ -213,7 +213,7 @@ KdInitSystem(ULONG BootPhase, } else { - /* Called from a bugcheck or a re-enable. Unconditionally enable KD */ + /* Called from a bugcheck or a re-enable. Unconditionally enable KD. */ KdDebuggerEnabled = TRUE; }
diff --git a/ntoskrnl/kd/kdio.c b/ntoskrnl/kd/kdio.c index 38a1d3fc9a2..23b163b4ebf 100644 --- a/ntoskrnl/kd/kdio.c +++ b/ntoskrnl/kd/kdio.c @@ -17,33 +17,33 @@ /* GLOBALS *******************************************************************/
#define KdpBufferSize (1024 * 512) -BOOLEAN KdpLoggingEnabled = FALSE; -PCHAR KdpDebugBuffer = NULL; -volatile ULONG KdpCurrentPosition = 0; -volatile ULONG KdpFreeBytes = 0; -KSPIN_LOCK KdpDebugLogSpinLock; -KEVENT KdpLoggerThreadEvent; -HANDLE KdpLogFileHandle; +static BOOLEAN KdpLoggingEnabled = FALSE; +static PCHAR KdpDebugBuffer = NULL; +static volatile ULONG KdpCurrentPosition = 0; +static volatile ULONG KdpFreeBytes = 0; +static KSPIN_LOCK KdpDebugLogSpinLock; +static KEVENT KdpLoggerThreadEvent; +static HANDLE KdpLogFileHandle; ANSI_STRING KdpLogFileName = RTL_CONSTANT_STRING("\SystemRoot\debug.log");
-KSPIN_LOCK KdpSerialSpinLock; +static KSPIN_LOCK KdpSerialSpinLock; ULONG SerialPortNumber = DEFAULT_DEBUG_PORT; CPPORT SerialPortInfo = {0, DEFAULT_DEBUG_BAUD_RATE, 0};
-/* Current Port in use. FIXME: Do we support more then one? */ +/* Current Port in use. FIXME: Do we support more than one? */ ULONG KdpPort;
#define KdpScreenLineLengthDefault 80 -CHAR KdpScreenLineBuffer[KdpScreenLineLengthDefault + 1] = ""; -ULONG KdpScreenLineBufferPos = 0, KdpScreenLineLength = 0; +static CHAR KdpScreenLineBuffer[KdpScreenLineLengthDefault + 1] = ""; +static ULONG KdpScreenLineBufferPos = 0, KdpScreenLineLength = 0;
const ULONG KdpDmesgBufferSize = 128 * 1024; // 512*1024; // 5*1024*1024; PCHAR KdpDmesgBuffer = NULL; volatile ULONG KdpDmesgCurrentPosition = 0; volatile ULONG KdpDmesgFreeBytes = 0; volatile ULONG KdbDmesgTotalWritten = 0; -KSPIN_LOCK KdpDmesgLogSpinLock; volatile BOOLEAN KdbpIsInDmesgMode = FALSE; +static KSPIN_LOCK KdpDmesgLogSpinLock;
/* UTILITY FUNCTIONS *********************************************************/
@@ -57,8 +57,8 @@ volatile BOOLEAN KdbpIsInDmesgMode = FALSE; * * See also: kd64\kdinit.c */ -static SIZE_T -INIT_FUNCTION +static INIT_FUNCTION +SIZE_T KdpGetMemorySizeInMBs(IN PLOADER_PARAMETER_BLOCK LoaderBlock) { PLIST_ENTRY ListEntry; @@ -98,8 +98,8 @@ KdpGetMemorySizeInMBs(IN PLOADER_PARAMETER_BLOCK LoaderBlock) }
/* See also: kd64\kdinit.c */ -static VOID -INIT_FUNCTION +static INIT_FUNCTION +VOID KdpPrintBanner(IN SIZE_T MemSizeMBs) { DPRINT1("-----------------------------------------------------\n"); @@ -109,10 +109,51 @@ KdpPrintBanner(IN SIZE_T MemSizeMBs) DPRINT1("ARC Paths: %s %s %s %s\n", KeLoaderBlock->ArcBootDeviceName, KeLoaderBlock->NtHalPathName, KeLoaderBlock->ArcHalDeviceName, KeLoaderBlock->NtBootPathName); }
-/* FILE DEBUG LOG FUNCTIONS **************************************************/ +/* LOCKING FUNCTIONS *********************************************************/ + +KIRQL +NTAPI +KdpAcquireLock(IN PKSPIN_LOCK SpinLock) +{ + KIRQL OldIrql; + + /* Acquire the spinlock without waiting at raised IRQL */ + while (TRUE) + { + /* Loop until the spinlock becomes available */ + while (!KeTestSpinLock(SpinLock)); + + /* Spinlock is free, raise IRQL to high level */ + KeRaiseIrql(HIGH_LEVEL, &OldIrql); + + /* Try to get the spinlock */ + if (KeTryToAcquireSpinLockAtDpcLevel(SpinLock)) + break; + + /* Someone else got the spinlock, lower IRQL back */ + KeLowerIrql(OldIrql); + } + + return OldIrql; +}
VOID NTAPI +KdpReleaseLock(IN PKSPIN_LOCK SpinLock, + IN KIRQL OldIrql) +{ + /* Release the spinlock */ + KiReleaseSpinLock(SpinLock); + // KeReleaseSpinLockFromDpcLevel(SpinLock); + + /* Restore the old IRQL */ + KeLowerIrql(OldIrql); +} + +/* FILE DEBUG LOG FUNCTIONS **************************************************/ + +static VOID +NTAPI KdpLoggerThread(PVOID Context) { ULONG beg, end, num; @@ -122,7 +163,7 @@ KdpLoggerThread(PVOID Context)
while (TRUE) { - KeWaitForSingleObject(&KdpLoggerThreadEvent, 0, KernelMode, FALSE, NULL); + KeWaitForSingleObject(&KdpLoggerThreadEvent, Executive, KernelMode, FALSE, NULL);
/* Bug */ /* Keep KdpCurrentPosition and KdpFreeBytes values in local @@ -158,32 +199,18 @@ KdpLoggerThread(PVOID Context) } }
-VOID +static VOID NTAPI -KdpPrintToLogFile(PCH String, +KdpPrintToLogFile(PCHAR String, ULONG StringLength) { - ULONG beg, end, num; KIRQL OldIrql; + ULONG beg, end, num;
if (KdpDebugBuffer == NULL) return;
/* Acquire the printing spinlock without waiting at raised IRQL */ - while (TRUE) - { - /* Wait when the spinlock becomes available */ - while (!KeTestSpinLock(&KdpDebugLogSpinLock)); - - /* Spinlock was free, raise IRQL */ - KeRaiseIrql(HIGH_LEVEL, &OldIrql); - - /* Try to get the spinlock */ - if (KeTryToAcquireSpinLockAtDpcLevel(&KdpDebugLogSpinLock)) - break; - - /* Someone else got the spinlock, lower IRQL back */ - KeLowerIrql(OldIrql); - } + OldIrql = KdpAcquireLock(&KdpDebugLogSpinLock);
beg = KdpCurrentPosition; num = KdpFreeBytes; @@ -207,21 +234,17 @@ KdpPrintToLogFile(PCH String, } }
- /* Release spinlock */ - KiReleaseSpinLock(&KdpDebugLogSpinLock); - - /* Lower IRQL */ - KeLowerIrql(OldIrql); + /* Release the spinlock */ + KdpReleaseLock(&KdpDebugLogSpinLock, OldIrql);
/* Signal the logger thread */ if (OldIrql <= DISPATCH_LEVEL && KdpLoggingEnabled) - KeSetEvent(&KdpLoggerThreadEvent, 0, FALSE); + KeSetEvent(&KdpLoggerThreadEvent, IO_NO_INCREMENT, FALSE); }
VOID NTAPI -INIT_FUNCTION -KdpInitDebugLog(PKD_DISPATCH_TABLE DispatchTable, +KdpDebugLogInit(PKD_DISPATCH_TABLE DispatchTable, ULONG BootPhase) { NTSTATUS Status; @@ -239,12 +262,11 @@ KdpInitDebugLog(PKD_DISPATCH_TABLE DispatchTable, KdComPortInUse = NULL;
/* Write out the functions that we support for now */ - DispatchTable->KdpInitRoutine = KdpInitDebugLog; + DispatchTable->KdpInitRoutine = KdpDebugLogInit; DispatchTable->KdpPrintRoutine = KdpPrintToLogFile;
/* Register as a Provider */ InsertTailList(&KdProviders, &DispatchTable->KdProvidersList); - } else if (BootPhase == 1) { @@ -272,7 +294,7 @@ KdpInitDebugLog(PKD_DISPATCH_TABLE DispatchTable,
InitializeObjectAttributes(&ObjectAttributes, &FileName, - 0, + OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, NULL, NULL);
@@ -291,7 +313,8 @@ KdpInitDebugLog(PKD_DISPATCH_TABLE DispatchTable,
RtlFreeUnicodeString(&FileName);
- if (!NT_SUCCESS(Status)) return; + if (!NT_SUCCESS(Status)) + return;
KeInitializeEvent(&KdpLoggerThreadEvent, SynchronizationEvent, TRUE);
@@ -303,8 +326,11 @@ KdpInitDebugLog(PKD_DISPATCH_TABLE DispatchTable, NULL, KdpLoggerThread, NULL); - - if (!NT_SUCCESS(Status)) return; + if (!NT_SUCCESS(Status)) + { + NtClose(KdpLogFileHandle); + return; + }
Priority = 7; NtSetInformationThread(ThreadHandle, @@ -318,28 +344,14 @@ KdpInitDebugLog(PKD_DISPATCH_TABLE DispatchTable,
VOID NTAPI -KdpSerialDebugPrint(LPSTR Message, +KdpSerialDebugPrint(PCHAR Message, ULONG Length) { + PCHAR pch = (PCHAR)Message; KIRQL OldIrql; - PCHAR pch = (PCHAR) Message;
/* Acquire the printing spinlock without waiting at raised IRQL */ - while (TRUE) - { - /* Wait when the spinlock becomes available */ - while (!KeTestSpinLock(&KdpSerialSpinLock)); - - /* Spinlock was free, raise IRQL */ - KeRaiseIrql(HIGH_LEVEL, &OldIrql); - - /* Try to get the spinlock */ - if (KeTryToAcquireSpinLockAtDpcLevel(&KdpSerialSpinLock)) - break; - - /* Someone else got the spinlock, lower IRQL back */ - KeLowerIrql(OldIrql); - } + OldIrql = KdpAcquireLock(&KdpSerialSpinLock);
/* Output the message */ while (pch < Message + Length && *pch != '\0') @@ -352,11 +364,8 @@ KdpSerialDebugPrint(LPSTR Message, pch++; }
- /* Release spinlock */ - KiReleaseSpinLock(&KdpSerialSpinLock); - - /* Lower IRQL */ - KeLowerIrql(OldIrql); + /* Release the spinlock */ + KdpReleaseLock(&KdpSerialSpinLock, OldIrql); }
VOID @@ -399,27 +408,58 @@ KdpSerialInit(PKD_DISPATCH_TABLE DispatchTable,
/* SCREEN FUNCTIONS **********************************************************/
+VOID +KdpScreenAcquire(VOID) +{ + if (InbvIsBootDriverInstalled() /* && + !InbvCheckDisplayOwnership() */) + { + /* Acquire ownership and reset the display */ + InbvAcquireDisplayOwnership(); + InbvResetDisplay(); + InbvSolidColorFill(0, 0, 639, 479, 0); + InbvSetTextColor(15); + InbvInstallDisplayStringFilter(NULL); + InbvEnableDisplayString(TRUE); + InbvSetScrollRegion(0, 0, 639, 479); + } +} + +// extern VOID NTAPI InbvSetDisplayOwnership(IN BOOLEAN DisplayOwned); + +VOID +KdpScreenRelease(VOID) +{ + if (InbvIsBootDriverInstalled()&& + InbvCheckDisplayOwnership()) + { + /* Release the display */ + // InbvSetDisplayOwnership(FALSE); + InbvNotifyDisplayOwnershipLost(NULL); + } +} + /* * Screen debug logger function KdpScreenPrint() writes text messages into * KdpDmesgBuffer, using it as a circular buffer. KdpDmesgBuffer contents could * be later (re)viewed using dmesg command of kdbg. KdpScreenPrint() protects * KdpDmesgBuffer from simultaneous writes by use of KdpDmesgLogSpinLock. */ -VOID +static VOID NTAPI -KdpScreenPrint(LPSTR Message, +KdpScreenPrint(PCHAR Message, ULONG Length) { - ULONG beg, end, num; + PCHAR pch = (PCHAR)Message; KIRQL OldIrql; - PCHAR pch = (PCHAR) Message; + ULONG beg, end, num;
while (pch < Message + Length && *pch) { - if(*pch == '\b') + if (*pch == '\b') { /* HalDisplayString does not support '\b'. Workaround it and use '\r' */ - if(KdpScreenLineLength > 0) + if (KdpScreenLineLength > 0) { /* Remove last character from buffer */ KdpScreenLineBuffer[--KdpScreenLineLength] = '\0'; @@ -436,10 +476,10 @@ KdpScreenPrint(LPSTR Message, KdpScreenLineBuffer[KdpScreenLineLength] = '\0'; }
- if(*pch == '\n' || KdpScreenLineLength == KdpScreenLineLengthDefault) + if (*pch == '\n' || KdpScreenLineLength == KdpScreenLineLengthDefault) { /* Print buffered characters */ - if(KdpScreenLineBufferPos != KdpScreenLineLength) + if (KdpScreenLineBufferPos != KdpScreenLineLength) HalDisplayString(KdpScreenLineBuffer + KdpScreenLineBufferPos);
/* Clear line buffer */ @@ -451,7 +491,7 @@ KdpScreenPrint(LPSTR Message, }
/* Print buffered characters */ - if(KdpScreenLineBufferPos != KdpScreenLineLength) + if (KdpScreenLineBufferPos != KdpScreenLineLength) { HalDisplayString(KdpScreenLineBuffer + KdpScreenLineBufferPos); KdpScreenLineBufferPos = KdpScreenLineLength; @@ -465,21 +505,7 @@ KdpScreenPrint(LPSTR Message, return;
/* Acquire the printing spinlock without waiting at raised IRQL */ - while (TRUE) - { - /* Wait when the spinlock becomes available */ - while (!KeTestSpinLock(&KdpDmesgLogSpinLock)); - - /* Spinlock was free, raise IRQL */ - KeRaiseIrql(HIGH_LEVEL, &OldIrql); - - /* Try to get the spinlock */ - if (KeTryToAcquireSpinLockAtDpcLevel(&KdpDmesgLogSpinLock)) - break; - - /* Someone else got the spinlock, lower IRQL back */ - KeLowerIrql(OldIrql); - } + OldIrql = KdpAcquireLock(&KdpDmesgLogSpinLock);
/* Invariant: always_true(KdpDmesgFreeBytes == KdpDmesgBufferSize); * set num to min(KdpDmesgFreeBytes, Length). @@ -504,11 +530,8 @@ KdpScreenPrint(LPSTR Message, KdbDmesgTotalWritten += num; }
- /* Release spinlock */ - KiReleaseSpinLock(&KdpDmesgLogSpinLock); - - /* Lower IRQL */ - KeLowerIrql(OldIrql); + /* Release the spinlock */ + KdpReleaseLock(&KdpDmesgLogSpinLock, OldIrql);
/* Optional step(?): find out a way to notify about buffer exhaustion, * and possibly fall into kbd to use dmesg command: user will read @@ -544,13 +567,7 @@ KdpScreenInit(PKD_DISPATCH_TABLE DispatchTable, KdbDmesgTotalWritten = 0;
/* Take control of the display */ - InbvAcquireDisplayOwnership(); - InbvResetDisplay(); - InbvSolidColorFill(0, 0, 639, 479, 0); - InbvSetTextColor(15); - InbvSetScrollRegion(0, 0, 639, 479); - InbvInstallDisplayStringFilter(NULL); - InbvEnableDisplayString(TRUE); + KdpScreenAcquire();
/* Initialize spinlock */ KeInitializeSpinLock(&KdpDmesgLogSpinLock); diff --git a/ntoskrnl/kd64/kdinit.c b/ntoskrnl/kd64/kdinit.c index b6a8beb9ce9..43d2e8fc6b5 100644 --- a/ntoskrnl/kd64/kdinit.c +++ b/ntoskrnl/kd64/kdinit.c @@ -26,8 +26,8 @@ * * See also: kd\kdio.c */ -static SIZE_T -INIT_FUNCTION +static INIT_FUNCTION +SIZE_T KdpGetMemorySizeInMBs(IN PLOADER_PARAMETER_BLOCK LoaderBlock) { PLIST_ENTRY ListEntry; @@ -67,8 +67,8 @@ KdpGetMemorySizeInMBs(IN PLOADER_PARAMETER_BLOCK LoaderBlock) }
/* See also: kd\kdio.c */ -static VOID -INIT_FUNCTION +static INIT_FUNCTION +VOID KdpPrintBanner(IN SIZE_T MemSizeMBs) { DPRINT1("-----------------------------------------------------\n"); @@ -340,7 +340,7 @@ KdInitSystem(IN ULONG BootPhase, } else { - /* Called from a bugcheck or a re-enable. Save the Kernel Base */ + /* Called from a bugcheck or a re-enable. Save the Kernel Base. */ KdVersionBlock.KernBase = (ULONG64)(LONG_PTR)PsNtosImageBase;
/* Unconditionally enable KD */ diff --git a/ntoskrnl/kdbg/kdb.c b/ntoskrnl/kdbg/kdb.c index d75ab137e64..5e7f5e249fc 100644 --- a/ntoskrnl/kdbg/kdb.c +++ b/ntoskrnl/kdbg/kdb.c @@ -1218,21 +1218,9 @@ KdbpInternalEnter(VOID)
KbdDisableMouse();
- if (KdpDebugMode.Screen && - InbvIsBootDriverInstalled() && - !InbvCheckDisplayOwnership()) - { - /* Acquire ownership and reset the display */ - InbvAcquireDisplayOwnership(); - InbvResetDisplay(); - - /* Display debugger prompt */ - InbvSolidColorFill(0, 0, 639, 479, 0); - InbvSetTextColor(15); - InbvInstallDisplayStringFilter(NULL); - InbvEnableDisplayString(TRUE); - InbvSetScrollRegion(0, 0, 639, 479); - } + /* Take control of the display */ + if (KdpDebugMode.Screen) + KdpScreenAcquire();
/* Call the interface's main loop on a different stack */ Thread = PsGetCurrentThread(); @@ -1244,7 +1232,7 @@ KdbpInternalEnter(VOID) Thread->Tcb.StackLimit = (ULONG_PTR)KdbStack; Thread->Tcb.KernelStack = (char*)KdbStack + KDB_STACK_SIZE;
- /*KdbpPrint("Switching to KDB stack 0x%08x-0x%08x (Current Stack is 0x%08x)\n", Thread->Tcb.StackLimit, Thread->Tcb.StackBase, Esp);*/ + // KdbpPrint("Switching to KDB stack 0x%08x-0x%08x (Current Stack is 0x%08x)\n", Thread->Tcb.StackLimit, Thread->Tcb.StackBase, Esp);
KdbpStackSwitchAndCall(KdbStack + KDB_STACK_SIZE - sizeof(ULONG), KdbpCallMainLoop);
@@ -1252,6 +1240,11 @@ KdbpInternalEnter(VOID) Thread->Tcb.StackBase = SavedStackBase; Thread->Tcb.StackLimit = SavedStackLimit; Thread->Tcb.KernelStack = SavedKernelStack; + + /* Release the display */ + if (KdpDebugMode.Screen) + KdpScreenRelease(); + KbdEnableMouse(); }
@@ -1363,7 +1356,7 @@ KdbEnterDebuggerException( EnterConditionMet = FALSE; }
- /* If we stopped on one of our breakpoints then let the user know. */ + /* If we stopped on one of our breakpoints then let the user know */ KdbLastBreakPointNr = -1; KdbEnteredOnSingleStep = FALSE;
@@ -1374,7 +1367,7 @@ KdbEnterDebuggerException(
if (ExceptionCode == STATUS_BREAKPOINT) { - /* ... and restore the original instruction. */ + /* ... and restore the original instruction */ if (!NT_SUCCESS(KdbpOverwriteInstruction(KdbCurrentProcess, BreakPoint->Address, BreakPoint->Data.SavedInstruction, NULL))) { @@ -1408,7 +1401,7 @@ KdbEnterDebuggerException( { ASSERT((TrapFrame->EFlags & EFLAGS_TF) == 0);
- /* Delete the temporary breakpoint which was used to step over or into the instruction. */ + /* Delete the temporary breakpoint which was used to step over or into the instruction */ KdbpDeleteBreakPoint(-1, BreakPoint);
if (--KdbNumSingleSteps > 0) @@ -1626,7 +1619,7 @@ KdbEnterDebuggerException( return kdHandleException; }
- /* Call the main loop. */ + /* Call the main loop */ KdbpInternalEnter();
/* Check if we should single step */ @@ -1698,9 +1691,9 @@ continue_execution: return ContinueType; }
+INIT_FUNCTION VOID NTAPI -INIT_FUNCTION KdbpGetCommandLineSettings( PCHAR p1) {