]> git.proxmox.com Git - mirror_edk2.git/blame - Nt32Pkg/WinNtConsoleDxe/Console.c
Correct ExtractGuidedSectionLib library instance for PEIM and DXE
[mirror_edk2.git] / Nt32Pkg / WinNtConsoleDxe / Console.c
CommitLineData
af4d71fc 1/*++\r
2\r
3Copyright (c) 2006 - 2007, 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 Console.c\r
15\r
16Abstract:\r
17\r
18 Console based on Win32 APIs.\r
19\r
20--*/\r
21\r
22//\r
23// The package level header files this module uses\r
24//\r
25#include <Uefi.h>\r
26#include <WinNtDxe.h>\r
27//\r
28// The protocols, PPI and GUID defintions for this module\r
29//\r
30#include <Protocol/SimpleTextIn.h>\r
31#include <Protocol/WinNtIo.h>\r
32#include <Protocol/SimpleTextOut.h>\r
33#include <Protocol/ComponentName.h>\r
34#include <Protocol/DriverBinding.h>\r
35//\r
36// The Library classes this module consumes\r
37//\r
38#include <Library/DebugLib.h>\r
39#include <Library/BaseLib.h>\r
40#include <Library/UefiDriverEntryPoint.h>\r
41#include <Library/UefiLib.h>\r
42#include <Library/BaseMemoryLib.h>\r
43#include <Library/UefiBootServicesTableLib.h>\r
44#include <Library/MemoryAllocationLib.h>\r
45\r
46#include "Console.h"\r
47\r
48EFI_STATUS\r
49EFIAPI\r
50WinNtConsoleDriverBindingSupported (\r
51 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
52 IN EFI_HANDLE Handle,\r
53 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
54 );\r
55\r
56EFI_STATUS\r
57EFIAPI\r
58WinNtConsoleDriverBindingStart (\r
59 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
60 IN EFI_HANDLE Handle,\r
61 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
62 );\r
63\r
64EFI_STATUS\r
65EFIAPI\r
66WinNtConsoleDriverBindingStop (\r
67 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
68 IN EFI_HANDLE Handle,\r
69 IN UINTN NumberOfChildren,\r
70 IN EFI_HANDLE *ChildHandleBuffer\r
71 );\r
72\r
73EFI_DRIVER_BINDING_PROTOCOL gWinNtConsoleDriverBinding = {\r
74 WinNtConsoleDriverBindingSupported,\r
75 WinNtConsoleDriverBindingStart,\r
76 WinNtConsoleDriverBindingStop,\r
77 0xa,\r
78 NULL,\r
79 NULL\r
80};\r
81\r
82/**\r
83 The user Entry Point for module WinNtConsole. The user code starts with this function.\r
84\r
85 @param[in] ImageHandle The firmware allocated handle for the EFI image. \r
86 @param[in] SystemTable A pointer to the EFI System Table.\r
87 \r
88 @retval EFI_SUCCESS The entry point is executed successfully.\r
89 @retval other Some error occurs when executing this entry point.\r
90\r
91**/\r
92EFI_STATUS\r
93EFIAPI\r
94InitializeWinNtConsole(\r
95 IN EFI_HANDLE ImageHandle,\r
96 IN EFI_SYSTEM_TABLE *SystemTable\r
97 )\r
98{\r
99 EFI_STATUS Status;\r
100\r
101 //\r
102 // Install driver model protocol(s).\r
103 //\r
f766bd80 104 Status = EfiLibInstallDriverBindingComponentName2 (\r
af4d71fc 105 ImageHandle,\r
106 SystemTable,\r
107 &gWinNtConsoleDriverBinding,\r
108 ImageHandle,\r
109 &gWinNtConsoleComponentName,\r
f766bd80 110 &gWinNtConsoleComponentName2\r
af4d71fc 111 );\r
112 ASSERT_EFI_ERROR (Status);\r
113\r
114\r
115 return Status;\r
116}\r
117\r
118\r
119EFI_STATUS\r
120EFIAPI\r
121WinNtConsoleDriverBindingSupported (\r
122 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
123 IN EFI_HANDLE Handle,\r
124 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
125 )\r
126/*++\r
127\r
128Routine Description:\r
129\r
130Arguments:\r
131\r
132Returns:\r
133\r
134 None\r
135\r
136--*/\r
137// TODO: This - add argument and description to function comment\r
138// TODO: Handle - add argument and description to function comment\r
139// TODO: RemainingDevicePath - add argument and description to function comment\r
140{\r
141 EFI_STATUS Status;\r
142 EFI_WIN_NT_IO_PROTOCOL *WinNtIo;\r
143\r
144 //\r
145 // Open the IO Abstraction(s) needed to perform the supported test\r
146 //\r
147 Status = gBS->OpenProtocol (\r
148 Handle,\r
149 &gEfiWinNtIoProtocolGuid,\r
150 &WinNtIo,\r
151 This->DriverBindingHandle,\r
152 Handle,\r
153 EFI_OPEN_PROTOCOL_BY_DRIVER\r
154 );\r
155 if (EFI_ERROR (Status)) {\r
156 return Status;\r
157 }\r
158\r
159 //\r
160 // Make sure that the WinNt Thunk Protocol is valid\r
161 //\r
162 Status = EFI_UNSUPPORTED;\r
163 if (WinNtIo->WinNtThunk->Signature == EFI_WIN_NT_THUNK_PROTOCOL_SIGNATURE) {\r
164\r
165 //\r
166 // Check the GUID to see if this is a handle type the driver supports\r
167 //\r
168 if (CompareGuid (WinNtIo->TypeGuid, &gEfiWinNtConsoleGuid)) {\r
169 Status = EFI_SUCCESS;\r
170 }\r
171 }\r
172\r
173 //\r
174 // Close the I/O Abstraction(s) used to perform the supported test\r
175 //\r
176 gBS->CloseProtocol (\r
177 Handle,\r
178 &gEfiWinNtIoProtocolGuid,\r
179 This->DriverBindingHandle,\r
180 Handle\r
181 );\r
182\r
183 return Status;\r
184}\r
185\r
186EFI_STATUS\r
187EFIAPI\r
188WinNtConsoleDriverBindingStart (\r
189 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
190 IN EFI_HANDLE Handle,\r
191 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
192 )\r
193/*++\r
194\r
195Routine Description:\r
196\r
197Arguments:\r
198\r
199Returns:\r
200\r
201 None\r
202\r
203--*/\r
204// TODO: This - add argument and description to function comment\r
205// TODO: Handle - add argument and description to function comment\r
206// TODO: RemainingDevicePath - add argument and description to function comment\r
207{\r
208 EFI_STATUS Status;\r
209 EFI_WIN_NT_IO_PROTOCOL *WinNtIo;\r
210 WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
211\r
212 //\r
213 // Grab the IO abstraction we need to get any work done\r
214 //\r
215 Status = gBS->OpenProtocol (\r
216 Handle,\r
217 &gEfiWinNtIoProtocolGuid,\r
218 &WinNtIo,\r
219 This->DriverBindingHandle,\r
220 Handle,\r
221 EFI_OPEN_PROTOCOL_BY_DRIVER\r
222 );\r
223 if (EFI_ERROR (Status)) {\r
224 return Status;\r
225 }\r
226\r
227 Private = AllocatePool (sizeof (WIN_NT_SIMPLE_TEXT_PRIVATE_DATA));\r
228 if (Private == NULL) {\r
229 goto Done;\r
230 }\r
231\r
232 ZeroMem (Private, sizeof (WIN_NT_SIMPLE_TEXT_PRIVATE_DATA));\r
233\r
234 Private->Signature = WIN_NT_SIMPLE_TEXT_PRIVATE_DATA_SIGNATURE;\r
235 Private->Handle = Handle;\r
236 Private->WinNtIo = WinNtIo;\r
237 Private->WinNtThunk = WinNtIo->WinNtThunk;\r
238\r
239 WinNtSimpleTextOutOpenWindow (Private);\r
240 WinNtSimpleTextInAttachToWindow (Private);\r
241\r
242 Status = gBS->InstallMultipleProtocolInterfaces (\r
243 &Handle,\r
244 &gEfiSimpleTextOutProtocolGuid,\r
245 &Private->SimpleTextOut,\r
246 &gEfiSimpleTextInProtocolGuid,\r
247 &Private->SimpleTextIn,\r
248 NULL\r
249 );\r
250 if (!EFI_ERROR (Status)) {\r
251 return Status;\r
252 }\r
253\r
254Done:\r
255 gBS->CloseProtocol (\r
256 Handle,\r
257 &gEfiWinNtIoProtocolGuid,\r
258 This->DriverBindingHandle,\r
259 Handle\r
260 );\r
261 if (Private != NULL) {\r
262\r
263 FreeUnicodeStringTable (Private->ControllerNameTable);\r
264\r
265 if (Private->NtOutHandle != NULL) {\r
266 Private->WinNtThunk->CloseHandle (Private->NtOutHandle);\r
267 }\r
268\r
269 if (Private->SimpleTextIn.WaitForKey != NULL) {\r
270 gBS->CloseEvent (Private->SimpleTextIn.WaitForKey);\r
271 }\r
272\r
273 FreePool (Private);\r
274 }\r
275\r
276 return Status;\r
277}\r
278\r
279EFI_STATUS\r
280EFIAPI\r
281WinNtConsoleDriverBindingStop (\r
282 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
283 IN EFI_HANDLE Handle,\r
284 IN UINTN NumberOfChildren,\r
285 IN EFI_HANDLE *ChildHandleBuffer\r
286 )\r
287/*++\r
288\r
289Routine Description:\r
290\r
291 TODO: Add function description\r
292\r
293Arguments:\r
294\r
295 This - TODO: add argument description\r
296 Handle - TODO: add argument description\r
297 NumberOfChildren - TODO: add argument description\r
298 ChildHandleBuffer - TODO: add argument description\r
299\r
300Returns:\r
301\r
302 EFI_UNSUPPORTED - TODO: Add description for return value\r
303\r
304--*/\r
305{\r
306 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut;\r
307 EFI_STATUS Status;\r
308 WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
309\r
310 //\r
311 // Kick people off our interface???\r
312 //\r
313 Status = gBS->OpenProtocol (\r
314 Handle,\r
315 &gEfiSimpleTextOutProtocolGuid,\r
316 &SimpleTextOut,\r
317 This->DriverBindingHandle,\r
318 Handle,\r
319 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
320 );\r
321 if (EFI_ERROR (Status)) {\r
322 return EFI_UNSUPPORTED;\r
323 }\r
324\r
325 Private = WIN_NT_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (SimpleTextOut);\r
326\r
327 ASSERT (Private->Handle == Handle);\r
328\r
329 Status = gBS->UninstallMultipleProtocolInterfaces (\r
330 Handle,\r
331 &gEfiSimpleTextOutProtocolGuid,\r
332 &Private->SimpleTextOut,\r
333 &gEfiSimpleTextInProtocolGuid,\r
334 &Private->SimpleTextIn,\r
335 NULL\r
336 );\r
337 if (!EFI_ERROR (Status)) {\r
338\r
339 //\r
340 // Shut down our device\r
341 //\r
342 Status = gBS->CloseProtocol (\r
343 Handle,\r
344 &gEfiWinNtIoProtocolGuid,\r
345 This->DriverBindingHandle,\r
346 Handle\r
347 );\r
348\r
349 Status = gBS->CloseEvent (Private->SimpleTextIn.WaitForKey);\r
350 ASSERT_EFI_ERROR (Status);\r
351\r
352 Private->WinNtThunk->CloseHandle (Private->NtOutHandle);\r
353 //\r
354 // DO NOT close Private->NtInHandle. It points to StdIn and not\r
355 // the Private->NtOutHandle is StdIn and should not be closed!\r
356 //\r
357 FreeUnicodeStringTable (Private->ControllerNameTable);\r
358\r
359 FreePool (Private);\r
360 }\r
361\r
362 return Status;\r
363}\r