summaryrefslogtreecommitdiff
path: root/EdkNt32Pkg/Dxe/WinNtThunk/Bus/Console/ConsoleOut.c
diff options
context:
space:
mode:
Diffstat (limited to 'EdkNt32Pkg/Dxe/WinNtThunk/Bus/Console/ConsoleOut.c')
-rw-r--r--EdkNt32Pkg/Dxe/WinNtThunk/Bus/Console/ConsoleOut.c638
1 files changed, 638 insertions, 0 deletions
diff --git a/EdkNt32Pkg/Dxe/WinNtThunk/Bus/Console/ConsoleOut.c b/EdkNt32Pkg/Dxe/WinNtThunk/Bus/Console/ConsoleOut.c
new file mode 100644
index 0000000000..cab3768b1c
--- /dev/null
+++ b/EdkNt32Pkg/Dxe/WinNtThunk/Bus/Console/ConsoleOut.c
@@ -0,0 +1,638 @@
+/*++
+
+Copyright (c) 2006, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+Module Name:
+
+ ConsoleOut.c
+
+Abstract:
+
+ Console based on Win32 APIs.
+
+ This file creates an Win32 window and attaches a SimpleTextOut protocol.
+
+--*/
+
+#include "Console.h"
+//
+// Private worker functions.
+//
+
+STATIC
+VOID
+WinNtSimpleTextOutScrollScreen (
+ IN OUT WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Console
+ );
+
+STATIC
+VOID
+WinNtSimpleTextOutPutChar (
+ IN OUT WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Console,
+ IN CHAR16 Char
+ );
+
+//
+// Modeule Global for Simple Text Out Mode.
+//
+#define MAX_SIMPLE_TEXT_OUT_MODE \
+ (sizeof(mWinNtSimpleTextOutSupportedModes)/sizeof(WIN_NT_SIMPLE_TEXT_OUT_MODE))
+
+STATIC WIN_NT_SIMPLE_TEXT_OUT_MODE mWinNtSimpleTextOutSupportedModes[] = {
+ { 80, 25 },
+ { 80, 50 },
+ { 80, 43 },
+ { 100, 100 },
+ { 100, 999 }
+};
+
+STATIC
+EFI_STATUS
+EFIAPI
+WinNtSimpleTextOutReset (
+ IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,
+ IN BOOLEAN ExtendedVerification
+ )
+/*++
+
+Routine Description:
+
+ TODO: Add function description
+
+Arguments:
+
+ This - TODO: add argument description
+ ExtendedVerification - TODO: add argument description
+
+Returns:
+
+ EFI_SUCCESS - TODO: Add description for return value
+
+--*/
+{
+ WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Private;
+
+ Private = WIN_NT_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);
+
+ WinNtSimpleTextOutSetAttribute (This, EFI_TEXT_ATTR (This->Mode->Attribute & 0x0F, EFI_BACKGROUND_BLACK));
+
+ WinNtSimpleTextOutSetMode (This, 0);
+ return EFI_SUCCESS;
+}
+
+STATIC
+EFI_STATUS
+EFIAPI
+WinNtSimpleTextOutOutputString (
+ IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,
+ IN CHAR16 *String
+ )
+/*++
+
+Routine Description:
+
+ TODO: Add function description
+
+Arguments:
+
+ This - TODO: add argument description
+ String - TODO: add argument description
+
+Returns:
+
+ EFI_SUCCESS - TODO: Add description for return value
+
+--*/
+{
+ WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Private;
+ CHAR16 *Str;
+
+ Private = WIN_NT_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);
+
+ for (Str = String; *Str != '\0'; Str++) {
+ switch (*Str) {
+ case '\n':
+ if (Private->Possition.Y == (Private->MaxScreenSize.Y - 1)) {
+ WinNtSimpleTextOutScrollScreen (Private);
+ }
+
+ if (Private->Possition.Y < (Private->MaxScreenSize.Y - 1)) {
+ Private->Possition.Y++;
+ This->Mode->CursorRow++;
+ }
+ break;
+
+ case '\r':
+ Private->Possition.X = 0;
+ This->Mode->CursorColumn = 0;
+ break;
+
+ case '\b':
+ if (Private->Possition.X > 0) {
+ Private->Possition.X--;
+ This->Mode->CursorColumn--;
+ }
+ break;
+
+ default:
+ WinNtSimpleTextOutPutChar (Private, *Str);
+ }
+ }
+
+ return EFI_SUCCESS;
+}
+
+STATIC
+VOID
+WinNtSimpleTextOutPutChar (
+ IN OUT WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Console,
+ IN CHAR16 Char
+ )
+/*++
+
+Routine Description:
+
+ TODO: Add function description
+
+Arguments:
+
+ Console - TODO: add argument description
+ Char - TODO: add argument description
+
+Returns:
+
+ TODO: add return values
+
+--*/
+{
+ SMALL_RECT Region;
+ COORD StrCoordinate;
+ COORD StrSize;
+ CHAR_INFO CharInfo;
+ BOOL Flag;
+
+ CharInfo.Char.UnicodeChar = Char;
+ CharInfo.Attributes = Console->Attribute;
+
+ StrSize.X = 1;
+ StrSize.Y = 1;
+ StrCoordinate.X = 0;
+ StrCoordinate.Y = 0;
+
+ Region.Left = (INT16) Console->Possition.X;
+ Region.Top = (INT16) Console->Possition.Y;
+ Region.Right = (INT16) (Console->Possition.X + 1);
+ Region.Bottom = (INT16) Console->Possition.Y;
+
+ Console->WinNtThunk->WriteConsoleOutput (
+ Console->NtOutHandle,
+ &CharInfo,
+ StrSize,
+ StrCoordinate,
+ &Region
+ );
+
+ if (Console->Possition.X >= (Console->MaxScreenSize.X - 1)) {
+ //
+ // If you print off the end wrap around
+ //
+ Console->SimpleTextOut.OutputString (&Console->SimpleTextOut, L"\n\r");
+ } else {
+ Console->Possition.X++;
+ Console->SimpleTextOut.Mode->CursorColumn++;
+ }
+
+ Flag = Console->WinNtThunk->SetConsoleCursorPosition (Console->NtOutHandle, Console->Possition);
+}
+
+STATIC
+VOID
+WinNtSimpleTextOutScrollScreen (
+ IN OUT WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Console
+ )
+/*++
+
+Routine Description:
+
+ TODO: Add function description
+
+Arguments:
+
+ Console - TODO: add argument description
+
+Returns:
+
+ TODO: add return values
+
+--*/
+{
+ SMALL_RECT Scroll;
+ CHAR_INFO CharInfo;
+ COORD Origin;
+
+ CharInfo.Char.UnicodeChar = ' ';
+ CharInfo.Attributes = Console->Attribute;
+
+ Origin.X = 0;
+ Origin.Y = 0;
+
+ Scroll.Top = 1;
+ Scroll.Left = 0;
+ Scroll.Right = (INT16) Console->MaxScreenSize.X;
+ Scroll.Bottom = (INT16) Console->MaxScreenSize.Y;
+
+ Console->WinNtThunk->ScrollConsoleScreenBuffer (
+ Console->NtOutHandle,
+ &Scroll,
+ NULL,
+ Origin,
+ &CharInfo
+ );
+}
+
+STATIC
+EFI_STATUS
+EFIAPI
+WinNtSimpleTextOutTestString (
+ IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,
+ IN CHAR16 *String
+ )
+/*++
+
+Routine Description:
+
+ TODO: Add function description
+
+Arguments:
+
+ This - TODO: add argument description
+ String - TODO: add argument description
+
+Returns:
+
+ EFI_SUCCESS - TODO: Add description for return value
+
+--*/
+{
+ WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Private;
+
+ Private = WIN_NT_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);
+
+ //
+ // BugBug: The correct answer would be a function of what code pages
+ // are currently loaded? For now we will just return success.
+ //
+ return EFI_SUCCESS;
+}
+
+STATIC
+EFI_STATUS
+EFIAPI
+WinNtSimpleTextOutQueryMode (
+ IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,
+ IN UINTN ModeNumber,
+ OUT UINTN *Columns,
+ OUT UINTN *Rows
+ )
+/*++
+
+Routine Description:
+
+ TODO: Add function description
+
+Arguments:
+
+ This - TODO: add argument description
+ ModeNumber - TODO: add argument description
+ Columns - TODO: add argument description
+ Rows - TODO: add argument description
+
+Returns:
+
+ EFI_INVALID_PARAMETER - TODO: Add description for return value
+ EFI_SUCCESS - TODO: Add description for return value
+
+--*/
+{
+ WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Private;
+
+ Private = WIN_NT_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);
+
+ if (ModeNumber > MAX_SIMPLE_TEXT_OUT_MODE) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ *Columns = mWinNtSimpleTextOutSupportedModes[ModeNumber].ColumnsX;
+ *Rows = mWinNtSimpleTextOutSupportedModes[ModeNumber].RowsY;
+
+ return EFI_SUCCESS;
+}
+
+STATIC
+EFI_STATUS
+EFIAPI
+WinNtSimpleTextOutSetMode (
+ IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,
+ IN UINTN ModeNumber
+ )
+/*++
+
+Routine Description:
+
+ TODO: Add function description
+
+Arguments:
+
+ This - TODO: add argument description
+ ModeNumber - TODO: add argument description
+
+Returns:
+
+ EFI_INVALID_PARAMETER - TODO: Add description for return value
+ EFI_SUCCESS - TODO: Add description for return value
+
+--*/
+{
+ WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Private;
+
+ Private = WIN_NT_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);
+
+ if (ModeNumber > MAX_SIMPLE_TEXT_OUT_MODE) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ Private->MaxScreenSize.X = (WORD) mWinNtSimpleTextOutSupportedModes[ModeNumber].ColumnsX;
+ Private->MaxScreenSize.Y = (WORD) mWinNtSimpleTextOutSupportedModes[ModeNumber].RowsY;
+
+ Private->WinNtThunk->SetConsoleScreenBufferSize (Private->NtOutHandle, Private->MaxScreenSize);
+ Private->WinNtThunk->SetConsoleActiveScreenBuffer (Private->NtOutHandle);
+
+ This->Mode->Mode = (INT32) ModeNumber;
+
+ This->EnableCursor (This, TRUE);
+ This->ClearScreen (This);
+ return EFI_SUCCESS;
+}
+
+STATIC
+EFI_STATUS
+EFIAPI
+WinNtSimpleTextOutSetAttribute (
+ IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,
+ IN UINTN Attribute
+ )
+/*++
+
+Routine Description:
+
+ TODO: Add function description
+
+Arguments:
+
+ This - TODO: add argument description
+ Attribute - TODO: add argument description
+
+Returns:
+
+ EFI_SUCCESS - TODO: Add description for return value
+
+--*/
+{
+ WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Private;
+
+ Private = WIN_NT_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);
+
+ Private->Attribute = (WORD) Attribute;
+ This->Mode->Attribute = (INT32) Attribute;
+
+ return EFI_SUCCESS;
+}
+
+STATIC
+EFI_STATUS
+EFIAPI
+WinNtSimpleTextOutClearScreen (
+ IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This
+ )
+/*++
+
+Routine Description:
+
+ TODO: Add function description
+
+Arguments:
+
+ This - TODO: add argument description
+
+Returns:
+
+ EFI_SUCCESS - TODO: Add description for return value
+
+--*/
+{
+ WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Private;
+ DWORD ConsoleWindow;
+
+ Private = WIN_NT_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);
+
+ This->SetCursorPosition (This, 0, 0);
+
+ Private->WinNtThunk->FillConsoleOutputCharacter (
+ Private->NtOutHandle,
+ ' ',
+ Private->MaxScreenSize.X * Private->MaxScreenSize.Y,
+ Private->Possition,
+ &ConsoleWindow
+ );
+ Private->WinNtThunk->FillConsoleOutputAttribute (
+ Private->NtOutHandle,
+ Private->Attribute,
+ Private->MaxScreenSize.X * Private->MaxScreenSize.Y,
+ Private->Possition,
+ &ConsoleWindow
+ );
+
+ return EFI_SUCCESS;
+}
+
+STATIC
+EFI_STATUS
+EFIAPI
+WinNtSimpleTextOutSetCursorPosition (
+ IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,
+ IN UINTN Column,
+ IN UINTN Row
+ )
+/*++
+
+Routine Description:
+
+ TODO: Add function description
+
+Arguments:
+
+ This - TODO: add argument description
+ Column - TODO: add argument description
+ Row - TODO: add argument description
+
+Returns:
+
+ EFI_SUCCESS - TODO: Add description for return value
+
+--*/
+{
+ WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Private;
+
+ Private = WIN_NT_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);
+
+ Private->Possition.X = (WORD) Column;
+ This->Mode->CursorColumn = (INT32) Column;
+
+ Private->Possition.Y = (WORD) Row;
+ This->Mode->CursorRow = (INT32) Row;
+ Private->WinNtThunk->SetConsoleCursorPosition (Private->NtOutHandle, Private->Possition);
+
+ return EFI_SUCCESS;
+}
+
+STATIC
+EFI_STATUS
+EFIAPI
+WinNtSimpleTextOutEnableCursor (
+ IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *This,
+ IN BOOLEAN Enable
+ )
+/*++
+
+Routine Description:
+
+ TODO: Add function description
+
+Arguments:
+
+ This - TODO: add argument description
+ Enable - TODO: add argument description
+
+Returns:
+
+ EFI_SUCCESS - TODO: Add description for return value
+
+--*/
+{
+ WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Private;
+ CONSOLE_CURSOR_INFO Info;
+
+ Private = WIN_NT_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);
+ Private->CursorEnable = Enable;
+ This->Mode->CursorVisible = Enable;
+
+ Private->WinNtThunk->GetConsoleCursorInfo (Private->NtOutHandle, &Info);
+ Info.bVisible = Enable;
+ Private->WinNtThunk->SetConsoleCursorInfo (Private->NtOutHandle, &Info);
+
+ return EFI_SUCCESS;
+}
+
+EFI_STATUS
+WinNtSimpleTextOutOpenWindow (
+ IN OUT WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Private
+ )
+/*++
+
+Routine Description:
+
+ TODO: Add function description
+
+Arguments:
+
+ Private - TODO: add argument description
+
+Returns:
+
+ TODO: add return values
+
+--*/
+{
+ EFI_SIMPLE_TEXT_OUT_PROTOCOL *SimpleTextOut;
+ CHAR16 *WindowName;
+
+ WindowName = Private->WinNtIo->EnvString;
+ Private->Attribute = FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY;
+ if (*WindowName == '?') {
+ Private->Attribute = BACKGROUND_RED | FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN;
+ WindowName = L"EFI Emulator Error Console";
+ }
+
+ AddUnicodeString (
+ "eng",
+ gWinNtConsoleComponentName.SupportedLanguages,
+ &Private->ControllerNameTable,
+ WindowName
+ );
+
+ //
+ // Fill in protocol member functions
+ //
+ SimpleTextOut = &Private->SimpleTextOut;
+ SimpleTextOut->Reset = WinNtSimpleTextOutReset;
+ SimpleTextOut->OutputString = WinNtSimpleTextOutOutputString;
+ SimpleTextOut->TestString = WinNtSimpleTextOutTestString;
+ SimpleTextOut->QueryMode = WinNtSimpleTextOutQueryMode;
+ SimpleTextOut->SetMode = WinNtSimpleTextOutSetMode;
+ SimpleTextOut->SetAttribute = WinNtSimpleTextOutSetAttribute;
+ SimpleTextOut->ClearScreen = WinNtSimpleTextOutClearScreen;
+ SimpleTextOut->SetCursorPosition = WinNtSimpleTextOutSetCursorPosition;
+ SimpleTextOut->EnableCursor = WinNtSimpleTextOutEnableCursor;
+
+ //
+ // Initialize SimpleTextOut protocol mode structure
+ //
+ SimpleTextOut->Mode = &Private->SimpleTextOutMode;
+ SimpleTextOut->Mode->MaxMode = MAX_SIMPLE_TEXT_OUT_MODE;
+ SimpleTextOut->Mode->Attribute = (INT32) Private->Attribute;
+
+ //
+ // Open the window an initialize it!
+ //
+ Private->NtOutHandle = Private->WinNtThunk->CreateConsoleScreenBuffer (
+ GENERIC_WRITE | GENERIC_READ,
+ FILE_SHARE_WRITE | FILE_SHARE_READ,
+ NULL,
+ CONSOLE_TEXTMODE_BUFFER,
+ NULL
+ );
+ Private->WinNtThunk->SetConsoleTitle (WindowName);
+
+ return SimpleTextOut->SetMode (SimpleTextOut, 0);
+}
+
+EFI_STATUS
+WinNtSimpleTextOutCloseWindow (
+ IN OUT WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Console
+ )
+/*++
+
+Routine Description:
+
+ TODO: Add function description
+
+Arguments:
+
+ Console - TODO: add argument description
+
+Returns:
+
+ EFI_SUCCESS - TODO: Add description for return value
+
+--*/
+{
+ Console->WinNtThunk->CloseHandle (Console->NtOutHandle);
+ return EFI_SUCCESS;
+}