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