]> git.proxmox.com Git - mirror_edk2.git/blame - EdkNt32Pkg/Dxe/WinNtThunk/Bus/Console/Console.c
1. Perfect libraries MSA files
[mirror_edk2.git] / EdkNt32Pkg / Dxe / WinNtThunk / Bus / Console / Console.c
CommitLineData
878ddf1f 1/*++\r
2\r
fa332de7 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
878ddf1f 11\r
12Module Name:\r
13\r
14 Console.c\r
15\r
16Abstract:\r
17\r
fa332de7 18 Console based on Win32 APIs.\r
878ddf1f 19\r
20--*/\r
21\r
22#include "Console.h"\r
23\r
24EFI_STATUS\r
25EFIAPI\r
26WinNtConsoleDriverBindingSupported (\r
27 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
28 IN EFI_HANDLE Handle,\r
29 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
30 );\r
31\r
32EFI_STATUS\r
33EFIAPI\r
34WinNtConsoleDriverBindingStart (\r
35 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
36 IN EFI_HANDLE Handle,\r
37 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
38 );\r
39\r
40EFI_STATUS\r
41EFIAPI\r
42WinNtConsoleDriverBindingStop (\r
43 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
44 IN EFI_HANDLE Handle,\r
45 IN UINTN NumberOfChildren,\r
46 IN EFI_HANDLE *ChildHandleBuffer\r
47 );\r
48\r
49EFI_DRIVER_BINDING_PROTOCOL gWinNtConsoleDriverBinding = {\r
50 WinNtConsoleDriverBindingSupported,\r
51 WinNtConsoleDriverBindingStart,\r
52 WinNtConsoleDriverBindingStop,\r
8b018de6 53 0xa,\r
878ddf1f 54 NULL,\r
55 NULL\r
56};\r
57\r
58\r
59EFI_STATUS\r
60EFIAPI\r
61WinNtConsoleDriverBindingSupported (\r
62 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
63 IN EFI_HANDLE Handle,\r
64 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
65 )\r
66/*++\r
67\r
68Routine Description:\r
69\r
70Arguments:\r
71\r
72Returns:\r
73\r
74 None\r
75\r
76--*/\r
77// TODO: This - add argument and description to function comment\r
78// TODO: Handle - add argument and description to function comment\r
79// TODO: RemainingDevicePath - add argument and description to function comment\r
80{\r
81 EFI_STATUS Status;\r
82 EFI_WIN_NT_IO_PROTOCOL *WinNtIo;\r
83\r
84 //\r
85 // Open the IO Abstraction(s) needed to perform the supported test\r
86 //\r
87 Status = gBS->OpenProtocol (\r
88 Handle,\r
89 &gEfiWinNtIoProtocolGuid,\r
90 &WinNtIo,\r
91 This->DriverBindingHandle,\r
92 Handle,\r
93 EFI_OPEN_PROTOCOL_BY_DRIVER\r
94 );\r
95 if (EFI_ERROR (Status)) {\r
96 return Status;\r
97 }\r
98\r
99 //\r
100 // Make sure that the WinNt Thunk Protocol is valid\r
101 //\r
102 Status = EFI_UNSUPPORTED;\r
103 if (WinNtIo->WinNtThunk->Signature == EFI_WIN_NT_THUNK_PROTOCOL_SIGNATURE) {\r
104\r
105 //\r
106 // Check the GUID to see if this is a handle type the driver supports\r
107 //\r
108 if (CompareGuid (WinNtIo->TypeGuid, &gEfiWinNtConsoleGuid)) {\r
109 Status = EFI_SUCCESS;\r
110 }\r
111 }\r
112\r
113 //\r
114 // Close the I/O Abstraction(s) used to perform the supported test\r
115 //\r
116 gBS->CloseProtocol (\r
117 Handle,\r
118 &gEfiWinNtIoProtocolGuid,\r
119 This->DriverBindingHandle,\r
120 Handle\r
121 );\r
122\r
123 return Status;\r
124}\r
125\r
126EFI_STATUS\r
127EFIAPI\r
128WinNtConsoleDriverBindingStart (\r
129 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
130 IN EFI_HANDLE Handle,\r
131 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
132 )\r
133/*++\r
134\r
135Routine Description:\r
136\r
137Arguments:\r
138\r
139Returns:\r
140\r
141 None\r
142\r
143--*/\r
144// TODO: This - add argument and description to function comment\r
145// TODO: Handle - add argument and description to function comment\r
146// TODO: RemainingDevicePath - add argument and description to function comment\r
147{\r
148 EFI_STATUS Status;\r
149 EFI_WIN_NT_IO_PROTOCOL *WinNtIo;\r
150 WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
151\r
152 //\r
153 // Grab the IO abstraction we need to get any work done\r
154 //\r
155 Status = gBS->OpenProtocol (\r
156 Handle,\r
157 &gEfiWinNtIoProtocolGuid,\r
158 &WinNtIo,\r
159 This->DriverBindingHandle,\r
160 Handle,\r
161 EFI_OPEN_PROTOCOL_BY_DRIVER\r
162 );\r
163 if (EFI_ERROR (Status)) {\r
164 return Status;\r
165 }\r
166\r
fa332de7 167 Private = AllocatePool (sizeof (WIN_NT_SIMPLE_TEXT_PRIVATE_DATA));\r
168 if (Private == NULL) {\r
878ddf1f 169 goto Done;\r
170 }\r
171\r
172 ZeroMem (Private, sizeof (WIN_NT_SIMPLE_TEXT_PRIVATE_DATA));\r
173\r
174 Private->Signature = WIN_NT_SIMPLE_TEXT_PRIVATE_DATA_SIGNATURE;\r
175 Private->Handle = Handle;\r
176 Private->WinNtIo = WinNtIo;\r
177 Private->WinNtThunk = WinNtIo->WinNtThunk;\r
178\r
179 WinNtSimpleTextOutOpenWindow (Private);\r
180 WinNtSimpleTextInAttachToWindow (Private);\r
181\r
182 Status = gBS->InstallMultipleProtocolInterfaces (\r
183 &Handle,\r
184 &gEfiSimpleTextOutProtocolGuid,\r
185 &Private->SimpleTextOut,\r
186 &gEfiSimpleTextInProtocolGuid,\r
187 &Private->SimpleTextIn,\r
188 NULL\r
189 );\r
190 if (!EFI_ERROR (Status)) {\r
191 return Status;\r
192 }\r
193\r
194Done:\r
195 gBS->CloseProtocol (\r
196 Handle,\r
197 &gEfiWinNtIoProtocolGuid,\r
198 This->DriverBindingHandle,\r
199 Handle\r
200 );\r
201 if (Private != NULL) {\r
202\r
203 FreeUnicodeStringTable (Private->ControllerNameTable);\r
204\r
205 if (Private->NtOutHandle != NULL) {\r
206 Private->WinNtThunk->CloseHandle (Private->NtOutHandle);\r
207 }\r
208\r
209 if (Private->SimpleTextIn.WaitForKey != NULL) {\r
210 gBS->CloseEvent (Private->SimpleTextIn.WaitForKey);\r
211 }\r
212\r
fa332de7 213 FreePool (Private);\r
878ddf1f 214 }\r
215\r
216 return Status;\r
217}\r
218\r
219EFI_STATUS\r
220EFIAPI\r
221WinNtConsoleDriverBindingStop (\r
222 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
223 IN EFI_HANDLE Handle,\r
224 IN UINTN NumberOfChildren,\r
225 IN EFI_HANDLE *ChildHandleBuffer\r
226 )\r
227/*++\r
228\r
229Routine Description:\r
230\r
231 TODO: Add function description\r
232\r
233Arguments:\r
234\r
235 This - TODO: add argument description\r
236 Handle - TODO: add argument description\r
237 NumberOfChildren - TODO: add argument description\r
238 ChildHandleBuffer - TODO: add argument description\r
239\r
240Returns:\r
241\r
242 EFI_UNSUPPORTED - TODO: Add description for return value\r
243\r
244--*/\r
245{\r
246 EFI_SIMPLE_TEXT_OUT_PROTOCOL *SimpleTextOut;\r
247 EFI_STATUS Status;\r
248 WIN_NT_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
249\r
250 //\r
251 // Kick people off our interface???\r
252 //\r
253 Status = gBS->OpenProtocol (\r
254 Handle,\r
255 &gEfiSimpleTextOutProtocolGuid,\r
256 &SimpleTextOut,\r
257 This->DriverBindingHandle,\r
258 Handle,\r
259 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
260 );\r
261 if (EFI_ERROR (Status)) {\r
262 return EFI_UNSUPPORTED;\r
263 }\r
264\r
265 Private = WIN_NT_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (SimpleTextOut);\r
266\r
267 ASSERT (Private->Handle == Handle);\r
268\r
269 Status = gBS->UninstallMultipleProtocolInterfaces (\r
270 Handle,\r
271 &gEfiSimpleTextOutProtocolGuid,\r
272 &Private->SimpleTextOut,\r
273 &gEfiSimpleTextInProtocolGuid,\r
274 &Private->SimpleTextIn,\r
275 NULL\r
276 );\r
277 if (!EFI_ERROR (Status)) {\r
278\r
279 //\r
280 // Shut down our device\r
281 //\r
282 Status = gBS->CloseProtocol (\r
283 Handle,\r
284 &gEfiWinNtIoProtocolGuid,\r
285 This->DriverBindingHandle,\r
286 Handle\r
287 );\r
288\r
289 Status = gBS->CloseEvent (Private->SimpleTextIn.WaitForKey);\r
290 ASSERT_EFI_ERROR (Status);\r
291\r
292 Private->WinNtThunk->CloseHandle (Private->NtOutHandle);\r
293 //\r
294 // DO NOT close Private->NtInHandle. It points to StdIn and not\r
295 // the Private->NtOutHandle is StdIn and should not be closed!\r
296 //\r
297 FreeUnicodeStringTable (Private->ControllerNameTable);\r
298\r
fa332de7 299 FreePool (Private);\r
878ddf1f 300 }\r
301\r
302 return Status;\r
303}\r