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