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