]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDriver1CommandsLib/Dh.c
ShellPkg/Dh: Fix coding style issues
[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
361a8267 645**/\r
28f898f8 646VOID\r
4ba49616 647DoDhByHandle(\r
648 IN CONST EFI_HANDLE TheHandle,\r
649 IN CONST BOOLEAN Verbose,\r
650 IN CONST BOOLEAN Sfo,\r
651 IN CONST CHAR8 *Language,\r
652 IN CONST BOOLEAN DriverInfo,\r
653 IN CONST BOOLEAN Multiple\r
654 )\r
655{\r
28f898f8 656 CHAR16 *ProtocolInfoString;\r
4ba49616 657\r
4ba49616 658 ProtocolInfoString = NULL;\r
659\r
660 if (!Sfo) {\r
661 if (Multiple) {\r
361a8267 662 ProtocolInfoString = GetProtocolInfoString(TheHandle, Language, L" ", Verbose, TRUE);\r
4ba49616 663 ShellPrintHiiEx(\r
664 -1,\r
665 -1,\r
666 NULL,\r
667 STRING_TOKEN (STR_DH_OUTPUT),\r
668 gShellDriver1HiiHandle,\r
669 ConvertHandleToHandleIndex(TheHandle),\r
28f898f8
CC
670 ProtocolInfoString==NULL?L"":ProtocolInfoString\r
671 );\r
4ba49616 672 } else {\r
361a8267 673 ProtocolInfoString = GetProtocolInfoString(TheHandle, Language, L"\r\n", Verbose, TRUE);\r
4ba49616 674 ShellPrintHiiEx(\r
675 -1,\r
676 -1,\r
677 NULL,\r
678 STRING_TOKEN (STR_DH_OUTPUT_SINGLE),\r
679 gShellDriver1HiiHandle,\r
680 ConvertHandleToHandleIndex(TheHandle),\r
681 TheHandle,\r
28f898f8
CC
682 ProtocolInfoString==NULL?L"":ProtocolInfoString\r
683 );\r
4ba49616 684 }\r
361a8267 685\r
686 if (DriverInfo) {\r
687 DisplayDriverModelHandle ((EFI_HANDLE)TheHandle, TRUE, Language);\r
688 }\r
4ba49616 689 } else {\r
361a8267 690 ProtocolInfoString = GetProtocolInfoString(TheHandle, Language, L";", FALSE, FALSE);\r
4ba49616 691 ShellPrintHiiEx(\r
692 -1,\r
693 -1,\r
694 NULL,\r
695 STRING_TOKEN (STR_DH_OUTPUT_SFO),\r
696 gShellDriver1HiiHandle,\r
697 Multiple ?L"HandlesInfo":L"HandleInfo",\r
698 L"DriverName",\r
699 L"ControllerName",\r
700 ConvertHandleToHandleIndex(TheHandle),\r
701 L"DevPath",\r
28f898f8
CC
702 ProtocolInfoString==NULL?L"":ProtocolInfoString\r
703 );\r
4ba49616 704 }\r
705\r
4ba49616 706 if (ProtocolInfoString != NULL) {\r
707 FreePool(ProtocolInfoString);\r
708 }\r
4ba49616 709}\r
710\r
361a8267 711/**\r
712 Display information for all handles on a list.\r
713\r
714 @param[in] HandleList The NULL-terminated list of handles.\r
f0b0e733 715 @param[in] Verbose TRUE for extra info, FALSE otherwise.\r
361a8267 716 @param[in] Sfo TRUE to output in standard format output (spec).\r
717 @param[in] Language Language string per UEFI specification.\r
718 @param[in] DriverInfo TRUE to show all info about the handle.\r
719\r
28f898f8
CC
720 @retval SHELL_SUCCESS The operation was successful.\r
721 @retval SHELL_ABORTED The operation was aborted.\r
361a8267 722**/\r
4ba49616 723SHELL_STATUS\r
4ba49616 724DoDhForHandleList(\r
725 IN CONST EFI_HANDLE *HandleList,\r
f0b0e733 726 IN CONST BOOLEAN Verbose,\r
4ba49616 727 IN CONST BOOLEAN Sfo,\r
728 IN CONST CHAR8 *Language,\r
729 IN CONST BOOLEAN DriverInfo\r
730 )\r
731{\r
732 CONST EFI_HANDLE *HandleWalker;\r
733 SHELL_STATUS ShellStatus;\r
734\r
735 ShellStatus = SHELL_SUCCESS;\r
736\r
28f898f8
CC
737 for ( HandleWalker = HandleList; HandleWalker != NULL && *HandleWalker != NULL; HandleWalker++ ) {\r
738 DoDhByHandle (*HandleWalker, Verbose, Sfo, Language, DriverInfo, TRUE);\r
376e7593
TS
739 if (ShellGetExecutionBreakFlag ()) {\r
740 ShellStatus = SHELL_ABORTED;\r
741 break;\r
742 }\r
4ba49616 743 }\r
744 return (ShellStatus);\r
745}\r
746\r
361a8267 747/**\r
748 Display information for all handles.\r
749\r
750 @param[in] Sfo TRUE to output in standard format output (spec).\r
f0b0e733 751 @param[in] Verbose TRUE for extra info, FALSE otherwise.\r
361a8267 752 @param[in] Language Language string per UEFI specification.\r
753 @param[in] DriverInfo TRUE to show all info about the handle.\r
754\r
755 @retval SHELL_SUCCESS The operation was successful.\r
756 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.\r
757**/\r
4ba49616 758SHELL_STATUS\r
4ba49616 759DoDhForAll(\r
760 IN CONST BOOLEAN Sfo,\r
f0b0e733 761 IN CONST BOOLEAN Verbose,\r
4ba49616 762 IN CONST CHAR8 *Language,\r
763 IN CONST BOOLEAN DriverInfo\r
764 )\r
765{\r
766 EFI_HANDLE *HandleList;\r
767 SHELL_STATUS ShellStatus;\r
768\r
769 HandleList = GetHandleListByProtocol(NULL);\r
770\r
771 ShellStatus = DoDhForHandleList(\r
772 HandleList,\r
f0b0e733 773 Verbose,\r
4ba49616 774 Sfo,\r
775 Language,\r
776 DriverInfo);\r
777\r
778 FreePool(HandleList);\r
779\r
780 return (ShellStatus);\r
781}\r
782\r
361a8267 783/**\r
784 Display information for all handles which have a specific protocol.\r
785\r
786 @param[in] ProtocolName The pointer to the name of the protocol.\r
f0b0e733 787 @param[in] Verbose TRUE for extra info, FALSE otherwise.\r
361a8267 788 @param[in] Sfo TRUE to output in standard format output (spec).\r
789 @param[in] Language Language string per UEFI specification.\r
790 @param[in] DriverInfo TRUE to show all info about the handle.\r
791\r
792 @retval SHELL_SUCCESS The operation was successful.\r
793 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.\r
794**/\r
4ba49616 795SHELL_STATUS\r
4ba49616 796DoDhByProtocol(\r
797 IN CONST CHAR16 *ProtocolName,\r
f0b0e733 798 IN CONST BOOLEAN Verbose,\r
4ba49616 799 IN CONST BOOLEAN Sfo,\r
800 IN CONST CHAR8 *Language,\r
801 IN CONST BOOLEAN DriverInfo\r
802 )\r
803{\r
804 EFI_GUID *Guid;\r
805 EFI_STATUS Status;\r
806 EFI_HANDLE *HandleList;\r
807 SHELL_STATUS ShellStatus;\r
808\r
361a8267 809 if (ProtocolName == NULL) {\r
810 return (SHELL_INVALID_PARAMETER);\r
811 }\r
4ba49616 812\r
813 Status = GetGuidFromStringName(ProtocolName, Language, &Guid);\r
814 if (EFI_ERROR(Status)) {\r
815 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DH_NO_GUID_FOUND), gShellDriver1HiiHandle, ProtocolName);\r
816 return (SHELL_INVALID_PARAMETER);\r
817 }\r
818\r
819 HandleList = GetHandleListByProtocol(Guid);\r
820\r
821 ShellStatus = DoDhForHandleList(\r
822 HandleList,\r
f0b0e733 823 Verbose,\r
4ba49616 824 Sfo,\r
825 Language,\r
826 DriverInfo);\r
827\r
828 SHELL_FREE_NON_NULL(HandleList);\r
829\r
830 return (ShellStatus);\r
831}\r
832\r
361a8267 833/**\r
834 Function for 'dh' command.\r
835\r
836 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
837 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
838**/\r
4ba49616 839SHELL_STATUS\r
840EFIAPI\r
841ShellCommandRunDh (\r
842 IN EFI_HANDLE ImageHandle,\r
843 IN EFI_SYSTEM_TABLE *SystemTable\r
844 )\r
845{\r
846 EFI_STATUS Status;\r
847 LIST_ENTRY *Package;\r
848 CHAR16 *ProblemParam;\r
849 SHELL_STATUS ShellStatus;\r
850 CHAR8 *Language;\r
851 CONST CHAR16 *Lang;\r
28f898f8
CC
852 CONST CHAR16 *RawValue;\r
853 BOOLEAN SfoFlag;\r
854 BOOLEAN DriverFlag;\r
855 BOOLEAN VerboseFlag;\r
361a8267 856 UINT64 Intermediate;\r
4ba49616 857\r
858 ShellStatus = SHELL_SUCCESS;\r
859 Status = EFI_SUCCESS;\r
860 Language = NULL;\r
861\r
862 //\r
863 // initialize the shell lib (we must be in non-auto-init...)\r
864 //\r
865 Status = ShellInitialize();\r
866 ASSERT_EFI_ERROR(Status);\r
867\r
868 Status = CommandInit();\r
869 ASSERT_EFI_ERROR(Status);\r
870\r
871 //\r
872 // parse the command line\r
873 //\r
874 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
875 if (EFI_ERROR(Status)) {\r
876 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
bc280720 877 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"dh", ProblemParam); \r
4ba49616 878 FreePool(ProblemParam);\r
879 ShellStatus = SHELL_INVALID_PARAMETER;\r
880 } else {\r
881 ASSERT(FALSE);\r
882 }\r
883 } else {\r
884 if (ShellCommandLineGetCount(Package) > 2) {\r
bc280720 885 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"dh"); \r
4ba49616 886 ShellCommandLineFreeVarList (Package);\r
887 return (SHELL_INVALID_PARAMETER);\r
888 }\r
889\r
28f898f8
CC
890 if (ShellCommandLineGetFlag(Package, L"-l")) {\r
891 Lang = ShellCommandLineGetValue(Package, L"-l");\r
892 if (Lang != NULL) {\r
893 Language = AllocateZeroPool(StrSize(Lang));\r
894 AsciiSPrint(Language, StrSize(Lang), "%S", Lang);\r
895 } else {\r
896 ASSERT(Language == NULL);\r
897 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN(STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"dh", L"-l");\r
898 ShellCommandLineFreeVarList(Package);\r
899 return (SHELL_INVALID_PARAMETER);\r
900 }\r
901 } else {\r
4ba49616 902 Language = AllocateZeroPool(10);\r
903 AsciiSPrint(Language, 10, "en-us");\r
4ba49616 904 }\r
905\r
28f898f8
CC
906 SfoFlag = ShellCommandLineGetFlag (Package, L"-sfo");\r
907 DriverFlag = ShellCommandLineGetFlag (Package, L"-d");\r
908 VerboseFlag = (BOOLEAN)(ShellCommandLineGetFlag (Package, L"-v") || ShellCommandLineGetFlag (Package, L"-verbose"));\r
4ba49616 909\r
28f898f8
CC
910 if (ShellCommandLineGetFlag (Package, L"-p")) {\r
911 if (ShellCommandLineGetCount (Package) > 1) {\r
912 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"dh");\r
4ba49616 913 ShellStatus = SHELL_INVALID_PARAMETER;\r
914 } else if (ShellCommandLineGetValue(Package, L"-p") == NULL) {\r
28f898f8 915 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"dh", L"-p");\r
4ba49616 916 ShellStatus = SHELL_INVALID_PARAMETER;\r
917 } else {\r
918 //\r
919 // print by protocol\r
920 //\r
921 ShellStatus = DoDhByProtocol(\r
922 ShellCommandLineGetValue(Package, L"-p"),\r
28f898f8
CC
923 VerboseFlag,\r
924 SfoFlag,\r
925 Language,\r
926 DriverFlag\r
927 );\r
4ba49616 928 }\r
929 } else {\r
28f898f8
CC
930 RawValue = ShellCommandLineGetRawValue(Package, 1);\r
931 if (RawValue == NULL) {\r
4ba49616 932 //\r
933 // Print everything\r
934 //\r
935 ShellStatus = DoDhForAll(\r
28f898f8
CC
936 SfoFlag,\r
937 VerboseFlag,\r
938 Language,\r
939 DriverFlag\r
4ba49616 940 );\r
941 } else {\r
28f898f8 942 Status = ShellConvertStringToUint64(RawValue, &Intermediate, TRUE, FALSE);\r
361a8267 943 if (EFI_ERROR(Status) || ConvertHandleIndexToHandle((UINTN)Intermediate) == NULL) {\r
28f898f8 944 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"dh", RawValue);\r
4ba49616 945 ShellStatus = SHELL_INVALID_PARAMETER;\r
946 } else {\r
947 //\r
948 // print 1 handle\r
949 //\r
28f898f8 950 DoDhByHandle(\r
361a8267 951 ConvertHandleIndexToHandle((UINTN)Intermediate),\r
28f898f8
CC
952 VerboseFlag,\r
953 SfoFlag,\r
954 Language,\r
955 DriverFlag,\r
4ba49616 956 FALSE\r
28f898f8 957 );\r
4ba49616 958 }\r
959 }\r
960 }\r
961\r
962\r
963 ShellCommandLineFreeVarList (Package);\r
964 SHELL_FREE_NON_NULL(Language);\r
965 }\r
966\r
967 return (ShellStatus);\r
968}\r