]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Universal/BdsDxe/Hotkey.c
Fix the potential issue that using integrate as BOOLEAN value in judgment.
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / BdsDxe / Hotkey.c
index bfad7ce7552b6ea94fe9a559c692ab8da1c86664..99c3306ec9985fcd4aa58f024a8b94a22a12fe7f 100644 (file)
@@ -101,11 +101,11 @@ RegisterHotkey (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  KeyOptionSize = sizeof (EFI_KEY_OPTION) + GET_KEY_CODE_COUNT (KeyOption->KeyData.PackedValue) * sizeof (EFI_INPUT_KEY);\r
+  KeyOptionSize = sizeof (EFI_KEY_OPTION) + KeyOption->KeyData.Options.InputKeyCount * sizeof (EFI_INPUT_KEY);\r
   UpdateBootOption = FALSE;\r
 \r
   //\r
-  // check whether HotKey conflict with keys used by Setup Browser\r
+  // Check whether HotKey conflict with keys used by Setup Browser\r
   //\r
   KeyOrder = BdsLibGetVariableAndSize (\r
                VAR_KEY_ORDER,\r
@@ -143,7 +143,7 @@ RegisterHotkey (
     }\r
 \r
     if (KeyOption->KeyData.PackedValue == TempOption->KeyData.PackedValue) {\r
-      if (GET_KEY_CODE_COUNT (KeyOption->KeyData.PackedValue) == 0 ||\r
+      if (KeyOption->KeyData.Options.InputKeyCount == 0 ||\r
           CompareMem (\r
             ((UINT8 *) TempOption) + sizeof (EFI_KEY_OPTION),\r
             ((UINT8 *) KeyOption) + sizeof (EFI_KEY_OPTION),\r
@@ -311,6 +311,7 @@ UnregisterHotkey (
   @return  EFI_NOT_FOUND Fail to find boot option variable.\r
 **/\r
 EFI_STATUS\r
+EFIAPI\r
 HotkeyCallback (\r
   IN EFI_KEY_DATA     *KeyData\r
 )\r
@@ -348,7 +349,7 @@ HotkeyCallback (
     HotkeyData = &Hotkey->KeyData[Hotkey->WaitingKey];\r
     if ((KeyData->Key.ScanCode == HotkeyData->Key.ScanCode) &&\r
        (KeyData->Key.UnicodeChar == HotkeyData->Key.UnicodeChar) &&\r
-       ((HotkeyData->KeyState.KeyShiftState & EFI_SHIFT_STATE_VALID) ? (KeyData->KeyState.KeyShiftState == HotkeyData->KeyState.KeyShiftState) : 1)) {\r
+       (((HotkeyData->KeyState.KeyShiftState & EFI_SHIFT_STATE_VALID) != 0) ? (KeyData->KeyState.KeyShiftState == HotkeyData->KeyState.KeyShiftState) : TRUE)) {\r
       //\r
       // Receive an expecting key stroke\r
       //\r
@@ -468,7 +469,7 @@ HotkeyRegisterNotify (
         return Status;\r
       }\r
       Index ++;\r
-    } while (Index < Hotkey->CodeCount);\r
+    } while ((Index < Hotkey->CodeCount) && (Index < (sizeof (Hotkey->KeyData) / sizeof (EFI_KEY_DATA))));\r
 \r
     Link = GetNextNode (&mHotkeyList, Link);\r
   }\r
@@ -538,7 +539,7 @@ HotkeyInsertList (
   BDS_HOTKEY_OPTION  *HotkeyLeft;\r
   BDS_HOTKEY_OPTION  *HotkeyRight;\r
   UINTN              Index;\r
-  UINT32             KeyOptions;\r
+  EFI_BOOT_KEY_DATA  KeyOptions;\r
   UINT32             KeyShiftStateLeft;\r
   UINT32             KeyShiftStateRight;\r
   EFI_INPUT_KEY      *InputKey;\r
@@ -552,19 +553,33 @@ HotkeyInsertList (
   HotkeyLeft->Signature = BDS_HOTKEY_OPTION_SIGNATURE;\r
   HotkeyLeft->BootOptionNumber = KeyOption->BootOption;\r
 \r
-  KeyOptions = KeyOption->KeyData.PackedValue;\r
+  KeyOptions = KeyOption->KeyData;\r
 \r
-  HotkeyLeft->CodeCount = (UINT8) GET_KEY_CODE_COUNT (KeyOptions);\r
+  HotkeyLeft->CodeCount = (UINT8) KeyOptions.Options.InputKeyCount;\r
 \r
   //\r
   // Map key shift state from KeyOptions to EFI_KEY_DATA.KeyState\r
   //\r
-  KeyShiftStateRight = (KeyOptions & EFI_KEY_OPTION_SHIFT) |\r
-                       ((KeyOptions & EFI_KEY_OPTION_CONTROL) << 1) |\r
-                       ((KeyOptions & EFI_KEY_OPTION_ALT) << 2) |\r
-                       ((KeyOptions & EFI_KEY_OPTION_LOGO) << 3) |\r
-                       ((KeyOptions & (EFI_KEY_OPTION_MENU | EFI_KEY_OPTION_SYSREQ)) << 4) |\r
-                       EFI_SHIFT_STATE_VALID;\r
+  KeyShiftStateRight = EFI_SHIFT_STATE_VALID;\r
+  if (KeyOptions.Options.ShiftPressed) {\r
+    KeyShiftStateRight |= EFI_RIGHT_SHIFT_PRESSED;\r
+  }\r
+  if (KeyOptions.Options.ControlPressed) {\r
+    KeyShiftStateRight |= EFI_RIGHT_CONTROL_PRESSED;\r
+  }\r
+  if (KeyOptions.Options.AltPressed) {\r
+    KeyShiftStateRight |= EFI_RIGHT_ALT_PRESSED;\r
+  }\r
+  if (KeyOptions.Options.LogoPressed) {\r
+    KeyShiftStateRight |= EFI_RIGHT_LOGO_PRESSED;\r
+  }\r
+  if (KeyOptions.Options.MenuPressed) {\r
+    KeyShiftStateRight |= EFI_MENU_KEY_PRESSED;\r
+  }\r
+  if (KeyOptions.Options.SysReqPressed) {\r
+    KeyShiftStateRight |= EFI_SYS_REQ_PRESSED;\r
+  }\r
+\r
 \r
   KeyShiftStateLeft = (KeyShiftStateRight & 0xffffff00) | ((KeyShiftStateRight & 0xff) << 1);\r
 \r
@@ -636,12 +651,14 @@ InitializeHotkeyService (
 \r
   //\r
   // Export our capability - EFI_BOOT_OPTION_SUPPORT_KEY and EFI_BOOT_OPTION_SUPPORT_APP\r
+  // with maximum number of key presses of 3\r
   //\r
   BootOptionSupport = EFI_BOOT_OPTION_SUPPORT_KEY | EFI_BOOT_OPTION_SUPPORT_APP;\r
+  SET_BOOT_OPTION_SUPPORT_KEY_COUNT (BootOptionSupport, 3);\r
   Status = gRT->SetVariable (\r
                   L"BootOptionSupport",\r
                   &gEfiGlobalVariableGuid,\r
-                  EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
+                  EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
                   sizeof (UINT32),\r
                   &BootOptionSupport\r
                   );\r