]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDriver1CommandsLib/Dh.c
ShellPkg: Clean up source files
[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
ba0014b9 5 Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>\r
03a5572b 6 (C) Copyright 2017 Hewlett Packard Enterprise Development LP<BR>\r
4ba49616 7 This program and the accompanying materials\r
8 are licensed and made available under the terms and conditions of the BSD License\r
9 which accompanies this distribution. The full text of the license may be found at\r
10 http://opensource.org/licenses/bsd-license.php\r
11\r
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
14\r
15**/\r
16\r
17#include "UefiShellDriver1CommandsLib.h"\r
18\r
19STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
20 {L"-p", TypeValue},\r
21 {L"-d", TypeFlag},\r
22 {L"-v", TypeFlag},\r
23 {L"-verbose", TypeFlag},\r
24 {L"-sfo", TypeFlag},\r
25 {L"-l", TypeValue},\r
26 {NULL, TypeMax}\r
27 };\r
28\r
29STATIC CONST EFI_GUID *UefiDriverModelProtocolsGuidArray[] = {\r
30 &gEfiDriverBindingProtocolGuid,\r
31 &gEfiPlatformDriverOverrideProtocolGuid,\r
32 &gEfiBusSpecificDriverOverrideProtocolGuid,\r
33 &gEfiDriverDiagnosticsProtocolGuid,\r
34 &gEfiDriverDiagnostics2ProtocolGuid,\r
35 &gEfiComponentNameProtocolGuid,\r
36 &gEfiComponentName2ProtocolGuid,\r
37 &gEfiPlatformToDriverConfigurationProtocolGuid,\r
38 &gEfiDriverSupportedEfiVersionProtocolGuid,\r
39 &gEfiDriverFamilyOverrideProtocolGuid,\r
40 &gEfiDriverHealthProtocolGuid,\r
41 &gEfiLoadedImageProtocolGuid,\r
42 NULL\r
43};\r
44\r
de8cea6f
RN
45UINTN mGuidDataLen[] = {8, 4, 4, 4, 12};\r
46/**\r
47 Function to determine if the string can convert to a GUID.\r
48 The string must be restricted as "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" format.\r
49\r
50 @param[in] String The string to test.\r
51\r
52 @retval TRUE The string can convert to a GUID.\r
53 @retval FALSE The string can't convert to a GUID.\r
54**/\r
55BOOLEAN\r
56IsValidGuidString(\r
57 IN CONST CHAR16 *String\r
58 )\r
59{\r
60 CONST CHAR16 *Walker;\r
61 CONST CHAR16 *PrevWalker;\r
62 UINTN Index;\r
63\r
64 if (String == NULL) {\r
65 return FALSE;\r
66 }\r
67\r
68 Walker = String;\r
69 PrevWalker = String;\r
70 Index = 0;\r
71\r
72 while (Walker != NULL && *Walker != CHAR_NULL) {\r
73 if ( (*Walker >= '0' && *Walker <= '9') ||\r
74 (*Walker >= 'a' && *Walker <= 'f') ||\r
75 (*Walker >= 'A' && *Walker <= 'F')\r
76 ) {\r
77 Walker++;\r
78 } else {\r
810c635d 79 if (*Walker == L'-' && (((UINTN)Walker - (UINTN)PrevWalker) / sizeof (CHAR16)) == mGuidDataLen[Index]) {\r
de8cea6f
RN
80 Walker++;\r
81 PrevWalker = Walker;\r
82 Index++;\r
83 } else {\r
84 return FALSE;\r
85 }\r
86 }\r
87 }\r
88\r
810c635d 89 if ((((UINTN)Walker - (UINTN)PrevWalker) / sizeof (CHAR16)) == mGuidDataLen[Index]) {\r
de8cea6f
RN
90 return TRUE;\r
91 } else {\r
92 return FALSE;\r
93 }\r
94}\r
95\r
96/**\r
97 Convert a hex-character to decimal value.\r
98\r
99 This internal function only deal with Unicode character\r
100 which maps to a valid hexadecimal ASII character, i.e.\r
101 L'0' to L'9', L'a' to L'f' or L'A' to L'F'. For other\r
102 Unicode character, the value returned does not make sense.\r
103\r
104 @param[in] Char The character to convert.\r
105\r
106 @retval The numerical value converted.\r
107**/\r
108UINTN\r
109HexCharToDecimal(\r
110 IN CHAR16 Char\r
111 )\r
112{\r
113 if (Char >= '0' && Char <= '9') {\r
114 return Char - L'0';\r
115 } else if (Char >= 'a' && Char <= 'f') {\r
116 return Char - L'a' + 10;\r
117 } else {\r
118 return Char - L'A' + 10;\r
119 }\r
120}\r
121\r
122/**\r
123 Function try to convert a string to GUID format.\r
124\r
125 @param[in] String The string will be converted.\r
126 @param[out] Guid Save the result convert from string.\r
127\r
128 @retval EFI_SUCCESS The string was successfully converted to a GUID.\r
129 @retval EFI_UNSUPPORTED The input string is not in registry format.\r
130**/\r
131EFI_STATUS\r
132ConvertStrToGuid(\r
133 IN CONST CHAR16 *String,\r
134 OUT GUID *Guid\r
135 )\r
136{\r
137 CONST CHAR16 *Walker;\r
138 UINT8 TempValue;\r
139 UINTN Index;\r
140\r
141 if (String == NULL || !IsValidGuidString (String)) {\r
142 return EFI_UNSUPPORTED;\r
143 }\r
144\r
145 Index = 0;\r
146\r
147 Walker = String;\r
148 Guid->Data1 = (UINT32)StrHexToUint64 (Walker);\r
149\r
150 Walker += 9;\r
151 Guid->Data2 = (UINT16)StrHexToUint64 (Walker);\r
152\r
153 Walker += 5;\r
154 Guid->Data3 = (UINT16)StrHexToUint64 (Walker);\r
155\r
156 Walker += 5;\r
157 while (Walker != NULL && *Walker != CHAR_NULL) {\r
158 if (*Walker == L'-') {\r
159 Walker++;\r
160 } else {\r
161 TempValue = (UINT8)HexCharToDecimal (*Walker);\r
162 TempValue = (UINT8)LShiftU64 (TempValue, 4);\r
163 Walker++;\r
164\r
165 TempValue += (UINT8)HexCharToDecimal (*Walker);\r
166 Walker++;\r
167\r
168 Guid->Data4[Index] = TempValue;\r
169 Index++;\r
170 }\r
171 }\r
172\r
173 return EFI_SUCCESS;\r
174}\r
175\r
361a8267 176/**\r
177 Get the name of a driver by it's handle.\r
178\r
179 If a name is found the memory must be callee freed.\r
180\r
181 @param[in] TheHandle The driver's handle.\r
182 @param[in] Language The language to use.\r
183 @param[in] NameFound Upon a successful return the name found.\r
184\r
185 @retval EFI_SUCCESS The name was found.\r
186**/\r
187EFI_STATUS\r
361a8267 188GetDriverName (\r
189 IN EFI_HANDLE TheHandle,\r
190 IN CONST CHAR8 *Language,\r
191 IN CHAR16 **NameFound\r
192 )\r
193{\r
194 CHAR8 *Lang;\r
361a8267 195 EFI_STATUS Status;\r
196 EFI_COMPONENT_NAME2_PROTOCOL *CompName2;\r
197 CHAR16 *NameToReturn;\r
198 //\r
199 // Go through those handles until we get one that passes for GetComponentName\r
200 //\r
201 Status = gBS->OpenProtocol(\r
202 TheHandle,\r
203 &gEfiComponentName2ProtocolGuid,\r
204 (VOID**)&CompName2,\r
205 gImageHandle,\r
206 NULL,\r
207 EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
208 if (EFI_ERROR(Status)) {\r
209 Status = gBS->OpenProtocol(\r
210 TheHandle,\r
211 &gEfiComponentNameProtocolGuid,\r
212 (VOID**)&CompName2,\r
213 gImageHandle,\r
214 NULL,\r
215 EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
216 }\r
217\r
218 if (EFI_ERROR(Status)) {\r
219 return (EFI_NOT_FOUND);\r
220 }\r
a71003f2 221 Lang = GetBestLanguageForDriver (CompName2->SupportedLanguages, Language, FALSE);\r
361a8267 222 Status = CompName2->GetDriverName(CompName2, Lang, &NameToReturn);\r
223 FreePool(Lang);\r
224\r
225 if (!EFI_ERROR(Status) && NameToReturn != NULL) {\r
226 *NameFound = NULL;\r
227 StrnCatGrow(NameFound, NULL, NameToReturn, 0);\r
228 }\r
229 return (Status);\r
230}\r
231\r
232/**\r
233 Discover if a protocol guid is one of the UEFI Driver Model Protocols.\r
234\r
235 @param[in] Guid The guid to test.\r
236\r
237 @retval TRUE The guid does represent a driver model protocol.\r
238 @retval FALSE The guid does not represent a driver model protocol.\r
239**/\r
4ba49616 240BOOLEAN\r
4ba49616 241IsDriverProt (\r
242 IN CONST EFI_GUID *Guid\r
243 )\r
244{\r
245 CONST EFI_GUID **GuidWalker;\r
246 BOOLEAN GuidFound;\r
247 GuidFound = FALSE;\r
248 for (GuidWalker = UefiDriverModelProtocolsGuidArray\r
249 ; GuidWalker != NULL && *GuidWalker != NULL\r
250 ; GuidWalker++\r
251 ){\r
252 if (CompareGuid(*GuidWalker, Guid)) {\r
253 GuidFound = TRUE;\r
254 break;\r
255 }\r
256 }\r
257 return (GuidFound);\r
258}\r
259\r
361a8267 260/**\r
261 Get information for a handle.\r
262\r
263 @param[in] TheHandle The handles to show info on.\r
264 @param[in] Language Language string per UEFI specification.\r
268d3445 265 @param[in] Separator Separator string between information blocks.\r
361a8267 266 @param[in] Verbose TRUE for extra info, FALSE otherwise.\r
267 @param[in] ExtraInfo TRUE for extra info, FALSE otherwise.\r
268\r
269 @retval SHELL_SUCCESS The operation was successful.\r
270 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.\r
271**/\r
4ba49616 272CHAR16*\r
4ba49616 273GetProtocolInfoString(\r
274 IN CONST EFI_HANDLE TheHandle,\r
275 IN CONST CHAR8 *Language,\r
268d3445 276 IN CONST CHAR16 *Separator,\r
4ba49616 277 IN CONST BOOLEAN Verbose,\r
278 IN CONST BOOLEAN ExtraInfo\r
279 )\r
280{\r
281 EFI_GUID **ProtocolGuidArray;\r
282 UINTN ArrayCount;\r
283 UINTN ProtocolIndex;\r
284 EFI_STATUS Status;\r
285 CHAR16 *RetVal;\r
286 UINTN Size;\r
287 CHAR16 *Temp;\r
0e88348e 288 CHAR16 GuidStr[40];\r
b6e0f0c6 289 VOID *Instance;\r
7f04c460 290 CHAR16 InstanceStr[17];\r
4ba49616 291\r
292 ProtocolGuidArray = NULL;\r
361a8267 293 RetVal = NULL;\r
294 Size = 0;\r
4ba49616 295\r
296 Status = gBS->ProtocolsPerHandle (\r
297 TheHandle,\r
298 &ProtocolGuidArray,\r
299 &ArrayCount\r
300 );\r
301 if (!EFI_ERROR (Status)) {\r
4ba49616 302 for (ProtocolIndex = 0; ProtocolIndex < ArrayCount; ProtocolIndex++) {\r
303 Temp = GetStringNameFromGuid(ProtocolGuidArray[ProtocolIndex], Language);\r
0e88348e
RN
304 ASSERT((RetVal == NULL && Size == 0) || (RetVal != NULL));\r
305 if (Size != 0) {\r
306 StrnCatGrow(&RetVal, &Size, Separator, 0);\r
307 }\r
308 StrnCatGrow(&RetVal, &Size, L"%H", 0);\r
309 if (Temp == NULL) {\r
310 UnicodeSPrint (GuidStr, sizeof (GuidStr), L"%g", ProtocolGuidArray[ProtocolIndex]);\r
311 StrnCatGrow (&RetVal, &Size, GuidStr, 0);\r
312 } else {\r
4ba49616 313 StrnCatGrow(&RetVal, &Size, Temp, 0);\r
4ba49616 314 FreePool(Temp);\r
315 }\r
0e88348e 316 StrnCatGrow(&RetVal, &Size, L"%N", 0);\r
7f04c460
HL
317\r
318 if(Verbose) {\r
b6e0f0c6 319 Status = gBS->HandleProtocol (TheHandle, ProtocolGuidArray[ProtocolIndex], &Instance);\r
7f04c460
HL
320 if (!EFI_ERROR (Status)) {\r
321 StrnCatGrow (&RetVal, &Size, L"(%H", 0);\r
b6e0f0c6 322 UnicodeSPrint (InstanceStr, sizeof (InstanceStr), L"%x", Instance);\r
7f04c460
HL
323 StrnCatGrow (&RetVal, &Size, InstanceStr, 0);\r
324 StrnCatGrow (&RetVal, &Size, L"%N)", 0);\r
325 }\r
326 }\r
327\r
4ba49616 328 if (ExtraInfo) {\r
329 Temp = GetProtocolInformationDump(TheHandle, ProtocolGuidArray[ProtocolIndex], Verbose);\r
330 if (Temp != NULL) {\r
331 ASSERT((RetVal == NULL && Size == 0) || (RetVal != NULL));\r
332 if (!Verbose) {\r
333 StrnCatGrow(&RetVal, &Size, L"(", 0);\r
334 StrnCatGrow(&RetVal, &Size, Temp, 0);\r
590351cf 335 StrnCatGrow(&RetVal, &Size, L")", 0);\r
4ba49616 336 } else {\r
268d3445 337 StrnCatGrow(&RetVal, &Size, Separator, 0);\r
4ba49616 338 StrnCatGrow(&RetVal, &Size, Temp, 0);\r
339 }\r
340 FreePool(Temp);\r
341 }\r
342 }\r
343 }\r
4ba49616 344 }\r
ba0014b9 345\r
361a8267 346 SHELL_FREE_NON_NULL(ProtocolGuidArray);\r
4ba49616 347\r
361a8267 348 if (RetVal == NULL) {\r
349 return (NULL);\r
4ba49616 350 }\r
361a8267 351\r
4ba49616 352 ASSERT((RetVal == NULL && Size == 0) || (RetVal != NULL));\r
268d3445 353 StrnCatGrow(&RetVal, &Size, Separator, 0);\r
4ba49616 354 return (RetVal);\r
355}\r
356\r
361a8267 357/**\r
358 Gets the name of the loaded image.\r
359\r
360 @param[in] TheHandle The handle of the driver to get info on.\r
361 @param[out] Name The pointer to the pointer. Valid upon a successful return.\r
362\r
363 @retval EFI_SUCCESS The operation was successful.\r
364**/\r
365EFI_STATUS\r
361a8267 366GetDriverImageName (\r
367 IN EFI_HANDLE TheHandle,\r
368 OUT CHAR16 **Name\r
369 )\r
370{\r
371 // get loaded image and devicepathtotext on image->Filepath\r
372 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
373 EFI_STATUS Status;\r
374 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
375\r
376 if (TheHandle == NULL || Name == NULL) {\r
377 return (EFI_INVALID_PARAMETER);\r
378 }\r
379\r
380 Status = gBS->OpenProtocol (\r
381 TheHandle,\r
382 &gEfiLoadedImageProtocolGuid,\r
383 (VOID **) &LoadedImage,\r
384 gImageHandle,\r
385 NULL,\r
386 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
387 );\r
388 if (EFI_ERROR(Status)) {\r
389 return (Status);\r
390 }\r
391 DevicePath = LoadedImage->FilePath;\r
863986b3 392 *Name = ConvertDevicePathToText(DevicePath, TRUE, TRUE);\r
361a8267 393 return (EFI_SUCCESS);\r
394}\r
395\r
396/**\r
397 Display driver model information for a given handle.\r
ba0014b9 398\r
361a8267 399 @param[in] Handle The handle to display info on.\r
400 @param[in] BestName Use the best name?\r
401 @param[in] Language The language to output in.\r
402**/\r
403EFI_STATUS\r
361a8267 404DisplayDriverModelHandle (\r
405 IN EFI_HANDLE Handle,\r
406 IN BOOLEAN BestName,\r
407 IN CONST CHAR8 *Language OPTIONAL\r
408 )\r
409{\r
410 EFI_STATUS Status;\r
411 BOOLEAN ConfigurationStatus;\r
412 BOOLEAN DiagnosticsStatus;\r
413 UINTN DriverBindingHandleCount;\r
414 EFI_HANDLE *DriverBindingHandleBuffer;\r
415 UINTN ParentControllerHandleCount;\r
416 EFI_HANDLE *ParentControllerHandleBuffer;\r
417 UINTN ChildControllerHandleCount;\r
418 EFI_HANDLE *ChildControllerHandleBuffer;\r
419 CHAR16 *TempStringPointer;\r
420 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
421 UINTN Index;\r
422 CHAR16 *DriverName;\r
423 EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;\r
424 UINTN NumberOfChildren;\r
425 UINTN HandleIndex;\r
426 UINTN ControllerHandleCount;\r
427 EFI_HANDLE *ControllerHandleBuffer;\r
428 UINTN ChildIndex;\r
429 BOOLEAN Image;\r
430\r
0d807dae
ED
431 DriverName = NULL;\r
432\r
361a8267 433 //\r
434 // See if Handle is a device handle and display its details.\r
435 //\r
436 DriverBindingHandleBuffer = NULL;\r
437 Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS (\r
438 Handle,\r
439 &DriverBindingHandleCount,\r
440 &DriverBindingHandleBuffer\r
441 );\r
442\r
443 ParentControllerHandleBuffer = NULL;\r
444 Status = PARSE_HANDLE_DATABASE_PARENTS (\r
445 Handle,\r
446 &ParentControllerHandleCount,\r
447 &ParentControllerHandleBuffer\r
448 );\r
449\r
450 ChildControllerHandleBuffer = NULL;\r
451 Status = ParseHandleDatabaseForChildControllers (\r
452 Handle,\r
453 &ChildControllerHandleCount,\r
454 &ChildControllerHandleBuffer\r
455 );\r
456\r
457 DiagnosticsStatus = FALSE;\r
458 ConfigurationStatus = FALSE;\r
459\r
460 if (!EFI_ERROR(gBS->OpenProtocol(Handle, &gEfiDriverConfigurationProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
461 ConfigurationStatus = TRUE;\r
462 }\r
463 if (!EFI_ERROR(gBS->OpenProtocol(Handle, &gEfiDriverConfiguration2ProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
464 ConfigurationStatus = TRUE;\r
465 }\r
466 if (!EFI_ERROR(gBS->OpenProtocol(Handle, &gEfiDriverDiagnosticsProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
467 DiagnosticsStatus = TRUE;\r
468 }\r
469 if (!EFI_ERROR(gBS->OpenProtocol(Handle, &gEfiDriverDiagnostics2ProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
470 DiagnosticsStatus = TRUE;\r
471 }\r
472\r
473 Status = EFI_SUCCESS;\r
474\r
475 if (DriverBindingHandleCount > 0 || ParentControllerHandleCount > 0 || ChildControllerHandleCount > 0) {\r
476\r
477\r
478\r
479 DevicePath = NULL;\r
480 TempStringPointer = NULL;\r
481 Status = gBS->HandleProtocol (Handle, &gEfiDevicePathProtocolGuid, (VOID**)&DevicePath);\r
482\r
483 Status = gEfiShellProtocol->GetDeviceName(Handle, EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8*)Language, &TempStringPointer);\r
484 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_DRIVER1), gShellDriver1HiiHandle, TempStringPointer!=NULL?TempStringPointer:L"<Unknown>");\r
485 SHELL_FREE_NON_NULL(TempStringPointer);\r
ba0014b9 486\r
863986b3 487 TempStringPointer = ConvertDevicePathToText(DevicePath, TRUE, FALSE);\r
361a8267 488 ShellPrintHiiEx(\r
ba0014b9
LG
489 -1,\r
490 -1,\r
491 NULL,\r
492 STRING_TOKEN (STR_DH_OUTPUT_DRIVER2),\r
493 gShellDriver1HiiHandle,\r
361a8267 494 TempStringPointer!=NULL?TempStringPointer:L"<None>",\r
495 ParentControllerHandleCount == 0?L"ROOT":(ChildControllerHandleCount > 0)?L"BUS":L"DEVICE",\r
496 ConfigurationStatus?L"YES":L"NO",\r
497 DiagnosticsStatus?L"YES":L"NO"\r
498 );\r
499\r
500 SHELL_FREE_NON_NULL(TempStringPointer);\r
501\r
502 if (DriverBindingHandleCount == 0) {\r
503 ShellPrintHiiEx(\r
ba0014b9
LG
504 -1,\r
505 -1,\r
506 NULL,\r
507 STRING_TOKEN (STR_DH_OUTPUT_DRIVER3),\r
508 gShellDriver1HiiHandle,\r
361a8267 509 L"<None>"\r
510 );\r
511 } else {\r
512 ShellPrintHiiEx(\r
ba0014b9
LG
513 -1,\r
514 -1,\r
515 NULL,\r
516 STRING_TOKEN (STR_DH_OUTPUT_DRIVER3),\r
517 gShellDriver1HiiHandle,\r
361a8267 518 L""\r
519 );\r
520 for (Index = 0; Index < DriverBindingHandleCount; Index++) {\r
521 Image = FALSE;\r
522 Status = GetDriverName (\r
523 DriverBindingHandleBuffer[Index],\r
524 Language,\r
525 &DriverName\r
526 );\r
f330ff35 527 if (EFI_ERROR (Status)) {\r
361a8267 528 Status = GetDriverImageName (\r
529 DriverBindingHandleBuffer[Index],\r
530 &DriverName\r
531 );\r
f330ff35 532 if (EFI_ERROR (Status)) {\r
533 DriverName = NULL;\r
534 }\r
361a8267 535 }\r
536\r
537 if (Image) {\r
538 ShellPrintHiiEx(\r
ba0014b9
LG
539 -1,\r
540 -1,\r
541 NULL,\r
361a8267 542 STRING_TOKEN (STR_DH_OUTPUT_DRIVER4A),\r
543 gShellDriver1HiiHandle,\r
544 ConvertHandleToHandleIndex (DriverBindingHandleBuffer[Index]),\r
545 DriverName!=NULL?DriverName:L"<Unknown>"\r
546 );\r
547 } else {\r
548 ShellPrintHiiEx(\r
ba0014b9
LG
549 -1,\r
550 -1,\r
551 NULL,\r
361a8267 552 STRING_TOKEN (STR_DH_OUTPUT_DRIVER4B),\r
553 gShellDriver1HiiHandle,\r
554 ConvertHandleToHandleIndex (DriverBindingHandleBuffer[Index]),\r
555 DriverName!=NULL?DriverName:L"<Unknown>"\r
556 );\r
557 }\r
558 SHELL_FREE_NON_NULL(DriverName);\r
559 }\r
560 }\r
561\r
562 if (ParentControllerHandleCount == 0) {\r
563 ShellPrintHiiEx(\r
ba0014b9
LG
564 -1,\r
565 -1,\r
566 NULL,\r
567 STRING_TOKEN (STR_DH_OUTPUT_DRIVER5),\r
568 gShellDriver1HiiHandle,\r
361a8267 569 L"<None>"\r
570 );\r
571 } else {\r
572 ShellPrintHiiEx(\r
ba0014b9
LG
573 -1,\r
574 -1,\r
575 NULL,\r
576 STRING_TOKEN (STR_DH_OUTPUT_DRIVER5),\r
577 gShellDriver1HiiHandle,\r
361a8267 578 L""\r
579 );\r
580 for (Index = 0; Index < ParentControllerHandleCount; Index++) {\r
581 Status = gEfiShellProtocol->GetDeviceName(ParentControllerHandleBuffer[Index], EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8*)Language, &TempStringPointer);\r
582 ShellPrintHiiEx(\r
ba0014b9
LG
583 -1,\r
584 -1,\r
585 NULL,\r
361a8267 586 STRING_TOKEN (STR_DH_OUTPUT_DRIVER5B),\r
587 gShellDriver1HiiHandle,\r
588 ConvertHandleToHandleIndex (ParentControllerHandleBuffer[Index]),\r
589 TempStringPointer!=NULL?TempStringPointer:L"<Unknown>"\r
590 );\r
591 SHELL_FREE_NON_NULL(TempStringPointer);\r
592 }\r
593 }\r
594\r
595 if (ChildControllerHandleCount == 0) {\r
596 ShellPrintHiiEx(\r
ba0014b9
LG
597 -1,\r
598 -1,\r
599 NULL,\r
600 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6),\r
601 gShellDriver1HiiHandle,\r
361a8267 602 L"<None>"\r
603 );\r
604 } else {\r
605 ShellPrintHiiEx(\r
ba0014b9
LG
606 -1,\r
607 -1,\r
608 NULL,\r
609 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6),\r
610 gShellDriver1HiiHandle,\r
361a8267 611 L""\r
612 );\r
613 for (Index = 0; Index < ChildControllerHandleCount; Index++) {\r
614 Status = gEfiShellProtocol->GetDeviceName(ChildControllerHandleBuffer[Index], EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8*)Language, &TempStringPointer);\r
615 ShellPrintHiiEx(\r
ba0014b9
LG
616 -1,\r
617 -1,\r
618 NULL,\r
361a8267 619 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6B),\r
620 gShellDriver1HiiHandle,\r
621 ConvertHandleToHandleIndex (ChildControllerHandleBuffer[Index]),\r
622 TempStringPointer!=NULL?TempStringPointer:L"<Unknown>"\r
623 );\r
624 SHELL_FREE_NON_NULL(TempStringPointer);\r
625 }\r
626 }\r
627 }\r
628\r
629 SHELL_FREE_NON_NULL(DriverBindingHandleBuffer);\r
630\r
631 SHELL_FREE_NON_NULL(ParentControllerHandleBuffer);\r
632\r
633 SHELL_FREE_NON_NULL(ChildControllerHandleBuffer);\r
634\r
635 if (EFI_ERROR (Status)) {\r
636 return Status;\r
637 }\r
638 //\r
639 // See if Handle is a driver binding handle and display its details.\r
640 //\r
641 Status = gBS->OpenProtocol (\r
642 Handle,\r
643 &gEfiDriverBindingProtocolGuid,\r
644 (VOID **) &DriverBinding,\r
645 NULL,\r
646 NULL,\r
647 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
648 );\r
649 if (EFI_ERROR (Status)) {\r
650 return EFI_SUCCESS;\r
651 }\r
652\r
653 NumberOfChildren = 0;\r
654 ControllerHandleBuffer = NULL;\r
655 Status = PARSE_HANDLE_DATABASE_DEVICES (\r
656 Handle,\r
657 &ControllerHandleCount,\r
658 &ControllerHandleBuffer\r
659 );\r
660 if (ControllerHandleCount > 0) {\r
661 for (HandleIndex = 0; HandleIndex < ControllerHandleCount; HandleIndex++) {\r
662 Status = PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (\r
663 Handle,\r
664 ControllerHandleBuffer[HandleIndex],\r
665 &ChildControllerHandleCount,\r
666 NULL\r
667 );\r
668 NumberOfChildren += ChildControllerHandleCount;\r
669 }\r
670 }\r
671\r
672 Status = GetDriverName (Handle, Language, &DriverName);\r
f330ff35 673 if (EFI_ERROR (Status)) {\r
674 DriverName = NULL;\r
675 }\r
361a8267 676\r
677 ShellPrintHiiEx(\r
ba0014b9
LG
678 -1,\r
679 -1,\r
680 NULL,\r
03a5572b 681 STRING_TOKEN (STR_DH_OUTPUT_DRIVER7),\r
361a8267 682 gShellDriver1HiiHandle,\r
683 ConvertHandleToHandleIndex(Handle),\r
684 DriverName!=NULL?DriverName:L"<Unknown>"\r
685 );\r
686 SHELL_FREE_NON_NULL(DriverName);\r
361a8267 687 Status = GetDriverImageName (\r
688 Handle,\r
689 &DriverName\r
690 );\r
f330ff35 691 if (EFI_ERROR (Status)) {\r
692 DriverName = NULL;\r
693 }\r
361a8267 694 ShellPrintHiiEx(\r
ba0014b9
LG
695 -1,\r
696 -1,\r
697 NULL,\r
361a8267 698 STRING_TOKEN (STR_DH_OUTPUT_DRIVER7B),\r
699 gShellDriver1HiiHandle,\r
700 DriverName!=NULL?DriverName:L"<Unknown>"\r
701 );\r
702 SHELL_FREE_NON_NULL(DriverName);\r
703\r
704 ShellPrintHiiEx(\r
ba0014b9
LG
705 -1,\r
706 -1,\r
707 NULL,\r
708 STRING_TOKEN (STR_DH_OUTPUT_DRIVER8),\r
709 gShellDriver1HiiHandle,\r
361a8267 710 DriverBinding->Version,\r
711 NumberOfChildren > 0?L"Bus":ControllerHandleCount > 0?L"Device":L"<Unknown>",\r
712 ConfigurationStatus?L"YES":L"NO",\r
713 DiagnosticsStatus?L"YES":L"NO"\r
714 );\r
715\r
716 if (ControllerHandleCount == 0) {\r
717 ShellPrintHiiEx(\r
ba0014b9
LG
718 -1,\r
719 -1,\r
720 NULL,\r
5bfd23eb 721 STRING_TOKEN (STR_DH_OUTPUT_DRIVER9),\r
ba0014b9 722 gShellDriver1HiiHandle,\r
361a8267 723 L"None"\r
724 );\r
725 } else {\r
726 ShellPrintHiiEx(\r
ba0014b9
LG
727 -1,\r
728 -1,\r
729 NULL,\r
5bfd23eb 730 STRING_TOKEN (STR_DH_OUTPUT_DRIVER9),\r
ba0014b9 731 gShellDriver1HiiHandle,\r
361a8267 732 L""\r
733 );\r
734 for (HandleIndex = 0; HandleIndex < ControllerHandleCount; HandleIndex++) {\r
735 Status = gEfiShellProtocol->GetDeviceName(ControllerHandleBuffer[HandleIndex], EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8*)Language, &TempStringPointer);\r
736\r
737 ShellPrintHiiEx(\r
ba0014b9
LG
738 -1,\r
739 -1,\r
740 NULL,\r
361a8267 741 STRING_TOKEN (STR_DH_OUTPUT_DRIVER9B),\r
742 gShellDriver1HiiHandle,\r
743 ConvertHandleToHandleIndex(ControllerHandleBuffer[HandleIndex]),\r
744 TempStringPointer!=NULL?TempStringPointer:L"<Unknown>"\r
745 );\r
746 SHELL_FREE_NON_NULL(TempStringPointer);\r
747\r
748 Status = PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (\r
749 Handle,\r
750 ControllerHandleBuffer[HandleIndex],\r
751 &ChildControllerHandleCount,\r
752 &ChildControllerHandleBuffer\r
753 );\r
754 if (!EFI_ERROR (Status)) {\r
755 for (ChildIndex = 0; ChildIndex < ChildControllerHandleCount; ChildIndex++) {\r
756 Status = gEfiShellProtocol->GetDeviceName(ChildControllerHandleBuffer[ChildIndex], EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8*)Language, &TempStringPointer);\r
757\r
758 ShellPrintHiiEx(\r
ba0014b9
LG
759 -1,\r
760 -1,\r
761 NULL,\r
5bfd23eb 762 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6C),\r
361a8267 763 gShellDriver1HiiHandle,\r
764 ConvertHandleToHandleIndex(ChildControllerHandleBuffer[ChildIndex]),\r
765 TempStringPointer!=NULL?TempStringPointer:L"<Unknown>"\r
766 );\r
767 SHELL_FREE_NON_NULL(TempStringPointer);\r
768 }\r
769\r
770 SHELL_FREE_NON_NULL (ChildControllerHandleBuffer);\r
771 }\r
772 }\r
773\r
774 SHELL_FREE_NON_NULL (ControllerHandleBuffer);\r
775 }\r
776\r
777 return EFI_SUCCESS;\r
778}\r
779\r
780/**\r
781 Display information for a handle.\r
782\r
783 @param[in] TheHandle The handles to show info on.\r
784 @param[in] Verbose TRUE for extra info, FALSE otherwise.\r
785 @param[in] Sfo TRUE to output in standard format output (spec).\r
786 @param[in] Language Language string per UEFI specification.\r
787 @param[in] DriverInfo TRUE to show all info about the handle.\r
788 @param[in] Multiple TRUE indicates more than will be output,\r
789 FALSE for a single one.\r
361a8267 790**/\r
28f898f8 791VOID\r
4ba49616 792DoDhByHandle(\r
793 IN CONST EFI_HANDLE TheHandle,\r
794 IN CONST BOOLEAN Verbose,\r
795 IN CONST BOOLEAN Sfo,\r
796 IN CONST CHAR8 *Language,\r
797 IN CONST BOOLEAN DriverInfo,\r
798 IN CONST BOOLEAN Multiple\r
799 )\r
800{\r
28f898f8 801 CHAR16 *ProtocolInfoString;\r
4ba49616 802\r
4ba49616 803 ProtocolInfoString = NULL;\r
804\r
805 if (!Sfo) {\r
806 if (Multiple) {\r
361a8267 807 ProtocolInfoString = GetProtocolInfoString(TheHandle, Language, L" ", Verbose, TRUE);\r
4ba49616 808 ShellPrintHiiEx(\r
809 -1,\r
810 -1,\r
811 NULL,\r
812 STRING_TOKEN (STR_DH_OUTPUT),\r
813 gShellDriver1HiiHandle,\r
814 ConvertHandleToHandleIndex(TheHandle),\r
28f898f8
CC
815 ProtocolInfoString==NULL?L"":ProtocolInfoString\r
816 );\r
4ba49616 817 } else {\r
590351cf
HL
818 ProtocolInfoString = GetProtocolInfoString(TheHandle, Language, Verbose ? L"\r\n" : L" ", Verbose, TRUE);\r
819 if (Verbose) {\r
820 ShellPrintHiiEx(\r
821 -1,\r
822 -1,\r
823 NULL,\r
824 STRING_TOKEN (STR_DH_OUTPUT_SINGLE),\r
825 gShellDriver1HiiHandle,\r
826 ConvertHandleToHandleIndex(TheHandle),\r
827 TheHandle,\r
828 ProtocolInfoString==NULL?L"":ProtocolInfoString\r
829 );\r
830 } else {\r
831 ShellPrintHiiEx(\r
832 -1,\r
833 -1,\r
834 NULL,\r
835 STRING_TOKEN (STR_DH_OUTPUT_SINGLE_D),\r
836 gShellDriver1HiiHandle,\r
837 ConvertHandleToHandleIndex(TheHandle),\r
838 ProtocolInfoString==NULL?L"":ProtocolInfoString\r
839 );\r
840 }\r
4ba49616 841 }\r
361a8267 842\r
843 if (DriverInfo) {\r
844 DisplayDriverModelHandle ((EFI_HANDLE)TheHandle, TRUE, Language);\r
845 }\r
4ba49616 846 } else {\r
361a8267 847 ProtocolInfoString = GetProtocolInfoString(TheHandle, Language, L";", FALSE, FALSE);\r
4ba49616 848 ShellPrintHiiEx(\r
849 -1,\r
850 -1,\r
851 NULL,\r
852 STRING_TOKEN (STR_DH_OUTPUT_SFO),\r
853 gShellDriver1HiiHandle,\r
854 Multiple ?L"HandlesInfo":L"HandleInfo",\r
855 L"DriverName",\r
856 L"ControllerName",\r
857 ConvertHandleToHandleIndex(TheHandle),\r
858 L"DevPath",\r
28f898f8
CC
859 ProtocolInfoString==NULL?L"":ProtocolInfoString\r
860 );\r
4ba49616 861 }\r
862\r
4ba49616 863 if (ProtocolInfoString != NULL) {\r
864 FreePool(ProtocolInfoString);\r
865 }\r
4ba49616 866}\r
867\r
361a8267 868/**\r
869 Display information for all handles on a list.\r
870\r
871 @param[in] HandleList The NULL-terminated list of handles.\r
f0b0e733 872 @param[in] Verbose TRUE for extra info, FALSE otherwise.\r
361a8267 873 @param[in] Sfo TRUE to output in standard format output (spec).\r
874 @param[in] Language Language string per UEFI specification.\r
875 @param[in] DriverInfo TRUE to show all info about the handle.\r
876\r
28f898f8
CC
877 @retval SHELL_SUCCESS The operation was successful.\r
878 @retval SHELL_ABORTED The operation was aborted.\r
361a8267 879**/\r
4ba49616 880SHELL_STATUS\r
4ba49616 881DoDhForHandleList(\r
882 IN CONST EFI_HANDLE *HandleList,\r
f0b0e733 883 IN CONST BOOLEAN Verbose,\r
4ba49616 884 IN CONST BOOLEAN Sfo,\r
885 IN CONST CHAR8 *Language,\r
886 IN CONST BOOLEAN DriverInfo\r
887 )\r
888{\r
889 CONST EFI_HANDLE *HandleWalker;\r
890 SHELL_STATUS ShellStatus;\r
891\r
892 ShellStatus = SHELL_SUCCESS;\r
de8cea6f 893 for (HandleWalker = HandleList; HandleWalker != NULL && *HandleWalker != NULL; HandleWalker++) {\r
28f898f8 894 DoDhByHandle (*HandleWalker, Verbose, Sfo, Language, DriverInfo, TRUE);\r
376e7593
TS
895 if (ShellGetExecutionBreakFlag ()) {\r
896 ShellStatus = SHELL_ABORTED;\r
897 break;\r
898 }\r
4ba49616 899 }\r
900 return (ShellStatus);\r
901}\r
902\r
361a8267 903/**\r
de8cea6f 904 Display information for a GUID of protocol.\r
361a8267 905\r
de8cea6f 906 @param[in] Guid The pointer to the name of the protocol.\r
f0b0e733 907 @param[in] Verbose TRUE for extra info, FALSE otherwise.\r
de8cea6f 908 @param[in] Sfo TRUE to output in standard format output (spec).\r
361a8267 909 @param[in] Language Language string per UEFI specification.\r
910 @param[in] DriverInfo TRUE to show all info about the handle.\r
911\r
912 @retval SHELL_SUCCESS The operation was successful.\r
de8cea6f 913 @retval SHELL_NOT_FOUND The GUID was not found.\r
361a8267 914 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.\r
915**/\r
4ba49616 916SHELL_STATUS\r
de8cea6f
RN
917DoDhByProtocolGuid(\r
918 IN CONST GUID *Guid,\r
f0b0e733 919 IN CONST BOOLEAN Verbose,\r
de8cea6f 920 IN CONST BOOLEAN Sfo,\r
4ba49616 921 IN CONST CHAR8 *Language,\r
922 IN CONST BOOLEAN DriverInfo\r
923 )\r
924{\r
de8cea6f 925 CHAR16 *Name;\r
4ba49616 926 SHELL_STATUS ShellStatus;\r
de8cea6f 927 EFI_HANDLE *HandleList;\r
4ba49616 928\r
de8cea6f
RN
929 if (!Sfo) {\r
930 if (Guid == NULL) {\r
931 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_ALL_HEADER), gShellDriver1HiiHandle);\r
932 } else {\r
933 Name = GetStringNameFromGuid (Guid, NULL);\r
934 if (Name == NULL) {\r
935 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_GUID_HEADER), gShellDriver1HiiHandle, Guid);\r
936 } else {\r
937 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_NAME_HEADER), gShellDriver1HiiHandle, Name);\r
938 }\r
939 }\r
940 }\r
941 HandleList = GetHandleListByProtocol(Guid);\r
942 ShellStatus = DoDhForHandleList(HandleList, Verbose, Sfo, Language, DriverInfo);\r
943 SHELL_FREE_NON_NULL(HandleList);\r
4ba49616 944\r
de8cea6f 945 return ShellStatus;\r
4ba49616 946}\r
947\r
361a8267 948/**\r
de8cea6f
RN
949 Function to determine use which method to print information.\r
950 If Protocol is NULL, The function will print all information.\r
361a8267 951\r
de8cea6f 952 @param[in] Protocol The pointer to the name or GUID of protocol or NULL.\r
f0b0e733 953 @param[in] Verbose TRUE for extra info, FALSE otherwise.\r
361a8267 954 @param[in] Sfo TRUE to output in standard format output (spec).\r
955 @param[in] Language Language string per UEFI specification.\r
956 @param[in] DriverInfo TRUE to show all info about the handle.\r
957\r
de8cea6f
RN
958 @retval SHELL_SUCCESS The operation was successful.\r
959 @retval SHELL_NOT_FOUND The protocol was not found.\r
960 @retval SHELL_INVALID_PARAMETER Protocol is invalid parameter.\r
361a8267 961**/\r
4ba49616 962SHELL_STATUS\r
de8cea6f
RN
963DoDhByProtocol (\r
964 IN CONST CHAR16 *Protocol,\r
f0b0e733 965 IN CONST BOOLEAN Verbose,\r
4ba49616 966 IN CONST BOOLEAN Sfo,\r
967 IN CONST CHAR8 *Language,\r
968 IN CONST BOOLEAN DriverInfo\r
969 )\r
970{\r
de8cea6f
RN
971 EFI_GUID Guid;\r
972 EFI_GUID *GuidPtr;\r
4ba49616 973 EFI_STATUS Status;\r
4ba49616 974\r
de8cea6f
RN
975 if (Protocol == NULL) {\r
976 return DoDhByProtocolGuid (NULL, Verbose, Sfo, Language, DriverInfo);\r
977 } else {\r
978 Status = ConvertStrToGuid (Protocol, &Guid);\r
979 if (!EFI_ERROR (Status)) {\r
980 GuidPtr = &Guid;\r
981 } else {\r
982 //\r
983 // Protocol is a Name, convert it to GUID\r
984 //\r
985 Status = GetGuidFromStringName (Protocol, Language, &GuidPtr);\r
986 if (EFI_ERROR(Status)) {\r
987 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_NO_NAME_FOUND), gShellDriver1HiiHandle, Protocol);\r
988 return (SHELL_NOT_FOUND);\r
989 }\r
990 }\r
4ba49616 991\r
de8cea6f 992 return DoDhByProtocolGuid (GuidPtr, Verbose, Sfo, Language, DriverInfo);\r
4ba49616 993 }\r
de8cea6f 994}\r
4ba49616 995\r
de8cea6f
RN
996/**\r
997 Function to display decode information by Protocol.\r
998 The parameter Protocol is either a GUID or the name of protocol.\r
999 If the parameter Protocol is NULL, the function will print all\r
1000 decode information.\r
4ba49616 1001\r
de8cea6f
RN
1002 @param[in] Protocol The pointer to the name or GUID of protocol.\r
1003 @param[in] Language Language string per UEFI specification.\r
4ba49616 1004\r
de8cea6f
RN
1005 @retval SHELL_SUCCESS The operation was successful.\r
1006 @retval SHELL_OUT_OT_RESOURCES A memory allocation failed.\r
1007**/\r
1008SHELL_STATUS\r
1009DoDecodeByProtocol(\r
1010 IN CONST CHAR16 *Protocol,\r
1011 IN CONST CHAR8 *Language\r
1012 )\r
1013{\r
1014 EFI_STATUS Status;\r
1015 EFI_GUID *Guids;\r
1016 EFI_GUID Guid;\r
1017 UINTN Counts;\r
1018 UINTN Index;\r
1019 CHAR16 *Name;\r
1020\r
1021 if (Protocol == NULL) {\r
1022 Counts = 0;\r
1023 Status = GetAllMappingGuids (NULL, &Counts);\r
1024 if (Status == EFI_BUFFER_TOO_SMALL) {\r
1025 Guids = AllocatePool (Counts * sizeof(EFI_GUID));\r
1026 if (Guids == NULL) {\r
1027 return SHELL_OUT_OF_RESOURCES;\r
1028 }\r
4ba49616 1029\r
de8cea6f
RN
1030 Status = GetAllMappingGuids (Guids, &Counts);\r
1031 if (Status == EFI_SUCCESS) {\r
1032 for (Index = 0; Index < Counts; Index++) {\r
1033 Name = GetStringNameFromGuid (&Guids[Index], Language);\r
1034 if (Name != NULL) {\r
1035 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_DECODE), gShellDriver1HiiHandle, Name, &Guids[Index]);\r
1036 } else {\r
1037 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_NO_GUID_FOUND), gShellDriver1HiiHandle, &Guids[Index]);\r
1038 }\r
1039 SHELL_FREE_NON_NULL (Name);\r
1040 }\r
1041 }\r
1042 FreePool (Guids);\r
1043 }\r
1044 } else {\r
1045 if (ConvertStrToGuid (Protocol, &Guid) == EFI_SUCCESS) {\r
1046 Name = GetStringNameFromGuid (&Guid, Language);\r
1047 if (Name != NULL) {\r
1048 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_DECODE), gShellDriver1HiiHandle, Name, &Guid);\r
1049 } else {\r
1050 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_NO_GUID_FOUND), gShellDriver1HiiHandle, &Guid);\r
1051 }\r
1052 SHELL_FREE_NON_NULL(Name);\r
1053 } else {\r
1054 Status = GetGuidFromStringName (Protocol, Language, &Guids);\r
1055 if (Status == EFI_SUCCESS) {\r
1056 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_DECODE), gShellDriver1HiiHandle, Protocol, Guids);\r
1057 } else {\r
1058 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_NO_NAME_FOUND), gShellDriver1HiiHandle, Protocol);\r
1059 }\r
1060 }\r
1061 }\r
1062\r
1063 return SHELL_SUCCESS;\r
4ba49616 1064}\r
1065\r
361a8267 1066/**\r
1067 Function for 'dh' command.\r
1068\r
1069 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
1070 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
1071**/\r
4ba49616 1072SHELL_STATUS\r
1073EFIAPI\r
1074ShellCommandRunDh (\r
1075 IN EFI_HANDLE ImageHandle,\r
1076 IN EFI_SYSTEM_TABLE *SystemTable\r
1077 )\r
1078{\r
1079 EFI_STATUS Status;\r
1080 LIST_ENTRY *Package;\r
1081 CHAR16 *ProblemParam;\r
1082 SHELL_STATUS ShellStatus;\r
1083 CHAR8 *Language;\r
1084 CONST CHAR16 *Lang;\r
28f898f8 1085 CONST CHAR16 *RawValue;\r
de8cea6f 1086 CONST CHAR16 *ProtocolVal;\r
28f898f8
CC
1087 BOOLEAN SfoFlag;\r
1088 BOOLEAN DriverFlag;\r
1089 BOOLEAN VerboseFlag;\r
361a8267 1090 UINT64 Intermediate;\r
de8cea6f 1091 EFI_HANDLE Handle;\r
4ba49616 1092\r
1093 ShellStatus = SHELL_SUCCESS;\r
1094 Status = EFI_SUCCESS;\r
1095 Language = NULL;\r
1096\r
1097 //\r
1098 // initialize the shell lib (we must be in non-auto-init...)\r
1099 //\r
1100 Status = ShellInitialize();\r
1101 ASSERT_EFI_ERROR(Status);\r
1102\r
1103 Status = CommandInit();\r
1104 ASSERT_EFI_ERROR(Status);\r
1105\r
1106 //\r
1107 // parse the command line\r
1108 //\r
1109 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
1110 if (EFI_ERROR(Status)) {\r
1111 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
ba0014b9 1112 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"dh", ProblemParam);\r
4ba49616 1113 FreePool(ProblemParam);\r
1114 ShellStatus = SHELL_INVALID_PARAMETER;\r
1115 } else {\r
1116 ASSERT(FALSE);\r
1117 }\r
1118 } else {\r
1119 if (ShellCommandLineGetCount(Package) > 2) {\r
ba0014b9 1120 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"dh");\r
4ba49616 1121 ShellCommandLineFreeVarList (Package);\r
1122 return (SHELL_INVALID_PARAMETER);\r
1123 }\r
1124\r
28f898f8
CC
1125 if (ShellCommandLineGetFlag(Package, L"-l")) {\r
1126 Lang = ShellCommandLineGetValue(Package, L"-l");\r
1127 if (Lang != NULL) {\r
1128 Language = AllocateZeroPool(StrSize(Lang));\r
1129 AsciiSPrint(Language, StrSize(Lang), "%S", Lang);\r
1130 } else {\r
1131 ASSERT(Language == NULL);\r
1132 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN(STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"dh", L"-l");\r
1133 ShellCommandLineFreeVarList(Package);\r
1134 return (SHELL_INVALID_PARAMETER);\r
1135 }\r
1136 } else {\r
4ba49616 1137 Language = AllocateZeroPool(10);\r
1138 AsciiSPrint(Language, 10, "en-us");\r
4ba49616 1139 }\r
1140\r
28f898f8
CC
1141 SfoFlag = ShellCommandLineGetFlag (Package, L"-sfo");\r
1142 DriverFlag = ShellCommandLineGetFlag (Package, L"-d");\r
1143 VerboseFlag = (BOOLEAN)(ShellCommandLineGetFlag (Package, L"-v") || ShellCommandLineGetFlag (Package, L"-verbose"));\r
de8cea6f
RN
1144 RawValue = ShellCommandLineGetRawValue (Package, 1);\r
1145 ProtocolVal = ShellCommandLineGetValue (Package, L"-p");\r
4ba49616 1146\r
de8cea6f
RN
1147 if (RawValue == NULL) {\r
1148 if (ShellCommandLineGetFlag (Package, L"-p") && (ProtocolVal == NULL)) {\r
1149 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"dh", L"-p");\r
4ba49616 1150 ShellStatus = SHELL_INVALID_PARAMETER;\r
1151 } else {\r
1152 //\r
de8cea6f 1153 // Print information by protocol, The ProtocolVal maybe is name or GUID or NULL.\r
4ba49616 1154 //\r
de8cea6f 1155 ShellStatus = DoDhByProtocol (ProtocolVal, VerboseFlag, SfoFlag, Language, DriverFlag);\r
4ba49616 1156 }\r
de8cea6f
RN
1157 } else if ((RawValue != NULL) &&\r
1158 (gUnicodeCollation->StriColl(gUnicodeCollation, L"decode", (CHAR16 *) RawValue) == 0)) {\r
1159 if (ShellCommandLineGetFlag (Package, L"-p") && (ProtocolVal == NULL)) {\r
1160 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"dh", L"-p");\r
1161 ShellStatus = SHELL_INVALID_PARAMETER;\r
1162 } else {\r
4ba49616 1163 //\r
de8cea6f 1164 // Print decode informatino by protocol.\r
4ba49616 1165 //\r
de8cea6f
RN
1166 ShellStatus = DoDecodeByProtocol (ProtocolVal, Language);\r
1167 }\r
1168 } else {\r
1169 if (ShellCommandLineGetFlag (Package, L"-p")) {\r
1170 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"dh");\r
1171 ShellStatus = SHELL_INVALID_PARAMETER;\r
4ba49616 1172 } else {\r
de8cea6f
RN
1173 Status = ShellConvertStringToUint64 (RawValue, &Intermediate, TRUE, FALSE);\r
1174 if (EFI_ERROR(Status)) {\r
1175 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"dh", RawValue);\r
4ba49616 1176 ShellStatus = SHELL_INVALID_PARAMETER;\r
1177 } else {\r
de8cea6f
RN
1178 Handle = ConvertHandleIndexToHandle ((UINTN) Intermediate);\r
1179 if (Handle == NULL) {\r
1180 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"dh", RawValue);\r
1181 ShellStatus = SHELL_INVALID_PARAMETER;\r
1182 } else {\r
1183 //\r
1184 // Print information by handle.\r
1185 //\r
1186 DoDhByHandle (Handle, VerboseFlag, SfoFlag, Language, DriverFlag, FALSE);\r
1187 }\r
4ba49616 1188 }\r
1189 }\r
1190 }\r
1191\r
4ba49616 1192 ShellCommandLineFreeVarList (Package);\r
1193 SHELL_FREE_NON_NULL(Language);\r
1194 }\r
1195\r
1196 return (ShellStatus);\r
1197}\r