Hopefully fix some input problems. If input does not work for you please let me know. Modified: trunk/reactos/ntoskrnl/dbg/kdb.h Modified: trunk/reactos/ntoskrnl/dbg/kdb_cli.c Modified: trunk/reactos/ntoskrnl/dbg/kdb_keyboard.c Modified: trunk/reactos/ntoskrnl/dbg/kdb_serial.c _____
Modified: trunk/reactos/ntoskrnl/dbg/kdb.h --- trunk/reactos/ntoskrnl/dbg/kdb.h 2005-03-06 00:50:48 UTC (rev 13844) +++ trunk/reactos/ntoskrnl/dbg/kdb.h 2005-03-06 02:06:11 UTC (rev 13845) @@ -272,10 +272,15 @@
#define KdbpSafeReadMemory(dst, src, size) MmSafeCopyFromUser(dst, src, size) #define KdbpSafeWriteMemory(dst, src, size) MmSafeCopyToUser(dst, src, size) + +#define KdbpGetCharKeyboard(ScanCode) KdbpTryGetCharKeyboard(ScanCode, 0) CHAR -KdbpTryGetCharKeyboard(PULONG ScanCode); -ULONG -KdbpTryGetCharSerial(VOID); +KdbpTryGetCharKeyboard(PULONG ScanCode, UINT Retry); + +#define KdbpGetCharSerial() KdbpTryGetCharSerial(0) +CHAR +KdbpTryGetCharSerial(UINT Retry); + VOID KdbEnter(VOID); VOID _____
Modified: trunk/reactos/ntoskrnl/dbg/kdb_cli.c --- trunk/reactos/ntoskrnl/dbg/kdb_cli.c 2005-03-06 00:50:48 UTC (rev 13844) +++ trunk/reactos/ntoskrnl/dbg/kdb_cli.c 2005-03-06 02:06:11 UTC (rev 13845) @@ -1682,6 +1682,7 @@
INT Length; INT i; INT RowsPrintedByTerminal; + ULONG ScanCode; va_list ap;
/* Check if the user has aborted output of the current command */ @@ -1703,20 +1704,17 @@ { /* Try to query number of rows from terminal. A reply looks like "\x1b[8;24;80t" */ TerminalReportsSize = FALSE; - DbgPrint("\x1b[18t"); - i = 10; - while ((i-- > 0) && ((c = KdbpTryGetCharSerial()) == -1)); + //DbgPrint("\x1b[18t"); + c = KdbpTryGetCharSerial(10); if (c == KEY_ESC) { - i = 5; - while ((i-- > 0) && ((c = KdbpTryGetCharSerial()) == -1)); + c = KdbpTryGetCharSerial(5); if (c == '[') { Length = 0; for (;;) { - i = 5; - while ((i-- > 0) && ((c = KdbpTryGetCharSerial()) == -1)); + c = KdbpTryGetCharSerial(5); if (c == -1) break; Buffer[Length++] = c; @@ -1781,13 +1779,19 @@ if (KdbNumberOfColsPrinted > 0) DbgPrint("\n"); DbgPrint("--- Press q to abort, any other key to continue ---"); - while ((c = KdbpTryGetCharSerial()) == -1); + if (KdDebugState & KD_DEBUG_KDSERIAL) + c = KdbpGetCharSerial(); + else + c = KdbpGetCharKeyboard(&ScanCode); if (c == '\r') { - /* Ignore \r and wait for \n or another \r - if \n is not received here + /* Try to read '\n' which might follow '\r' - if \n is not received here * it will be interpreted as "return" when the next command should be read. */ - while ((c = KdbpTryGetCharSerial()) == -1); + if (KdDebugState & KD_DEBUG_KDSERIAL) + c = KdbpTryGetCharSerial(5); + else + c = KdbpTryGetCharKeyboard(&ScanCode, 5); } DbgPrint("\n"); if (c == 'q') @@ -1914,7 +1918,7 @@ OUT PCHAR Buffer, IN ULONG Size) { - CHAR Key; + CHAR Key, NextKey; PCHAR Orig = Buffer; ULONG ScanCode = 0; BOOLEAN EchoOn; @@ -1929,14 +1933,14 @@ { if (KdDebugState & KD_DEBUG_KDSERIAL) { - while ((Key = KdbpTryGetCharSerial()) == -1); + Key = KdbpGetCharSerial(); ScanCode = 0; if (Key == KEY_ESC) /* ESC */ { - while ((Key = KdbpTryGetCharSerial()) == -1); + Key = KdbpGetCharSerial(); if (Key == '[') { - while ((Key = KdbpTryGetCharSerial()) == -1); + Key = KdbpGetCharSerial(); switch (Key) { case 'A': @@ -1954,7 +1958,9 @@ } } else - while ((Key = KdbpTryGetCharKeyboard(&ScanCode)) == -1); + { + Key = KdbpGetCharKeyboard(&ScanCode); + }
if ((Buffer - Orig) >= (Size - 1)) { @@ -1965,10 +1971,13 @@
if (Key == '\r') { - /* Ignore this key... */ - } - else if (Key == '\n') - { + /* Read the next char - this is to throw away a \n which most clients should + * send after \r. + */ + if (KdDebugState & KD_DEBUG_KDSERIAL) + NextKey = KdbpTryGetCharSerial(5); + else + NextKey = KdbpTryGetCharKeyboard(&ScanCode, 5); DbgPrint("\n"); /* * Repeat the last command if the user presses enter. Reduces the _____
Modified: trunk/reactos/ntoskrnl/dbg/kdb_keyboard.c --- trunk/reactos/ntoskrnl/dbg/kdb_keyboard.c 2005-03-06 00:50:48 UTC (rev 13844) +++ trunk/reactos/ntoskrnl/dbg/kdb_keyboard.c 2005-03-06 02:06:11 UTC (rev 13845) @@ -62,12 +62,13 @@
}
CHAR -KdbpTryGetCharKeyboard(PULONG ScanCode) +KdbpTryGetCharKeyboard(PULONG ScanCode, UINT Retry) { static byte_t last_key = 0; static byte_t shift = 0; char c; - while(1) { + BOOLEAN KeepRetrying = (Retry == 0); + while (KeepRetrying || Retry-- > 0) { unsigned char status = kbd_read_status(); while (status & KBD_STAT_OBF) { byte_t scancode; @@ -91,6 +92,8 @@ } } } + + return -1; }
#endif _____
Modified: trunk/reactos/ntoskrnl/dbg/kdb_serial.c --- trunk/reactos/ntoskrnl/dbg/kdb_serial.c 2005-03-06 00:50:48 UTC (rev 13844) +++ trunk/reactos/ntoskrnl/dbg/kdb_serial.c 2005-03-06 02:06:11 UTC (rev 13845) @@ -20,11 +20,14 @@
CHAR -KdbpTryGetCharSerial() +KdbpTryGetCharSerial(UINT Retry) { - UCHAR Result; + CHAR Result = -1;
- while( !KdPortGetByteEx (&LogPortInfo, &Result) ); + if (Retry == 0) + while (!KdPortGetByteEx(&LogPortInfo, (PUCHAR)&Result)); + else + while (!KdPortGetByteEx(&LogPortInfo, (PUCHAR)&Result) && Retry--
0);
return Result; }