From 48ef4bcdca119f194bc00f091de5d12cb7faeb62 Mon Sep 17 00:00:00 2001 From: Aiken Harris Date: Mon, 4 May 2026 14:09:30 +0200 Subject: [PATCH] Clear input key buffer before read and propagate EFI_STATUS from ReadKeyStroke --- boot/xtldr/console.cc | 9 +++++++-- boot/xtldr/includes/xtldr.hh | 2 +- sdk/xtdk/bltypes.h | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/boot/xtldr/console.cc b/boot/xtldr/console.cc index e003591..b460c58 100644 --- a/boot/xtldr/console.cc +++ b/boot/xtldr/console.cc @@ -221,10 +221,15 @@ Console::QueryMode(OUT PUINT_PTR ResX, * @since XT 1.0 */ XTCDECL -VOID +EFI_STATUS Console::ReadKeyStroke(OUT PEFI_INPUT_KEY Key) { - XtLoader::GetEfiSystemTable()->ConIn->ReadKeyStroke(XtLoader::GetEfiSystemTable()->ConIn, Key); + /* Clear the key structure to prevent ghost keystrokes */ + Key->ScanCode = 0; + Key->UnicodeChar = 0; + + /* Read the keystroke from the EFI input console */ + return XtLoader::GetEfiSystemTable()->ConIn->ReadKeyStroke(XtLoader::GetEfiSystemTable()->ConIn, Key); } /** diff --git a/boot/xtldr/includes/xtldr.hh b/boot/xtldr/includes/xtldr.hh index 03d8146..8534bf1 100644 --- a/boot/xtldr/includes/xtldr.hh +++ b/boot/xtldr/includes/xtldr.hh @@ -93,7 +93,7 @@ class Console STATIC XTCDECL XTSTATUS PutChar(IN WCHAR Character); STATIC XTCDECL VOID QueryMode(OUT PUINT_PTR ResX, OUT PUINT_PTR ResY); - STATIC XTCDECL VOID ReadKeyStroke(OUT PEFI_INPUT_KEY Key); + STATIC XTCDECL EFI_STATUS ReadKeyStroke(OUT PEFI_INPUT_KEY Key); STATIC XTCDECL VOID ResetInputBuffer(); STATIC XTCDECL VOID SetAttributes(IN ULONGLONG Attributes); STATIC XTCDECL VOID SetCursorPosition(IN ULONGLONG PosX, diff --git a/sdk/xtdk/bltypes.h b/sdk/xtdk/bltypes.h index 11bcc0c..32bbeae 100644 --- a/sdk/xtdk/bltypes.h +++ b/sdk/xtdk/bltypes.h @@ -77,7 +77,7 @@ typedef VOID (XTCDECL *PBL_CONSOLE_DISABLE_CURSOR)(); typedef VOID (XTCDECL *PBL_CONSOLE_ENABLE_CURSOR)(); typedef VOID (XTCDECL *PBL_CONSOLE_PRINT)(IN PCWSTR Format, IN ...); typedef VOID (XTCDECL *PBL_CONSOLE_QUERY_MODE)(OUT PUINT_PTR ResX, OUT PUINT_PTR ResY); -typedef VOID (XTCDECL *PBL_CONSOLE_READ_KEY_STROKE)(OUT PEFI_INPUT_KEY Key); +typedef EFI_STATUS (XTCDECL *PBL_CONSOLE_READ_KEY_STROKE)(OUT PEFI_INPUT_KEY Key); typedef VOID (XTCDECL *PBL_CONSOLE_RESET_INPUT_BUFFER)(); typedef VOID (XTCDECL *PBL_CONSOLE_SET_ATTRIBUTES)(IN ULONGLONG Attributes); typedef VOID (XTCDECL *PBL_CONSOLE_SET_CURSOR_POSITION)(IN ULONGLONG PosX, IN ULONGLONG PosY);