]> git.proxmox.com Git - mirror_edk2.git/blame - Nt32Pkg/WinNtConsoleDxe/ConsoleOut.c
Update to support to produce Component Name and & Component Name 2 protocol based...
[mirror_edk2.git] / Nt32Pkg / WinNtConsoleDxe / ConsoleOut.c
CommitLineData
af4d71fc 1/*++\r
2\r
3Copyright (c) 2006, Intel Corporation \r
4All rights reserved. This program and the accompanying materials \r
5are licensed and made available under the terms and conditions of the BSD License \r
6which accompanies this distribution. The full text of the license may be found at \r
7http://opensource.org/licenses/bsd-license.php \r
8 \r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
11\r
12Module Name:\r
13\r
14 ConsoleOut.c\r
15\r
16Abstract:\r
17\r
18 Console based on Win32 APIs. \r
19\r
20 This file creates an Win32 window and attaches a SimpleTextOut protocol.\r
21\r
22--*/\r
23\r
24//\r
25// The package level header files this module uses\r
26//\r
27#include <Uefi.h>\r
28#include <WinNtDxe.h>\r
29//\r
30// The protocols, PPI and GUID defintions for this module\r
31//\r
32#include <Protocol/SimpleTextIn.h>\r
33#include <Protocol/WinNtIo.h>\r
34#include <Protocol/SimpleTextOut.h>\r
35#include <Protocol/ComponentName.h>\r
36#include <Protocol/DriverBinding.h>\r
37//\r
38// The Library classes this module consumes\r
39//\r
40#include <Library/DebugLib.h>\r
41#include <Library/BaseLib.h>\r
42#include <Library/UefiDriverEntryPoint.h>\r
43#include <Library/UefiLib.h>\r
44#include <Library/BaseMemoryLib.h>\r
45#include <Library/UefiBootServicesTableLib.h>\r
46#include <Library/MemoryAllocationLib.h>\r
47\r
48\r
49#include "Console.h"\r
50//\r
51// Private worker functions.\r
52//\r
53\r
54STATIC\r
55VOID\r
56WinNtSimpleTextOutScrollScreen (\r
57 IN OUT WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Console\r
58 );\r
59\r
60STATIC\r
61VOID\r
62WinNtSimpleTextOutPutChar (\r
63 IN OUT WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Console,\r
64 IN CHAR16 Char\r
65 );\r
66\r
67//\r
68// Modeule Global for Simple Text Out Mode.\r
69//\r
70#define MAX_SIMPLE_TEXT_OUT_MODE \\r
71 (sizeof(mWinNtSimpleTextOutSupportedModes)/sizeof(WIN_NT_SIMPLE_TEXT_OUT_MODE))\r
72\r
73STATIC WIN_NT_SIMPLE_TEXT_OUT_MODE mWinNtSimpleTextOutSupportedModes[] = {\r
74 { 80, 25 }, \r
75 { 80, 50 }, \r
76 { 80, 43 }, \r
77 { 100, 100 }, \r
78 { 100, 999 } \r
79};\r
80\r
81STATIC\r
82EFI_STATUS\r
83EFIAPI\r
84WinNtSimpleTextOutReset (\r
85 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
86 IN BOOLEAN ExtendedVerification\r
87 )\r
88/*++\r
89\r
90Routine Description:\r
91\r
92 TODO: Add function description\r
93\r
94Arguments:\r
95\r
96 This - TODO: add argument description\r
97 ExtendedVerification - TODO: add argument description\r
98\r
99Returns:\r
100\r
101 EFI_SUCCESS - TODO: Add description for return value\r
102\r
103--*/\r
104{\r
105 WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
106\r
107 Private = WIN_NT_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
108\r
109 WinNtSimpleTextOutSetAttribute (This, EFI_TEXT_ATTR (This->Mode->Attribute & 0x0F, EFI_BACKGROUND_BLACK));\r
110\r
111 WinNtSimpleTextOutSetMode (This, 0);\r
112 return EFI_SUCCESS;\r
113}\r
114\r
115STATIC\r
116EFI_STATUS\r
117EFIAPI\r
118WinNtSimpleTextOutOutputString (\r
119 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
120 IN CHAR16 *String\r
121 )\r
122/*++\r
123\r
124Routine Description:\r
125\r
126 TODO: Add function description\r
127\r
128Arguments:\r
129\r
130 This - TODO: add argument description\r
131 String - TODO: add argument description\r
132\r
133Returns:\r
134\r
135 EFI_SUCCESS - TODO: Add description for return value\r
136\r
137--*/\r
138{\r
139 WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
140 CHAR16 *Str;\r
141\r
142 Private = WIN_NT_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
143\r
144 for (Str = String; *Str != '\0'; Str++) {\r
145 switch (*Str) {\r
146 case '\n':\r
147 if (Private->Possition.Y == (Private->MaxScreenSize.Y - 1)) {\r
148 WinNtSimpleTextOutScrollScreen (Private);\r
149 }\r
150\r
151 if (Private->Possition.Y < (Private->MaxScreenSize.Y - 1)) {\r
152 Private->Possition.Y++;\r
153 This->Mode->CursorRow++;\r
154 }\r
155 break;\r
156\r
157 case '\r':\r
158 Private->Possition.X = 0;\r
159 This->Mode->CursorColumn = 0;\r
160 break;\r
161\r
162 case '\b':\r
163 if (Private->Possition.X > 0) {\r
164 Private->Possition.X--;\r
165 This->Mode->CursorColumn--;\r
166 }\r
167 break;\r
168\r
169 default:\r
170 WinNtSimpleTextOutPutChar (Private, *Str);\r
171 }\r
172 }\r
173\r
174 return EFI_SUCCESS;\r
175}\r
176\r
177STATIC\r
178VOID\r
179WinNtSimpleTextOutPutChar (\r
180 IN OUT WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Console,\r
181 IN CHAR16 Char\r
182 )\r
183/*++\r
184\r
185Routine Description:\r
186\r
187 TODO: Add function description\r
188\r
189Arguments:\r
190\r
191 Console - TODO: add argument description\r
192 Char - TODO: add argument description\r
193\r
194Returns:\r
195\r
196 TODO: add return values\r
197\r
198--*/\r
199{\r
200 SMALL_RECT Region;\r
201 COORD StrCoordinate;\r
202 COORD StrSize;\r
203 CHAR_INFO CharInfo;\r
204 BOOL Flag;\r
205\r
206 CharInfo.Char.UnicodeChar = Char;\r
207 CharInfo.Attributes = Console->Attribute;\r
208\r
209 StrSize.X = 1;\r
210 StrSize.Y = 1;\r
211 StrCoordinate.X = 0;\r
212 StrCoordinate.Y = 0;\r
213\r
214 Region.Left = (INT16) Console->Possition.X;\r
215 Region.Top = (INT16) Console->Possition.Y;\r
216 Region.Right = (INT16) (Console->Possition.X + 1);\r
217 Region.Bottom = (INT16) Console->Possition.Y;\r
218\r
219 Console->WinNtThunk->WriteConsoleOutput (\r
220 Console->NtOutHandle,\r
221 &CharInfo,\r
222 StrSize,\r
223 StrCoordinate,\r
224 &Region\r
225 );\r
226\r
227 if (Console->Possition.X >= (Console->MaxScreenSize.X - 1)) {\r
228 //\r
229 // If you print off the end wrap around\r
230 //\r
231 Console->SimpleTextOut.OutputString (&Console->SimpleTextOut, L"\n\r");\r
232 } else {\r
233 Console->Possition.X++;\r
234 Console->SimpleTextOut.Mode->CursorColumn++;\r
235 }\r
236\r
237 Flag = Console->WinNtThunk->SetConsoleCursorPosition (Console->NtOutHandle, Console->Possition);\r
238}\r
239\r
240STATIC\r
241VOID\r
242WinNtSimpleTextOutScrollScreen (\r
243 IN OUT WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Console\r
244 )\r
245/*++\r
246\r
247Routine Description:\r
248\r
249 TODO: Add function description\r
250\r
251Arguments:\r
252\r
253 Console - TODO: add argument description\r
254\r
255Returns:\r
256\r
257 TODO: add return values\r
258\r
259--*/\r
260{\r
261 SMALL_RECT Scroll;\r
262 CHAR_INFO CharInfo;\r
263 COORD Origin;\r
264\r
265 CharInfo.Char.UnicodeChar = ' ';\r
266 CharInfo.Attributes = Console->Attribute;\r
267\r
268 Origin.X = 0;\r
269 Origin.Y = 0;\r
270\r
271 Scroll.Top = 1;\r
272 Scroll.Left = 0;\r
273 Scroll.Right = (INT16) Console->MaxScreenSize.X;\r
274 Scroll.Bottom = (INT16) Console->MaxScreenSize.Y;\r
275\r
276 Console->WinNtThunk->ScrollConsoleScreenBuffer (\r
277 Console->NtOutHandle,\r
278 &Scroll,\r
279 NULL,\r
280 Origin,\r
281 &CharInfo\r
282 );\r
283}\r
284\r
285STATIC\r
286EFI_STATUS\r
287EFIAPI\r
288WinNtSimpleTextOutTestString (\r
289 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
290 IN CHAR16 *String\r
291 )\r
292/*++\r
293\r
294Routine Description:\r
295\r
296 TODO: Add function description\r
297\r
298Arguments:\r
299\r
300 This - TODO: add argument description\r
301 String - TODO: add argument description\r
302\r
303Returns:\r
304\r
305 EFI_SUCCESS - TODO: Add description for return value\r
306\r
307--*/\r
308{\r
309 WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
310\r
311 Private = WIN_NT_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
312\r
313 //\r
314 // BugBug: The correct answer would be a function of what code pages\r
315 // are currently loaded? For now we will just return success.\r
316 //\r
317 return EFI_SUCCESS;\r
318}\r
319\r
320STATIC\r
321EFI_STATUS\r
322EFIAPI\r
323WinNtSimpleTextOutQueryMode (\r
324 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
325 IN UINTN ModeNumber,\r
326 OUT UINTN *Columns,\r
327 OUT UINTN *Rows\r
328 )\r
329/*++\r
330\r
331Routine Description:\r
332\r
333 TODO: Add function description\r
334\r
335Arguments:\r
336\r
337 This - TODO: add argument description\r
338 ModeNumber - TODO: add argument description\r
339 Columns - TODO: add argument description\r
340 Rows - TODO: add argument description\r
341\r
342Returns:\r
343\r
344 EFI_INVALID_PARAMETER - TODO: Add description for return value\r
345 EFI_SUCCESS - TODO: Add description for return value\r
346\r
347--*/\r
348{\r
349 WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
350\r
351 Private = WIN_NT_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
352\r
353 if (ModeNumber > MAX_SIMPLE_TEXT_OUT_MODE) {\r
354 return EFI_INVALID_PARAMETER;\r
355 }\r
356\r
357 *Columns = mWinNtSimpleTextOutSupportedModes[ModeNumber].ColumnsX;\r
358 *Rows = mWinNtSimpleTextOutSupportedModes[ModeNumber].RowsY;\r
359\r
360 return EFI_SUCCESS;\r
361}\r
362\r
363STATIC\r
364EFI_STATUS\r
365EFIAPI\r
366WinNtSimpleTextOutSetMode (\r
367 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
368 IN UINTN ModeNumber\r
369 )\r
370/*++\r
371\r
372Routine Description:\r
373\r
374 TODO: Add function description\r
375\r
376Arguments:\r
377\r
378 This - TODO: add argument description\r
379 ModeNumber - TODO: add argument description\r
380\r
381Returns:\r
382\r
383 EFI_INVALID_PARAMETER - TODO: Add description for return value\r
384 EFI_SUCCESS - TODO: Add description for return value\r
385\r
386--*/\r
387{\r
388 WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
389\r
390 Private = WIN_NT_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
391\r
392 if (ModeNumber > MAX_SIMPLE_TEXT_OUT_MODE) {\r
393 return EFI_INVALID_PARAMETER;\r
394 }\r
395\r
396 Private->MaxScreenSize.X = (WORD) mWinNtSimpleTextOutSupportedModes[ModeNumber].ColumnsX;\r
397 Private->MaxScreenSize.Y = (WORD) mWinNtSimpleTextOutSupportedModes[ModeNumber].RowsY;\r
398\r
399 Private->WinNtThunk->SetConsoleScreenBufferSize (Private->NtOutHandle, Private->MaxScreenSize);\r
400 Private->WinNtThunk->SetConsoleActiveScreenBuffer (Private->NtOutHandle);\r
401\r
402 This->Mode->Mode = (INT32) ModeNumber;\r
403\r
404 This->EnableCursor (This, TRUE);\r
405 This->ClearScreen (This);\r
406 return EFI_SUCCESS;\r
407}\r
408\r
409STATIC\r
410EFI_STATUS\r
411EFIAPI\r
412WinNtSimpleTextOutSetAttribute (\r
413 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
414 IN UINTN Attribute\r
415 )\r
416/*++\r
417\r
418Routine Description:\r
419\r
420 TODO: Add function description\r
421\r
422Arguments:\r
423\r
424 This - TODO: add argument description\r
425 Attribute - TODO: add argument description\r
426\r
427Returns:\r
428\r
429 EFI_SUCCESS - TODO: Add description for return value\r
430\r
431--*/\r
432{\r
433 WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
434\r
435 Private = WIN_NT_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
436\r
437 Private->Attribute = (WORD) Attribute;\r
438 This->Mode->Attribute = (INT32) Attribute;\r
439\r
440 return EFI_SUCCESS;\r
441}\r
442\r
443STATIC\r
444EFI_STATUS\r
445EFIAPI\r
446WinNtSimpleTextOutClearScreen (\r
447 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This\r
448 )\r
449/*++\r
450\r
451Routine Description:\r
452\r
453 TODO: Add function description\r
454\r
455Arguments:\r
456\r
457 This - TODO: add argument description\r
458\r
459Returns:\r
460\r
461 EFI_SUCCESS - TODO: Add description for return value\r
462\r
463--*/\r
464{\r
465 WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
466 DWORD ConsoleWindow;\r
467\r
468 Private = WIN_NT_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
469\r
470 This->SetCursorPosition (This, 0, 0);\r
471\r
472 Private->WinNtThunk->FillConsoleOutputCharacter (\r
473 Private->NtOutHandle,\r
474 ' ',\r
475 Private->MaxScreenSize.X * Private->MaxScreenSize.Y,\r
476 Private->Possition,\r
477 &ConsoleWindow\r
478 );\r
479 Private->WinNtThunk->FillConsoleOutputAttribute (\r
480 Private->NtOutHandle,\r
481 Private->Attribute,\r
482 Private->MaxScreenSize.X * Private->MaxScreenSize.Y,\r
483 Private->Possition,\r
484 &ConsoleWindow\r
485 );\r
486\r
487 return EFI_SUCCESS;\r
488}\r
489\r
490STATIC\r
491EFI_STATUS\r
492EFIAPI\r
493WinNtSimpleTextOutSetCursorPosition (\r
494 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
495 IN UINTN Column,\r
496 IN UINTN Row\r
497 )\r
498/*++\r
499\r
500Routine Description:\r
501\r
502 TODO: Add function description\r
503\r
504Arguments:\r
505\r
506 This - TODO: add argument description\r
507 Column - TODO: add argument description\r
508 Row - TODO: add argument description\r
509\r
510Returns:\r
511\r
512 EFI_SUCCESS - TODO: Add description for return value\r
513\r
514--*/\r
515{\r
516 WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
517\r
518 Private = WIN_NT_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
519\r
520 Private->Possition.X = (WORD) Column;\r
521 This->Mode->CursorColumn = (INT32) Column;\r
522\r
523 Private->Possition.Y = (WORD) Row;\r
524 This->Mode->CursorRow = (INT32) Row;\r
525 Private->WinNtThunk->SetConsoleCursorPosition (Private->NtOutHandle, Private->Possition);\r
526\r
527 return EFI_SUCCESS;\r
528}\r
529\r
530STATIC\r
531EFI_STATUS\r
532EFIAPI\r
533WinNtSimpleTextOutEnableCursor (\r
534 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *This,\r
535 IN BOOLEAN Enable\r
536 )\r
537/*++\r
538\r
539Routine Description:\r
540\r
541 TODO: Add function description\r
542\r
543Arguments:\r
544\r
545 This - TODO: add argument description\r
546 Enable - TODO: add argument description\r
547\r
548Returns:\r
549\r
550 EFI_SUCCESS - TODO: Add description for return value\r
551\r
552--*/\r
553{\r
554 WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
555 CONSOLE_CURSOR_INFO Info;\r
556\r
557 Private = WIN_NT_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (This);\r
558 Private->CursorEnable = Enable;\r
559 This->Mode->CursorVisible = Enable;\r
560\r
561 Private->WinNtThunk->GetConsoleCursorInfo (Private->NtOutHandle, &Info);\r
562 Info.bVisible = Enable;\r
563 Private->WinNtThunk->SetConsoleCursorInfo (Private->NtOutHandle, &Info);\r
564\r
565 return EFI_SUCCESS;\r
566}\r
567\r
568EFI_STATUS\r
569WinNtSimpleTextOutOpenWindow (\r
570 IN OUT WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Private\r
571 )\r
572/*++\r
573\r
574Routine Description:\r
575\r
576 TODO: Add function description\r
577\r
578Arguments:\r
579\r
580 Private - TODO: add argument description\r
581\r
582Returns:\r
583\r
584 TODO: add return values\r
585\r
586--*/\r
587{\r
588 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut;\r
589 CHAR16 *WindowName;\r
590\r
591 WindowName = Private->WinNtIo->EnvString;\r
592 Private->Attribute = FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY;\r
593 if (*WindowName == '?') {\r
594 Private->Attribute = BACKGROUND_RED | FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN;\r
595 WindowName = L"EFI Emulator Error Console";\r
596 }\r
597\r
f766bd80 598 AddUnicodeString2 (\r
af4d71fc 599 "eng",\r
600 gWinNtConsoleComponentName.SupportedLanguages,\r
601 &Private->ControllerNameTable,\r
f766bd80 602 WindowName,\r
603 TRUE\r
af4d71fc 604 );\r
f766bd80 605 AddUnicodeString2 (\r
606 "en",\r
607 gWinNtConsoleComponentName2.SupportedLanguages,\r
608 &Private->ControllerNameTable,\r
609 WindowName,\r
610 FALSE\r
611 );\r
612\r
af4d71fc 613\r
614 //\r
615 // Fill in protocol member functions\r
616 //\r
617 SimpleTextOut = &Private->SimpleTextOut;\r
618 SimpleTextOut->Reset = WinNtSimpleTextOutReset;\r
619 SimpleTextOut->OutputString = WinNtSimpleTextOutOutputString;\r
620 SimpleTextOut->TestString = WinNtSimpleTextOutTestString;\r
621 SimpleTextOut->QueryMode = WinNtSimpleTextOutQueryMode;\r
622 SimpleTextOut->SetMode = WinNtSimpleTextOutSetMode;\r
623 SimpleTextOut->SetAttribute = WinNtSimpleTextOutSetAttribute;\r
624 SimpleTextOut->ClearScreen = WinNtSimpleTextOutClearScreen;\r
625 SimpleTextOut->SetCursorPosition = WinNtSimpleTextOutSetCursorPosition;\r
626 SimpleTextOut->EnableCursor = WinNtSimpleTextOutEnableCursor;\r
627\r
628 //\r
629 // Initialize SimpleTextOut protocol mode structure\r
630 //\r
631 SimpleTextOut->Mode = &Private->SimpleTextOutMode;\r
632 SimpleTextOut->Mode->MaxMode = MAX_SIMPLE_TEXT_OUT_MODE;\r
633 SimpleTextOut->Mode->Attribute = (INT32) Private->Attribute;\r
634\r
635 //\r
636 // Open the window an initialize it!\r
637 //\r
638 Private->NtOutHandle = Private->WinNtThunk->CreateConsoleScreenBuffer (\r
639 GENERIC_WRITE | GENERIC_READ,\r
640 FILE_SHARE_WRITE | FILE_SHARE_READ,\r
641 NULL,\r
642 CONSOLE_TEXTMODE_BUFFER,\r
643 NULL\r
644 );\r
645 Private->WinNtThunk->SetConsoleTitle (WindowName);\r
646\r
647 return SimpleTextOut->SetMode (SimpleTextOut, 0);\r
648}\r
649\r
650EFI_STATUS\r
651WinNtSimpleTextOutCloseWindow (\r
652 IN OUT WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Console\r
653 )\r
654/*++\r
655\r
656Routine Description:\r
657\r
658 TODO: Add function description\r
659\r
660Arguments:\r
661\r
662 Console - TODO: add argument description\r
663\r
664Returns:\r
665\r
666 EFI_SUCCESS - TODO: Add description for return value\r
667\r
668--*/\r
669{\r
670 Console->WinNtThunk->CloseHandle (Console->NtOutHandle);\r
671 return EFI_SUCCESS;\r
672}\r