]> git.proxmox.com Git - mirror_edk2.git/blame - Nt32Pkg/WinNtConsoleDxe/Console.c
Add WinNtConsole driver into Nt32Pkg.
[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
104 Status = EfiLibInstallAllDriverProtocols (\r
105 ImageHandle,\r
106 SystemTable,\r
107 &gWinNtConsoleDriverBinding,\r
108 ImageHandle,\r
109 &gWinNtConsoleComponentName,\r
110 NULL,\r
111 NULL\r
112 );\r
113 ASSERT_EFI_ERROR (Status);\r
114\r
115\r
116 return Status;\r
117}\r
118\r
119\r
120EFI_STATUS\r
121EFIAPI\r
122WinNtConsoleDriverBindingSupported (\r
123 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
124 IN EFI_HANDLE Handle,\r
125 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
126 )\r
127/*++\r
128\r
129Routine Description:\r
130\r
131Arguments:\r
132\r
133Returns:\r
134\r
135 None\r
136\r
137--*/\r
138// TODO: This - add argument and description to function comment\r
139// TODO: Handle - add argument and description to function comment\r
140// TODO: RemainingDevicePath - add argument and description to function comment\r
141{\r
142 EFI_STATUS Status;\r
143 EFI_WIN_NT_IO_PROTOCOL *WinNtIo;\r
144\r
145 //\r
146 // Open the IO Abstraction(s) needed to perform the supported test\r
147 //\r
148 Status = gBS->OpenProtocol (\r
149 Handle,\r
150 &gEfiWinNtIoProtocolGuid,\r
151 &WinNtIo,\r
152 This->DriverBindingHandle,\r
153 Handle,\r
154 EFI_OPEN_PROTOCOL_BY_DRIVER\r
155 );\r
156 if (EFI_ERROR (Status)) {\r
157 return Status;\r
158 }\r
159\r
160 //\r
161 // Make sure that the WinNt Thunk Protocol is valid\r
162 //\r
163 Status = EFI_UNSUPPORTED;\r
164 if (WinNtIo->WinNtThunk->Signature == EFI_WIN_NT_THUNK_PROTOCOL_SIGNATURE) {\r
165\r
166 //\r
167 // Check the GUID to see if this is a handle type the driver supports\r
168 //\r
169 if (CompareGuid (WinNtIo->TypeGuid, &gEfiWinNtConsoleGuid)) {\r
170 Status = EFI_SUCCESS;\r
171 }\r
172 }\r
173\r
174 //\r
175 // Close the I/O Abstraction(s) used to perform the supported test\r
176 //\r
177 gBS->CloseProtocol (\r
178 Handle,\r
179 &gEfiWinNtIoProtocolGuid,\r
180 This->DriverBindingHandle,\r
181 Handle\r
182 );\r
183\r
184 return Status;\r
185}\r
186\r
187EFI_STATUS\r
188EFIAPI\r
189WinNtConsoleDriverBindingStart (\r
190 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
191 IN EFI_HANDLE Handle,\r
192 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
193 )\r
194/*++\r
195\r
196Routine Description:\r
197\r
198Arguments:\r
199\r
200Returns:\r
201\r
202 None\r
203\r
204--*/\r
205// TODO: This - add argument and description to function comment\r
206// TODO: Handle - add argument and description to function comment\r
207// TODO: RemainingDevicePath - add argument and description to function comment\r
208{\r
209 EFI_STATUS Status;\r
210 EFI_WIN_NT_IO_PROTOCOL *WinNtIo;\r
211 WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
212\r
213 //\r
214 // Grab the IO abstraction we need to get any work done\r
215 //\r
216 Status = gBS->OpenProtocol (\r
217 Handle,\r
218 &gEfiWinNtIoProtocolGuid,\r
219 &WinNtIo,\r
220 This->DriverBindingHandle,\r
221 Handle,\r
222 EFI_OPEN_PROTOCOL_BY_DRIVER\r
223 );\r
224 if (EFI_ERROR (Status)) {\r
225 return Status;\r
226 }\r
227\r
228 Private = AllocatePool (sizeof (WIN_NT_SIMPLE_TEXT_PRIVATE_DATA));\r
229 if (Private == NULL) {\r
230 goto Done;\r
231 }\r
232\r
233 ZeroMem (Private, sizeof (WIN_NT_SIMPLE_TEXT_PRIVATE_DATA));\r
234\r
235 Private->Signature = WIN_NT_SIMPLE_TEXT_PRIVATE_DATA_SIGNATURE;\r
236 Private->Handle = Handle;\r
237 Private->WinNtIo = WinNtIo;\r
238 Private->WinNtThunk = WinNtIo->WinNtThunk;\r
239\r
240 WinNtSimpleTextOutOpenWindow (Private);\r
241 WinNtSimpleTextInAttachToWindow (Private);\r
242\r
243 Status = gBS->InstallMultipleProtocolInterfaces (\r
244 &Handle,\r
245 &gEfiSimpleTextOutProtocolGuid,\r
246 &Private->SimpleTextOut,\r
247 &gEfiSimpleTextInProtocolGuid,\r
248 &Private->SimpleTextIn,\r
249 NULL\r
250 );\r
251 if (!EFI_ERROR (Status)) {\r
252 return Status;\r
253 }\r
254\r
255Done:\r
256 gBS->CloseProtocol (\r
257 Handle,\r
258 &gEfiWinNtIoProtocolGuid,\r
259 This->DriverBindingHandle,\r
260 Handle\r
261 );\r
262 if (Private != NULL) {\r
263\r
264 FreeUnicodeStringTable (Private->ControllerNameTable);\r
265\r
266 if (Private->NtOutHandle != NULL) {\r
267 Private->WinNtThunk->CloseHandle (Private->NtOutHandle);\r
268 }\r
269\r
270 if (Private->SimpleTextIn.WaitForKey != NULL) {\r
271 gBS->CloseEvent (Private->SimpleTextIn.WaitForKey);\r
272 }\r
273\r
274 FreePool (Private);\r
275 }\r
276\r
277 return Status;\r
278}\r
279\r
280EFI_STATUS\r
281EFIAPI\r
282WinNtConsoleDriverBindingStop (\r
283 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
284 IN EFI_HANDLE Handle,\r
285 IN UINTN NumberOfChildren,\r
286 IN EFI_HANDLE *ChildHandleBuffer\r
287 )\r
288/*++\r
289\r
290Routine Description:\r
291\r
292 TODO: Add function description\r
293\r
294Arguments:\r
295\r
296 This - TODO: add argument description\r
297 Handle - TODO: add argument description\r
298 NumberOfChildren - TODO: add argument description\r
299 ChildHandleBuffer - TODO: add argument description\r
300\r
301Returns:\r
302\r
303 EFI_UNSUPPORTED - TODO: Add description for return value\r
304\r
305--*/\r
306{\r
307 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut;\r
308 EFI_STATUS Status;\r
309 WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
310\r
311 //\r
312 // Kick people off our interface???\r
313 //\r
314 Status = gBS->OpenProtocol (\r
315 Handle,\r
316 &gEfiSimpleTextOutProtocolGuid,\r
317 &SimpleTextOut,\r
318 This->DriverBindingHandle,\r
319 Handle,\r
320 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
321 );\r
322 if (EFI_ERROR (Status)) {\r
323 return EFI_UNSUPPORTED;\r
324 }\r
325\r
326 Private = WIN_NT_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (SimpleTextOut);\r
327\r
328 ASSERT (Private->Handle == Handle);\r
329\r
330 Status = gBS->UninstallMultipleProtocolInterfaces (\r
331 Handle,\r
332 &gEfiSimpleTextOutProtocolGuid,\r
333 &Private->SimpleTextOut,\r
334 &gEfiSimpleTextInProtocolGuid,\r
335 &Private->SimpleTextIn,\r
336 NULL\r
337 );\r
338 if (!EFI_ERROR (Status)) {\r
339\r
340 //\r
341 // Shut down our device\r
342 //\r
343 Status = gBS->CloseProtocol (\r
344 Handle,\r
345 &gEfiWinNtIoProtocolGuid,\r
346 This->DriverBindingHandle,\r
347 Handle\r
348 );\r
349\r
350 Status = gBS->CloseEvent (Private->SimpleTextIn.WaitForKey);\r
351 ASSERT_EFI_ERROR (Status);\r
352\r
353 Private->WinNtThunk->CloseHandle (Private->NtOutHandle);\r
354 //\r
355 // DO NOT close Private->NtInHandle. It points to StdIn and not\r
356 // the Private->NtOutHandle is StdIn and should not be closed!\r
357 //\r
358 FreeUnicodeStringTable (Private->ControllerNameTable);\r
359\r
360 FreePool (Private);\r
361 }\r
362\r
363 return Status;\r
364}\r