3 Copyright (c) 2006, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 This file produces the Simple Text In for an Gop window.
20 This stuff is linked at the hip to the Window, since the window
21 processing is done in a thread kicked off in WinNtGopImplementation.c
23 Since the window information is processed in an other thread we need
24 a keyboard Queue to pass data about. The Simple Text In code just
25 takes data off the Queue. The WinProc message loop takes keyboard input
26 and places it in the Queue.
36 TODO: Add function description
38 @param Private TODO: add argument description
40 @retval EFI_SUCCESS TODO: Add description for return value
45 IN GOP_PRIVATE_DATA
*Private
48 Private
->WinNtThunk
->InitializeCriticalSection (&Private
->QCriticalSection
);
50 Private
->Queue
.Front
= 0;
51 Private
->Queue
.Rear
= MAX_Q
- 1;
52 Private
->Queue
.Count
= 0;
58 TODO: Add function description
60 @param Private TODO: add argument description
62 @retval EFI_SUCCESS TODO: Add description for return value
67 IN GOP_PRIVATE_DATA
*Private
70 Private
->Queue
.Count
= 0;
71 Private
->WinNtThunk
->DeleteCriticalSection (&Private
->QCriticalSection
);
77 TODO: Add function description
79 @param Private TODO: add argument description
80 @param Key TODO: add argument description
82 @retval EFI_NOT_READY TODO: Add description for return value
83 @retval EFI_SUCCESS TODO: Add description for return value
88 IN GOP_PRIVATE_DATA
*Private
,
92 Private
->WinNtThunk
->EnterCriticalSection (&Private
->QCriticalSection
);
94 if (Private
->Queue
.Count
== MAX_Q
) {
95 Private
->WinNtThunk
->LeaveCriticalSection (&Private
->QCriticalSection
);
99 Private
->Queue
.Rear
= (Private
->Queue
.Rear
+ 1) % MAX_Q
;
100 Private
->Queue
.Q
[Private
->Queue
.Rear
] = Key
;
101 Private
->Queue
.Count
++;
103 Private
->WinNtThunk
->LeaveCriticalSection (&Private
->QCriticalSection
);
109 TODO: Add function description
111 @param Private TODO: add argument description
112 @param Key TODO: add argument description
114 @retval EFI_NOT_READY TODO: Add description for return value
115 @retval EFI_SUCCESS TODO: Add description for return value
120 IN GOP_PRIVATE_DATA
*Private
,
121 OUT EFI_INPUT_KEY
*Key
124 Private
->WinNtThunk
->EnterCriticalSection (&Private
->QCriticalSection
);
126 if (Private
->Queue
.Count
== 0) {
127 Private
->WinNtThunk
->LeaveCriticalSection (&Private
->QCriticalSection
);
128 return EFI_NOT_READY
;
131 *Key
= Private
->Queue
.Q
[Private
->Queue
.Front
];
132 Private
->Queue
.Front
= (Private
->Queue
.Front
+ 1) % MAX_Q
;
133 Private
->Queue
.Count
--;
135 Private
->WinNtThunk
->LeaveCriticalSection (&Private
->QCriticalSection
);
141 TODO: Add function description
143 @param Private TODO: add argument description
145 @retval EFI_NOT_READY TODO: Add description for return value
146 @retval EFI_SUCCESS TODO: Add description for return value
151 IN GOP_PRIVATE_DATA
*Private
154 if (Private
->Queue
.Count
== 0) {
155 return EFI_NOT_READY
;
162 GopPrivateIsKeyRegistered (
163 IN EFI_KEY_DATA
*RegsiteredData
,
164 IN EFI_KEY_DATA
*InputData
172 RegsiteredData - A pointer to a buffer that is filled in with the keystroke
173 state data for the key that was registered.
174 InputData - A pointer to a buffer that is filled in with the keystroke
175 state data for the key that was pressed.
178 TRUE - Key be pressed matches a registered key.
179 FLASE - Match failed.
183 ASSERT (RegsiteredData
!= NULL
&& InputData
!= NULL
);
185 if ((RegsiteredData
->Key
.ScanCode
!= InputData
->Key
.ScanCode
) ||
186 (RegsiteredData
->Key
.UnicodeChar
!= InputData
->Key
.UnicodeChar
)) {
191 // Assume KeyShiftState/KeyToggleState = 0 in Registered key data means these state could be ignored.
193 if (RegsiteredData
->KeyState
.KeyShiftState
!= 0 &&
194 RegsiteredData
->KeyState
.KeyShiftState
!= InputData
->KeyState
.KeyShiftState
) {
197 if (RegsiteredData
->KeyState
.KeyToggleState
!= 0 &&
198 RegsiteredData
->KeyState
.KeyToggleState
!= InputData
->KeyState
.KeyToggleState
) {
208 GopPrivateInvokeRegisteredFunction (
209 IN GOP_PRIVATE_DATA
*Private
,
210 IN EFI_KEY_DATA
*KeyData
216 This function updates the status light of NumLock, ScrollLock and CapsLock.
220 Private - The private structure of WinNt Gop device.
221 KeyData - A pointer to a buffer that is filled in with the keystroke
222 state data for the key that was pressed.
226 EFI_SUCCESS - The status light is updated successfully.
231 WIN_NT_GOP_SIMPLE_TEXTIN_EX_NOTIFY
*CurrentNotify
;
233 for (Link
= Private
->NotifyList
.ForwardLink
; Link
!= &Private
->NotifyList
; Link
= Link
->ForwardLink
) {
236 WIN_NT_GOP_SIMPLE_TEXTIN_EX_NOTIFY
,
238 WIN_NT_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
240 if (GopPrivateIsKeyRegistered (&CurrentNotify
->KeyData
, KeyData
)) {
241 CurrentNotify
->KeyNotificationFn (KeyData
);
247 GopPrivateUpdateStatusLight (
248 IN GOP_PRIVATE_DATA
*Private
254 This function updates the status light of NumLock, ScrollLock and CapsLock.
258 Private - The private structure of WinNt console In/Out.
262 EFI_SUCCESS - The status light is updated successfully.
267 // BUGBUG:Only SendInput/keybd_event function can toggle
268 // NumLock, CapsLock and ScrollLock keys.
269 // Neither of these functions is included in EFI_WIN_NT_THUNK_PROTOCOL.
270 // Thus, return immediately without operation.
278 GopPrivateResetWorker (
279 IN GOP_PRIVATE_DATA
*Private
285 This function is a worker function for SimpleTextIn/SimpleTextInEx.Reset().
289 Private - WinNT GOP private structure
293 EFI_SUCCESS - Reset successfully
301 // Enter critical section
303 OldTpl
= gBS
->RaiseTPL (TPL_NOTIFY
);
306 // A reset is draining the Queue
308 while (GopPrivateDeleteQ (Private
, &Key
) == EFI_SUCCESS
)
311 Private
->LeftShift
= FALSE
;
312 Private
->RightShift
= FALSE
;
313 Private
->LeftAlt
= FALSE
;
314 Private
->RightAlt
= FALSE
;
315 Private
->LeftCtrl
= FALSE
;
316 Private
->RightCtrl
= FALSE
;
317 Private
->LeftLogo
= FALSE
;
318 Private
->RightLogo
= FALSE
;
319 Private
->Menu
= FALSE
;
320 Private
->SysReq
= FALSE
;
322 Private
->CapsLock
= FALSE
;
323 Private
->NumLock
= FALSE
;
324 Private
->ScrollLock
= FALSE
;
326 Private
->KeyState
.KeyShiftState
= EFI_SHIFT_STATE_VALID
;
327 Private
->KeyState
.KeyToggleState
= EFI_TOGGLE_STATE_VALID
;
330 // Leave critical section and return
332 gBS
->RestoreTPL (OldTpl
);
338 GopPrivateReadKeyStrokeWorker (
339 IN GOP_PRIVATE_DATA
*Private
,
340 OUT EFI_KEY_DATA
*KeyData
345 Reads the next keystroke from the input device. The WaitForKey Event can
346 be used to test for existance of a keystroke via WaitForEvent () call.
349 Private - The private structure of WinNt Gop device.
350 KeyData - A pointer to a buffer that is filled in with the keystroke
351 state data for the key that was pressed.
354 EFI_SUCCESS - The keystroke information was returned.
355 EFI_NOT_READY - There was no keystroke data availiable.
356 EFI_DEVICE_ERROR - The keystroke information was not returned due to
358 EFI_INVALID_PARAMETER - KeyData is NULL.
365 if (KeyData
== NULL
) {
366 return EFI_INVALID_PARAMETER
;
370 // Enter critical section
372 OldTpl
= gBS
->RaiseTPL (TPL_NOTIFY
);
374 Status
= GopPrivateCheckQ (Private
);
375 if (!EFI_ERROR (Status
)) {
377 // If a Key press exists try and read it.
379 Status
= GopPrivateDeleteQ (Private
, &KeyData
->Key
);
380 if (!EFI_ERROR (Status
)) {
382 // Record Key shift state and toggle state
384 if (Private
->LeftCtrl
) {
385 Private
->KeyState
.KeyShiftState
|= EFI_LEFT_CONTROL_PRESSED
;
387 if (Private
->RightCtrl
) {
388 Private
->KeyState
.KeyShiftState
|= EFI_RIGHT_CONTROL_PRESSED
;
390 if (Private
->LeftAlt
) {
391 Private
->KeyState
.KeyShiftState
|= EFI_LEFT_ALT_PRESSED
;
393 if (Private
->RightAlt
) {
394 Private
->KeyState
.KeyShiftState
|= EFI_RIGHT_ALT_PRESSED
;
396 if (Private
->LeftShift
) {
397 Private
->KeyState
.KeyShiftState
|= EFI_LEFT_SHIFT_PRESSED
;
399 if (Private
->RightShift
) {
400 Private
->KeyState
.KeyShiftState
|= EFI_RIGHT_SHIFT_PRESSED
;
402 if (Private
->LeftLogo
) {
403 Private
->KeyState
.KeyShiftState
|= EFI_LEFT_LOGO_PRESSED
;
405 if (Private
->RightLogo
) {
406 Private
->KeyState
.KeyShiftState
|= EFI_RIGHT_LOGO_PRESSED
;
409 Private
->KeyState
.KeyShiftState
|= EFI_MENU_KEY_PRESSED
;
411 if (Private
->SysReq
) {
412 Private
->KeyState
.KeyShiftState
|= EFI_SYS_REQ_PRESSED
;
414 if (Private
->CapsLock
) {
415 Private
->KeyState
.KeyToggleState
|= EFI_CAPS_LOCK_ACTIVE
;
417 if (Private
->NumLock
) {
418 Private
->KeyState
.KeyToggleState
|= EFI_NUM_LOCK_ACTIVE
;
420 if (Private
->ScrollLock
) {
421 Private
->KeyState
.KeyToggleState
|= EFI_SCROLL_LOCK_ACTIVE
;
424 KeyData
->KeyState
.KeyShiftState
= Private
->KeyState
.KeyShiftState
;
425 KeyData
->KeyState
.KeyToggleState
= Private
->KeyState
.KeyToggleState
;
427 Private
->KeyState
.KeyShiftState
= EFI_SHIFT_STATE_VALID
;
428 Private
->KeyState
.KeyToggleState
= EFI_TOGGLE_STATE_VALID
;
431 // Leave critical section and return
433 gBS
->RestoreTPL (OldTpl
);
435 GopPrivateInvokeRegisteredFunction (Private
, KeyData
);
442 // Leave critical section and return
444 gBS
->RestoreTPL (OldTpl
);
452 // Simple Text In implementation.
457 TODO: Add function description
459 @param This TODO: add argument description
460 @param ExtendedVerification TODO: add argument description
462 @retval EFI_SUCCESS TODO: Add description for return value
467 WinNtGopSimpleTextInReset (
468 IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL
*This
,
469 IN BOOLEAN ExtendedVerification
472 GOP_PRIVATE_DATA
*Private
;
474 Private
= GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS (This
);
476 return GopPrivateResetWorker (Private
);
481 TODO: Add function description
483 @param This TODO: add argument description
484 @param Key TODO: add argument description
486 @return TODO: add return values
491 WinNtGopSimpleTextInReadKeyStroke (
492 IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL
*This
,
493 OUT EFI_INPUT_KEY
*Key
496 GOP_PRIVATE_DATA
*Private
;
498 EFI_KEY_DATA KeyData
;
500 Private
= GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS (This
);
502 Status
= GopPrivateReadKeyStrokeWorker (Private
, &KeyData
);
503 if (EFI_ERROR (Status
)) {
507 CopyMem (Key
, &KeyData
.Key
, sizeof (EFI_INPUT_KEY
));
514 TODO: Add function description
516 @param Event TODO: add argument description
517 @param Context TODO: add argument description
519 @return TODO: add return values
524 WinNtGopSimpleTextInWaitForKey (
529 GOP_PRIVATE_DATA
*Private
;
533 Private
= (GOP_PRIVATE_DATA
*) Context
;
536 // Enter critical section
538 OldTpl
= gBS
->RaiseTPL (TPL_NOTIFY
);
540 Status
= GopPrivateCheckQ (Private
);
541 if (!EFI_ERROR (Status
)) {
543 // If a there is a key in the queue signal our event.
545 gBS
->SignalEvent (Event
);
548 // We need to sleep or NT will schedule this thread with such high
549 // priority that WinProc thread will never run and we will not see
550 // keyboard input. This Sleep makes the syste run 10x faster, so don't
553 Private
->WinNtThunk
->Sleep (1);
557 // Leave critical section and return
559 gBS
->RestoreTPL (OldTpl
);
563 // Simple Text Input Ex protocol functions
568 WinNtGopSimpleTextInExResetEx (
569 IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL
*This
,
570 IN BOOLEAN ExtendedVerification
575 Reset the input device and optionaly run diagnostics
578 This - Protocol instance pointer.
579 ExtendedVerification - Driver may perform diagnostics on reset.
582 EFI_SUCCESS - The device was reset.
586 GOP_PRIVATE_DATA
*Private
;
588 Private
= GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This
);
590 return GopPrivateResetWorker (Private
);
595 WinNtGopSimpleTextInExReadKeyStrokeEx (
596 IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL
*This
,
597 OUT EFI_KEY_DATA
*KeyData
602 Reads the next keystroke from the input device. The WaitForKey Event can
603 be used to test for existance of a keystroke via WaitForEvent () call.
606 This - Protocol instance pointer.
607 KeyData - A pointer to a buffer that is filled in with the keystroke
608 state data for the key that was pressed.
611 EFI_SUCCESS - The keystroke information was returned.
612 EFI_NOT_READY - There was no keystroke data availiable.
613 EFI_DEVICE_ERROR - The keystroke information was not returned due to
615 EFI_INVALID_PARAMETER - KeyData is NULL.
619 GOP_PRIVATE_DATA
*Private
;
621 if (KeyData
== NULL
) {
622 return EFI_INVALID_PARAMETER
;
625 Private
= GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This
);
627 return GopPrivateReadKeyStrokeWorker (Private
, KeyData
);
633 WinNtGopSimpleTextInExSetState (
634 IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL
*This
,
635 IN EFI_KEY_TOGGLE_STATE
*KeyToggleState
640 Set certain state for the input device.
643 This - Protocol instance pointer.
644 KeyToggleState - A pointer to the EFI_KEY_TOGGLE_STATE to set the
645 state for the input device.
648 EFI_SUCCESS - The device state was set successfully.
649 EFI_DEVICE_ERROR - The device is not functioning correctly and could
650 not have the setting adjusted.
651 EFI_UNSUPPORTED - The device does not have the ability to set its state.
652 EFI_INVALID_PARAMETER - KeyToggleState is NULL.
657 GOP_PRIVATE_DATA
*Private
;
659 if (KeyToggleState
== NULL
) {
660 return EFI_INVALID_PARAMETER
;
663 Private
= GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This
);
665 if (((Private
->KeyState
.KeyToggleState
& EFI_TOGGLE_STATE_VALID
) != EFI_TOGGLE_STATE_VALID
) ||
666 ((*KeyToggleState
& EFI_TOGGLE_STATE_VALID
) != EFI_TOGGLE_STATE_VALID
)) {
667 return EFI_UNSUPPORTED
;
670 Private
->ScrollLock
= FALSE
;
671 Private
->NumLock
= FALSE
;
672 Private
->CapsLock
= FALSE
;
674 if ((*KeyToggleState
& EFI_SCROLL_LOCK_ACTIVE
) == EFI_SCROLL_LOCK_ACTIVE
) {
675 Private
->ScrollLock
= TRUE
;
677 if ((*KeyToggleState
& EFI_NUM_LOCK_ACTIVE
) == EFI_NUM_LOCK_ACTIVE
) {
678 Private
->NumLock
= TRUE
;
680 if ((*KeyToggleState
& EFI_CAPS_LOCK_ACTIVE
) == EFI_CAPS_LOCK_ACTIVE
) {
681 Private
->CapsLock
= TRUE
;
684 Status
= GopPrivateUpdateStatusLight (Private
);
685 if (EFI_ERROR (Status
)) {
686 return EFI_DEVICE_ERROR
;
689 Private
->KeyState
.KeyToggleState
= *KeyToggleState
;
696 WinNtGopSimpleTextInExRegisterKeyNotify (
697 IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL
*This
,
698 IN EFI_KEY_DATA
*KeyData
,
699 IN EFI_KEY_NOTIFY_FUNCTION KeyNotificationFunction
,
700 OUT EFI_HANDLE
*NotifyHandle
705 Register a notification function for a particular keystroke for the input device.
708 This - Protocol instance pointer.
709 KeyData - A pointer to a buffer that is filled in with the keystroke
710 information data for the key that was pressed.
711 KeyNotificationFunction - Points to the function to be called when the key
712 sequence is typed specified by KeyData.
713 NotifyHandle - Points to the unique handle assigned to the registered notification.
716 EFI_SUCCESS - The notification function was registered successfully.
717 EFI_OUT_OF_RESOURCES - Unable to allocate resources for necesssary data structures.
718 EFI_INVALID_PARAMETER - KeyData or NotifyHandle is NULL.
722 GOP_PRIVATE_DATA
*Private
;
723 WIN_NT_GOP_SIMPLE_TEXTIN_EX_NOTIFY
*CurrentNotify
;
725 WIN_NT_GOP_SIMPLE_TEXTIN_EX_NOTIFY
*NewNotify
;
727 if (KeyData
== NULL
|| KeyNotificationFunction
== NULL
|| NotifyHandle
== NULL
) {
728 return EFI_INVALID_PARAMETER
;
731 Private
= GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This
);
734 // Return EFI_SUCCESS if the (KeyData, NotificationFunction) is already registered.
736 for (Link
= Private
->NotifyList
.ForwardLink
; Link
!= &Private
->NotifyList
; Link
= Link
->ForwardLink
) {
739 WIN_NT_GOP_SIMPLE_TEXTIN_EX_NOTIFY
,
741 WIN_NT_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
743 if (GopPrivateIsKeyRegistered (&CurrentNotify
->KeyData
, KeyData
)) {
744 if (CurrentNotify
->KeyNotificationFn
== KeyNotificationFunction
) {
745 *NotifyHandle
= CurrentNotify
->NotifyHandle
;
752 // Allocate resource to save the notification function
754 NewNotify
= (WIN_NT_GOP_SIMPLE_TEXTIN_EX_NOTIFY
*) AllocateZeroPool (sizeof (WIN_NT_GOP_SIMPLE_TEXTIN_EX_NOTIFY
));
755 if (NewNotify
== NULL
) {
756 return EFI_OUT_OF_RESOURCES
;
759 NewNotify
->Signature
= WIN_NT_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
;
760 NewNotify
->KeyNotificationFn
= KeyNotificationFunction
;
761 NewNotify
->NotifyHandle
= (EFI_HANDLE
) NewNotify
;
762 CopyMem (&NewNotify
->KeyData
, KeyData
, sizeof (KeyData
));
763 InsertTailList (&Private
->NotifyList
, &NewNotify
->NotifyEntry
);
765 *NotifyHandle
= NewNotify
->NotifyHandle
;
773 WinNtGopSimpleTextInExUnregisterKeyNotify (
774 IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL
*This
,
775 IN EFI_HANDLE NotificationHandle
780 Remove a registered notification function from a particular keystroke.
783 This - Protocol instance pointer.
784 NotificationHandle - The handle of the notification function being unregistered.
787 EFI_SUCCESS - The notification function was unregistered successfully.
788 EFI_INVALID_PARAMETER - The NotificationHandle is invalid.
792 GOP_PRIVATE_DATA
*Private
;
794 WIN_NT_GOP_SIMPLE_TEXTIN_EX_NOTIFY
*CurrentNotify
;
796 if (NotificationHandle
== NULL
) {
797 return EFI_INVALID_PARAMETER
;
800 if (((WIN_NT_GOP_SIMPLE_TEXTIN_EX_NOTIFY
*) NotificationHandle
)->Signature
!= WIN_NT_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
) {
801 return EFI_INVALID_PARAMETER
;
804 Private
= GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This
);
806 for (Link
= Private
->NotifyList
.ForwardLink
; Link
!= &Private
->NotifyList
; Link
= Link
->ForwardLink
) {
809 WIN_NT_GOP_SIMPLE_TEXTIN_EX_NOTIFY
,
811 WIN_NT_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
813 if (CurrentNotify
->NotifyHandle
== NotificationHandle
) {
815 // Remove the notification function from NotifyList and free resources
817 RemoveEntryList (&CurrentNotify
->NotifyEntry
);
819 gBS
->FreePool (CurrentNotify
);
825 // Can not find the specified Notification Handle
827 return EFI_INVALID_PARAMETER
;
831 TODO: Add function description
833 @param Private TODO: add argument description
835 @return TODO: add return values
839 WinNtGopInitializeSimpleTextInForWindow (
840 IN GOP_PRIVATE_DATA
*Private
845 GopPrivateCreateQ (Private
);
848 // Initialize Simple Text In protoocol
850 Private
->SimpleTextIn
.Reset
= WinNtGopSimpleTextInReset
;
851 Private
->SimpleTextIn
.ReadKeyStroke
= WinNtGopSimpleTextInReadKeyStroke
;
853 Status
= gBS
->CreateEvent (
856 WinNtGopSimpleTextInWaitForKey
,
858 &Private
->SimpleTextIn
.WaitForKey
862 Private
->SimpleTextInEx
.Reset
= WinNtGopSimpleTextInExResetEx
;
863 Private
->SimpleTextInEx
.ReadKeyStrokeEx
= WinNtGopSimpleTextInExReadKeyStrokeEx
;
864 Private
->SimpleTextInEx
.SetState
= WinNtGopSimpleTextInExSetState
;
865 Private
->SimpleTextInEx
.RegisterKeyNotify
= WinNtGopSimpleTextInExRegisterKeyNotify
;
866 Private
->SimpleTextInEx
.UnregisterKeyNotify
= WinNtGopSimpleTextInExUnregisterKeyNotify
;
868 Private
->SimpleTextInEx
.Reset (&Private
->SimpleTextInEx
, FALSE
);
870 InitializeListHead (&Private
->NotifyList
);
872 Status
= gBS
->CreateEvent (
875 WinNtGopSimpleTextInWaitForKey
,
877 &Private
->SimpleTextInEx
.WaitForKeyEx
879 ASSERT_EFI_ERROR (Status
);
888 TODO: Add function description
890 @param Private TODO: add argument description
892 @retval EFI_SUCCESS TODO: Add description for return value
896 WinNtGopDestroySimpleTextInForWindow (
897 IN GOP_PRIVATE_DATA
*Private
900 GopPrivateDestroyQ (Private
);