]>
Commit | Line | Data |
---|---|---|
4ba49616 | 1 | /** @file\r |
2 | Main file for Dh shell Driver1 function.\r | |
3 | \r | |
c011b6c9 | 4 | (C) Copyright 2014-2015 Hewlett-Packard Development Company, L.P.<BR>\r |
ba0014b9 | 5 | Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>\r |
03a5572b | 6 | (C) Copyright 2017 Hewlett Packard Enterprise Development LP<BR>\r |
56ba3746 | 7 | SPDX-License-Identifier: BSD-2-Clause-Patent\r |
4ba49616 | 8 | \r |
9 | **/\r | |
10 | \r | |
11 | #include "UefiShellDriver1CommandsLib.h"\r | |
12 | \r | |
47d20b54 MK |
13 | STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r |
14 | { L"-p", TypeValue },\r | |
15 | { L"-d", TypeFlag },\r | |
16 | { L"-v", TypeFlag },\r | |
17 | { L"-verbose", TypeFlag },\r | |
18 | { L"-sfo", TypeFlag },\r | |
19 | { L"-l", TypeValue },\r | |
20 | { NULL, TypeMax }\r | |
21 | };\r | |
22 | \r | |
23 | STATIC CONST EFI_GUID *UefiDriverModelProtocolsGuidArray[] = {\r | |
4ba49616 | 24 | &gEfiDriverBindingProtocolGuid,\r |
25 | &gEfiPlatformDriverOverrideProtocolGuid,\r | |
26 | &gEfiBusSpecificDriverOverrideProtocolGuid,\r | |
27 | &gEfiDriverDiagnosticsProtocolGuid,\r | |
28 | &gEfiDriverDiagnostics2ProtocolGuid,\r | |
29 | &gEfiComponentNameProtocolGuid,\r | |
30 | &gEfiComponentName2ProtocolGuid,\r | |
31 | &gEfiPlatformToDriverConfigurationProtocolGuid,\r | |
32 | &gEfiDriverSupportedEfiVersionProtocolGuid,\r | |
33 | &gEfiDriverFamilyOverrideProtocolGuid,\r | |
34 | &gEfiDriverHealthProtocolGuid,\r | |
35 | &gEfiLoadedImageProtocolGuid,\r | |
36 | NULL\r | |
37 | };\r | |
38 | \r | |
47d20b54 MK |
39 | UINTN mGuidDataLen[] = { 8, 4, 4, 4, 12 };\r |
40 | \r | |
de8cea6f RN |
41 | /**\r |
42 | Function to determine if the string can convert to a GUID.\r | |
43 | The string must be restricted as "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" format.\r | |
44 | \r | |
45 | @param[in] String The string to test.\r | |
46 | \r | |
47 | @retval TRUE The string can convert to a GUID.\r | |
48 | @retval FALSE The string can't convert to a GUID.\r | |
49 | **/\r | |
50 | BOOLEAN\r | |
47d20b54 MK |
51 | IsValidGuidString (\r |
52 | IN CONST CHAR16 *String\r | |
de8cea6f RN |
53 | )\r |
54 | {\r | |
55 | CONST CHAR16 *Walker;\r | |
56 | CONST CHAR16 *PrevWalker;\r | |
57 | UINTN Index;\r | |
58 | \r | |
59 | if (String == NULL) {\r | |
60 | return FALSE;\r | |
61 | }\r | |
62 | \r | |
47d20b54 MK |
63 | Walker = String;\r |
64 | PrevWalker = String;\r | |
65 | Index = 0;\r | |
de8cea6f RN |
66 | \r |
67 | while (Walker != NULL && *Walker != CHAR_NULL) {\r | |
47d20b54 MK |
68 | if (((*Walker >= '0') && (*Walker <= '9')) ||\r |
69 | ((*Walker >= 'a') && (*Walker <= 'f')) ||\r | |
70 | ((*Walker >= 'A') && (*Walker <= 'F'))\r | |
71 | )\r | |
72 | {\r | |
de8cea6f RN |
73 | Walker++;\r |
74 | } else {\r | |
47d20b54 | 75 | if ((*Walker == L'-') && ((((UINTN)Walker - (UINTN)PrevWalker) / sizeof (CHAR16)) == mGuidDataLen[Index])) {\r |
de8cea6f RN |
76 | Walker++;\r |
77 | PrevWalker = Walker;\r | |
78 | Index++;\r | |
79 | } else {\r | |
80 | return FALSE;\r | |
81 | }\r | |
82 | }\r | |
83 | }\r | |
84 | \r | |
810c635d | 85 | if ((((UINTN)Walker - (UINTN)PrevWalker) / sizeof (CHAR16)) == mGuidDataLen[Index]) {\r |
de8cea6f RN |
86 | return TRUE;\r |
87 | } else {\r | |
88 | return FALSE;\r | |
89 | }\r | |
90 | }\r | |
91 | \r | |
92 | /**\r | |
93 | Convert a hex-character to decimal value.\r | |
94 | \r | |
95 | This internal function only deal with Unicode character\r | |
96 | which maps to a valid hexadecimal ASII character, i.e.\r | |
97 | L'0' to L'9', L'a' to L'f' or L'A' to L'F'. For other\r | |
98 | Unicode character, the value returned does not make sense.\r | |
99 | \r | |
100 | @param[in] Char The character to convert.\r | |
101 | \r | |
102 | @retval The numerical value converted.\r | |
103 | **/\r | |
104 | UINTN\r | |
47d20b54 MK |
105 | HexCharToDecimal (\r |
106 | IN CHAR16 Char\r | |
de8cea6f RN |
107 | )\r |
108 | {\r | |
47d20b54 | 109 | if ((Char >= '0') && (Char <= '9')) {\r |
de8cea6f | 110 | return Char - L'0';\r |
47d20b54 | 111 | } else if ((Char >= 'a') && (Char <= 'f')) {\r |
de8cea6f RN |
112 | return Char - L'a' + 10;\r |
113 | } else {\r | |
114 | return Char - L'A' + 10;\r | |
115 | }\r | |
116 | }\r | |
117 | \r | |
118 | /**\r | |
119 | Function try to convert a string to GUID format.\r | |
120 | \r | |
121 | @param[in] String The string will be converted.\r | |
122 | @param[out] Guid Save the result convert from string.\r | |
123 | \r | |
124 | @retval EFI_SUCCESS The string was successfully converted to a GUID.\r | |
125 | @retval EFI_UNSUPPORTED The input string is not in registry format.\r | |
126 | **/\r | |
127 | EFI_STATUS\r | |
47d20b54 MK |
128 | ConvertStrToGuid (\r |
129 | IN CONST CHAR16 *String,\r | |
130 | OUT GUID *Guid\r | |
de8cea6f RN |
131 | )\r |
132 | {\r | |
133 | CONST CHAR16 *Walker;\r | |
134 | UINT8 TempValue;\r | |
135 | UINTN Index;\r | |
136 | \r | |
47d20b54 | 137 | if ((String == NULL) || !IsValidGuidString (String)) {\r |
de8cea6f RN |
138 | return EFI_UNSUPPORTED;\r |
139 | }\r | |
140 | \r | |
141 | Index = 0;\r | |
142 | \r | |
47d20b54 | 143 | Walker = String;\r |
de8cea6f RN |
144 | Guid->Data1 = (UINT32)StrHexToUint64 (Walker);\r |
145 | \r | |
47d20b54 | 146 | Walker += 9;\r |
de8cea6f RN |
147 | Guid->Data2 = (UINT16)StrHexToUint64 (Walker);\r |
148 | \r | |
47d20b54 | 149 | Walker += 5;\r |
de8cea6f RN |
150 | Guid->Data3 = (UINT16)StrHexToUint64 (Walker);\r |
151 | \r | |
152 | Walker += 5;\r | |
153 | while (Walker != NULL && *Walker != CHAR_NULL) {\r | |
154 | if (*Walker == L'-') {\r | |
155 | Walker++;\r | |
156 | } else {\r | |
157 | TempValue = (UINT8)HexCharToDecimal (*Walker);\r | |
158 | TempValue = (UINT8)LShiftU64 (TempValue, 4);\r | |
159 | Walker++;\r | |
160 | \r | |
161 | TempValue += (UINT8)HexCharToDecimal (*Walker);\r | |
162 | Walker++;\r | |
163 | \r | |
164 | Guid->Data4[Index] = TempValue;\r | |
165 | Index++;\r | |
166 | }\r | |
167 | }\r | |
168 | \r | |
169 | return EFI_SUCCESS;\r | |
170 | }\r | |
171 | \r | |
361a8267 | 172 | /**\r |
173 | Get the name of a driver by it's handle.\r | |
174 | \r | |
175 | If a name is found the memory must be callee freed.\r | |
176 | \r | |
177 | @param[in] TheHandle The driver's handle.\r | |
178 | @param[in] Language The language to use.\r | |
179 | @param[in] NameFound Upon a successful return the name found.\r | |
180 | \r | |
181 | @retval EFI_SUCCESS The name was found.\r | |
182 | **/\r | |
183 | EFI_STATUS\r | |
361a8267 | 184 | GetDriverName (\r |
185 | IN EFI_HANDLE TheHandle,\r | |
186 | IN CONST CHAR8 *Language,\r | |
187 | IN CHAR16 **NameFound\r | |
188 | )\r | |
189 | {\r | |
47d20b54 MK |
190 | CHAR8 *Lang;\r |
191 | EFI_STATUS Status;\r | |
192 | EFI_COMPONENT_NAME2_PROTOCOL *CompName2;\r | |
193 | CHAR16 *NameToReturn;\r | |
194 | \r | |
361a8267 | 195 | //\r |
196 | // Go through those handles until we get one that passes for GetComponentName\r | |
197 | //\r | |
47d20b54 MK |
198 | Status = gBS->OpenProtocol (\r |
199 | TheHandle,\r | |
200 | &gEfiComponentName2ProtocolGuid,\r | |
201 | (VOID **)&CompName2,\r | |
202 | gImageHandle,\r | |
203 | NULL,\r | |
204 | EFI_OPEN_PROTOCOL_GET_PROTOCOL\r | |
205 | );\r | |
206 | if (EFI_ERROR (Status)) {\r | |
207 | Status = gBS->OpenProtocol (\r | |
208 | TheHandle,\r | |
209 | &gEfiComponentNameProtocolGuid,\r | |
210 | (VOID **)&CompName2,\r | |
211 | gImageHandle,\r | |
212 | NULL,\r | |
213 | EFI_OPEN_PROTOCOL_GET_PROTOCOL\r | |
214 | );\r | |
361a8267 | 215 | }\r |
216 | \r | |
47d20b54 | 217 | if (EFI_ERROR (Status)) {\r |
361a8267 | 218 | return (EFI_NOT_FOUND);\r |
219 | }\r | |
361a8267 | 220 | \r |
47d20b54 MK |
221 | Lang = GetBestLanguageForDriver (CompName2->SupportedLanguages, Language, FALSE);\r |
222 | Status = CompName2->GetDriverName (CompName2, Lang, &NameToReturn);\r | |
223 | FreePool (Lang);\r | |
224 | \r | |
225 | if (!EFI_ERROR (Status) && (NameToReturn != NULL)) {\r | |
361a8267 | 226 | *NameFound = NULL;\r |
47d20b54 | 227 | StrnCatGrow (NameFound, NULL, NameToReturn, 0);\r |
361a8267 | 228 | }\r |
47d20b54 | 229 | \r |
361a8267 | 230 | return (Status);\r |
231 | }\r | |
232 | \r | |
233 | /**\r | |
234 | Discover if a protocol guid is one of the UEFI Driver Model Protocols.\r | |
235 | \r | |
236 | @param[in] Guid The guid to test.\r | |
237 | \r | |
238 | @retval TRUE The guid does represent a driver model protocol.\r | |
239 | @retval FALSE The guid does not represent a driver model protocol.\r | |
240 | **/\r | |
4ba49616 | 241 | BOOLEAN\r |
4ba49616 | 242 | IsDriverProt (\r |
47d20b54 | 243 | IN CONST EFI_GUID *Guid\r |
4ba49616 | 244 | )\r |
245 | {\r | |
47d20b54 MK |
246 | CONST EFI_GUID **GuidWalker;\r |
247 | BOOLEAN GuidFound;\r | |
248 | \r | |
4ba49616 | 249 | GuidFound = FALSE;\r |
250 | for (GuidWalker = UefiDriverModelProtocolsGuidArray\r | |
47d20b54 MK |
251 | ; GuidWalker != NULL && *GuidWalker != NULL\r |
252 | ; GuidWalker++\r | |
253 | )\r | |
254 | {\r | |
255 | if (CompareGuid (*GuidWalker, Guid)) {\r | |
4ba49616 | 256 | GuidFound = TRUE;\r |
257 | break;\r | |
258 | }\r | |
259 | }\r | |
47d20b54 | 260 | \r |
4ba49616 | 261 | return (GuidFound);\r |
262 | }\r | |
263 | \r | |
361a8267 | 264 | /**\r |
265 | Get information for a handle.\r | |
266 | \r | |
267 | @param[in] TheHandle The handles to show info on.\r | |
268 | @param[in] Language Language string per UEFI specification.\r | |
268d3445 | 269 | @param[in] Separator Separator string between information blocks.\r |
361a8267 | 270 | @param[in] Verbose TRUE for extra info, FALSE otherwise.\r |
271 | @param[in] ExtraInfo TRUE for extra info, FALSE otherwise.\r | |
272 | \r | |
273 | @retval SHELL_SUCCESS The operation was successful.\r | |
274 | @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.\r | |
275 | **/\r | |
47d20b54 MK |
276 | CHAR16 *\r |
277 | GetProtocolInfoString (\r | |
278 | IN CONST EFI_HANDLE TheHandle,\r | |
279 | IN CONST CHAR8 *Language,\r | |
280 | IN CONST CHAR16 *Separator,\r | |
281 | IN CONST BOOLEAN Verbose,\r | |
282 | IN CONST BOOLEAN ExtraInfo\r | |
4ba49616 | 283 | )\r |
284 | {\r | |
47d20b54 MK |
285 | EFI_GUID **ProtocolGuidArray;\r |
286 | UINTN ArrayCount;\r | |
287 | UINTN ProtocolIndex;\r | |
288 | EFI_STATUS Status;\r | |
289 | CHAR16 *RetVal;\r | |
290 | UINTN Size;\r | |
291 | CHAR16 *Temp;\r | |
292 | CHAR16 GuidStr[40];\r | |
293 | VOID *Instance;\r | |
294 | CHAR16 InstanceStr[17];\r | |
4ba49616 | 295 | \r |
296 | ProtocolGuidArray = NULL;\r | |
361a8267 | 297 | RetVal = NULL;\r |
298 | Size = 0;\r | |
4ba49616 | 299 | \r |
300 | Status = gBS->ProtocolsPerHandle (\r | |
47d20b54 MK |
301 | TheHandle,\r |
302 | &ProtocolGuidArray,\r | |
303 | &ArrayCount\r | |
304 | );\r | |
4ba49616 | 305 | if (!EFI_ERROR (Status)) {\r |
4ba49616 | 306 | for (ProtocolIndex = 0; ProtocolIndex < ArrayCount; ProtocolIndex++) {\r |
47d20b54 MK |
307 | Temp = GetStringNameFromGuid (ProtocolGuidArray[ProtocolIndex], Language);\r |
308 | ASSERT ((RetVal == NULL && Size == 0) || (RetVal != NULL));\r | |
0e88348e | 309 | if (Size != 0) {\r |
47d20b54 | 310 | StrnCatGrow (&RetVal, &Size, Separator, 0);\r |
0e88348e | 311 | }\r |
47d20b54 MK |
312 | \r |
313 | StrnCatGrow (&RetVal, &Size, L"%H", 0);\r | |
0e88348e RN |
314 | if (Temp == NULL) {\r |
315 | UnicodeSPrint (GuidStr, sizeof (GuidStr), L"%g", ProtocolGuidArray[ProtocolIndex]);\r | |
316 | StrnCatGrow (&RetVal, &Size, GuidStr, 0);\r | |
317 | } else {\r | |
47d20b54 MK |
318 | StrnCatGrow (&RetVal, &Size, Temp, 0);\r |
319 | FreePool (Temp);\r | |
4ba49616 | 320 | }\r |
7f04c460 | 321 | \r |
47d20b54 MK |
322 | StrnCatGrow (&RetVal, &Size, L"%N", 0);\r |
323 | \r | |
324 | if (Verbose) {\r | |
b6e0f0c6 | 325 | Status = gBS->HandleProtocol (TheHandle, ProtocolGuidArray[ProtocolIndex], &Instance);\r |
7f04c460 HL |
326 | if (!EFI_ERROR (Status)) {\r |
327 | StrnCatGrow (&RetVal, &Size, L"(%H", 0);\r | |
b6e0f0c6 | 328 | UnicodeSPrint (InstanceStr, sizeof (InstanceStr), L"%x", Instance);\r |
7f04c460 HL |
329 | StrnCatGrow (&RetVal, &Size, InstanceStr, 0);\r |
330 | StrnCatGrow (&RetVal, &Size, L"%N)", 0);\r | |
331 | }\r | |
332 | }\r | |
333 | \r | |
4ba49616 | 334 | if (ExtraInfo) {\r |
47d20b54 | 335 | Temp = GetProtocolInformationDump (TheHandle, ProtocolGuidArray[ProtocolIndex], Verbose);\r |
4ba49616 | 336 | if (Temp != NULL) {\r |
47d20b54 | 337 | ASSERT ((RetVal == NULL && Size == 0) || (RetVal != NULL));\r |
4ba49616 | 338 | if (!Verbose) {\r |
47d20b54 MK |
339 | StrnCatGrow (&RetVal, &Size, L"(", 0);\r |
340 | StrnCatGrow (&RetVal, &Size, Temp, 0);\r | |
341 | StrnCatGrow (&RetVal, &Size, L")", 0);\r | |
4ba49616 | 342 | } else {\r |
47d20b54 MK |
343 | StrnCatGrow (&RetVal, &Size, Separator, 0);\r |
344 | StrnCatGrow (&RetVal, &Size, Temp, 0);\r | |
4ba49616 | 345 | }\r |
47d20b54 MK |
346 | \r |
347 | FreePool (Temp);\r | |
4ba49616 | 348 | }\r |
349 | }\r | |
350 | }\r | |
4ba49616 | 351 | }\r |
ba0014b9 | 352 | \r |
47d20b54 | 353 | SHELL_FREE_NON_NULL (ProtocolGuidArray);\r |
4ba49616 | 354 | \r |
361a8267 | 355 | if (RetVal == NULL) {\r |
356 | return (NULL);\r | |
4ba49616 | 357 | }\r |
361a8267 | 358 | \r |
47d20b54 MK |
359 | ASSERT ((RetVal == NULL && Size == 0) || (RetVal != NULL));\r |
360 | StrnCatGrow (&RetVal, &Size, Separator, 0);\r | |
4ba49616 | 361 | return (RetVal);\r |
362 | }\r | |
363 | \r | |
361a8267 | 364 | /**\r |
365 | Gets the name of the loaded image.\r | |
366 | \r | |
367 | @param[in] TheHandle The handle of the driver to get info on.\r | |
368 | @param[out] Name The pointer to the pointer. Valid upon a successful return.\r | |
369 | \r | |
370 | @retval EFI_SUCCESS The operation was successful.\r | |
371 | **/\r | |
372 | EFI_STATUS\r | |
361a8267 | 373 | GetDriverImageName (\r |
47d20b54 MK |
374 | IN EFI_HANDLE TheHandle,\r |
375 | OUT CHAR16 **Name\r | |
361a8267 | 376 | )\r |
377 | {\r | |
378 | // get loaded image and devicepathtotext on image->Filepath\r | |
47d20b54 MK |
379 | EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r |
380 | EFI_STATUS Status;\r | |
381 | EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r | |
361a8267 | 382 | \r |
47d20b54 | 383 | if ((TheHandle == NULL) || (Name == NULL)) {\r |
361a8267 | 384 | return (EFI_INVALID_PARAMETER);\r |
385 | }\r | |
386 | \r | |
387 | Status = gBS->OpenProtocol (\r | |
47d20b54 MK |
388 | TheHandle,\r |
389 | &gEfiLoadedImageProtocolGuid,\r | |
390 | (VOID **)&LoadedImage,\r | |
391 | gImageHandle,\r | |
392 | NULL,\r | |
393 | EFI_OPEN_PROTOCOL_GET_PROTOCOL\r | |
394 | );\r | |
395 | if (EFI_ERROR (Status)) {\r | |
361a8267 | 396 | return (Status);\r |
397 | }\r | |
47d20b54 | 398 | \r |
361a8267 | 399 | DevicePath = LoadedImage->FilePath;\r |
47d20b54 | 400 | *Name = ConvertDevicePathToText (DevicePath, TRUE, TRUE);\r |
361a8267 | 401 | return (EFI_SUCCESS);\r |
402 | }\r | |
403 | \r | |
404 | /**\r | |
405 | Display driver model information for a given handle.\r | |
ba0014b9 | 406 | \r |
361a8267 | 407 | @param[in] Handle The handle to display info on.\r |
408 | @param[in] BestName Use the best name?\r | |
409 | @param[in] Language The language to output in.\r | |
410 | **/\r | |
411 | EFI_STATUS\r | |
361a8267 | 412 | DisplayDriverModelHandle (\r |
47d20b54 MK |
413 | IN EFI_HANDLE Handle,\r |
414 | IN BOOLEAN BestName,\r | |
415 | IN CONST CHAR8 *Language OPTIONAL\r | |
361a8267 | 416 | )\r |
417 | {\r | |
47d20b54 MK |
418 | EFI_STATUS Status;\r |
419 | BOOLEAN ConfigurationStatus;\r | |
420 | BOOLEAN DiagnosticsStatus;\r | |
421 | UINTN DriverBindingHandleCount;\r | |
422 | EFI_HANDLE *DriverBindingHandleBuffer;\r | |
423 | UINTN ParentControllerHandleCount;\r | |
424 | EFI_HANDLE *ParentControllerHandleBuffer;\r | |
425 | UINTN ChildControllerHandleCount;\r | |
426 | EFI_HANDLE *ChildControllerHandleBuffer;\r | |
427 | CHAR16 *TempStringPointer;\r | |
428 | EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r | |
429 | UINTN Index;\r | |
430 | CHAR16 *DriverName;\r | |
431 | EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;\r | |
432 | UINTN NumberOfChildren;\r | |
433 | UINTN HandleIndex;\r | |
434 | UINTN ControllerHandleCount;\r | |
435 | EFI_HANDLE *ControllerHandleBuffer;\r | |
436 | UINTN ChildIndex;\r | |
437 | BOOLEAN Image;\r | |
361a8267 | 438 | \r |
0d807dae ED |
439 | DriverName = NULL;\r |
440 | \r | |
361a8267 | 441 | //\r |
442 | // See if Handle is a device handle and display its details.\r | |
443 | //\r | |
444 | DriverBindingHandleBuffer = NULL;\r | |
47d20b54 MK |
445 | Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS (\r |
446 | Handle,\r | |
447 | &DriverBindingHandleCount,\r | |
448 | &DriverBindingHandleBuffer\r | |
449 | );\r | |
361a8267 | 450 | \r |
451 | ParentControllerHandleBuffer = NULL;\r | |
47d20b54 MK |
452 | Status = PARSE_HANDLE_DATABASE_PARENTS (\r |
453 | Handle,\r | |
454 | &ParentControllerHandleCount,\r | |
455 | &ParentControllerHandleBuffer\r | |
456 | );\r | |
361a8267 | 457 | \r |
458 | ChildControllerHandleBuffer = NULL;\r | |
47d20b54 MK |
459 | Status = ParseHandleDatabaseForChildControllers (\r |
460 | Handle,\r | |
461 | &ChildControllerHandleCount,\r | |
462 | &ChildControllerHandleBuffer\r | |
463 | );\r | |
361a8267 | 464 | \r |
47d20b54 | 465 | DiagnosticsStatus = FALSE;\r |
361a8267 | 466 | ConfigurationStatus = FALSE;\r |
467 | \r | |
47d20b54 | 468 | if (!EFI_ERROR (gBS->OpenProtocol (Handle, &gEfiDriverConfigurationProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r |
361a8267 | 469 | ConfigurationStatus = TRUE;\r |
470 | }\r | |
47d20b54 MK |
471 | \r |
472 | if (!EFI_ERROR (gBS->OpenProtocol (Handle, &gEfiDriverConfiguration2ProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r | |
361a8267 | 473 | ConfigurationStatus = TRUE;\r |
474 | }\r | |
47d20b54 MK |
475 | \r |
476 | if (!EFI_ERROR (gBS->OpenProtocol (Handle, &gEfiDriverDiagnosticsProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r | |
361a8267 | 477 | DiagnosticsStatus = TRUE;\r |
478 | }\r | |
47d20b54 MK |
479 | \r |
480 | if (!EFI_ERROR (gBS->OpenProtocol (Handle, &gEfiDriverDiagnostics2ProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r | |
361a8267 | 481 | DiagnosticsStatus = TRUE;\r |
482 | }\r | |
483 | \r | |
484 | Status = EFI_SUCCESS;\r | |
485 | \r | |
47d20b54 MK |
486 | if ((DriverBindingHandleCount > 0) || (ParentControllerHandleCount > 0) || (ChildControllerHandleCount > 0)) {\r |
487 | DevicePath = NULL;\r | |
488 | TempStringPointer = NULL;\r | |
489 | Status = gBS->HandleProtocol (Handle, &gEfiDevicePathProtocolGuid, (VOID **)&DevicePath);\r | |
361a8267 | 490 | \r |
47d20b54 MK |
491 | Status = gEfiShellProtocol->GetDeviceName (Handle, EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8 *)Language, &TempStringPointer);\r |
492 | ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_DRIVER1), gShellDriver1HiiHandle, TempStringPointer != NULL ? TempStringPointer : L"<Unknown>");\r | |
493 | SHELL_FREE_NON_NULL (TempStringPointer);\r | |
ba0014b9 | 494 | \r |
47d20b54 MK |
495 | TempStringPointer = ConvertDevicePathToText (DevicePath, TRUE, FALSE);\r |
496 | ShellPrintHiiEx (\r | |
ba0014b9 LG |
497 | -1,\r |
498 | -1,\r | |
499 | NULL,\r | |
500 | STRING_TOKEN (STR_DH_OUTPUT_DRIVER2),\r | |
501 | gShellDriver1HiiHandle,\r | |
47d20b54 MK |
502 | TempStringPointer != NULL ? TempStringPointer : L"<None>",\r |
503 | ParentControllerHandleCount == 0 ? L"ROOT" : (ChildControllerHandleCount > 0) ? L"BUS" : L"DEVICE",\r | |
504 | ConfigurationStatus ? L"YES" : L"NO",\r | |
505 | DiagnosticsStatus ? L"YES" : L"NO"\r | |
361a8267 | 506 | );\r |
507 | \r | |
47d20b54 | 508 | SHELL_FREE_NON_NULL (TempStringPointer);\r |
361a8267 | 509 | \r |
510 | if (DriverBindingHandleCount == 0) {\r | |
47d20b54 | 511 | ShellPrintHiiEx (\r |
ba0014b9 LG |
512 | -1,\r |
513 | -1,\r | |
514 | NULL,\r | |
515 | STRING_TOKEN (STR_DH_OUTPUT_DRIVER3),\r | |
516 | gShellDriver1HiiHandle,\r | |
361a8267 | 517 | L"<None>"\r |
518 | );\r | |
519 | } else {\r | |
47d20b54 | 520 | ShellPrintHiiEx (\r |
ba0014b9 LG |
521 | -1,\r |
522 | -1,\r | |
523 | NULL,\r | |
524 | STRING_TOKEN (STR_DH_OUTPUT_DRIVER3),\r | |
525 | gShellDriver1HiiHandle,\r | |
361a8267 | 526 | L""\r |
527 | );\r | |
528 | for (Index = 0; Index < DriverBindingHandleCount; Index++) {\r | |
47d20b54 | 529 | Image = FALSE;\r |
361a8267 | 530 | Status = GetDriverName (\r |
47d20b54 MK |
531 | DriverBindingHandleBuffer[Index],\r |
532 | Language,\r | |
533 | &DriverName\r | |
534 | );\r | |
f330ff35 | 535 | if (EFI_ERROR (Status)) {\r |
361a8267 | 536 | Status = GetDriverImageName (\r |
47d20b54 MK |
537 | DriverBindingHandleBuffer[Index],\r |
538 | &DriverName\r | |
539 | );\r | |
f330ff35 | 540 | if (EFI_ERROR (Status)) {\r |
541 | DriverName = NULL;\r | |
542 | }\r | |
361a8267 | 543 | }\r |
544 | \r | |
545 | if (Image) {\r | |
47d20b54 | 546 | ShellPrintHiiEx (\r |
ba0014b9 LG |
547 | -1,\r |
548 | -1,\r | |
549 | NULL,\r | |
361a8267 | 550 | STRING_TOKEN (STR_DH_OUTPUT_DRIVER4A),\r |
551 | gShellDriver1HiiHandle,\r | |
552 | ConvertHandleToHandleIndex (DriverBindingHandleBuffer[Index]),\r | |
47d20b54 | 553 | DriverName != NULL ? DriverName : L"<Unknown>"\r |
361a8267 | 554 | );\r |
555 | } else {\r | |
47d20b54 | 556 | ShellPrintHiiEx (\r |
ba0014b9 LG |
557 | -1,\r |
558 | -1,\r | |
559 | NULL,\r | |
361a8267 | 560 | STRING_TOKEN (STR_DH_OUTPUT_DRIVER4B),\r |
561 | gShellDriver1HiiHandle,\r | |
562 | ConvertHandleToHandleIndex (DriverBindingHandleBuffer[Index]),\r | |
47d20b54 | 563 | DriverName != NULL ? DriverName : L"<Unknown>"\r |
361a8267 | 564 | );\r |
565 | }\r | |
47d20b54 MK |
566 | \r |
567 | SHELL_FREE_NON_NULL (DriverName);\r | |
361a8267 | 568 | }\r |
569 | }\r | |
570 | \r | |
571 | if (ParentControllerHandleCount == 0) {\r | |
47d20b54 | 572 | ShellPrintHiiEx (\r |
ba0014b9 LG |
573 | -1,\r |
574 | -1,\r | |
575 | NULL,\r | |
576 | STRING_TOKEN (STR_DH_OUTPUT_DRIVER5),\r | |
577 | gShellDriver1HiiHandle,\r | |
361a8267 | 578 | L"<None>"\r |
579 | );\r | |
580 | } else {\r | |
47d20b54 | 581 | ShellPrintHiiEx (\r |
ba0014b9 LG |
582 | -1,\r |
583 | -1,\r | |
584 | NULL,\r | |
585 | STRING_TOKEN (STR_DH_OUTPUT_DRIVER5),\r | |
586 | gShellDriver1HiiHandle,\r | |
361a8267 | 587 | L""\r |
588 | );\r | |
589 | for (Index = 0; Index < ParentControllerHandleCount; Index++) {\r | |
47d20b54 MK |
590 | Status = gEfiShellProtocol->GetDeviceName (ParentControllerHandleBuffer[Index], EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8 *)Language, &TempStringPointer);\r |
591 | ShellPrintHiiEx (\r | |
ba0014b9 LG |
592 | -1,\r |
593 | -1,\r | |
594 | NULL,\r | |
361a8267 | 595 | STRING_TOKEN (STR_DH_OUTPUT_DRIVER5B),\r |
596 | gShellDriver1HiiHandle,\r | |
597 | ConvertHandleToHandleIndex (ParentControllerHandleBuffer[Index]),\r | |
47d20b54 | 598 | TempStringPointer != NULL ? TempStringPointer : L"<Unknown>"\r |
361a8267 | 599 | );\r |
47d20b54 | 600 | SHELL_FREE_NON_NULL (TempStringPointer);\r |
361a8267 | 601 | }\r |
602 | }\r | |
603 | \r | |
604 | if (ChildControllerHandleCount == 0) {\r | |
47d20b54 | 605 | ShellPrintHiiEx (\r |
ba0014b9 LG |
606 | -1,\r |
607 | -1,\r | |
608 | NULL,\r | |
609 | STRING_TOKEN (STR_DH_OUTPUT_DRIVER6),\r | |
610 | gShellDriver1HiiHandle,\r | |
361a8267 | 611 | L"<None>"\r |
612 | );\r | |
613 | } else {\r | |
47d20b54 | 614 | ShellPrintHiiEx (\r |
ba0014b9 LG |
615 | -1,\r |
616 | -1,\r | |
617 | NULL,\r | |
618 | STRING_TOKEN (STR_DH_OUTPUT_DRIVER6),\r | |
619 | gShellDriver1HiiHandle,\r | |
361a8267 | 620 | L""\r |
621 | );\r | |
622 | for (Index = 0; Index < ChildControllerHandleCount; Index++) {\r | |
47d20b54 MK |
623 | Status = gEfiShellProtocol->GetDeviceName (ChildControllerHandleBuffer[Index], EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8 *)Language, &TempStringPointer);\r |
624 | ShellPrintHiiEx (\r | |
ba0014b9 LG |
625 | -1,\r |
626 | -1,\r | |
627 | NULL,\r | |
361a8267 | 628 | STRING_TOKEN (STR_DH_OUTPUT_DRIVER6B),\r |
629 | gShellDriver1HiiHandle,\r | |
630 | ConvertHandleToHandleIndex (ChildControllerHandleBuffer[Index]),\r | |
47d20b54 | 631 | TempStringPointer != NULL ? TempStringPointer : L"<Unknown>"\r |
361a8267 | 632 | );\r |
47d20b54 | 633 | SHELL_FREE_NON_NULL (TempStringPointer);\r |
361a8267 | 634 | }\r |
635 | }\r | |
636 | }\r | |
637 | \r | |
47d20b54 | 638 | SHELL_FREE_NON_NULL (DriverBindingHandleBuffer);\r |
361a8267 | 639 | \r |
47d20b54 | 640 | SHELL_FREE_NON_NULL (ParentControllerHandleBuffer);\r |
361a8267 | 641 | \r |
47d20b54 | 642 | SHELL_FREE_NON_NULL (ChildControllerHandleBuffer);\r |
361a8267 | 643 | \r |
644 | if (EFI_ERROR (Status)) {\r | |
645 | return Status;\r | |
646 | }\r | |
47d20b54 | 647 | \r |
361a8267 | 648 | //\r |
649 | // See if Handle is a driver binding handle and display its details.\r | |
650 | //\r | |
651 | Status = gBS->OpenProtocol (\r | |
47d20b54 MK |
652 | Handle,\r |
653 | &gEfiDriverBindingProtocolGuid,\r | |
654 | (VOID **)&DriverBinding,\r | |
655 | NULL,\r | |
656 | NULL,\r | |
657 | EFI_OPEN_PROTOCOL_GET_PROTOCOL\r | |
658 | );\r | |
361a8267 | 659 | if (EFI_ERROR (Status)) {\r |
660 | return EFI_SUCCESS;\r | |
661 | }\r | |
662 | \r | |
47d20b54 MK |
663 | NumberOfChildren = 0;\r |
664 | ControllerHandleBuffer = NULL;\r | |
665 | Status = PARSE_HANDLE_DATABASE_DEVICES (\r | |
666 | Handle,\r | |
667 | &ControllerHandleCount,\r | |
668 | &ControllerHandleBuffer\r | |
669 | );\r | |
361a8267 | 670 | if (ControllerHandleCount > 0) {\r |
671 | for (HandleIndex = 0; HandleIndex < ControllerHandleCount; HandleIndex++) {\r | |
672 | Status = PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (\r | |
47d20b54 MK |
673 | Handle,\r |
674 | ControllerHandleBuffer[HandleIndex],\r | |
675 | &ChildControllerHandleCount,\r | |
676 | NULL\r | |
677 | );\r | |
361a8267 | 678 | NumberOfChildren += ChildControllerHandleCount;\r |
679 | }\r | |
680 | }\r | |
681 | \r | |
682 | Status = GetDriverName (Handle, Language, &DriverName);\r | |
f330ff35 | 683 | if (EFI_ERROR (Status)) {\r |
684 | DriverName = NULL;\r | |
685 | }\r | |
361a8267 | 686 | \r |
47d20b54 | 687 | ShellPrintHiiEx (\r |
ba0014b9 LG |
688 | -1,\r |
689 | -1,\r | |
690 | NULL,\r | |
03a5572b | 691 | STRING_TOKEN (STR_DH_OUTPUT_DRIVER7),\r |
361a8267 | 692 | gShellDriver1HiiHandle,\r |
47d20b54 MK |
693 | ConvertHandleToHandleIndex (Handle),\r |
694 | DriverName != NULL ? DriverName : L"<Unknown>"\r | |
361a8267 | 695 | );\r |
47d20b54 | 696 | SHELL_FREE_NON_NULL (DriverName);\r |
361a8267 | 697 | Status = GetDriverImageName (\r |
47d20b54 MK |
698 | Handle,\r |
699 | &DriverName\r | |
700 | );\r | |
f330ff35 | 701 | if (EFI_ERROR (Status)) {\r |
702 | DriverName = NULL;\r | |
703 | }\r | |
47d20b54 MK |
704 | \r |
705 | ShellPrintHiiEx (\r | |
ba0014b9 LG |
706 | -1,\r |
707 | -1,\r | |
708 | NULL,\r | |
361a8267 | 709 | STRING_TOKEN (STR_DH_OUTPUT_DRIVER7B),\r |
710 | gShellDriver1HiiHandle,\r | |
47d20b54 | 711 | DriverName != NULL ? DriverName : L"<Unknown>"\r |
361a8267 | 712 | );\r |
47d20b54 | 713 | SHELL_FREE_NON_NULL (DriverName);\r |
361a8267 | 714 | \r |
47d20b54 | 715 | ShellPrintHiiEx (\r |
ba0014b9 LG |
716 | -1,\r |
717 | -1,\r | |
718 | NULL,\r | |
719 | STRING_TOKEN (STR_DH_OUTPUT_DRIVER8),\r | |
720 | gShellDriver1HiiHandle,\r | |
361a8267 | 721 | DriverBinding->Version,\r |
47d20b54 MK |
722 | NumberOfChildren > 0 ? L"Bus" : ControllerHandleCount > 0 ? L"Device" : L"<Unknown>",\r |
723 | ConfigurationStatus ? L"YES" : L"NO",\r | |
724 | DiagnosticsStatus ? L"YES" : L"NO"\r | |
361a8267 | 725 | );\r |
726 | \r | |
727 | if (ControllerHandleCount == 0) {\r | |
47d20b54 MK |
728 | ShellPrintHiiEx (\r |
729 | -1,\r | |
730 | -1,\r | |
731 | NULL,\r | |
732 | STRING_TOKEN (STR_DH_OUTPUT_DRIVER9),\r | |
733 | gShellDriver1HiiHandle,\r | |
734 | L"None"\r | |
735 | );\r | |
361a8267 | 736 | } else {\r |
47d20b54 | 737 | ShellPrintHiiEx (\r |
ba0014b9 LG |
738 | -1,\r |
739 | -1,\r | |
740 | NULL,\r | |
5bfd23eb | 741 | STRING_TOKEN (STR_DH_OUTPUT_DRIVER9),\r |
ba0014b9 | 742 | gShellDriver1HiiHandle,\r |
361a8267 | 743 | L""\r |
744 | );\r | |
745 | for (HandleIndex = 0; HandleIndex < ControllerHandleCount; HandleIndex++) {\r | |
47d20b54 | 746 | Status = gEfiShellProtocol->GetDeviceName (ControllerHandleBuffer[HandleIndex], EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8 *)Language, &TempStringPointer);\r |
361a8267 | 747 | \r |
47d20b54 | 748 | ShellPrintHiiEx (\r |
ba0014b9 LG |
749 | -1,\r |
750 | -1,\r | |
751 | NULL,\r | |
361a8267 | 752 | STRING_TOKEN (STR_DH_OUTPUT_DRIVER9B),\r |
753 | gShellDriver1HiiHandle,\r | |
47d20b54 MK |
754 | ConvertHandleToHandleIndex (ControllerHandleBuffer[HandleIndex]),\r |
755 | TempStringPointer != NULL ? TempStringPointer : L"<Unknown>"\r | |
361a8267 | 756 | );\r |
47d20b54 | 757 | SHELL_FREE_NON_NULL (TempStringPointer);\r |
361a8267 | 758 | \r |
759 | Status = PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (\r | |
47d20b54 MK |
760 | Handle,\r |
761 | ControllerHandleBuffer[HandleIndex],\r | |
762 | &ChildControllerHandleCount,\r | |
763 | &ChildControllerHandleBuffer\r | |
764 | );\r | |
361a8267 | 765 | if (!EFI_ERROR (Status)) {\r |
766 | for (ChildIndex = 0; ChildIndex < ChildControllerHandleCount; ChildIndex++) {\r | |
47d20b54 | 767 | Status = gEfiShellProtocol->GetDeviceName (ChildControllerHandleBuffer[ChildIndex], EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8 *)Language, &TempStringPointer);\r |
361a8267 | 768 | \r |
47d20b54 | 769 | ShellPrintHiiEx (\r |
ba0014b9 LG |
770 | -1,\r |
771 | -1,\r | |
772 | NULL,\r | |
5bfd23eb | 773 | STRING_TOKEN (STR_DH_OUTPUT_DRIVER6C),\r |
361a8267 | 774 | gShellDriver1HiiHandle,\r |
47d20b54 MK |
775 | ConvertHandleToHandleIndex (ChildControllerHandleBuffer[ChildIndex]),\r |
776 | TempStringPointer != NULL ? TempStringPointer : L"<Unknown>"\r | |
361a8267 | 777 | );\r |
47d20b54 | 778 | SHELL_FREE_NON_NULL (TempStringPointer);\r |
361a8267 | 779 | }\r |
780 | \r | |
781 | SHELL_FREE_NON_NULL (ChildControllerHandleBuffer);\r | |
782 | }\r | |
783 | }\r | |
784 | \r | |
785 | SHELL_FREE_NON_NULL (ControllerHandleBuffer);\r | |
786 | }\r | |
787 | \r | |
788 | return EFI_SUCCESS;\r | |
789 | }\r | |
790 | \r | |
791 | /**\r | |
792 | Display information for a handle.\r | |
793 | \r | |
794 | @param[in] TheHandle The handles to show info on.\r | |
795 | @param[in] Verbose TRUE for extra info, FALSE otherwise.\r | |
796 | @param[in] Sfo TRUE to output in standard format output (spec).\r | |
797 | @param[in] Language Language string per UEFI specification.\r | |
798 | @param[in] DriverInfo TRUE to show all info about the handle.\r | |
799 | @param[in] Multiple TRUE indicates more than will be output,\r | |
800 | FALSE for a single one.\r | |
361a8267 | 801 | **/\r |
28f898f8 | 802 | VOID\r |
47d20b54 MK |
803 | DoDhByHandle (\r |
804 | IN CONST EFI_HANDLE TheHandle,\r | |
805 | IN CONST BOOLEAN Verbose,\r | |
806 | IN CONST BOOLEAN Sfo,\r | |
807 | IN CONST CHAR8 *Language,\r | |
808 | IN CONST BOOLEAN DriverInfo,\r | |
809 | IN CONST BOOLEAN Multiple\r | |
4ba49616 | 810 | )\r |
811 | {\r | |
47d20b54 | 812 | CHAR16 *ProtocolInfoString;\r |
4ba49616 | 813 | \r |
47d20b54 | 814 | ProtocolInfoString = NULL;\r |
4ba49616 | 815 | \r |
816 | if (!Sfo) {\r | |
817 | if (Multiple) {\r | |
47d20b54 MK |
818 | ProtocolInfoString = GetProtocolInfoString (TheHandle, Language, L" ", Verbose, TRUE);\r |
819 | ShellPrintHiiEx (\r | |
4ba49616 | 820 | -1,\r |
821 | -1,\r | |
822 | NULL,\r | |
823 | STRING_TOKEN (STR_DH_OUTPUT),\r | |
824 | gShellDriver1HiiHandle,\r | |
47d20b54 MK |
825 | ConvertHandleToHandleIndex (TheHandle),\r |
826 | ProtocolInfoString == NULL ? L"" : ProtocolInfoString\r | |
827 | );\r | |
4ba49616 | 828 | } else {\r |
47d20b54 | 829 | ProtocolInfoString = GetProtocolInfoString (TheHandle, Language, Verbose ? L"\r\n" : L" ", Verbose, TRUE);\r |
590351cf | 830 | if (Verbose) {\r |
47d20b54 | 831 | ShellPrintHiiEx (\r |
590351cf HL |
832 | -1,\r |
833 | -1,\r | |
834 | NULL,\r | |
835 | STRING_TOKEN (STR_DH_OUTPUT_SINGLE),\r | |
836 | gShellDriver1HiiHandle,\r | |
47d20b54 | 837 | ConvertHandleToHandleIndex (TheHandle),\r |
590351cf | 838 | TheHandle,\r |
47d20b54 MK |
839 | ProtocolInfoString == NULL ? L"" : ProtocolInfoString\r |
840 | );\r | |
590351cf | 841 | } else {\r |
47d20b54 | 842 | ShellPrintHiiEx (\r |
590351cf HL |
843 | -1,\r |
844 | -1,\r | |
845 | NULL,\r | |
846 | STRING_TOKEN (STR_DH_OUTPUT_SINGLE_D),\r | |
847 | gShellDriver1HiiHandle,\r | |
47d20b54 MK |
848 | ConvertHandleToHandleIndex (TheHandle),\r |
849 | ProtocolInfoString == NULL ? L"" : ProtocolInfoString\r | |
850 | );\r | |
590351cf | 851 | }\r |
4ba49616 | 852 | }\r |
361a8267 | 853 | \r |
854 | if (DriverInfo) {\r | |
855 | DisplayDriverModelHandle ((EFI_HANDLE)TheHandle, TRUE, Language);\r | |
856 | }\r | |
4ba49616 | 857 | } else {\r |
47d20b54 MK |
858 | ProtocolInfoString = GetProtocolInfoString (TheHandle, Language, L";", FALSE, FALSE);\r |
859 | ShellPrintHiiEx (\r | |
860 | -1,\r | |
861 | -1,\r | |
862 | NULL,\r | |
863 | STRING_TOKEN (STR_DH_OUTPUT_SFO),\r | |
864 | gShellDriver1HiiHandle,\r | |
865 | Multiple ? L"HandlesInfo" : L"HandleInfo",\r | |
866 | L"DriverName",\r | |
867 | L"ControllerName",\r | |
868 | ConvertHandleToHandleIndex (TheHandle),\r | |
869 | L"DevPath",\r | |
870 | ProtocolInfoString == NULL ? L"" : ProtocolInfoString\r | |
28f898f8 | 871 | );\r |
4ba49616 | 872 | }\r |
873 | \r | |
4ba49616 | 874 | if (ProtocolInfoString != NULL) {\r |
47d20b54 | 875 | FreePool (ProtocolInfoString);\r |
4ba49616 | 876 | }\r |
4ba49616 | 877 | }\r |
878 | \r | |
361a8267 | 879 | /**\r |
880 | Display information for all handles on a list.\r | |
881 | \r | |
882 | @param[in] HandleList The NULL-terminated list of handles.\r | |
f0b0e733 | 883 | @param[in] Verbose TRUE for extra info, FALSE otherwise.\r |
361a8267 | 884 | @param[in] Sfo TRUE to output in standard format output (spec).\r |
885 | @param[in] Language Language string per UEFI specification.\r | |
886 | @param[in] DriverInfo TRUE to show all info about the handle.\r | |
887 | \r | |
28f898f8 CC |
888 | @retval SHELL_SUCCESS The operation was successful.\r |
889 | @retval SHELL_ABORTED The operation was aborted.\r | |
361a8267 | 890 | **/\r |
4ba49616 | 891 | SHELL_STATUS\r |
47d20b54 MK |
892 | DoDhForHandleList (\r |
893 | IN CONST EFI_HANDLE *HandleList,\r | |
894 | IN CONST BOOLEAN Verbose,\r | |
895 | IN CONST BOOLEAN Sfo,\r | |
896 | IN CONST CHAR8 *Language,\r | |
897 | IN CONST BOOLEAN DriverInfo\r | |
4ba49616 | 898 | )\r |
899 | {\r | |
900 | CONST EFI_HANDLE *HandleWalker;\r | |
901 | SHELL_STATUS ShellStatus;\r | |
902 | \r | |
47d20b54 | 903 | ShellStatus = SHELL_SUCCESS;\r |
de8cea6f | 904 | for (HandleWalker = HandleList; HandleWalker != NULL && *HandleWalker != NULL; HandleWalker++) {\r |
28f898f8 | 905 | DoDhByHandle (*HandleWalker, Verbose, Sfo, Language, DriverInfo, TRUE);\r |
376e7593 TS |
906 | if (ShellGetExecutionBreakFlag ()) {\r |
907 | ShellStatus = SHELL_ABORTED;\r | |
908 | break;\r | |
909 | }\r | |
4ba49616 | 910 | }\r |
47d20b54 | 911 | \r |
4ba49616 | 912 | return (ShellStatus);\r |
913 | }\r | |
914 | \r | |
361a8267 | 915 | /**\r |
de8cea6f | 916 | Display information for a GUID of protocol.\r |
361a8267 | 917 | \r |
de8cea6f | 918 | @param[in] Guid The pointer to the name of the protocol.\r |
f0b0e733 | 919 | @param[in] Verbose TRUE for extra info, FALSE otherwise.\r |
de8cea6f | 920 | @param[in] Sfo TRUE to output in standard format output (spec).\r |
361a8267 | 921 | @param[in] Language Language string per UEFI specification.\r |
922 | @param[in] DriverInfo TRUE to show all info about the handle.\r | |
923 | \r | |
924 | @retval SHELL_SUCCESS The operation was successful.\r | |
de8cea6f | 925 | @retval SHELL_NOT_FOUND The GUID was not found.\r |
361a8267 | 926 | @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.\r |
927 | **/\r | |
4ba49616 | 928 | SHELL_STATUS\r |
47d20b54 | 929 | DoDhByProtocolGuid (\r |
de8cea6f | 930 | IN CONST GUID *Guid,\r |
f0b0e733 | 931 | IN CONST BOOLEAN Verbose,\r |
de8cea6f | 932 | IN CONST BOOLEAN Sfo,\r |
4ba49616 | 933 | IN CONST CHAR8 *Language,\r |
934 | IN CONST BOOLEAN DriverInfo\r | |
935 | )\r | |
936 | {\r | |
de8cea6f | 937 | CHAR16 *Name;\r |
4ba49616 | 938 | SHELL_STATUS ShellStatus;\r |
de8cea6f | 939 | EFI_HANDLE *HandleList;\r |
4ba49616 | 940 | \r |
de8cea6f RN |
941 | if (!Sfo) {\r |
942 | if (Guid == NULL) {\r | |
943 | ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_ALL_HEADER), gShellDriver1HiiHandle);\r | |
944 | } else {\r | |
945 | Name = GetStringNameFromGuid (Guid, NULL);\r | |
946 | if (Name == NULL) {\r | |
947 | ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_GUID_HEADER), gShellDriver1HiiHandle, Guid);\r | |
948 | } else {\r | |
949 | ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_NAME_HEADER), gShellDriver1HiiHandle, Name);\r | |
950 | }\r | |
951 | }\r | |
952 | }\r | |
47d20b54 MK |
953 | \r |
954 | HandleList = GetHandleListByProtocol (Guid);\r | |
955 | ShellStatus = DoDhForHandleList (HandleList, Verbose, Sfo, Language, DriverInfo);\r | |
956 | SHELL_FREE_NON_NULL (HandleList);\r | |
4ba49616 | 957 | \r |
de8cea6f | 958 | return ShellStatus;\r |
4ba49616 | 959 | }\r |
960 | \r | |
361a8267 | 961 | /**\r |
de8cea6f RN |
962 | Function to determine use which method to print information.\r |
963 | If Protocol is NULL, The function will print all information.\r | |
361a8267 | 964 | \r |
de8cea6f | 965 | @param[in] Protocol The pointer to the name or GUID of protocol or NULL.\r |
f0b0e733 | 966 | @param[in] Verbose TRUE for extra info, FALSE otherwise.\r |
361a8267 | 967 | @param[in] Sfo TRUE to output in standard format output (spec).\r |
968 | @param[in] Language Language string per UEFI specification.\r | |
969 | @param[in] DriverInfo TRUE to show all info about the handle.\r | |
970 | \r | |
de8cea6f RN |
971 | @retval SHELL_SUCCESS The operation was successful.\r |
972 | @retval SHELL_NOT_FOUND The protocol was not found.\r | |
973 | @retval SHELL_INVALID_PARAMETER Protocol is invalid parameter.\r | |
361a8267 | 974 | **/\r |
4ba49616 | 975 | SHELL_STATUS\r |
de8cea6f RN |
976 | DoDhByProtocol (\r |
977 | IN CONST CHAR16 *Protocol,\r | |
f0b0e733 | 978 | IN CONST BOOLEAN Verbose,\r |
4ba49616 | 979 | IN CONST BOOLEAN Sfo,\r |
980 | IN CONST CHAR8 *Language,\r | |
981 | IN CONST BOOLEAN DriverInfo\r | |
982 | )\r | |
983 | {\r | |
47d20b54 MK |
984 | EFI_GUID Guid;\r |
985 | EFI_GUID *GuidPtr;\r | |
986 | EFI_STATUS Status;\r | |
4ba49616 | 987 | \r |
de8cea6f RN |
988 | if (Protocol == NULL) {\r |
989 | return DoDhByProtocolGuid (NULL, Verbose, Sfo, Language, DriverInfo);\r | |
990 | } else {\r | |
991 | Status = ConvertStrToGuid (Protocol, &Guid);\r | |
992 | if (!EFI_ERROR (Status)) {\r | |
993 | GuidPtr = &Guid;\r | |
994 | } else {\r | |
995 | //\r | |
996 | // Protocol is a Name, convert it to GUID\r | |
997 | //\r | |
998 | Status = GetGuidFromStringName (Protocol, Language, &GuidPtr);\r | |
47d20b54 | 999 | if (EFI_ERROR (Status)) {\r |
de8cea6f RN |
1000 | ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_NO_NAME_FOUND), gShellDriver1HiiHandle, Protocol);\r |
1001 | return (SHELL_NOT_FOUND);\r | |
1002 | }\r | |
1003 | }\r | |
4ba49616 | 1004 | \r |
de8cea6f | 1005 | return DoDhByProtocolGuid (GuidPtr, Verbose, Sfo, Language, DriverInfo);\r |
4ba49616 | 1006 | }\r |
de8cea6f | 1007 | }\r |
4ba49616 | 1008 | \r |
de8cea6f RN |
1009 | /**\r |
1010 | Function to display decode information by Protocol.\r | |
1011 | The parameter Protocol is either a GUID or the name of protocol.\r | |
1012 | If the parameter Protocol is NULL, the function will print all\r | |
1013 | decode information.\r | |
4ba49616 | 1014 | \r |
de8cea6f RN |
1015 | @param[in] Protocol The pointer to the name or GUID of protocol.\r |
1016 | @param[in] Language Language string per UEFI specification.\r | |
4ba49616 | 1017 | \r |
de8cea6f RN |
1018 | @retval SHELL_SUCCESS The operation was successful.\r |
1019 | @retval SHELL_OUT_OT_RESOURCES A memory allocation failed.\r | |
1020 | **/\r | |
1021 | SHELL_STATUS\r | |
47d20b54 MK |
1022 | DoDecodeByProtocol (\r |
1023 | IN CONST CHAR16 *Protocol,\r | |
1024 | IN CONST CHAR8 *Language\r | |
de8cea6f RN |
1025 | )\r |
1026 | {\r | |
47d20b54 MK |
1027 | EFI_STATUS Status;\r |
1028 | EFI_GUID *Guids;\r | |
1029 | EFI_GUID Guid;\r | |
1030 | UINTN Counts;\r | |
1031 | UINTN Index;\r | |
1032 | CHAR16 *Name;\r | |
de8cea6f RN |
1033 | \r |
1034 | if (Protocol == NULL) {\r | |
1035 | Counts = 0;\r | |
1036 | Status = GetAllMappingGuids (NULL, &Counts);\r | |
1037 | if (Status == EFI_BUFFER_TOO_SMALL) {\r | |
47d20b54 | 1038 | Guids = AllocatePool (Counts * sizeof (EFI_GUID));\r |
de8cea6f RN |
1039 | if (Guids == NULL) {\r |
1040 | return SHELL_OUT_OF_RESOURCES;\r | |
1041 | }\r | |
4ba49616 | 1042 | \r |
de8cea6f RN |
1043 | Status = GetAllMappingGuids (Guids, &Counts);\r |
1044 | if (Status == EFI_SUCCESS) {\r | |
1045 | for (Index = 0; Index < Counts; Index++) {\r | |
1046 | Name = GetStringNameFromGuid (&Guids[Index], Language);\r | |
1047 | if (Name != NULL) {\r | |
1048 | ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_DECODE), gShellDriver1HiiHandle, Name, &Guids[Index]);\r | |
1049 | } else {\r | |
1050 | ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_NO_GUID_FOUND), gShellDriver1HiiHandle, &Guids[Index]);\r | |
1051 | }\r | |
47d20b54 | 1052 | \r |
de8cea6f RN |
1053 | SHELL_FREE_NON_NULL (Name);\r |
1054 | }\r | |
1055 | }\r | |
47d20b54 | 1056 | \r |
de8cea6f RN |
1057 | FreePool (Guids);\r |
1058 | }\r | |
1059 | } else {\r | |
1060 | if (ConvertStrToGuid (Protocol, &Guid) == EFI_SUCCESS) {\r | |
1061 | Name = GetStringNameFromGuid (&Guid, Language);\r | |
1062 | if (Name != NULL) {\r | |
1063 | ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_DECODE), gShellDriver1HiiHandle, Name, &Guid);\r | |
1064 | } else {\r | |
1065 | ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_NO_GUID_FOUND), gShellDriver1HiiHandle, &Guid);\r | |
1066 | }\r | |
47d20b54 MK |
1067 | \r |
1068 | SHELL_FREE_NON_NULL (Name);\r | |
de8cea6f RN |
1069 | } else {\r |
1070 | Status = GetGuidFromStringName (Protocol, Language, &Guids);\r | |
1071 | if (Status == EFI_SUCCESS) {\r | |
1072 | ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_DECODE), gShellDriver1HiiHandle, Protocol, Guids);\r | |
1073 | } else {\r | |
1074 | ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_NO_NAME_FOUND), gShellDriver1HiiHandle, Protocol);\r | |
1075 | }\r | |
1076 | }\r | |
1077 | }\r | |
1078 | \r | |
1079 | return SHELL_SUCCESS;\r | |
4ba49616 | 1080 | }\r |
1081 | \r | |
361a8267 | 1082 | /**\r |
1083 | Function for 'dh' command.\r | |
1084 | \r | |
1085 | @param[in] ImageHandle Handle to the Image (NULL if Internal).\r | |
1086 | @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r | |
1087 | **/\r | |
4ba49616 | 1088 | SHELL_STATUS\r |
1089 | EFIAPI\r | |
1090 | ShellCommandRunDh (\r | |
1091 | IN EFI_HANDLE ImageHandle,\r | |
1092 | IN EFI_SYSTEM_TABLE *SystemTable\r | |
1093 | )\r | |
1094 | {\r | |
47d20b54 MK |
1095 | EFI_STATUS Status;\r |
1096 | LIST_ENTRY *Package;\r | |
1097 | CHAR16 *ProblemParam;\r | |
1098 | SHELL_STATUS ShellStatus;\r | |
1099 | CHAR8 *Language;\r | |
1100 | CONST CHAR16 *Lang;\r | |
1101 | CONST CHAR16 *RawValue;\r | |
1102 | CONST CHAR16 *ProtocolVal;\r | |
1103 | BOOLEAN SfoFlag;\r | |
1104 | BOOLEAN DriverFlag;\r | |
1105 | BOOLEAN VerboseFlag;\r | |
1106 | UINT64 Intermediate;\r | |
1107 | EFI_HANDLE Handle;\r | |
1108 | \r | |
1109 | ShellStatus = SHELL_SUCCESS;\r | |
1110 | Status = EFI_SUCCESS;\r | |
1111 | Language = NULL;\r | |
4ba49616 | 1112 | \r |
1113 | //\r | |
1114 | // initialize the shell lib (we must be in non-auto-init...)\r | |
1115 | //\r | |
47d20b54 MK |
1116 | Status = ShellInitialize ();\r |
1117 | ASSERT_EFI_ERROR (Status);\r | |
4ba49616 | 1118 | \r |
47d20b54 MK |
1119 | Status = CommandInit ();\r |
1120 | ASSERT_EFI_ERROR (Status);\r | |
4ba49616 | 1121 | \r |
1122 | //\r | |
1123 | // parse the command line\r | |
1124 | //\r | |
1125 | Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r | |
47d20b54 MK |
1126 | if (EFI_ERROR (Status)) {\r |
1127 | if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) {\r | |
1128 | ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"dh", ProblemParam);\r | |
1129 | FreePool (ProblemParam);\r | |
4ba49616 | 1130 | ShellStatus = SHELL_INVALID_PARAMETER;\r |
1131 | } else {\r | |
47d20b54 | 1132 | ASSERT (FALSE);\r |
4ba49616 | 1133 | }\r |
1134 | } else {\r | |
47d20b54 MK |
1135 | if (ShellCommandLineGetCount (Package) > 2) {\r |
1136 | ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"dh");\r | |
4ba49616 | 1137 | ShellCommandLineFreeVarList (Package);\r |
1138 | return (SHELL_INVALID_PARAMETER);\r | |
1139 | }\r | |
1140 | \r | |
47d20b54 MK |
1141 | if (ShellCommandLineGetFlag (Package, L"-l")) {\r |
1142 | Lang = ShellCommandLineGetValue (Package, L"-l");\r | |
28f898f8 | 1143 | if (Lang != NULL) {\r |
47d20b54 MK |
1144 | Language = AllocateZeroPool (StrSize (Lang));\r |
1145 | AsciiSPrint (Language, StrSize (Lang), "%S", Lang);\r | |
28f898f8 | 1146 | } else {\r |
47d20b54 MK |
1147 | ASSERT (Language == NULL);\r |
1148 | ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"dh", L"-l");\r | |
1149 | ShellCommandLineFreeVarList (Package);\r | |
28f898f8 CC |
1150 | return (SHELL_INVALID_PARAMETER);\r |
1151 | }\r | |
1152 | } else {\r | |
47d20b54 MK |
1153 | Language = AllocateZeroPool (10);\r |
1154 | AsciiSPrint (Language, 10, "en-us");\r | |
4ba49616 | 1155 | }\r |
1156 | \r | |
28f898f8 CC |
1157 | SfoFlag = ShellCommandLineGetFlag (Package, L"-sfo");\r |
1158 | DriverFlag = ShellCommandLineGetFlag (Package, L"-d");\r | |
1159 | VerboseFlag = (BOOLEAN)(ShellCommandLineGetFlag (Package, L"-v") || ShellCommandLineGetFlag (Package, L"-verbose"));\r | |
de8cea6f RN |
1160 | RawValue = ShellCommandLineGetRawValue (Package, 1);\r |
1161 | ProtocolVal = ShellCommandLineGetValue (Package, L"-p");\r | |
4ba49616 | 1162 | \r |
de8cea6f RN |
1163 | if (RawValue == NULL) {\r |
1164 | if (ShellCommandLineGetFlag (Package, L"-p") && (ProtocolVal == NULL)) {\r | |
1165 | ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"dh", L"-p");\r | |
4ba49616 | 1166 | ShellStatus = SHELL_INVALID_PARAMETER;\r |
1167 | } else {\r | |
1168 | //\r | |
de8cea6f | 1169 | // Print information by protocol, The ProtocolVal maybe is name or GUID or NULL.\r |
4ba49616 | 1170 | //\r |
de8cea6f | 1171 | ShellStatus = DoDhByProtocol (ProtocolVal, VerboseFlag, SfoFlag, Language, DriverFlag);\r |
4ba49616 | 1172 | }\r |
de8cea6f | 1173 | } else if ((RawValue != NULL) &&\r |
47d20b54 MK |
1174 | (gUnicodeCollation->StriColl (gUnicodeCollation, L"decode", (CHAR16 *)RawValue) == 0))\r |
1175 | {\r | |
de8cea6f RN |
1176 | if (ShellCommandLineGetFlag (Package, L"-p") && (ProtocolVal == NULL)) {\r |
1177 | ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"dh", L"-p");\r | |
1178 | ShellStatus = SHELL_INVALID_PARAMETER;\r | |
1179 | } else {\r | |
4ba49616 | 1180 | //\r |
de8cea6f | 1181 | // Print decode informatino by protocol.\r |
4ba49616 | 1182 | //\r |
de8cea6f RN |
1183 | ShellStatus = DoDecodeByProtocol (ProtocolVal, Language);\r |
1184 | }\r | |
1185 | } else {\r | |
1186 | if (ShellCommandLineGetFlag (Package, L"-p")) {\r | |
1187 | ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"dh");\r | |
1188 | ShellStatus = SHELL_INVALID_PARAMETER;\r | |
4ba49616 | 1189 | } else {\r |
de8cea6f | 1190 | Status = ShellConvertStringToUint64 (RawValue, &Intermediate, TRUE, FALSE);\r |
47d20b54 | 1191 | if (EFI_ERROR (Status)) {\r |
de8cea6f | 1192 | ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"dh", RawValue);\r |
4ba49616 | 1193 | ShellStatus = SHELL_INVALID_PARAMETER;\r |
1194 | } else {\r | |
47d20b54 | 1195 | Handle = ConvertHandleIndexToHandle ((UINTN)Intermediate);\r |
de8cea6f RN |
1196 | if (Handle == NULL) {\r |
1197 | ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"dh", RawValue);\r | |
1198 | ShellStatus = SHELL_INVALID_PARAMETER;\r | |
1199 | } else {\r | |
1200 | //\r | |
1201 | // Print information by handle.\r | |
1202 | //\r | |
1203 | DoDhByHandle (Handle, VerboseFlag, SfoFlag, Language, DriverFlag, FALSE);\r | |
1204 | }\r | |
4ba49616 | 1205 | }\r |
1206 | }\r | |
1207 | }\r | |
1208 | \r | |
4ba49616 | 1209 | ShellCommandLineFreeVarList (Package);\r |
47d20b54 | 1210 | SHELL_FREE_NON_NULL (Language);\r |
4ba49616 | 1211 | }\r |
1212 | \r | |
1213 | return (ShellStatus);\r | |
1214 | }\r |