- //\r
- // Pre-process KeyboardBuffer to check if Ctrl + Alt + Del is pressed.\r
- //\r
- SavedTail = UsbKeyboardDevice->KeyboardBuffer.BufferTail;\r
- Index = UsbKeyboardDevice->KeyboardBuffer.BufferHead;\r
- while (Index != SavedTail) {\r
- RemoveKeyCode (&(UsbKeyboardDevice->KeyboardBuffer), &UsbKey);\r
-\r
- KeyDescriptor = GetKeyDescriptor (UsbKeyboardDevice, UsbKey.KeyCode);\r
- ASSERT (KeyDescriptor != NULL);\r
-\r
- switch (KeyDescriptor->Modifier) {\r
-\r
- case EFI_LEFT_CONTROL_MODIFIER:\r
- case EFI_RIGHT_CONTROL_MODIFIER:\r
- if (UsbKey.Down) {\r
- UsbKeyboardDevice->CtrlOn = TRUE;\r
- } else {\r
- UsbKeyboardDevice->CtrlOn = FALSE;\r
- }\r
- break;\r
-\r
- case EFI_LEFT_ALT_MODIFIER:\r
- case EFI_RIGHT_ALT_MODIFIER:\r
- if (UsbKey.Down) {\r
- UsbKeyboardDevice->AltOn = TRUE;\r
- } else {\r
- UsbKeyboardDevice->AltOn = FALSE;\r
- }\r
- break;\r
-\r
- case EFI_ALT_GR_MODIFIER:\r
- if (UsbKey.Down) {\r
- UsbKeyboardDevice->AltGrOn = TRUE;\r
- } else {\r
- UsbKeyboardDevice->AltGrOn = FALSE;\r
- }\r
- break;\r
-\r
- //\r
- // For Del Key, check if Ctrl + Alt + Del occurs for reset.\r
- //\r
- case EFI_DELETE_MODIFIER:\r
- if (UsbKey.Down) {\r
- if ((UsbKeyboardDevice->CtrlOn) && (UsbKeyboardDevice->AltOn)) {\r
- gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, 0, NULL);\r
- }\r
- }\r
- break;\r
-\r
- default:\r
- break;\r
- }\r
-\r
- //\r
- // Insert the key back to the buffer,\r
- // so the key sequence will not be destroyed.\r
- //\r
- InsertKeyCode (\r
- &(UsbKeyboardDevice->KeyboardBuffer),\r
- UsbKey.KeyCode,\r
- UsbKey.Down\r
- );\r
- Index = UsbKeyboardDevice->KeyboardBuffer.BufferHead;\r
-\r
- }\r