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 Console based on Win32 APIs.
20 This file creates an Win32 window and attaches a SimpleTextOut protocol.
26 // Private worker functions.
31 WinNtSimpleTextOutScrollScreen (
32 IN OUT WIN_NT_SIMPLE_TEXT_PRIVATE_DATA
*Console
37 WinNtSimpleTextOutPutChar (
38 IN OUT WIN_NT_SIMPLE_TEXT_PRIVATE_DATA
*Console
,
43 // Modeule Global for Simple Text Out Mode.
45 #define MAX_SIMPLE_TEXT_OUT_MODE \
46 (sizeof(mWinNtSimpleTextOutSupportedModes)/sizeof(WIN_NT_SIMPLE_TEXT_OUT_MODE))
48 STATIC WIN_NT_SIMPLE_TEXT_OUT_MODE mWinNtSimpleTextOutSupportedModes
[] = {
59 WinNtSimpleTextOutReset (
60 IN EFI_SIMPLE_TEXT_OUT_PROTOCOL
*This
,
61 IN BOOLEAN ExtendedVerification
67 TODO: Add function description
71 This - TODO: add argument description
72 ExtendedVerification - TODO: add argument description
76 EFI_SUCCESS - TODO: Add description for return value
80 WIN_NT_SIMPLE_TEXT_PRIVATE_DATA
*Private
;
82 Private
= WIN_NT_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This
);
84 WinNtSimpleTextOutSetAttribute (This
, EFI_TEXT_ATTR (This
->Mode
->Attribute
& 0x0F, EFI_BACKGROUND_BLACK
));
86 WinNtSimpleTextOutSetMode (This
, 0);
93 WinNtSimpleTextOutOutputString (
94 IN EFI_SIMPLE_TEXT_OUT_PROTOCOL
*This
,
101 TODO: Add function description
105 This - TODO: add argument description
106 String - TODO: add argument description
110 EFI_SUCCESS - TODO: Add description for return value
114 WIN_NT_SIMPLE_TEXT_PRIVATE_DATA
*Private
;
117 Private
= WIN_NT_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This
);
119 for (Str
= String
; *Str
!= '\0'; Str
++) {
122 if (Private
->Possition
.Y
== (Private
->MaxScreenSize
.Y
- 1)) {
123 WinNtSimpleTextOutScrollScreen (Private
);
126 if (Private
->Possition
.Y
< (Private
->MaxScreenSize
.Y
- 1)) {
127 Private
->Possition
.Y
++;
128 This
->Mode
->CursorRow
++;
133 Private
->Possition
.X
= 0;
134 This
->Mode
->CursorColumn
= 0;
138 if (Private
->Possition
.X
> 0) {
139 Private
->Possition
.X
--;
140 This
->Mode
->CursorColumn
--;
145 WinNtSimpleTextOutPutChar (Private
, *Str
);
154 WinNtSimpleTextOutPutChar (
155 IN OUT WIN_NT_SIMPLE_TEXT_PRIVATE_DATA
*Console
,
162 TODO: Add function description
166 Console - TODO: add argument description
167 Char - TODO: add argument description
171 TODO: add return values
181 CharInfo
.Char
.UnicodeChar
= Char
;
182 CharInfo
.Attributes
= Console
->Attribute
;
189 Region
.Left
= (INT16
) Console
->Possition
.X
;
190 Region
.Top
= (INT16
) Console
->Possition
.Y
;
191 Region
.Right
= (INT16
) (Console
->Possition
.X
+ 1);
192 Region
.Bottom
= (INT16
) Console
->Possition
.Y
;
194 Console
->WinNtThunk
->WriteConsoleOutput (
195 Console
->NtOutHandle
,
202 if (Console
->Possition
.X
>= (Console
->MaxScreenSize
.X
- 1)) {
204 // If you print off the end wrap around
206 Console
->SimpleTextOut
.OutputString (&Console
->SimpleTextOut
, L
"\n\r");
208 Console
->Possition
.X
++;
209 Console
->SimpleTextOut
.Mode
->CursorColumn
++;
212 Flag
= Console
->WinNtThunk
->SetConsoleCursorPosition (Console
->NtOutHandle
, Console
->Possition
);
217 WinNtSimpleTextOutScrollScreen (
218 IN OUT WIN_NT_SIMPLE_TEXT_PRIVATE_DATA
*Console
224 TODO: Add function description
228 Console - TODO: add argument description
232 TODO: add return values
240 CharInfo
.Char
.UnicodeChar
= ' ';
241 CharInfo
.Attributes
= Console
->Attribute
;
248 Scroll
.Right
= (INT16
) Console
->MaxScreenSize
.X
;
249 Scroll
.Bottom
= (INT16
) Console
->MaxScreenSize
.Y
;
251 Console
->WinNtThunk
->ScrollConsoleScreenBuffer (
252 Console
->NtOutHandle
,
263 WinNtSimpleTextOutTestString (
264 IN EFI_SIMPLE_TEXT_OUT_PROTOCOL
*This
,
271 TODO: Add function description
275 This - TODO: add argument description
276 String - TODO: add argument description
280 EFI_SUCCESS - TODO: Add description for return value
284 WIN_NT_SIMPLE_TEXT_PRIVATE_DATA
*Private
;
286 Private
= WIN_NT_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This
);
289 // BugBug: The correct answer would be a function of what code pages
290 // are currently loaded? For now we will just return success.
298 WinNtSimpleTextOutQueryMode (
299 IN EFI_SIMPLE_TEXT_OUT_PROTOCOL
*This
,
308 TODO: Add function description
312 This - TODO: add argument description
313 ModeNumber - TODO: add argument description
314 Columns - TODO: add argument description
315 Rows - TODO: add argument description
319 EFI_INVALID_PARAMETER - TODO: Add description for return value
320 EFI_SUCCESS - TODO: Add description for return value
324 WIN_NT_SIMPLE_TEXT_PRIVATE_DATA
*Private
;
326 Private
= WIN_NT_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This
);
328 if (ModeNumber
> MAX_SIMPLE_TEXT_OUT_MODE
) {
329 return EFI_INVALID_PARAMETER
;
332 *Columns
= mWinNtSimpleTextOutSupportedModes
[ModeNumber
].ColumnsX
;
333 *Rows
= mWinNtSimpleTextOutSupportedModes
[ModeNumber
].RowsY
;
341 WinNtSimpleTextOutSetMode (
342 IN EFI_SIMPLE_TEXT_OUT_PROTOCOL
*This
,
349 TODO: Add function description
353 This - TODO: add argument description
354 ModeNumber - TODO: add argument description
358 EFI_INVALID_PARAMETER - TODO: Add description for return value
359 EFI_SUCCESS - TODO: Add description for return value
363 WIN_NT_SIMPLE_TEXT_PRIVATE_DATA
*Private
;
365 Private
= WIN_NT_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This
);
367 if (ModeNumber
> MAX_SIMPLE_TEXT_OUT_MODE
) {
368 return EFI_INVALID_PARAMETER
;
371 Private
->MaxScreenSize
.X
= (WORD
) mWinNtSimpleTextOutSupportedModes
[ModeNumber
].ColumnsX
;
372 Private
->MaxScreenSize
.Y
= (WORD
) mWinNtSimpleTextOutSupportedModes
[ModeNumber
].RowsY
;
374 Private
->WinNtThunk
->SetConsoleScreenBufferSize (Private
->NtOutHandle
, Private
->MaxScreenSize
);
375 Private
->WinNtThunk
->SetConsoleActiveScreenBuffer (Private
->NtOutHandle
);
377 This
->Mode
->Mode
= (INT32
) ModeNumber
;
379 This
->EnableCursor (This
, TRUE
);
380 This
->ClearScreen (This
);
387 WinNtSimpleTextOutSetAttribute (
388 IN EFI_SIMPLE_TEXT_OUT_PROTOCOL
*This
,
395 TODO: Add function description
399 This - TODO: add argument description
400 Attribute - TODO: add argument description
404 EFI_SUCCESS - TODO: Add description for return value
408 WIN_NT_SIMPLE_TEXT_PRIVATE_DATA
*Private
;
410 Private
= WIN_NT_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This
);
412 Private
->Attribute
= (WORD
) Attribute
;
413 This
->Mode
->Attribute
= (INT32
) Attribute
;
421 WinNtSimpleTextOutClearScreen (
422 IN EFI_SIMPLE_TEXT_OUT_PROTOCOL
*This
428 TODO: Add function description
432 This - TODO: add argument description
436 EFI_SUCCESS - TODO: Add description for return value
440 WIN_NT_SIMPLE_TEXT_PRIVATE_DATA
*Private
;
443 Private
= WIN_NT_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This
);
445 This
->SetCursorPosition (This
, 0, 0);
447 Private
->WinNtThunk
->FillConsoleOutputCharacter (
448 Private
->NtOutHandle
,
450 Private
->MaxScreenSize
.X
* Private
->MaxScreenSize
.Y
,
454 Private
->WinNtThunk
->FillConsoleOutputAttribute (
455 Private
->NtOutHandle
,
457 Private
->MaxScreenSize
.X
* Private
->MaxScreenSize
.Y
,
468 WinNtSimpleTextOutSetCursorPosition (
469 IN EFI_SIMPLE_TEXT_OUT_PROTOCOL
*This
,
477 TODO: Add function description
481 This - TODO: add argument description
482 Column - TODO: add argument description
483 Row - TODO: add argument description
487 EFI_SUCCESS - TODO: Add description for return value
491 WIN_NT_SIMPLE_TEXT_PRIVATE_DATA
*Private
;
493 Private
= WIN_NT_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This
);
495 Private
->Possition
.X
= (WORD
) Column
;
496 This
->Mode
->CursorColumn
= (INT32
) Column
;
498 Private
->Possition
.Y
= (WORD
) Row
;
499 This
->Mode
->CursorRow
= (INT32
) Row
;
500 Private
->WinNtThunk
->SetConsoleCursorPosition (Private
->NtOutHandle
, Private
->Possition
);
508 WinNtSimpleTextOutEnableCursor (
509 IN EFI_SIMPLE_TEXT_OUT_PROTOCOL
*This
,
516 TODO: Add function description
520 This - TODO: add argument description
521 Enable - TODO: add argument description
525 EFI_SUCCESS - TODO: Add description for return value
529 WIN_NT_SIMPLE_TEXT_PRIVATE_DATA
*Private
;
530 CONSOLE_CURSOR_INFO Info
;
532 Private
= WIN_NT_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This
);
533 Private
->CursorEnable
= Enable
;
534 This
->Mode
->CursorVisible
= Enable
;
536 Private
->WinNtThunk
->GetConsoleCursorInfo (Private
->NtOutHandle
, &Info
);
537 Info
.bVisible
= Enable
;
538 Private
->WinNtThunk
->SetConsoleCursorInfo (Private
->NtOutHandle
, &Info
);
544 WinNtSimpleTextOutOpenWindow (
545 IN OUT WIN_NT_SIMPLE_TEXT_PRIVATE_DATA
*Private
551 TODO: Add function description
555 Private - TODO: add argument description
559 TODO: add return values
563 EFI_SIMPLE_TEXT_OUT_PROTOCOL
*SimpleTextOut
;
566 WindowName
= Private
->WinNtIo
->EnvString
;
567 Private
->Attribute
= FOREGROUND_RED
| FOREGROUND_BLUE
| FOREGROUND_GREEN
| FOREGROUND_INTENSITY
;
568 if (*WindowName
== '?') {
569 Private
->Attribute
= BACKGROUND_RED
| FOREGROUND_INTENSITY
| FOREGROUND_RED
| FOREGROUND_BLUE
| FOREGROUND_GREEN
;
570 WindowName
= L
"EFI Emulator Error Console";
575 gWinNtConsoleComponentName
.SupportedLanguages
,
576 &Private
->ControllerNameTable
,
581 // Fill in protocol member functions
583 SimpleTextOut
= &Private
->SimpleTextOut
;
584 SimpleTextOut
->Reset
= WinNtSimpleTextOutReset
;
585 SimpleTextOut
->OutputString
= WinNtSimpleTextOutOutputString
;
586 SimpleTextOut
->TestString
= WinNtSimpleTextOutTestString
;
587 SimpleTextOut
->QueryMode
= WinNtSimpleTextOutQueryMode
;
588 SimpleTextOut
->SetMode
= WinNtSimpleTextOutSetMode
;
589 SimpleTextOut
->SetAttribute
= WinNtSimpleTextOutSetAttribute
;
590 SimpleTextOut
->ClearScreen
= WinNtSimpleTextOutClearScreen
;
591 SimpleTextOut
->SetCursorPosition
= WinNtSimpleTextOutSetCursorPosition
;
592 SimpleTextOut
->EnableCursor
= WinNtSimpleTextOutEnableCursor
;
595 // Initialize SimpleTextOut protocol mode structure
597 SimpleTextOut
->Mode
= &Private
->SimpleTextOutMode
;
598 SimpleTextOut
->Mode
->MaxMode
= MAX_SIMPLE_TEXT_OUT_MODE
;
599 SimpleTextOut
->Mode
->Attribute
= (INT32
) Private
->Attribute
;
602 // Open the window an initialize it!
604 Private
->NtOutHandle
= Private
->WinNtThunk
->CreateConsoleScreenBuffer (
605 GENERIC_WRITE
| GENERIC_READ
,
606 FILE_SHARE_WRITE
| FILE_SHARE_READ
,
608 CONSOLE_TEXTMODE_BUFFER
,
611 Private
->WinNtThunk
->SetConsoleTitle (WindowName
);
613 return SimpleTextOut
->SetMode (SimpleTextOut
, 0);
617 WinNtSimpleTextOutCloseWindow (
618 IN OUT WIN_NT_SIMPLE_TEXT_PRIVATE_DATA
*Console
624 TODO: Add function description
628 Console - TODO: add argument description
632 EFI_SUCCESS - TODO: Add description for return value
636 Console
->WinNtThunk
->CloseHandle (Console
->NtOutHandle
);