From fb03061a2a68dd70dda54ddcb74c8fe92d994c0a Mon Sep 17 00:00:00 2001 From: Konstantin Aladyshev Date: Wed, 14 Jul 2021 12:54:56 +0300 Subject: Add lesson 39 Signed-off-by: Konstantin Aladyshev --- UefiLessonsPkg/HotKeyDriver/HotKeyDriver.c | 107 +++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100755 UefiLessonsPkg/HotKeyDriver/HotKeyDriver.c (limited to 'UefiLessonsPkg/HotKeyDriver/HotKeyDriver.c') diff --git a/UefiLessonsPkg/HotKeyDriver/HotKeyDriver.c b/UefiLessonsPkg/HotKeyDriver/HotKeyDriver.c new file mode 100755 index 0000000..bb73c0c --- /dev/null +++ b/UefiLessonsPkg/HotKeyDriver/HotKeyDriver.c @@ -0,0 +1,107 @@ +#include +#include + +#include + + +EFI_HANDLE NotifyHandle; +EFI_HANDLE NotifyHandle1; + +EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL* InputEx = NULL; + +EFI_STATUS EFIAPI MyKeyNotificationFunction(EFI_KEY_DATA* KeyData) +{ + Print(L"\nHot Key 1 is pressed"); + return EFI_SUCCESS; +} + +EFI_STATUS EFIAPI MyKeyNotificationFunction1(EFI_KEY_DATA* KeyData) +{ + Print(L"\nHot Key 2 is pressed"); + return EFI_SUCCESS; +} + + +EFI_STATUS +EFIAPI +HotKeyDriverUnload( + IN EFI_HANDLE ImageHandle + ) +{ + if (!InputEx) + return EFI_SUCCESS; + + EFI_STATUS Status; + + if (!NotifyHandle) { + Status = InputEx->UnregisterKeyNotify(InputEx, + (VOID*)NotifyHandle); + + if (EFI_ERROR(Status)) { + Print(L"Error! Can't perform RegisterKeyNotify: %r", Status); + return Status; + } + } + + if (!NotifyHandle1) { + Status = InputEx->UnregisterKeyNotify(InputEx, + (VOID*)NotifyHandle1); + + if (EFI_ERROR(Status)) { + Print(L"Error! Can't perform RegisterKeyNotify: %r", Status); + return Status; + } + } + + return EFI_SUCCESS; +} + + +EFI_STATUS +EFIAPI +HotKeyDriverEntryPoint( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status = gBS->LocateProtocol( + &gEfiSimpleTextInputExProtocolGuid, + NULL, + (VOID**)&InputEx + ); + if (EFI_ERROR(Status)) { + Print(L"Error! Can't locate EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL: %r", Status); + return Status; + } + + EFI_KEY_DATA HotKey; + HotKey.Key.ScanCode = 0; + HotKey.Key.UnicodeChar = L'z'; + HotKey.KeyState.KeyShiftState = EFI_LEFT_CONTROL_PRESSED | EFI_LEFT_ALT_PRESSED | EFI_SHIFT_STATE_VALID; + HotKey.KeyState.KeyToggleState = 0; + + Status = InputEx->RegisterKeyNotify(InputEx, + &HotKey, + MyKeyNotificationFunction, + (VOID**)&NotifyHandle); + + if (EFI_ERROR(Status)) { + Print(L"Error! Can't perform RegisterKeyNotify: %r", Status); + return Status; + } + + HotKey.KeyState.KeyShiftState = 0; + HotKey.KeyState.KeyToggleState = EFI_TOGGLE_STATE_VALID | EFI_NUM_LOCK_ACTIVE | EFI_KEY_STATE_EXPOSED; + + Status = InputEx->RegisterKeyNotify(InputEx, + &HotKey, + MyKeyNotificationFunction1, + (VOID**)&NotifyHandle1); + + if (EFI_ERROR(Status)) { + Print(L"Error! Can't perform RegisterKeyNotify: %r", Status); + return Status; + } + + return EFI_SUCCESS; +} -- cgit v1.2.3-18-g5258