]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDriver1CommandsLib/Dh.c
ShellPkg/HandleParsingLib: Return NULL name for unknown GUID
[mirror_edk2.git] / ShellPkg / Library / UefiShellDriver1CommandsLib / Dh.c
CommitLineData
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
0e88348e 5 Copyright (c) 2010 - 2017, Intel Corporation. All rights reserved.<BR>\r
4ba49616 6 This program and the accompanying materials\r
7 are licensed and made available under the terms and conditions of the BSD License\r
8 which accompanies this distribution. The full text of the license may be found at\r
9 http://opensource.org/licenses/bsd-license.php\r
10\r
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14**/\r
15\r
16#include "UefiShellDriver1CommandsLib.h"\r
17\r
18STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
19 {L"-p", TypeValue},\r
20 {L"-d", TypeFlag},\r
21 {L"-v", TypeFlag},\r
22 {L"-verbose", TypeFlag},\r
23 {L"-sfo", TypeFlag},\r
24 {L"-l", TypeValue},\r
25 {NULL, TypeMax}\r
26 };\r
27\r
28STATIC CONST EFI_GUID *UefiDriverModelProtocolsGuidArray[] = {\r
29 &gEfiDriverBindingProtocolGuid,\r
30 &gEfiPlatformDriverOverrideProtocolGuid,\r
31 &gEfiBusSpecificDriverOverrideProtocolGuid,\r
32 &gEfiDriverDiagnosticsProtocolGuid,\r
33 &gEfiDriverDiagnostics2ProtocolGuid,\r
34 &gEfiComponentNameProtocolGuid,\r
35 &gEfiComponentName2ProtocolGuid,\r
36 &gEfiPlatformToDriverConfigurationProtocolGuid,\r
37 &gEfiDriverSupportedEfiVersionProtocolGuid,\r
38 &gEfiDriverFamilyOverrideProtocolGuid,\r
39 &gEfiDriverHealthProtocolGuid,\r
40 &gEfiLoadedImageProtocolGuid,\r
41 NULL\r
42};\r
43\r
361a8267 44/**\r
45 Get the name of a driver by it's handle.\r
46\r
47 If a name is found the memory must be callee freed.\r
48\r
49 @param[in] TheHandle The driver's handle.\r
50 @param[in] Language The language to use.\r
51 @param[in] NameFound Upon a successful return the name found.\r
52\r
53 @retval EFI_SUCCESS The name was found.\r
54**/\r
55EFI_STATUS\r
361a8267 56GetDriverName (\r
57 IN EFI_HANDLE TheHandle,\r
58 IN CONST CHAR8 *Language,\r
59 IN CHAR16 **NameFound\r
60 )\r
61{\r
62 CHAR8 *Lang;\r
361a8267 63 EFI_STATUS Status;\r
64 EFI_COMPONENT_NAME2_PROTOCOL *CompName2;\r
65 CHAR16 *NameToReturn;\r
66 //\r
67 // Go through those handles until we get one that passes for GetComponentName\r
68 //\r
69 Status = gBS->OpenProtocol(\r
70 TheHandle,\r
71 &gEfiComponentName2ProtocolGuid,\r
72 (VOID**)&CompName2,\r
73 gImageHandle,\r
74 NULL,\r
75 EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
76 if (EFI_ERROR(Status)) {\r
77 Status = gBS->OpenProtocol(\r
78 TheHandle,\r
79 &gEfiComponentNameProtocolGuid,\r
80 (VOID**)&CompName2,\r
81 gImageHandle,\r
82 NULL,\r
83 EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
84 }\r
85\r
86 if (EFI_ERROR(Status)) {\r
87 return (EFI_NOT_FOUND);\r
88 }\r
a71003f2 89 Lang = GetBestLanguageForDriver (CompName2->SupportedLanguages, Language, FALSE);\r
361a8267 90 Status = CompName2->GetDriverName(CompName2, Lang, &NameToReturn);\r
91 FreePool(Lang);\r
92\r
93 if (!EFI_ERROR(Status) && NameToReturn != NULL) {\r
94 *NameFound = NULL;\r
95 StrnCatGrow(NameFound, NULL, NameToReturn, 0);\r
96 }\r
97 return (Status);\r
98}\r
99\r
100/**\r
101 Discover if a protocol guid is one of the UEFI Driver Model Protocols.\r
102\r
103 @param[in] Guid The guid to test.\r
104\r
105 @retval TRUE The guid does represent a driver model protocol.\r
106 @retval FALSE The guid does not represent a driver model protocol.\r
107**/\r
4ba49616 108BOOLEAN\r
4ba49616 109IsDriverProt (\r
110 IN CONST EFI_GUID *Guid\r
111 )\r
112{\r
113 CONST EFI_GUID **GuidWalker;\r
114 BOOLEAN GuidFound;\r
115 GuidFound = FALSE;\r
116 for (GuidWalker = UefiDriverModelProtocolsGuidArray\r
117 ; GuidWalker != NULL && *GuidWalker != NULL\r
118 ; GuidWalker++\r
119 ){\r
120 if (CompareGuid(*GuidWalker, Guid)) {\r
121 GuidFound = TRUE;\r
122 break;\r
123 }\r
124 }\r
125 return (GuidFound);\r
126}\r
127\r
361a8267 128/**\r
129 Get information for a handle.\r
130\r
131 @param[in] TheHandle The handles to show info on.\r
132 @param[in] Language Language string per UEFI specification.\r
268d3445 133 @param[in] Separator Separator string between information blocks.\r
361a8267 134 @param[in] Verbose TRUE for extra info, FALSE otherwise.\r
135 @param[in] ExtraInfo TRUE for extra info, FALSE otherwise.\r
136\r
137 @retval SHELL_SUCCESS The operation was successful.\r
138 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.\r
139**/\r
4ba49616 140CHAR16*\r
4ba49616 141GetProtocolInfoString(\r
142 IN CONST EFI_HANDLE TheHandle,\r
143 IN CONST CHAR8 *Language,\r
268d3445 144 IN CONST CHAR16 *Separator,\r
4ba49616 145 IN CONST BOOLEAN Verbose,\r
146 IN CONST BOOLEAN ExtraInfo\r
147 )\r
148{\r
149 EFI_GUID **ProtocolGuidArray;\r
150 UINTN ArrayCount;\r
151 UINTN ProtocolIndex;\r
152 EFI_STATUS Status;\r
153 CHAR16 *RetVal;\r
154 UINTN Size;\r
155 CHAR16 *Temp;\r
0e88348e 156 CHAR16 GuidStr[40];\r
4ba49616 157\r
158 ProtocolGuidArray = NULL;\r
361a8267 159 RetVal = NULL;\r
160 Size = 0;\r
4ba49616 161\r
162 Status = gBS->ProtocolsPerHandle (\r
163 TheHandle,\r
164 &ProtocolGuidArray,\r
165 &ArrayCount\r
166 );\r
167 if (!EFI_ERROR (Status)) {\r
4ba49616 168 for (ProtocolIndex = 0; ProtocolIndex < ArrayCount; ProtocolIndex++) {\r
169 Temp = GetStringNameFromGuid(ProtocolGuidArray[ProtocolIndex], Language);\r
0e88348e
RN
170 ASSERT((RetVal == NULL && Size == 0) || (RetVal != NULL));\r
171 if (Size != 0) {\r
172 StrnCatGrow(&RetVal, &Size, Separator, 0);\r
173 }\r
174 StrnCatGrow(&RetVal, &Size, L"%H", 0);\r
175 if (Temp == NULL) {\r
176 UnicodeSPrint (GuidStr, sizeof (GuidStr), L"%g", ProtocolGuidArray[ProtocolIndex]);\r
177 StrnCatGrow (&RetVal, &Size, GuidStr, 0);\r
178 } else {\r
4ba49616 179 StrnCatGrow(&RetVal, &Size, Temp, 0);\r
4ba49616 180 FreePool(Temp);\r
181 }\r
0e88348e 182 StrnCatGrow(&RetVal, &Size, L"%N", 0);\r
4ba49616 183 if (ExtraInfo) {\r
184 Temp = GetProtocolInformationDump(TheHandle, ProtocolGuidArray[ProtocolIndex], Verbose);\r
185 if (Temp != NULL) {\r
186 ASSERT((RetVal == NULL && Size == 0) || (RetVal != NULL));\r
187 if (!Verbose) {\r
188 StrnCatGrow(&RetVal, &Size, L"(", 0);\r
189 StrnCatGrow(&RetVal, &Size, Temp, 0);\r
f0b0e733 190 StrnCatGrow(&RetVal, &Size, L")\r\n", 0);\r
4ba49616 191 } else {\r
268d3445 192 StrnCatGrow(&RetVal, &Size, Separator, 0);\r
4ba49616 193 StrnCatGrow(&RetVal, &Size, Temp, 0);\r
194 }\r
195 FreePool(Temp);\r
196 }\r
197 }\r
198 }\r
4ba49616 199 }\r
361a8267 200 \r
201 SHELL_FREE_NON_NULL(ProtocolGuidArray);\r
4ba49616 202\r
361a8267 203 if (RetVal == NULL) {\r
204 return (NULL);\r
4ba49616 205 }\r
361a8267 206\r
4ba49616 207 ASSERT((RetVal == NULL && Size == 0) || (RetVal != NULL));\r
268d3445 208 StrnCatGrow(&RetVal, &Size, Separator, 0);\r
4ba49616 209 return (RetVal);\r
210}\r
211\r
361a8267 212/**\r
213 Gets the name of the loaded image.\r
214\r
215 @param[in] TheHandle The handle of the driver to get info on.\r
216 @param[out] Name The pointer to the pointer. Valid upon a successful return.\r
217\r
218 @retval EFI_SUCCESS The operation was successful.\r
219**/\r
220EFI_STATUS\r
361a8267 221GetDriverImageName (\r
222 IN EFI_HANDLE TheHandle,\r
223 OUT CHAR16 **Name\r
224 )\r
225{\r
226 // get loaded image and devicepathtotext on image->Filepath\r
227 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
228 EFI_STATUS Status;\r
229 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
230\r
231 if (TheHandle == NULL || Name == NULL) {\r
232 return (EFI_INVALID_PARAMETER);\r
233 }\r
234\r
235 Status = gBS->OpenProtocol (\r
236 TheHandle,\r
237 &gEfiLoadedImageProtocolGuid,\r
238 (VOID **) &LoadedImage,\r
239 gImageHandle,\r
240 NULL,\r
241 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
242 );\r
243 if (EFI_ERROR(Status)) {\r
244 return (Status);\r
245 }\r
246 DevicePath = LoadedImage->FilePath;\r
863986b3 247 *Name = ConvertDevicePathToText(DevicePath, TRUE, TRUE);\r
361a8267 248 return (EFI_SUCCESS);\r
249}\r
250\r
251/**\r
252 Display driver model information for a given handle.\r
253 \r
254 @param[in] Handle The handle to display info on.\r
255 @param[in] BestName Use the best name?\r
256 @param[in] Language The language to output in.\r
257**/\r
258EFI_STATUS\r
361a8267 259DisplayDriverModelHandle (\r
260 IN EFI_HANDLE Handle,\r
261 IN BOOLEAN BestName,\r
262 IN CONST CHAR8 *Language OPTIONAL\r
263 )\r
264{\r
265 EFI_STATUS Status;\r
266 BOOLEAN ConfigurationStatus;\r
267 BOOLEAN DiagnosticsStatus;\r
268 UINTN DriverBindingHandleCount;\r
269 EFI_HANDLE *DriverBindingHandleBuffer;\r
270 UINTN ParentControllerHandleCount;\r
271 EFI_HANDLE *ParentControllerHandleBuffer;\r
272 UINTN ChildControllerHandleCount;\r
273 EFI_HANDLE *ChildControllerHandleBuffer;\r
274 CHAR16 *TempStringPointer;\r
275 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
276 UINTN Index;\r
277 CHAR16 *DriverName;\r
278 EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;\r
279 UINTN NumberOfChildren;\r
280 UINTN HandleIndex;\r
281 UINTN ControllerHandleCount;\r
282 EFI_HANDLE *ControllerHandleBuffer;\r
283 UINTN ChildIndex;\r
284 BOOLEAN Image;\r
285\r
0d807dae
ED
286 DriverName = NULL;\r
287\r
361a8267 288 //\r
289 // See if Handle is a device handle and display its details.\r
290 //\r
291 DriverBindingHandleBuffer = NULL;\r
292 Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS (\r
293 Handle,\r
294 &DriverBindingHandleCount,\r
295 &DriverBindingHandleBuffer\r
296 );\r
297\r
298 ParentControllerHandleBuffer = NULL;\r
299 Status = PARSE_HANDLE_DATABASE_PARENTS (\r
300 Handle,\r
301 &ParentControllerHandleCount,\r
302 &ParentControllerHandleBuffer\r
303 );\r
304\r
305 ChildControllerHandleBuffer = NULL;\r
306 Status = ParseHandleDatabaseForChildControllers (\r
307 Handle,\r
308 &ChildControllerHandleCount,\r
309 &ChildControllerHandleBuffer\r
310 );\r
311\r
312 DiagnosticsStatus = FALSE;\r
313 ConfigurationStatus = FALSE;\r
314\r
315 if (!EFI_ERROR(gBS->OpenProtocol(Handle, &gEfiDriverConfigurationProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
316 ConfigurationStatus = TRUE;\r
317 }\r
318 if (!EFI_ERROR(gBS->OpenProtocol(Handle, &gEfiDriverConfiguration2ProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
319 ConfigurationStatus = TRUE;\r
320 }\r
321 if (!EFI_ERROR(gBS->OpenProtocol(Handle, &gEfiDriverDiagnosticsProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
322 DiagnosticsStatus = TRUE;\r
323 }\r
324 if (!EFI_ERROR(gBS->OpenProtocol(Handle, &gEfiDriverDiagnostics2ProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
325 DiagnosticsStatus = TRUE;\r
326 }\r
327\r
328 Status = EFI_SUCCESS;\r
329\r
330 if (DriverBindingHandleCount > 0 || ParentControllerHandleCount > 0 || ChildControllerHandleCount > 0) {\r
331\r
332\r
333\r
334 DevicePath = NULL;\r
335 TempStringPointer = NULL;\r
336 Status = gBS->HandleProtocol (Handle, &gEfiDevicePathProtocolGuid, (VOID**)&DevicePath);\r
337\r
338 Status = gEfiShellProtocol->GetDeviceName(Handle, EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8*)Language, &TempStringPointer);\r
339 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_DRIVER1), gShellDriver1HiiHandle, TempStringPointer!=NULL?TempStringPointer:L"<Unknown>");\r
340 SHELL_FREE_NON_NULL(TempStringPointer);\r
341 \r
863986b3 342 TempStringPointer = ConvertDevicePathToText(DevicePath, TRUE, FALSE);\r
361a8267 343 ShellPrintHiiEx(\r
344 -1, \r
345 -1, \r
346 NULL, \r
347 STRING_TOKEN (STR_DH_OUTPUT_DRIVER2), \r
348 gShellDriver1HiiHandle, \r
349 TempStringPointer!=NULL?TempStringPointer:L"<None>",\r
350 ParentControllerHandleCount == 0?L"ROOT":(ChildControllerHandleCount > 0)?L"BUS":L"DEVICE",\r
351 ConfigurationStatus?L"YES":L"NO",\r
352 DiagnosticsStatus?L"YES":L"NO"\r
353 );\r
354\r
355 SHELL_FREE_NON_NULL(TempStringPointer);\r
356\r
357 if (DriverBindingHandleCount == 0) {\r
358 ShellPrintHiiEx(\r
359 -1, \r
360 -1, \r
361 NULL, \r
362 STRING_TOKEN (STR_DH_OUTPUT_DRIVER3), \r
363 gShellDriver1HiiHandle, \r
364 L"<None>"\r
365 );\r
366 } else {\r
367 ShellPrintHiiEx(\r
368 -1, \r
369 -1, \r
370 NULL, \r
371 STRING_TOKEN (STR_DH_OUTPUT_DRIVER3), \r
372 gShellDriver1HiiHandle, \r
373 L""\r
374 );\r
375 for (Index = 0; Index < DriverBindingHandleCount; Index++) {\r
376 Image = FALSE;\r
377 Status = GetDriverName (\r
378 DriverBindingHandleBuffer[Index],\r
379 Language,\r
380 &DriverName\r
381 );\r
f330ff35 382 if (EFI_ERROR (Status)) {\r
361a8267 383 Status = GetDriverImageName (\r
384 DriverBindingHandleBuffer[Index],\r
385 &DriverName\r
386 );\r
f330ff35 387 if (EFI_ERROR (Status)) {\r
388 DriverName = NULL;\r
389 }\r
361a8267 390 }\r
391\r
392 if (Image) {\r
393 ShellPrintHiiEx(\r
394 -1, \r
395 -1, \r
396 NULL, \r
397 STRING_TOKEN (STR_DH_OUTPUT_DRIVER4A),\r
398 gShellDriver1HiiHandle,\r
399 ConvertHandleToHandleIndex (DriverBindingHandleBuffer[Index]),\r
400 DriverName!=NULL?DriverName:L"<Unknown>"\r
401 );\r
402 } else {\r
403 ShellPrintHiiEx(\r
404 -1, \r
405 -1, \r
406 NULL, \r
407 STRING_TOKEN (STR_DH_OUTPUT_DRIVER4B),\r
408 gShellDriver1HiiHandle,\r
409 ConvertHandleToHandleIndex (DriverBindingHandleBuffer[Index]),\r
410 DriverName!=NULL?DriverName:L"<Unknown>"\r
411 );\r
412 }\r
413 SHELL_FREE_NON_NULL(DriverName);\r
414 }\r
415 }\r
416\r
417 if (ParentControllerHandleCount == 0) {\r
418 ShellPrintHiiEx(\r
419 -1, \r
420 -1, \r
421 NULL, \r
422 STRING_TOKEN (STR_DH_OUTPUT_DRIVER5), \r
423 gShellDriver1HiiHandle, \r
424 L"<None>"\r
425 );\r
426 } else {\r
427 ShellPrintHiiEx(\r
428 -1, \r
429 -1, \r
430 NULL, \r
431 STRING_TOKEN (STR_DH_OUTPUT_DRIVER5), \r
432 gShellDriver1HiiHandle, \r
433 L""\r
434 );\r
435 for (Index = 0; Index < ParentControllerHandleCount; Index++) {\r
436 Status = gEfiShellProtocol->GetDeviceName(ParentControllerHandleBuffer[Index], EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8*)Language, &TempStringPointer);\r
437 ShellPrintHiiEx(\r
438 -1, \r
439 -1, \r
440 NULL, \r
441 STRING_TOKEN (STR_DH_OUTPUT_DRIVER5B),\r
442 gShellDriver1HiiHandle,\r
443 ConvertHandleToHandleIndex (ParentControllerHandleBuffer[Index]),\r
444 TempStringPointer!=NULL?TempStringPointer:L"<Unknown>"\r
445 );\r
446 SHELL_FREE_NON_NULL(TempStringPointer);\r
447 }\r
448 }\r
449\r
450 if (ChildControllerHandleCount == 0) {\r
451 ShellPrintHiiEx(\r
452 -1, \r
453 -1, \r
454 NULL, \r
455 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6), \r
456 gShellDriver1HiiHandle, \r
457 L"<None>"\r
458 );\r
459 } else {\r
460 ShellPrintHiiEx(\r
461 -1, \r
462 -1, \r
463 NULL, \r
464 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6), \r
465 gShellDriver1HiiHandle, \r
466 L""\r
467 );\r
468 for (Index = 0; Index < ChildControllerHandleCount; Index++) {\r
469 Status = gEfiShellProtocol->GetDeviceName(ChildControllerHandleBuffer[Index], EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8*)Language, &TempStringPointer);\r
470 ShellPrintHiiEx(\r
471 -1, \r
472 -1, \r
473 NULL, \r
474 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6B),\r
475 gShellDriver1HiiHandle,\r
476 ConvertHandleToHandleIndex (ChildControllerHandleBuffer[Index]),\r
477 TempStringPointer!=NULL?TempStringPointer:L"<Unknown>"\r
478 );\r
479 SHELL_FREE_NON_NULL(TempStringPointer);\r
480 }\r
481 }\r
482 }\r
483\r
484 SHELL_FREE_NON_NULL(DriverBindingHandleBuffer);\r
485\r
486 SHELL_FREE_NON_NULL(ParentControllerHandleBuffer);\r
487\r
488 SHELL_FREE_NON_NULL(ChildControllerHandleBuffer);\r
489\r
490 if (EFI_ERROR (Status)) {\r
491 return Status;\r
492 }\r
493 //\r
494 // See if Handle is a driver binding handle and display its details.\r
495 //\r
496 Status = gBS->OpenProtocol (\r
497 Handle,\r
498 &gEfiDriverBindingProtocolGuid,\r
499 (VOID **) &DriverBinding,\r
500 NULL,\r
501 NULL,\r
502 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
503 );\r
504 if (EFI_ERROR (Status)) {\r
505 return EFI_SUCCESS;\r
506 }\r
507\r
508 NumberOfChildren = 0;\r
509 ControllerHandleBuffer = NULL;\r
510 Status = PARSE_HANDLE_DATABASE_DEVICES (\r
511 Handle,\r
512 &ControllerHandleCount,\r
513 &ControllerHandleBuffer\r
514 );\r
515 if (ControllerHandleCount > 0) {\r
516 for (HandleIndex = 0; HandleIndex < ControllerHandleCount; HandleIndex++) {\r
517 Status = PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (\r
518 Handle,\r
519 ControllerHandleBuffer[HandleIndex],\r
520 &ChildControllerHandleCount,\r
521 NULL\r
522 );\r
523 NumberOfChildren += ChildControllerHandleCount;\r
524 }\r
525 }\r
526\r
527 Status = GetDriverName (Handle, Language, &DriverName);\r
f330ff35 528 if (EFI_ERROR (Status)) {\r
529 DriverName = NULL;\r
530 }\r
361a8267 531\r
532 ShellPrintHiiEx(\r
533 -1, \r
534 -1, \r
535 NULL, \r
536 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6B),\r
537 gShellDriver1HiiHandle,\r
538 ConvertHandleToHandleIndex(Handle),\r
539 DriverName!=NULL?DriverName:L"<Unknown>"\r
540 );\r
541 SHELL_FREE_NON_NULL(DriverName);\r
361a8267 542 Status = GetDriverImageName (\r
543 Handle,\r
544 &DriverName\r
545 );\r
f330ff35 546 if (EFI_ERROR (Status)) {\r
547 DriverName = NULL;\r
548 }\r
361a8267 549 ShellPrintHiiEx(\r
550 -1, \r
551 -1, \r
552 NULL, \r
553 STRING_TOKEN (STR_DH_OUTPUT_DRIVER7B),\r
554 gShellDriver1HiiHandle,\r
555 DriverName!=NULL?DriverName:L"<Unknown>"\r
556 );\r
557 SHELL_FREE_NON_NULL(DriverName);\r
558\r
559 ShellPrintHiiEx(\r
560 -1, \r
561 -1, \r
562 NULL, \r
563 STRING_TOKEN (STR_DH_OUTPUT_DRIVER8), \r
564 gShellDriver1HiiHandle, \r
565 DriverBinding->Version,\r
566 NumberOfChildren > 0?L"Bus":ControllerHandleCount > 0?L"Device":L"<Unknown>",\r
567 ConfigurationStatus?L"YES":L"NO",\r
568 DiagnosticsStatus?L"YES":L"NO"\r
569 );\r
570\r
571 if (ControllerHandleCount == 0) {\r
572 ShellPrintHiiEx(\r
573 -1, \r
574 -1, \r
575 NULL, \r
576 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6), \r
577 gShellDriver1HiiHandle, \r
578 L"None"\r
579 );\r
580 } else {\r
581 ShellPrintHiiEx(\r
582 -1, \r
583 -1, \r
584 NULL, \r
585 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6), \r
586 gShellDriver1HiiHandle, \r
587 L""\r
588 );\r
589 for (HandleIndex = 0; HandleIndex < ControllerHandleCount; HandleIndex++) {\r
590 Status = gEfiShellProtocol->GetDeviceName(ControllerHandleBuffer[HandleIndex], EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8*)Language, &TempStringPointer);\r
591\r
592 ShellPrintHiiEx(\r
593 -1, \r
594 -1, \r
595 NULL, \r
596 STRING_TOKEN (STR_DH_OUTPUT_DRIVER9B),\r
597 gShellDriver1HiiHandle,\r
598 ConvertHandleToHandleIndex(ControllerHandleBuffer[HandleIndex]),\r
599 TempStringPointer!=NULL?TempStringPointer:L"<Unknown>"\r
600 );\r
601 SHELL_FREE_NON_NULL(TempStringPointer);\r
602\r
603 Status = PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (\r
604 Handle,\r
605 ControllerHandleBuffer[HandleIndex],\r
606 &ChildControllerHandleCount,\r
607 &ChildControllerHandleBuffer\r
608 );\r
609 if (!EFI_ERROR (Status)) {\r
610 for (ChildIndex = 0; ChildIndex < ChildControllerHandleCount; ChildIndex++) {\r
611 Status = gEfiShellProtocol->GetDeviceName(ChildControllerHandleBuffer[ChildIndex], EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8*)Language, &TempStringPointer);\r
612\r
613 ShellPrintHiiEx(\r
614 -1, \r
615 -1, \r
616 NULL, \r
617 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6B),\r
618 gShellDriver1HiiHandle,\r
619 ConvertHandleToHandleIndex(ChildControllerHandleBuffer[ChildIndex]),\r
620 TempStringPointer!=NULL?TempStringPointer:L"<Unknown>"\r
621 );\r
622 SHELL_FREE_NON_NULL(TempStringPointer);\r
623 }\r
624\r
625 SHELL_FREE_NON_NULL (ChildControllerHandleBuffer);\r
626 }\r
627 }\r
628\r
629 SHELL_FREE_NON_NULL (ControllerHandleBuffer);\r
630 }\r
631\r
632 return EFI_SUCCESS;\r
633}\r
634\r
635/**\r
636 Display information for a handle.\r
637\r
638 @param[in] TheHandle The handles to show info on.\r
639 @param[in] Verbose TRUE for extra info, FALSE otherwise.\r
640 @param[in] Sfo TRUE to output in standard format output (spec).\r
641 @param[in] Language Language string per UEFI specification.\r
642 @param[in] DriverInfo TRUE to show all info about the handle.\r
643 @param[in] Multiple TRUE indicates more than will be output,\r
644 FALSE for a single one.\r
645\r
646 @retval SHELL_SUCCESS The operation was successful.\r
647 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.\r
648**/\r
4ba49616 649SHELL_STATUS\r
4ba49616 650DoDhByHandle(\r
651 IN CONST EFI_HANDLE TheHandle,\r
652 IN CONST BOOLEAN Verbose,\r
653 IN CONST BOOLEAN Sfo,\r
654 IN CONST CHAR8 *Language,\r
655 IN CONST BOOLEAN DriverInfo,\r
656 IN CONST BOOLEAN Multiple\r
657 )\r
658{\r
659 CHAR16 *ProtocolInfoString;\r
660 SHELL_STATUS ShellStatus;\r
4ba49616 661\r
4ba49616 662 ShellStatus = SHELL_SUCCESS;\r
663 ProtocolInfoString = NULL;\r
664\r
665 if (!Sfo) {\r
666 if (Multiple) {\r
361a8267 667 ProtocolInfoString = GetProtocolInfoString(TheHandle, Language, L" ", Verbose, TRUE);\r
4ba49616 668 ShellPrintHiiEx(\r
669 -1,\r
670 -1,\r
671 NULL,\r
672 STRING_TOKEN (STR_DH_OUTPUT),\r
673 gShellDriver1HiiHandle,\r
674 ConvertHandleToHandleIndex(TheHandle),\r
675 ProtocolInfoString==NULL?L"":ProtocolInfoString);\r
676 } else {\r
361a8267 677 ProtocolInfoString = GetProtocolInfoString(TheHandle, Language, L"\r\n", Verbose, TRUE);\r
4ba49616 678 ShellPrintHiiEx(\r
679 -1,\r
680 -1,\r
681 NULL,\r
682 STRING_TOKEN (STR_DH_OUTPUT_SINGLE),\r
683 gShellDriver1HiiHandle,\r
684 ConvertHandleToHandleIndex(TheHandle),\r
685 TheHandle,\r
686 ProtocolInfoString==NULL?L"":ProtocolInfoString);\r
687 }\r
361a8267 688\r
689 if (DriverInfo) {\r
690 DisplayDriverModelHandle ((EFI_HANDLE)TheHandle, TRUE, Language);\r
691 }\r
4ba49616 692 } else {\r
361a8267 693 ProtocolInfoString = GetProtocolInfoString(TheHandle, Language, L";", FALSE, FALSE);\r
4ba49616 694 ShellPrintHiiEx(\r
695 -1,\r
696 -1,\r
697 NULL,\r
698 STRING_TOKEN (STR_DH_OUTPUT_SFO),\r
699 gShellDriver1HiiHandle,\r
700 Multiple ?L"HandlesInfo":L"HandleInfo",\r
701 L"DriverName",\r
702 L"ControllerName",\r
703 ConvertHandleToHandleIndex(TheHandle),\r
704 L"DevPath",\r
705 ProtocolInfoString==NULL?L"":ProtocolInfoString);\r
706\r
707\r
708 }\r
709\r
710\r
711 if (ProtocolInfoString != NULL) {\r
712 FreePool(ProtocolInfoString);\r
713 }\r
714 return (ShellStatus);\r
715}\r
716\r
361a8267 717/**\r
718 Display information for all handles on a list.\r
719\r
720 @param[in] HandleList The NULL-terminated list of handles.\r
f0b0e733 721 @param[in] Verbose TRUE for extra info, FALSE otherwise.\r
361a8267 722 @param[in] Sfo TRUE to output in standard format output (spec).\r
723 @param[in] Language Language string per UEFI specification.\r
724 @param[in] DriverInfo TRUE to show all info about the handle.\r
725\r
726 @retval SHELL_SUCCESS The operation was successful.\r
727 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.\r
728**/\r
4ba49616 729SHELL_STATUS\r
4ba49616 730DoDhForHandleList(\r
731 IN CONST EFI_HANDLE *HandleList,\r
f0b0e733 732 IN CONST BOOLEAN Verbose,\r
4ba49616 733 IN CONST BOOLEAN Sfo,\r
734 IN CONST CHAR8 *Language,\r
735 IN CONST BOOLEAN DriverInfo\r
736 )\r
737{\r
738 CONST EFI_HANDLE *HandleWalker;\r
739 SHELL_STATUS ShellStatus;\r
740\r
741 ShellStatus = SHELL_SUCCESS;\r
742\r
743 for (HandleWalker = HandleList ; HandleWalker != NULL && *HandleWalker != NULL && ShellStatus == SHELL_SUCCESS; HandleWalker++) {\r
744 ShellStatus = DoDhByHandle(\r
745 *HandleWalker,\r
f0b0e733 746 Verbose,\r
4ba49616 747 Sfo,\r
748 Language,\r
749 DriverInfo,\r
750 TRUE\r
751 );\r
376e7593
TS
752 if (ShellGetExecutionBreakFlag ()) {\r
753 ShellStatus = SHELL_ABORTED;\r
754 break;\r
755 }\r
4ba49616 756 }\r
757 return (ShellStatus);\r
758}\r
759\r
361a8267 760/**\r
761 Display information for all handles.\r
762\r
763 @param[in] Sfo TRUE to output in standard format output (spec).\r
f0b0e733 764 @param[in] Verbose TRUE for extra info, FALSE otherwise.\r
361a8267 765 @param[in] Language Language string per UEFI specification.\r
766 @param[in] DriverInfo TRUE to show all info about the handle.\r
767\r
768 @retval SHELL_SUCCESS The operation was successful.\r
769 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.\r
770**/\r
4ba49616 771SHELL_STATUS\r
4ba49616 772DoDhForAll(\r
773 IN CONST BOOLEAN Sfo,\r
f0b0e733 774 IN CONST BOOLEAN Verbose,\r
4ba49616 775 IN CONST CHAR8 *Language,\r
776 IN CONST BOOLEAN DriverInfo\r
777 )\r
778{\r
779 EFI_HANDLE *HandleList;\r
780 SHELL_STATUS ShellStatus;\r
781\r
782 HandleList = GetHandleListByProtocol(NULL);\r
783\r
784 ShellStatus = DoDhForHandleList(\r
785 HandleList,\r
f0b0e733 786 Verbose,\r
4ba49616 787 Sfo,\r
788 Language,\r
789 DriverInfo);\r
790\r
791 FreePool(HandleList);\r
792\r
793 return (ShellStatus);\r
794}\r
795\r
361a8267 796/**\r
797 Display information for all handles which have a specific protocol.\r
798\r
799 @param[in] ProtocolName The pointer to the name of the protocol.\r
f0b0e733 800 @param[in] Verbose TRUE for extra info, FALSE otherwise.\r
361a8267 801 @param[in] Sfo TRUE to output in standard format output (spec).\r
802 @param[in] Language Language string per UEFI specification.\r
803 @param[in] DriverInfo TRUE to show all info about the handle.\r
804\r
805 @retval SHELL_SUCCESS The operation was successful.\r
806 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.\r
807**/\r
4ba49616 808SHELL_STATUS\r
4ba49616 809DoDhByProtocol(\r
810 IN CONST CHAR16 *ProtocolName,\r
f0b0e733 811 IN CONST BOOLEAN Verbose,\r
4ba49616 812 IN CONST BOOLEAN Sfo,\r
813 IN CONST CHAR8 *Language,\r
814 IN CONST BOOLEAN DriverInfo\r
815 )\r
816{\r
817 EFI_GUID *Guid;\r
818 EFI_STATUS Status;\r
819 EFI_HANDLE *HandleList;\r
820 SHELL_STATUS ShellStatus;\r
821\r
361a8267 822 if (ProtocolName == NULL) {\r
823 return (SHELL_INVALID_PARAMETER);\r
824 }\r
4ba49616 825\r
826 Status = GetGuidFromStringName(ProtocolName, Language, &Guid);\r
827 if (EFI_ERROR(Status)) {\r
828 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DH_NO_GUID_FOUND), gShellDriver1HiiHandle, ProtocolName);\r
829 return (SHELL_INVALID_PARAMETER);\r
830 }\r
831\r
832 HandleList = GetHandleListByProtocol(Guid);\r
833\r
834 ShellStatus = DoDhForHandleList(\r
835 HandleList,\r
f0b0e733 836 Verbose,\r
4ba49616 837 Sfo,\r
838 Language,\r
839 DriverInfo);\r
840\r
841 SHELL_FREE_NON_NULL(HandleList);\r
842\r
843 return (ShellStatus);\r
844}\r
845\r
361a8267 846/**\r
847 Function for 'dh' command.\r
848\r
849 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
850 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
851**/\r
4ba49616 852SHELL_STATUS\r
853EFIAPI\r
854ShellCommandRunDh (\r
855 IN EFI_HANDLE ImageHandle,\r
856 IN EFI_SYSTEM_TABLE *SystemTable\r
857 )\r
858{\r
859 EFI_STATUS Status;\r
860 LIST_ENTRY *Package;\r
861 CHAR16 *ProblemParam;\r
862 SHELL_STATUS ShellStatus;\r
863 CHAR8 *Language;\r
864 CONST CHAR16 *Lang;\r
865 CONST CHAR16 *Temp2;\r
866 BOOLEAN SfoMode;\r
867 BOOLEAN FlagD;\r
868 BOOLEAN Verbose;\r
361a8267 869 UINT64 Intermediate;\r
4ba49616 870\r
871 ShellStatus = SHELL_SUCCESS;\r
872 Status = EFI_SUCCESS;\r
873 Language = NULL;\r
874\r
875 //\r
876 // initialize the shell lib (we must be in non-auto-init...)\r
877 //\r
878 Status = ShellInitialize();\r
879 ASSERT_EFI_ERROR(Status);\r
880\r
881 Status = CommandInit();\r
882 ASSERT_EFI_ERROR(Status);\r
883\r
884 //\r
885 // parse the command line\r
886 //\r
887 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
888 if (EFI_ERROR(Status)) {\r
889 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
bc280720 890 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"dh", ProblemParam); \r
4ba49616 891 FreePool(ProblemParam);\r
892 ShellStatus = SHELL_INVALID_PARAMETER;\r
893 } else {\r
894 ASSERT(FALSE);\r
895 }\r
896 } else {\r
897 if (ShellCommandLineGetCount(Package) > 2) {\r
bc280720 898 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"dh"); \r
4ba49616 899 ShellCommandLineFreeVarList (Package);\r
900 return (SHELL_INVALID_PARAMETER);\r
901 }\r
902\r
903 Lang = ShellCommandLineGetValue(Package, L"-l");\r
904 if (Lang != NULL) {\r
905 Language = AllocateZeroPool(StrSize(Lang));\r
906 AsciiSPrint(Language, StrSize(Lang), "%S", Lang);\r
907 } else if (!ShellCommandLineGetFlag(Package, L"-l")){\r
908 Language = AllocateZeroPool(10);\r
909 AsciiSPrint(Language, 10, "en-us");\r
910 } else {\r
911 ASSERT(Language == NULL);\r
bc280720 912 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"dh", L"-l"); \r
4ba49616 913 ShellCommandLineFreeVarList (Package);\r
914 return (SHELL_INVALID_PARAMETER);\r
915 }\r
916\r
917 SfoMode = ShellCommandLineGetFlag(Package, L"-sfo");\r
918 FlagD = ShellCommandLineGetFlag(Package, L"-d");\r
361a8267 919 Verbose = (BOOLEAN)(ShellCommandLineGetFlag(Package, L"-v") || ShellCommandLineGetFlag(Package, L"-verbose"));\r
4ba49616 920\r
921 if (ShellCommandLineGetFlag(Package, L"-p")) {\r
922 if (ShellCommandLineGetCount(Package) > 1) {\r
bc280720 923 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"dh"); \r
4ba49616 924 ShellStatus = SHELL_INVALID_PARAMETER;\r
925 } else if (ShellCommandLineGetValue(Package, L"-p") == NULL) {\r
bc280720 926 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"dh", L"-p"); \r
4ba49616 927 ShellStatus = SHELL_INVALID_PARAMETER;\r
928 } else {\r
929 //\r
930 // print by protocol\r
931 //\r
932 ShellStatus = DoDhByProtocol(\r
933 ShellCommandLineGetValue(Package, L"-p"),\r
f0b0e733 934 Verbose,\r
4ba49616 935 SfoMode,\r
936 Lang==NULL?NULL:Language,\r
937 FlagD\r
938 );\r
939 }\r
940 } else {\r
941 Temp2 = ShellCommandLineGetRawValue(Package, 1);\r
942 if (Temp2 == NULL) {\r
943 //\r
944 // Print everything\r
945 //\r
946 ShellStatus = DoDhForAll(\r
947 SfoMode,\r
f0b0e733 948 Verbose,\r
4ba49616 949 Lang==NULL?NULL:Language,\r
950 FlagD\r
951 );\r
952 } else {\r
361a8267 953 Status = ShellConvertStringToUint64(Temp2, &Intermediate, TRUE, FALSE);\r
954 if (EFI_ERROR(Status) || ConvertHandleIndexToHandle((UINTN)Intermediate) == NULL) {\r
bc280720 955 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"dh", Temp2); \r
4ba49616 956 ShellStatus = SHELL_INVALID_PARAMETER;\r
957 } else {\r
958 //\r
959 // print 1 handle\r
960 //\r
961 ShellStatus = DoDhByHandle(\r
361a8267 962 ConvertHandleIndexToHandle((UINTN)Intermediate),\r
4ba49616 963 Verbose,\r
964 SfoMode,\r
965 Lang==NULL?NULL:Language,\r
966 FlagD,\r
967 FALSE\r
968 );\r
969 }\r
970 }\r
971 }\r
972\r
973\r
974 ShellCommandLineFreeVarList (Package);\r
975 SHELL_FREE_NON_NULL(Language);\r
976 }\r
977\r
978 return (ShellStatus);\r
979}\r