From d94bef5d9725402b71c1f6674bc18304fc890b6d Mon Sep 17 00:00:00 2001 From: Darbin Reyes Date: Mon, 25 Nov 2024 14:13:16 -0800 Subject: [PATCH] Pkg-Module: Features/VirtualKeyboardDxe The Keyboard.c driver did not include ScanCodes like F1,F2,F12,etc. and UnicodeChars like Backspace, Tab in VK_NOTIFY NotifyList which is why these keys were not getting registered and not getting pushed in the KeyBuffer stack which resulted in undefined behavior of continuous backspace and not recognizing the relevant key push after the buffer overflow condition Signed-off-by: Contributor Name --- .../VirtualKeyboardDxe/Keyboard.c | 51 +++++++++++++++---- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/Features/Intel/UserInterface/VirtualKeyboardFeaturePkg/VirtualKeyboardDxe/Keyboard.c b/Features/Intel/UserInterface/VirtualKeyboardFeaturePkg/VirtualKeyboardDxe/Keyboard.c index 9c9b585ae2f..8dd47a07d6e 100644 --- a/Features/Intel/UserInterface/VirtualKeyboardFeaturePkg/VirtualKeyboardDxe/Keyboard.c +++ b/Features/Intel/UserInterface/VirtualKeyboardFeaturePkg/VirtualKeyboardDxe/Keyboard.c @@ -883,18 +883,47 @@ VkApiStart ( KeyData.KeyState.KeyToggleState = 0; KeyData.KeyState.KeyShiftState = 0; - KeyData.Key.ScanCode = SCAN_ESC; - KeyData.Key.UnicodeChar = CHAR_NULL; + KeyData.Key.ScanCode = SCAN_NULL; NotifyHandle = NULL; - Status = SimpleEx->RegisterKeyNotify ( - SimpleEx, - &KeyData, - VkNotifyKeyCallback, - &NotifyHandle - ); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_VK_ROUTINE_ENTRY_EXIT | DEBUG_ERROR, "ERROR - Failed to register 'Esc', Status: %r\n", Status)); - goto Error; + + for (KeyData.Key.ScanCode = SCAN_UP; KeyData.Key.ScanCode <= SCAN_ESC; KeyData.Key.ScanCode++) { + Status = SimpleEx->RegisterKeyNotify ( + SimpleEx, + &KeyData, + VkNotifyKeyCallback, + &NotifyHandle + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_VK_ROUTINE_ENTRY_EXIT | DEBUG_ERROR, + "ERROR - Failed to register '%c', Status: %r\n", + KeyData.Key.ScanCode, + Status + )); + break; + } + } + + KeyData.KeyState.KeyToggleState = 0; + KeyData.KeyState.KeyShiftState = 0; + KeyData.Key.ScanCode = SCAN_NULL; + + for (KeyData.Key.UnicodeChar = CHAR_BACKSPACE; KeyData.Key.UnicodeChar <= CHAR_LINEFEED; KeyData.Key.UnicodeChar++) { + Status = SimpleEx->RegisterKeyNotify ( + SimpleEx, + &KeyData, + VkNotifyKeyCallback, + &NotifyHandle + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_VK_ROUTINE_ENTRY_EXIT | DEBUG_ERROR, + "ERROR - Failed to register '%c', Status: %r\n", + KeyData.Key.UnicodeChar, + Status + )); + break; + } } KeyData.KeyState.KeyToggleState = 0;