878ddf1f |
1 | /*++\r |
2 | \r |
fa332de7 |
3 | Copyright (c) 2006 - 2007, Intel Corporation\r |
4 | All rights reserved. This program and the accompanying materials\r |
5 | are licensed and made available under the terms and conditions of the BSD License\r |
6 | which accompanies this distribution. The full text of the license may be found at\r |
7 | http://opensource.org/licenses/bsd-license.php\r |
8 | \r |
9 | THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r |
10 | WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r |
878ddf1f |
11 | \r |
12 | Module Name:\r |
13 | \r |
14 | Console.c\r |
15 | \r |
16 | Abstract:\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 |
24 | EFI_STATUS\r |
25 | EFIAPI\r |
26 | WinNtConsoleDriverBindingSupported (\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 |
32 | EFI_STATUS\r |
33 | EFIAPI\r |
34 | WinNtConsoleDriverBindingStart (\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 |
40 | EFI_STATUS\r |
41 | EFIAPI\r |
42 | WinNtConsoleDriverBindingStop (\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 |
49 | EFI_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 |
59 | EFI_STATUS\r |
60 | EFIAPI\r |
61 | WinNtConsoleDriverBindingSupported (\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 |
68 | Routine Description:\r |
69 | \r |
70 | Arguments:\r |
71 | \r |
72 | Returns:\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 |
126 | EFI_STATUS\r |
127 | EFIAPI\r |
128 | WinNtConsoleDriverBindingStart (\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 |
135 | Routine Description:\r |
136 | \r |
137 | Arguments:\r |
138 | \r |
139 | Returns:\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 |
194 | Done:\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 |
219 | EFI_STATUS\r |
220 | EFIAPI\r |
221 | WinNtConsoleDriverBindingStop (\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 |
229 | Routine Description:\r |
230 | \r |
231 | TODO: Add function description\r |
232 | \r |
233 | Arguments:\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 |
240 | Returns:\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 |