From 6868505225177b298e9db32544315ffc3b1a2f55 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 | 50 +++++++++++++++---- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/Features/Intel/UserInterface/VirtualKeyboardFeaturePkg/VirtualKeyboardDxe/Keyboard.c b/Features/Intel/UserInterface/VirtualKeyboardFeaturePkg/VirtualKeyboardDxe/Keyboard.c index 9c9b585ae2f..c1efb7b54da 100644 --- a/Features/Intel/UserInterface/VirtualKeyboardFeaturePkg/VirtualKeyboardDxe/Keyboard.c +++ b/Features/Intel/UserInterface/VirtualKeyboardFeaturePkg/VirtualKeyboardDxe/Keyboard.c @@ -883,18 +883,48 @@ VkApiStart ( KeyData.KeyState.KeyToggleState = 0; KeyData.KeyState.KeyShiftState = 0; - KeyData.Key.ScanCode = SCAN_ESC; KeyData.Key.UnicodeChar = CHAR_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.UnicodeChar = CHAR_NULL; + NotifyHandle = 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;