]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDriver1CommandsLib/Dh.c
ShellPkg: Fixes and updates for the 'devices' command
[mirror_edk2.git] / ShellPkg / Library / UefiShellDriver1CommandsLib / Dh.c
CommitLineData
4ba49616 1/** @file\r
2 Main file for Dh shell Driver1 function.\r
3\r
0d807dae 4 Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>\r
4ba49616 5 This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "UefiShellDriver1CommandsLib.h"\r
16\r
17STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
18 {L"-p", TypeValue},\r
19 {L"-d", TypeFlag},\r
20 {L"-v", TypeFlag},\r
21 {L"-verbose", TypeFlag},\r
22 {L"-sfo", TypeFlag},\r
23 {L"-l", TypeValue},\r
24 {NULL, TypeMax}\r
25 };\r
26\r
27STATIC CONST EFI_GUID *UefiDriverModelProtocolsGuidArray[] = {\r
28 &gEfiDriverBindingProtocolGuid,\r
29 &gEfiPlatformDriverOverrideProtocolGuid,\r
30 &gEfiBusSpecificDriverOverrideProtocolGuid,\r
31 &gEfiDriverDiagnosticsProtocolGuid,\r
32 &gEfiDriverDiagnostics2ProtocolGuid,\r
33 &gEfiComponentNameProtocolGuid,\r
34 &gEfiComponentName2ProtocolGuid,\r
35 &gEfiPlatformToDriverConfigurationProtocolGuid,\r
36 &gEfiDriverSupportedEfiVersionProtocolGuid,\r
37 &gEfiDriverFamilyOverrideProtocolGuid,\r
38 &gEfiDriverHealthProtocolGuid,\r
39 &gEfiLoadedImageProtocolGuid,\r
40 NULL\r
41};\r
42\r
361a8267 43/**\r
44 Get the name of a driver by it's handle.\r
45\r
46 If a name is found the memory must be callee freed.\r
47\r
48 @param[in] TheHandle The driver's handle.\r
49 @param[in] Language The language to use.\r
50 @param[in] NameFound Upon a successful return the name found.\r
51\r
52 @retval EFI_SUCCESS The name was found.\r
53**/\r
54EFI_STATUS\r
55EFIAPI\r
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
109EFIAPI\r
110IsDriverProt (\r
111 IN CONST EFI_GUID *Guid\r
112 )\r
113{\r
114 CONST EFI_GUID **GuidWalker;\r
115 BOOLEAN GuidFound;\r
116 GuidFound = FALSE;\r
117 for (GuidWalker = UefiDriverModelProtocolsGuidArray\r
118 ; GuidWalker != NULL && *GuidWalker != NULL\r
119 ; GuidWalker++\r
120 ){\r
121 if (CompareGuid(*GuidWalker, Guid)) {\r
122 GuidFound = TRUE;\r
123 break;\r
124 }\r
125 }\r
126 return (GuidFound);\r
127}\r
128\r
361a8267 129/**\r
130 Get information for a handle.\r
131\r
132 @param[in] TheHandle The handles to show info on.\r
133 @param[in] Language Language string per UEFI specification.\r
134 @param[in] Seperator Separator string between information blocks.\r
135 @param[in] Verbose TRUE for extra info, FALSE otherwise.\r
136 @param[in] ExtraInfo TRUE for extra info, FALSE otherwise.\r
137\r
138 @retval SHELL_SUCCESS The operation was successful.\r
139 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.\r
140**/\r
4ba49616 141CHAR16*\r
142EFIAPI\r
143GetProtocolInfoString(\r
144 IN CONST EFI_HANDLE TheHandle,\r
145 IN CONST CHAR8 *Language,\r
146 IN CONST CHAR16 *Seperator,\r
4ba49616 147 IN CONST BOOLEAN Verbose,\r
148 IN CONST BOOLEAN ExtraInfo\r
149 )\r
150{\r
151 EFI_GUID **ProtocolGuidArray;\r
152 UINTN ArrayCount;\r
153 UINTN ProtocolIndex;\r
154 EFI_STATUS Status;\r
155 CHAR16 *RetVal;\r
156 UINTN Size;\r
157 CHAR16 *Temp;\r
158\r
159 ProtocolGuidArray = NULL;\r
361a8267 160 RetVal = NULL;\r
161 Size = 0;\r
4ba49616 162\r
163 Status = gBS->ProtocolsPerHandle (\r
164 TheHandle,\r
165 &ProtocolGuidArray,\r
166 &ArrayCount\r
167 );\r
168 if (!EFI_ERROR (Status)) {\r
4ba49616 169 for (ProtocolIndex = 0; ProtocolIndex < ArrayCount; ProtocolIndex++) {\r
170 Temp = GetStringNameFromGuid(ProtocolGuidArray[ProtocolIndex], Language);\r
171 if (Temp != NULL) {\r
172 ASSERT((RetVal == NULL && Size == 0) || (RetVal != NULL));\r
173 if (Size != 0) {\r
174 StrnCatGrow(&RetVal, &Size, Seperator, 0);\r
175 }\r
176 StrnCatGrow(&RetVal, &Size, L"%H", 0);\r
177 StrnCatGrow(&RetVal, &Size, Temp, 0);\r
178 StrnCatGrow(&RetVal, &Size, L"%N", 0);\r
179 FreePool(Temp);\r
180 }\r
181 if (ExtraInfo) {\r
182 Temp = GetProtocolInformationDump(TheHandle, ProtocolGuidArray[ProtocolIndex], Verbose);\r
183 if (Temp != NULL) {\r
184 ASSERT((RetVal == NULL && Size == 0) || (RetVal != NULL));\r
185 if (!Verbose) {\r
186 StrnCatGrow(&RetVal, &Size, L"(", 0);\r
187 StrnCatGrow(&RetVal, &Size, Temp, 0);\r
f0b0e733 188 StrnCatGrow(&RetVal, &Size, L")\r\n", 0);\r
4ba49616 189 } else {\r
190 StrnCatGrow(&RetVal, &Size, Seperator, 0);\r
191 StrnCatGrow(&RetVal, &Size, Temp, 0);\r
192 }\r
193 FreePool(Temp);\r
194 }\r
195 }\r
196 }\r
4ba49616 197 }\r
361a8267 198 \r
199 SHELL_FREE_NON_NULL(ProtocolGuidArray);\r
4ba49616 200\r
361a8267 201 if (RetVal == NULL) {\r
202 return (NULL);\r
4ba49616 203 }\r
361a8267 204\r
4ba49616 205 ASSERT((RetVal == NULL && Size == 0) || (RetVal != NULL));\r
206 StrnCatGrow(&RetVal, &Size, Seperator, 0);\r
207 return (RetVal);\r
208}\r
209\r
361a8267 210/**\r
211 Gets the name of the loaded image.\r
212\r
213 @param[in] TheHandle The handle of the driver to get info on.\r
214 @param[out] Name The pointer to the pointer. Valid upon a successful return.\r
215\r
216 @retval EFI_SUCCESS The operation was successful.\r
217**/\r
218EFI_STATUS\r
219EFIAPI\r
220GetDriverImageName (\r
221 IN EFI_HANDLE TheHandle,\r
222 OUT CHAR16 **Name\r
223 )\r
224{\r
225 // get loaded image and devicepathtotext on image->Filepath\r
226 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
227 EFI_STATUS Status;\r
228 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
229\r
230 if (TheHandle == NULL || Name == NULL) {\r
231 return (EFI_INVALID_PARAMETER);\r
232 }\r
233\r
234 Status = gBS->OpenProtocol (\r
235 TheHandle,\r
236 &gEfiLoadedImageProtocolGuid,\r
237 (VOID **) &LoadedImage,\r
238 gImageHandle,\r
239 NULL,\r
240 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
241 );\r
242 if (EFI_ERROR(Status)) {\r
243 return (Status);\r
244 }\r
245 DevicePath = LoadedImage->FilePath;\r
863986b3 246 *Name = ConvertDevicePathToText(DevicePath, TRUE, TRUE);\r
361a8267 247 return (EFI_SUCCESS);\r
248}\r
249\r
250/**\r
251 Display driver model information for a given handle.\r
252 \r
253 @param[in] Handle The handle to display info on.\r
254 @param[in] BestName Use the best name?\r
255 @param[in] Language The language to output in.\r
256**/\r
257EFI_STATUS\r
258EFIAPI\r
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
650EFIAPI\r
651DoDhByHandle(\r
652 IN CONST EFI_HANDLE TheHandle,\r
653 IN CONST BOOLEAN Verbose,\r
654 IN CONST BOOLEAN Sfo,\r
655 IN CONST CHAR8 *Language,\r
656 IN CONST BOOLEAN DriverInfo,\r
657 IN CONST BOOLEAN Multiple\r
658 )\r
659{\r
660 CHAR16 *ProtocolInfoString;\r
661 SHELL_STATUS ShellStatus;\r
4ba49616 662\r
4ba49616 663 ShellStatus = SHELL_SUCCESS;\r
664 ProtocolInfoString = NULL;\r
665\r
666 if (!Sfo) {\r
667 if (Multiple) {\r
361a8267 668 ProtocolInfoString = GetProtocolInfoString(TheHandle, Language, L" ", Verbose, TRUE);\r
4ba49616 669 ShellPrintHiiEx(\r
670 -1,\r
671 -1,\r
672 NULL,\r
673 STRING_TOKEN (STR_DH_OUTPUT),\r
674 gShellDriver1HiiHandle,\r
675 ConvertHandleToHandleIndex(TheHandle),\r
676 ProtocolInfoString==NULL?L"":ProtocolInfoString);\r
677 } else {\r
361a8267 678 ProtocolInfoString = GetProtocolInfoString(TheHandle, Language, L"\r\n", Verbose, TRUE);\r
4ba49616 679 ShellPrintHiiEx(\r
680 -1,\r
681 -1,\r
682 NULL,\r
683 STRING_TOKEN (STR_DH_OUTPUT_SINGLE),\r
684 gShellDriver1HiiHandle,\r
685 ConvertHandleToHandleIndex(TheHandle),\r
686 TheHandle,\r
687 ProtocolInfoString==NULL?L"":ProtocolInfoString);\r
688 }\r
361a8267 689\r
690 if (DriverInfo) {\r
691 DisplayDriverModelHandle ((EFI_HANDLE)TheHandle, TRUE, Language);\r
692 }\r
4ba49616 693 } else {\r
361a8267 694 ProtocolInfoString = GetProtocolInfoString(TheHandle, Language, L";", FALSE, FALSE);\r
4ba49616 695 ShellPrintHiiEx(\r
696 -1,\r
697 -1,\r
698 NULL,\r
699 STRING_TOKEN (STR_DH_OUTPUT_SFO),\r
700 gShellDriver1HiiHandle,\r
701 Multiple ?L"HandlesInfo":L"HandleInfo",\r
702 L"DriverName",\r
703 L"ControllerName",\r
704 ConvertHandleToHandleIndex(TheHandle),\r
705 L"DevPath",\r
706 ProtocolInfoString==NULL?L"":ProtocolInfoString);\r
707\r
708\r
709 }\r
710\r
711\r
712 if (ProtocolInfoString != NULL) {\r
713 FreePool(ProtocolInfoString);\r
714 }\r
715 return (ShellStatus);\r
716}\r
717\r
361a8267 718/**\r
719 Display information for all handles on a list.\r
720\r
721 @param[in] HandleList The NULL-terminated list of handles.\r
f0b0e733 722 @param[in] Verbose TRUE for extra info, FALSE otherwise.\r
361a8267 723 @param[in] Sfo TRUE to output in standard format output (spec).\r
724 @param[in] Language Language string per UEFI specification.\r
725 @param[in] DriverInfo TRUE to show all info about the handle.\r
726\r
727 @retval SHELL_SUCCESS The operation was successful.\r
728 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.\r
729**/\r
4ba49616 730SHELL_STATUS\r
731EFIAPI\r
732DoDhForHandleList(\r
733 IN CONST EFI_HANDLE *HandleList,\r
f0b0e733 734 IN CONST BOOLEAN Verbose,\r
4ba49616 735 IN CONST BOOLEAN Sfo,\r
736 IN CONST CHAR8 *Language,\r
737 IN CONST BOOLEAN DriverInfo\r
738 )\r
739{\r
740 CONST EFI_HANDLE *HandleWalker;\r
741 SHELL_STATUS ShellStatus;\r
742\r
743 ShellStatus = SHELL_SUCCESS;\r
744\r
745 for (HandleWalker = HandleList ; HandleWalker != NULL && *HandleWalker != NULL && ShellStatus == SHELL_SUCCESS; HandleWalker++) {\r
746 ShellStatus = DoDhByHandle(\r
747 *HandleWalker,\r
f0b0e733 748 Verbose,\r
4ba49616 749 Sfo,\r
750 Language,\r
751 DriverInfo,\r
752 TRUE\r
753 );\r
754 }\r
755 return (ShellStatus);\r
756}\r
757\r
361a8267 758/**\r
759 Display information for all handles.\r
760\r
761 @param[in] Sfo TRUE to output in standard format output (spec).\r
f0b0e733 762 @param[in] Verbose TRUE for extra info, FALSE otherwise.\r
361a8267 763 @param[in] Language Language string per UEFI specification.\r
764 @param[in] DriverInfo TRUE to show all info about the handle.\r
765\r
766 @retval SHELL_SUCCESS The operation was successful.\r
767 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.\r
768**/\r
4ba49616 769SHELL_STATUS\r
770EFIAPI\r
771DoDhForAll(\r
772 IN CONST BOOLEAN Sfo,\r
f0b0e733 773 IN CONST BOOLEAN Verbose,\r
4ba49616 774 IN CONST CHAR8 *Language,\r
775 IN CONST BOOLEAN DriverInfo\r
776 )\r
777{\r
778 EFI_HANDLE *HandleList;\r
779 SHELL_STATUS ShellStatus;\r
780\r
781 HandleList = GetHandleListByProtocol(NULL);\r
782\r
783 ShellStatus = DoDhForHandleList(\r
784 HandleList,\r
f0b0e733 785 Verbose,\r
4ba49616 786 Sfo,\r
787 Language,\r
788 DriverInfo);\r
789\r
790 FreePool(HandleList);\r
791\r
792 return (ShellStatus);\r
793}\r
794\r
361a8267 795/**\r
796 Display information for all handles which have a specific protocol.\r
797\r
798 @param[in] ProtocolName The pointer to the name of the protocol.\r
f0b0e733 799 @param[in] Verbose TRUE for extra info, FALSE otherwise.\r
361a8267 800 @param[in] Sfo TRUE to output in standard format output (spec).\r
801 @param[in] Language Language string per UEFI specification.\r
802 @param[in] DriverInfo TRUE to show all info about the handle.\r
803\r
804 @retval SHELL_SUCCESS The operation was successful.\r
805 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.\r
806**/\r
4ba49616 807SHELL_STATUS\r
808EFIAPI\r
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
890 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, ProblemParam);\r
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
898 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle);\r
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
912 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"-l");\r
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
923 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle);\r
924 ShellStatus = SHELL_INVALID_PARAMETER;\r
925 } else if (ShellCommandLineGetValue(Package, L"-p") == NULL) {\r
926 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"-p");\r
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
4ba49616 955 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, Temp2);\r
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