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