+/**\r
+ Notification function for keystrokes.\r
+\r
+ @param[in] KeyData The key that was pressed.\r
+\r
+ @retval EFI_SUCCESS The operation was successful.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NotificationFunction(\r
+ IN EFI_KEY_DATA *KeyData\r
+ )\r
+{\r
+ EFI_INPUT_KEY Key;\r
+ if ( ((KeyData->Key.UnicodeChar == L'c') &&\r
+ (KeyData->KeyState.KeyShiftState == (EFI_SHIFT_STATE_VALID|EFI_LEFT_CONTROL_PRESSED) || KeyData->KeyState.KeyShiftState == (EFI_SHIFT_STATE_VALID|EFI_RIGHT_CONTROL_PRESSED))) ||\r
+ (KeyData->Key.UnicodeChar == 3)\r
+ ){ \r
+ if (ShellInfoObject.NewEfiShellProtocol->ExecutionBreak == NULL) {\r
+ return (EFI_UNSUPPORTED);\r
+ }\r
+ return (gBS->SignalEvent(ShellInfoObject.NewEfiShellProtocol->ExecutionBreak));\r
+ } else if ((KeyData->Key.UnicodeChar == L's') &&\r
+ (KeyData->KeyState.KeyShiftState == (EFI_SHIFT_STATE_VALID|EFI_LEFT_CONTROL_PRESSED) || KeyData->KeyState.KeyShiftState == (EFI_SHIFT_STATE_VALID|EFI_RIGHT_CONTROL_PRESSED))\r
+ ){ \r
+ ShellInfoObject.HaltOutput = TRUE;\r
+\r
+ //\r
+ // Make sure that there are no pending keystrokes to pervent the pause.\r
+ //\r
+ gST->ConIn->Reset(gST->ConIn, FALSE);\r
+ while (gST->ConIn->ReadKeyStroke (gST->ConIn, &Key)==EFI_SUCCESS);\r
+ }\r
+ return (EFI_SUCCESS);\r
+}\r
+\r
+/**\r
+ Function to start monitoring for CTRL-C using SimpleTextInputEx. This \r
+ feature's enabled state was not known when the shell initially launched.\r
+\r
+ @retval EFI_SUCCESS The feature is enabled.\r
+ @retval EFI_OUT_OF_RESOURCES There is not enough mnemory available.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+InernalEfiShellStartMonitor(\r
+ VOID\r
+ )\r
+{\r
+ EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *SimpleEx;\r
+ EFI_KEY_DATA KeyData;\r
+ EFI_STATUS Status;\r
+\r
+ Status = gBS->OpenProtocol(\r
+ gST->ConsoleInHandle,\r
+ &gEfiSimpleTextInputExProtocolGuid,\r
+ (VOID**)&SimpleEx,\r
+ gImageHandle,\r
+ NULL,\r
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
+ if (EFI_ERROR(Status)) {\r
+ ShellPrintHiiEx(\r
+ -1, \r
+ -1, \r
+ NULL,\r
+ STRING_TOKEN (STR_SHELL_NO_IN_EX),\r
+ ShellInfoObject.HiiHandle);\r
+ return (EFI_SUCCESS);\r
+ }\r
+\r
+ if (ShellInfoObject.NewEfiShellProtocol->ExecutionBreak == NULL) {\r
+ return (EFI_UNSUPPORTED);\r
+ }\r
+\r
+ KeyData.KeyState.KeyToggleState = 0;\r
+ KeyData.Key.ScanCode = 0;\r
+ KeyData.KeyState.KeyShiftState = EFI_SHIFT_STATE_VALID|EFI_LEFT_CONTROL_PRESSED;\r
+ KeyData.Key.UnicodeChar = L'c';\r