]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDriver1CommandsLib/Dh.c
ShellPkg/dh: fix the error display "Child Controllers" to "Managing".
[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
0e88348e 5 Copyright (c) 2010 - 2017, 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
4ba49616 289\r
290 ProtocolGuidArray = NULL;\r
361a8267 291 RetVal = NULL;\r
292 Size = 0;\r
4ba49616 293\r
294 Status = gBS->ProtocolsPerHandle (\r
295 TheHandle,\r
296 &ProtocolGuidArray,\r
297 &ArrayCount\r
298 );\r
299 if (!EFI_ERROR (Status)) {\r
4ba49616 300 for (ProtocolIndex = 0; ProtocolIndex < ArrayCount; ProtocolIndex++) {\r
301 Temp = GetStringNameFromGuid(ProtocolGuidArray[ProtocolIndex], Language);\r
0e88348e
RN
302 ASSERT((RetVal == NULL && Size == 0) || (RetVal != NULL));\r
303 if (Size != 0) {\r
304 StrnCatGrow(&RetVal, &Size, Separator, 0);\r
305 }\r
306 StrnCatGrow(&RetVal, &Size, L"%H", 0);\r
307 if (Temp == NULL) {\r
308 UnicodeSPrint (GuidStr, sizeof (GuidStr), L"%g", ProtocolGuidArray[ProtocolIndex]);\r
309 StrnCatGrow (&RetVal, &Size, GuidStr, 0);\r
310 } else {\r
4ba49616 311 StrnCatGrow(&RetVal, &Size, Temp, 0);\r
4ba49616 312 FreePool(Temp);\r
313 }\r
0e88348e 314 StrnCatGrow(&RetVal, &Size, L"%N", 0);\r
4ba49616 315 if (ExtraInfo) {\r
316 Temp = GetProtocolInformationDump(TheHandle, ProtocolGuidArray[ProtocolIndex], Verbose);\r
317 if (Temp != NULL) {\r
318 ASSERT((RetVal == NULL && Size == 0) || (RetVal != NULL));\r
319 if (!Verbose) {\r
320 StrnCatGrow(&RetVal, &Size, L"(", 0);\r
321 StrnCatGrow(&RetVal, &Size, Temp, 0);\r
590351cf 322 StrnCatGrow(&RetVal, &Size, L")", 0);\r
4ba49616 323 } else {\r
268d3445 324 StrnCatGrow(&RetVal, &Size, Separator, 0);\r
4ba49616 325 StrnCatGrow(&RetVal, &Size, Temp, 0);\r
326 }\r
327 FreePool(Temp);\r
328 }\r
329 }\r
330 }\r
4ba49616 331 }\r
361a8267 332 \r
333 SHELL_FREE_NON_NULL(ProtocolGuidArray);\r
4ba49616 334\r
361a8267 335 if (RetVal == NULL) {\r
336 return (NULL);\r
4ba49616 337 }\r
361a8267 338\r
4ba49616 339 ASSERT((RetVal == NULL && Size == 0) || (RetVal != NULL));\r
268d3445 340 StrnCatGrow(&RetVal, &Size, Separator, 0);\r
4ba49616 341 return (RetVal);\r
342}\r
343\r
361a8267 344/**\r
345 Gets the name of the loaded image.\r
346\r
347 @param[in] TheHandle The handle of the driver to get info on.\r
348 @param[out] Name The pointer to the pointer. Valid upon a successful return.\r
349\r
350 @retval EFI_SUCCESS The operation was successful.\r
351**/\r
352EFI_STATUS\r
361a8267 353GetDriverImageName (\r
354 IN EFI_HANDLE TheHandle,\r
355 OUT CHAR16 **Name\r
356 )\r
357{\r
358 // get loaded image and devicepathtotext on image->Filepath\r
359 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
360 EFI_STATUS Status;\r
361 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
362\r
363 if (TheHandle == NULL || Name == NULL) {\r
364 return (EFI_INVALID_PARAMETER);\r
365 }\r
366\r
367 Status = gBS->OpenProtocol (\r
368 TheHandle,\r
369 &gEfiLoadedImageProtocolGuid,\r
370 (VOID **) &LoadedImage,\r
371 gImageHandle,\r
372 NULL,\r
373 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
374 );\r
375 if (EFI_ERROR(Status)) {\r
376 return (Status);\r
377 }\r
378 DevicePath = LoadedImage->FilePath;\r
863986b3 379 *Name = ConvertDevicePathToText(DevicePath, TRUE, TRUE);\r
361a8267 380 return (EFI_SUCCESS);\r
381}\r
382\r
383/**\r
384 Display driver model information for a given handle.\r
385 \r
386 @param[in] Handle The handle to display info on.\r
387 @param[in] BestName Use the best name?\r
388 @param[in] Language The language to output in.\r
389**/\r
390EFI_STATUS\r
361a8267 391DisplayDriverModelHandle (\r
392 IN EFI_HANDLE Handle,\r
393 IN BOOLEAN BestName,\r
394 IN CONST CHAR8 *Language OPTIONAL\r
395 )\r
396{\r
397 EFI_STATUS Status;\r
398 BOOLEAN ConfigurationStatus;\r
399 BOOLEAN DiagnosticsStatus;\r
400 UINTN DriverBindingHandleCount;\r
401 EFI_HANDLE *DriverBindingHandleBuffer;\r
402 UINTN ParentControllerHandleCount;\r
403 EFI_HANDLE *ParentControllerHandleBuffer;\r
404 UINTN ChildControllerHandleCount;\r
405 EFI_HANDLE *ChildControllerHandleBuffer;\r
406 CHAR16 *TempStringPointer;\r
407 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
408 UINTN Index;\r
409 CHAR16 *DriverName;\r
410 EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;\r
411 UINTN NumberOfChildren;\r
412 UINTN HandleIndex;\r
413 UINTN ControllerHandleCount;\r
414 EFI_HANDLE *ControllerHandleBuffer;\r
415 UINTN ChildIndex;\r
416 BOOLEAN Image;\r
417\r
0d807dae
ED
418 DriverName = NULL;\r
419\r
361a8267 420 //\r
421 // See if Handle is a device handle and display its details.\r
422 //\r
423 DriverBindingHandleBuffer = NULL;\r
424 Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS (\r
425 Handle,\r
426 &DriverBindingHandleCount,\r
427 &DriverBindingHandleBuffer\r
428 );\r
429\r
430 ParentControllerHandleBuffer = NULL;\r
431 Status = PARSE_HANDLE_DATABASE_PARENTS (\r
432 Handle,\r
433 &ParentControllerHandleCount,\r
434 &ParentControllerHandleBuffer\r
435 );\r
436\r
437 ChildControllerHandleBuffer = NULL;\r
438 Status = ParseHandleDatabaseForChildControllers (\r
439 Handle,\r
440 &ChildControllerHandleCount,\r
441 &ChildControllerHandleBuffer\r
442 );\r
443\r
444 DiagnosticsStatus = FALSE;\r
445 ConfigurationStatus = FALSE;\r
446\r
447 if (!EFI_ERROR(gBS->OpenProtocol(Handle, &gEfiDriverConfigurationProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
448 ConfigurationStatus = TRUE;\r
449 }\r
450 if (!EFI_ERROR(gBS->OpenProtocol(Handle, &gEfiDriverConfiguration2ProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
451 ConfigurationStatus = TRUE;\r
452 }\r
453 if (!EFI_ERROR(gBS->OpenProtocol(Handle, &gEfiDriverDiagnosticsProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
454 DiagnosticsStatus = TRUE;\r
455 }\r
456 if (!EFI_ERROR(gBS->OpenProtocol(Handle, &gEfiDriverDiagnostics2ProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
457 DiagnosticsStatus = TRUE;\r
458 }\r
459\r
460 Status = EFI_SUCCESS;\r
461\r
462 if (DriverBindingHandleCount > 0 || ParentControllerHandleCount > 0 || ChildControllerHandleCount > 0) {\r
463\r
464\r
465\r
466 DevicePath = NULL;\r
467 TempStringPointer = NULL;\r
468 Status = gBS->HandleProtocol (Handle, &gEfiDevicePathProtocolGuid, (VOID**)&DevicePath);\r
469\r
470 Status = gEfiShellProtocol->GetDeviceName(Handle, EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8*)Language, &TempStringPointer);\r
471 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_DRIVER1), gShellDriver1HiiHandle, TempStringPointer!=NULL?TempStringPointer:L"<Unknown>");\r
472 SHELL_FREE_NON_NULL(TempStringPointer);\r
473 \r
863986b3 474 TempStringPointer = ConvertDevicePathToText(DevicePath, TRUE, FALSE);\r
361a8267 475 ShellPrintHiiEx(\r
476 -1, \r
477 -1, \r
478 NULL, \r
479 STRING_TOKEN (STR_DH_OUTPUT_DRIVER2), \r
480 gShellDriver1HiiHandle, \r
481 TempStringPointer!=NULL?TempStringPointer:L"<None>",\r
482 ParentControllerHandleCount == 0?L"ROOT":(ChildControllerHandleCount > 0)?L"BUS":L"DEVICE",\r
483 ConfigurationStatus?L"YES":L"NO",\r
484 DiagnosticsStatus?L"YES":L"NO"\r
485 );\r
486\r
487 SHELL_FREE_NON_NULL(TempStringPointer);\r
488\r
489 if (DriverBindingHandleCount == 0) {\r
490 ShellPrintHiiEx(\r
491 -1, \r
492 -1, \r
493 NULL, \r
494 STRING_TOKEN (STR_DH_OUTPUT_DRIVER3), \r
495 gShellDriver1HiiHandle, \r
496 L"<None>"\r
497 );\r
498 } else {\r
499 ShellPrintHiiEx(\r
500 -1, \r
501 -1, \r
502 NULL, \r
503 STRING_TOKEN (STR_DH_OUTPUT_DRIVER3), \r
504 gShellDriver1HiiHandle, \r
505 L""\r
506 );\r
507 for (Index = 0; Index < DriverBindingHandleCount; Index++) {\r
508 Image = FALSE;\r
509 Status = GetDriverName (\r
510 DriverBindingHandleBuffer[Index],\r
511 Language,\r
512 &DriverName\r
513 );\r
f330ff35 514 if (EFI_ERROR (Status)) {\r
361a8267 515 Status = GetDriverImageName (\r
516 DriverBindingHandleBuffer[Index],\r
517 &DriverName\r
518 );\r
f330ff35 519 if (EFI_ERROR (Status)) {\r
520 DriverName = NULL;\r
521 }\r
361a8267 522 }\r
523\r
524 if (Image) {\r
525 ShellPrintHiiEx(\r
526 -1, \r
527 -1, \r
528 NULL, \r
529 STRING_TOKEN (STR_DH_OUTPUT_DRIVER4A),\r
530 gShellDriver1HiiHandle,\r
531 ConvertHandleToHandleIndex (DriverBindingHandleBuffer[Index]),\r
532 DriverName!=NULL?DriverName:L"<Unknown>"\r
533 );\r
534 } else {\r
535 ShellPrintHiiEx(\r
536 -1, \r
537 -1, \r
538 NULL, \r
539 STRING_TOKEN (STR_DH_OUTPUT_DRIVER4B),\r
540 gShellDriver1HiiHandle,\r
541 ConvertHandleToHandleIndex (DriverBindingHandleBuffer[Index]),\r
542 DriverName!=NULL?DriverName:L"<Unknown>"\r
543 );\r
544 }\r
545 SHELL_FREE_NON_NULL(DriverName);\r
546 }\r
547 }\r
548\r
549 if (ParentControllerHandleCount == 0) {\r
550 ShellPrintHiiEx(\r
551 -1, \r
552 -1, \r
553 NULL, \r
554 STRING_TOKEN (STR_DH_OUTPUT_DRIVER5), \r
555 gShellDriver1HiiHandle, \r
556 L"<None>"\r
557 );\r
558 } else {\r
559 ShellPrintHiiEx(\r
560 -1, \r
561 -1, \r
562 NULL, \r
563 STRING_TOKEN (STR_DH_OUTPUT_DRIVER5), \r
564 gShellDriver1HiiHandle, \r
565 L""\r
566 );\r
567 for (Index = 0; Index < ParentControllerHandleCount; Index++) {\r
568 Status = gEfiShellProtocol->GetDeviceName(ParentControllerHandleBuffer[Index], EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8*)Language, &TempStringPointer);\r
569 ShellPrintHiiEx(\r
570 -1, \r
571 -1, \r
572 NULL, \r
573 STRING_TOKEN (STR_DH_OUTPUT_DRIVER5B),\r
574 gShellDriver1HiiHandle,\r
575 ConvertHandleToHandleIndex (ParentControllerHandleBuffer[Index]),\r
576 TempStringPointer!=NULL?TempStringPointer:L"<Unknown>"\r
577 );\r
578 SHELL_FREE_NON_NULL(TempStringPointer);\r
579 }\r
580 }\r
581\r
582 if (ChildControllerHandleCount == 0) {\r
583 ShellPrintHiiEx(\r
584 -1, \r
585 -1, \r
586 NULL, \r
587 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6), \r
588 gShellDriver1HiiHandle, \r
589 L"<None>"\r
590 );\r
591 } else {\r
592 ShellPrintHiiEx(\r
593 -1, \r
594 -1, \r
595 NULL, \r
596 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6), \r
597 gShellDriver1HiiHandle, \r
598 L""\r
599 );\r
600 for (Index = 0; Index < ChildControllerHandleCount; Index++) {\r
601 Status = gEfiShellProtocol->GetDeviceName(ChildControllerHandleBuffer[Index], EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8*)Language, &TempStringPointer);\r
602 ShellPrintHiiEx(\r
603 -1, \r
604 -1, \r
605 NULL, \r
606 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6B),\r
607 gShellDriver1HiiHandle,\r
608 ConvertHandleToHandleIndex (ChildControllerHandleBuffer[Index]),\r
609 TempStringPointer!=NULL?TempStringPointer:L"<Unknown>"\r
610 );\r
611 SHELL_FREE_NON_NULL(TempStringPointer);\r
612 }\r
613 }\r
614 }\r
615\r
616 SHELL_FREE_NON_NULL(DriverBindingHandleBuffer);\r
617\r
618 SHELL_FREE_NON_NULL(ParentControllerHandleBuffer);\r
619\r
620 SHELL_FREE_NON_NULL(ChildControllerHandleBuffer);\r
621\r
622 if (EFI_ERROR (Status)) {\r
623 return Status;\r
624 }\r
625 //\r
626 // See if Handle is a driver binding handle and display its details.\r
627 //\r
628 Status = gBS->OpenProtocol (\r
629 Handle,\r
630 &gEfiDriverBindingProtocolGuid,\r
631 (VOID **) &DriverBinding,\r
632 NULL,\r
633 NULL,\r
634 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
635 );\r
636 if (EFI_ERROR (Status)) {\r
637 return EFI_SUCCESS;\r
638 }\r
639\r
640 NumberOfChildren = 0;\r
641 ControllerHandleBuffer = NULL;\r
642 Status = PARSE_HANDLE_DATABASE_DEVICES (\r
643 Handle,\r
644 &ControllerHandleCount,\r
645 &ControllerHandleBuffer\r
646 );\r
647 if (ControllerHandleCount > 0) {\r
648 for (HandleIndex = 0; HandleIndex < ControllerHandleCount; HandleIndex++) {\r
649 Status = PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (\r
650 Handle,\r
651 ControllerHandleBuffer[HandleIndex],\r
652 &ChildControllerHandleCount,\r
653 NULL\r
654 );\r
655 NumberOfChildren += ChildControllerHandleCount;\r
656 }\r
657 }\r
658\r
659 Status = GetDriverName (Handle, Language, &DriverName);\r
f330ff35 660 if (EFI_ERROR (Status)) {\r
661 DriverName = NULL;\r
662 }\r
361a8267 663\r
664 ShellPrintHiiEx(\r
665 -1, \r
666 -1, \r
667 NULL, \r
03a5572b 668 STRING_TOKEN (STR_DH_OUTPUT_DRIVER7),\r
361a8267 669 gShellDriver1HiiHandle,\r
670 ConvertHandleToHandleIndex(Handle),\r
671 DriverName!=NULL?DriverName:L"<Unknown>"\r
672 );\r
673 SHELL_FREE_NON_NULL(DriverName);\r
361a8267 674 Status = GetDriverImageName (\r
675 Handle,\r
676 &DriverName\r
677 );\r
f330ff35 678 if (EFI_ERROR (Status)) {\r
679 DriverName = NULL;\r
680 }\r
361a8267 681 ShellPrintHiiEx(\r
682 -1, \r
683 -1, \r
684 NULL, \r
685 STRING_TOKEN (STR_DH_OUTPUT_DRIVER7B),\r
686 gShellDriver1HiiHandle,\r
687 DriverName!=NULL?DriverName:L"<Unknown>"\r
688 );\r
689 SHELL_FREE_NON_NULL(DriverName);\r
690\r
691 ShellPrintHiiEx(\r
692 -1, \r
693 -1, \r
694 NULL, \r
695 STRING_TOKEN (STR_DH_OUTPUT_DRIVER8), \r
696 gShellDriver1HiiHandle, \r
697 DriverBinding->Version,\r
698 NumberOfChildren > 0?L"Bus":ControllerHandleCount > 0?L"Device":L"<Unknown>",\r
699 ConfigurationStatus?L"YES":L"NO",\r
700 DiagnosticsStatus?L"YES":L"NO"\r
701 );\r
702\r
703 if (ControllerHandleCount == 0) {\r
704 ShellPrintHiiEx(\r
705 -1, \r
706 -1, \r
707 NULL, \r
5bfd23eb 708 STRING_TOKEN (STR_DH_OUTPUT_DRIVER9),\r
361a8267 709 gShellDriver1HiiHandle, \r
710 L"None"\r
711 );\r
712 } else {\r
713 ShellPrintHiiEx(\r
714 -1, \r
715 -1, \r
716 NULL, \r
5bfd23eb 717 STRING_TOKEN (STR_DH_OUTPUT_DRIVER9),\r
361a8267 718 gShellDriver1HiiHandle, \r
719 L""\r
720 );\r
721 for (HandleIndex = 0; HandleIndex < ControllerHandleCount; HandleIndex++) {\r
722 Status = gEfiShellProtocol->GetDeviceName(ControllerHandleBuffer[HandleIndex], EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8*)Language, &TempStringPointer);\r
723\r
724 ShellPrintHiiEx(\r
725 -1, \r
726 -1, \r
727 NULL, \r
728 STRING_TOKEN (STR_DH_OUTPUT_DRIVER9B),\r
729 gShellDriver1HiiHandle,\r
730 ConvertHandleToHandleIndex(ControllerHandleBuffer[HandleIndex]),\r
731 TempStringPointer!=NULL?TempStringPointer:L"<Unknown>"\r
732 );\r
733 SHELL_FREE_NON_NULL(TempStringPointer);\r
734\r
735 Status = PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (\r
736 Handle,\r
737 ControllerHandleBuffer[HandleIndex],\r
738 &ChildControllerHandleCount,\r
739 &ChildControllerHandleBuffer\r
740 );\r
741 if (!EFI_ERROR (Status)) {\r
742 for (ChildIndex = 0; ChildIndex < ChildControllerHandleCount; ChildIndex++) {\r
743 Status = gEfiShellProtocol->GetDeviceName(ChildControllerHandleBuffer[ChildIndex], EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8*)Language, &TempStringPointer);\r
744\r
745 ShellPrintHiiEx(\r
746 -1, \r
747 -1, \r
748 NULL, \r
5bfd23eb 749 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6C),\r
361a8267 750 gShellDriver1HiiHandle,\r
751 ConvertHandleToHandleIndex(ChildControllerHandleBuffer[ChildIndex]),\r
752 TempStringPointer!=NULL?TempStringPointer:L"<Unknown>"\r
753 );\r
754 SHELL_FREE_NON_NULL(TempStringPointer);\r
755 }\r
756\r
757 SHELL_FREE_NON_NULL (ChildControllerHandleBuffer);\r
758 }\r
759 }\r
760\r
761 SHELL_FREE_NON_NULL (ControllerHandleBuffer);\r
762 }\r
763\r
764 return EFI_SUCCESS;\r
765}\r
766\r
767/**\r
768 Display information for a handle.\r
769\r
770 @param[in] TheHandle The handles to show info on.\r
771 @param[in] Verbose TRUE for extra info, FALSE otherwise.\r
772 @param[in] Sfo TRUE to output in standard format output (spec).\r
773 @param[in] Language Language string per UEFI specification.\r
774 @param[in] DriverInfo TRUE to show all info about the handle.\r
775 @param[in] Multiple TRUE indicates more than will be output,\r
776 FALSE for a single one.\r
361a8267 777**/\r
28f898f8 778VOID\r
4ba49616 779DoDhByHandle(\r
780 IN CONST EFI_HANDLE TheHandle,\r
781 IN CONST BOOLEAN Verbose,\r
782 IN CONST BOOLEAN Sfo,\r
783 IN CONST CHAR8 *Language,\r
784 IN CONST BOOLEAN DriverInfo,\r
785 IN CONST BOOLEAN Multiple\r
786 )\r
787{\r
28f898f8 788 CHAR16 *ProtocolInfoString;\r
4ba49616 789\r
4ba49616 790 ProtocolInfoString = NULL;\r
791\r
792 if (!Sfo) {\r
793 if (Multiple) {\r
361a8267 794 ProtocolInfoString = GetProtocolInfoString(TheHandle, Language, L" ", Verbose, TRUE);\r
4ba49616 795 ShellPrintHiiEx(\r
796 -1,\r
797 -1,\r
798 NULL,\r
799 STRING_TOKEN (STR_DH_OUTPUT),\r
800 gShellDriver1HiiHandle,\r
801 ConvertHandleToHandleIndex(TheHandle),\r
28f898f8
CC
802 ProtocolInfoString==NULL?L"":ProtocolInfoString\r
803 );\r
4ba49616 804 } else {\r
590351cf
HL
805 ProtocolInfoString = GetProtocolInfoString(TheHandle, Language, Verbose ? L"\r\n" : L" ", Verbose, TRUE);\r
806 if (Verbose) {\r
807 ShellPrintHiiEx(\r
808 -1,\r
809 -1,\r
810 NULL,\r
811 STRING_TOKEN (STR_DH_OUTPUT_SINGLE),\r
812 gShellDriver1HiiHandle,\r
813 ConvertHandleToHandleIndex(TheHandle),\r
814 TheHandle,\r
815 ProtocolInfoString==NULL?L"":ProtocolInfoString\r
816 );\r
817 } else {\r
818 ShellPrintHiiEx(\r
819 -1,\r
820 -1,\r
821 NULL,\r
822 STRING_TOKEN (STR_DH_OUTPUT_SINGLE_D),\r
823 gShellDriver1HiiHandle,\r
824 ConvertHandleToHandleIndex(TheHandle),\r
825 ProtocolInfoString==NULL?L"":ProtocolInfoString\r
826 );\r
827 }\r
4ba49616 828 }\r
361a8267 829\r
830 if (DriverInfo) {\r
831 DisplayDriverModelHandle ((EFI_HANDLE)TheHandle, TRUE, Language);\r
832 }\r
4ba49616 833 } else {\r
361a8267 834 ProtocolInfoString = GetProtocolInfoString(TheHandle, Language, L";", FALSE, FALSE);\r
4ba49616 835 ShellPrintHiiEx(\r
836 -1,\r
837 -1,\r
838 NULL,\r
839 STRING_TOKEN (STR_DH_OUTPUT_SFO),\r
840 gShellDriver1HiiHandle,\r
841 Multiple ?L"HandlesInfo":L"HandleInfo",\r
842 L"DriverName",\r
843 L"ControllerName",\r
844 ConvertHandleToHandleIndex(TheHandle),\r
845 L"DevPath",\r
28f898f8
CC
846 ProtocolInfoString==NULL?L"":ProtocolInfoString\r
847 );\r
4ba49616 848 }\r
849\r
4ba49616 850 if (ProtocolInfoString != NULL) {\r
851 FreePool(ProtocolInfoString);\r
852 }\r
4ba49616 853}\r
854\r
361a8267 855/**\r
856 Display information for all handles on a list.\r
857\r
858 @param[in] HandleList The NULL-terminated list of handles.\r
f0b0e733 859 @param[in] Verbose TRUE for extra info, FALSE otherwise.\r
361a8267 860 @param[in] Sfo TRUE to output in standard format output (spec).\r
861 @param[in] Language Language string per UEFI specification.\r
862 @param[in] DriverInfo TRUE to show all info about the handle.\r
863\r
28f898f8
CC
864 @retval SHELL_SUCCESS The operation was successful.\r
865 @retval SHELL_ABORTED The operation was aborted.\r
361a8267 866**/\r
4ba49616 867SHELL_STATUS\r
4ba49616 868DoDhForHandleList(\r
869 IN CONST EFI_HANDLE *HandleList,\r
f0b0e733 870 IN CONST BOOLEAN Verbose,\r
4ba49616 871 IN CONST BOOLEAN Sfo,\r
872 IN CONST CHAR8 *Language,\r
873 IN CONST BOOLEAN DriverInfo\r
874 )\r
875{\r
876 CONST EFI_HANDLE *HandleWalker;\r
877 SHELL_STATUS ShellStatus;\r
878\r
879 ShellStatus = SHELL_SUCCESS;\r
de8cea6f 880 for (HandleWalker = HandleList; HandleWalker != NULL && *HandleWalker != NULL; HandleWalker++) {\r
28f898f8 881 DoDhByHandle (*HandleWalker, Verbose, Sfo, Language, DriverInfo, TRUE);\r
376e7593
TS
882 if (ShellGetExecutionBreakFlag ()) {\r
883 ShellStatus = SHELL_ABORTED;\r
884 break;\r
885 }\r
4ba49616 886 }\r
887 return (ShellStatus);\r
888}\r
889\r
361a8267 890/**\r
de8cea6f 891 Display information for a GUID of protocol.\r
361a8267 892\r
de8cea6f 893 @param[in] Guid The pointer to the name of the protocol.\r
f0b0e733 894 @param[in] Verbose TRUE for extra info, FALSE otherwise.\r
de8cea6f 895 @param[in] Sfo TRUE to output in standard format output (spec).\r
361a8267 896 @param[in] Language Language string per UEFI specification.\r
897 @param[in] DriverInfo TRUE to show all info about the handle.\r
898\r
899 @retval SHELL_SUCCESS The operation was successful.\r
de8cea6f 900 @retval SHELL_NOT_FOUND The GUID was not found.\r
361a8267 901 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.\r
902**/\r
4ba49616 903SHELL_STATUS\r
de8cea6f
RN
904DoDhByProtocolGuid(\r
905 IN CONST GUID *Guid,\r
f0b0e733 906 IN CONST BOOLEAN Verbose,\r
de8cea6f 907 IN CONST BOOLEAN Sfo,\r
4ba49616 908 IN CONST CHAR8 *Language,\r
909 IN CONST BOOLEAN DriverInfo\r
910 )\r
911{\r
de8cea6f 912 CHAR16 *Name;\r
4ba49616 913 SHELL_STATUS ShellStatus;\r
de8cea6f 914 EFI_HANDLE *HandleList;\r
4ba49616 915\r
de8cea6f
RN
916 if (!Sfo) {\r
917 if (Guid == NULL) {\r
918 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_ALL_HEADER), gShellDriver1HiiHandle);\r
919 } else {\r
920 Name = GetStringNameFromGuid (Guid, NULL);\r
921 if (Name == NULL) {\r
922 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_GUID_HEADER), gShellDriver1HiiHandle, Guid);\r
923 } else {\r
924 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_NAME_HEADER), gShellDriver1HiiHandle, Name);\r
925 }\r
926 }\r
927 }\r
928 HandleList = GetHandleListByProtocol(Guid);\r
929 ShellStatus = DoDhForHandleList(HandleList, Verbose, Sfo, Language, DriverInfo);\r
930 SHELL_FREE_NON_NULL(HandleList);\r
4ba49616 931\r
de8cea6f 932 return ShellStatus;\r
4ba49616 933}\r
934\r
361a8267 935/**\r
de8cea6f
RN
936 Function to determine use which method to print information.\r
937 If Protocol is NULL, The function will print all information.\r
361a8267 938\r
de8cea6f 939 @param[in] Protocol The pointer to the name or GUID of protocol or NULL.\r
f0b0e733 940 @param[in] Verbose TRUE for extra info, FALSE otherwise.\r
361a8267 941 @param[in] Sfo TRUE to output in standard format output (spec).\r
942 @param[in] Language Language string per UEFI specification.\r
943 @param[in] DriverInfo TRUE to show all info about the handle.\r
944\r
de8cea6f
RN
945 @retval SHELL_SUCCESS The operation was successful.\r
946 @retval SHELL_NOT_FOUND The protocol was not found.\r
947 @retval SHELL_INVALID_PARAMETER Protocol is invalid parameter.\r
361a8267 948**/\r
4ba49616 949SHELL_STATUS\r
de8cea6f
RN
950DoDhByProtocol (\r
951 IN CONST CHAR16 *Protocol,\r
f0b0e733 952 IN CONST BOOLEAN Verbose,\r
4ba49616 953 IN CONST BOOLEAN Sfo,\r
954 IN CONST CHAR8 *Language,\r
955 IN CONST BOOLEAN DriverInfo\r
956 )\r
957{\r
de8cea6f
RN
958 EFI_GUID Guid;\r
959 EFI_GUID *GuidPtr;\r
4ba49616 960 EFI_STATUS Status;\r
4ba49616 961\r
de8cea6f
RN
962 if (Protocol == NULL) {\r
963 return DoDhByProtocolGuid (NULL, Verbose, Sfo, Language, DriverInfo);\r
964 } else {\r
965 Status = ConvertStrToGuid (Protocol, &Guid);\r
966 if (!EFI_ERROR (Status)) {\r
967 GuidPtr = &Guid;\r
968 } else {\r
969 //\r
970 // Protocol is a Name, convert it to GUID\r
971 //\r
972 Status = GetGuidFromStringName (Protocol, Language, &GuidPtr);\r
973 if (EFI_ERROR(Status)) {\r
974 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_NO_NAME_FOUND), gShellDriver1HiiHandle, Protocol);\r
975 return (SHELL_NOT_FOUND);\r
976 }\r
977 }\r
4ba49616 978\r
de8cea6f 979 return DoDhByProtocolGuid (GuidPtr, Verbose, Sfo, Language, DriverInfo);\r
4ba49616 980 }\r
de8cea6f 981}\r
4ba49616 982\r
de8cea6f
RN
983/**\r
984 Function to display decode information by Protocol.\r
985 The parameter Protocol is either a GUID or the name of protocol.\r
986 If the parameter Protocol is NULL, the function will print all\r
987 decode information.\r
4ba49616 988\r
de8cea6f
RN
989 @param[in] Protocol The pointer to the name or GUID of protocol.\r
990 @param[in] Language Language string per UEFI specification.\r
4ba49616 991\r
de8cea6f
RN
992 @retval SHELL_SUCCESS The operation was successful.\r
993 @retval SHELL_OUT_OT_RESOURCES A memory allocation failed.\r
994**/\r
995SHELL_STATUS\r
996DoDecodeByProtocol(\r
997 IN CONST CHAR16 *Protocol,\r
998 IN CONST CHAR8 *Language\r
999 )\r
1000{\r
1001 EFI_STATUS Status;\r
1002 EFI_GUID *Guids;\r
1003 EFI_GUID Guid;\r
1004 UINTN Counts;\r
1005 UINTN Index;\r
1006 CHAR16 *Name;\r
1007\r
1008 if (Protocol == NULL) {\r
1009 Counts = 0;\r
1010 Status = GetAllMappingGuids (NULL, &Counts);\r
1011 if (Status == EFI_BUFFER_TOO_SMALL) {\r
1012 Guids = AllocatePool (Counts * sizeof(EFI_GUID));\r
1013 if (Guids == NULL) {\r
1014 return SHELL_OUT_OF_RESOURCES;\r
1015 }\r
4ba49616 1016\r
de8cea6f
RN
1017 Status = GetAllMappingGuids (Guids, &Counts);\r
1018 if (Status == EFI_SUCCESS) {\r
1019 for (Index = 0; Index < Counts; Index++) {\r
1020 Name = GetStringNameFromGuid (&Guids[Index], Language);\r
1021 if (Name != NULL) {\r
1022 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_DECODE), gShellDriver1HiiHandle, Name, &Guids[Index]);\r
1023 } else {\r
1024 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_NO_GUID_FOUND), gShellDriver1HiiHandle, &Guids[Index]);\r
1025 }\r
1026 SHELL_FREE_NON_NULL (Name);\r
1027 }\r
1028 }\r
1029 FreePool (Guids);\r
1030 }\r
1031 } else {\r
1032 if (ConvertStrToGuid (Protocol, &Guid) == EFI_SUCCESS) {\r
1033 Name = GetStringNameFromGuid (&Guid, Language);\r
1034 if (Name != NULL) {\r
1035 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_DECODE), gShellDriver1HiiHandle, Name, &Guid);\r
1036 } else {\r
1037 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_NO_GUID_FOUND), gShellDriver1HiiHandle, &Guid);\r
1038 }\r
1039 SHELL_FREE_NON_NULL(Name);\r
1040 } else {\r
1041 Status = GetGuidFromStringName (Protocol, Language, &Guids);\r
1042 if (Status == EFI_SUCCESS) {\r
1043 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_DECODE), gShellDriver1HiiHandle, Protocol, Guids);\r
1044 } else {\r
1045 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_NO_NAME_FOUND), gShellDriver1HiiHandle, Protocol);\r
1046 }\r
1047 }\r
1048 }\r
1049\r
1050 return SHELL_SUCCESS;\r
4ba49616 1051}\r
1052\r
361a8267 1053/**\r
1054 Function for 'dh' command.\r
1055\r
1056 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
1057 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
1058**/\r
4ba49616 1059SHELL_STATUS\r
1060EFIAPI\r
1061ShellCommandRunDh (\r
1062 IN EFI_HANDLE ImageHandle,\r
1063 IN EFI_SYSTEM_TABLE *SystemTable\r
1064 )\r
1065{\r
1066 EFI_STATUS Status;\r
1067 LIST_ENTRY *Package;\r
1068 CHAR16 *ProblemParam;\r
1069 SHELL_STATUS ShellStatus;\r
1070 CHAR8 *Language;\r
1071 CONST CHAR16 *Lang;\r
28f898f8 1072 CONST CHAR16 *RawValue;\r
de8cea6f 1073 CONST CHAR16 *ProtocolVal;\r
28f898f8
CC
1074 BOOLEAN SfoFlag;\r
1075 BOOLEAN DriverFlag;\r
1076 BOOLEAN VerboseFlag;\r
361a8267 1077 UINT64 Intermediate;\r
de8cea6f 1078 EFI_HANDLE Handle;\r
4ba49616 1079\r
1080 ShellStatus = SHELL_SUCCESS;\r
1081 Status = EFI_SUCCESS;\r
1082 Language = NULL;\r
1083\r
1084 //\r
1085 // initialize the shell lib (we must be in non-auto-init...)\r
1086 //\r
1087 Status = ShellInitialize();\r
1088 ASSERT_EFI_ERROR(Status);\r
1089\r
1090 Status = CommandInit();\r
1091 ASSERT_EFI_ERROR(Status);\r
1092\r
1093 //\r
1094 // parse the command line\r
1095 //\r
1096 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
1097 if (EFI_ERROR(Status)) {\r
1098 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
bc280720 1099 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"dh", ProblemParam); \r
4ba49616 1100 FreePool(ProblemParam);\r
1101 ShellStatus = SHELL_INVALID_PARAMETER;\r
1102 } else {\r
1103 ASSERT(FALSE);\r
1104 }\r
1105 } else {\r
1106 if (ShellCommandLineGetCount(Package) > 2) {\r
bc280720 1107 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"dh"); \r
4ba49616 1108 ShellCommandLineFreeVarList (Package);\r
1109 return (SHELL_INVALID_PARAMETER);\r
1110 }\r
1111\r
28f898f8
CC
1112 if (ShellCommandLineGetFlag(Package, L"-l")) {\r
1113 Lang = ShellCommandLineGetValue(Package, L"-l");\r
1114 if (Lang != NULL) {\r
1115 Language = AllocateZeroPool(StrSize(Lang));\r
1116 AsciiSPrint(Language, StrSize(Lang), "%S", Lang);\r
1117 } else {\r
1118 ASSERT(Language == NULL);\r
1119 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN(STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"dh", L"-l");\r
1120 ShellCommandLineFreeVarList(Package);\r
1121 return (SHELL_INVALID_PARAMETER);\r
1122 }\r
1123 } else {\r
4ba49616 1124 Language = AllocateZeroPool(10);\r
1125 AsciiSPrint(Language, 10, "en-us");\r
4ba49616 1126 }\r
1127\r
28f898f8
CC
1128 SfoFlag = ShellCommandLineGetFlag (Package, L"-sfo");\r
1129 DriverFlag = ShellCommandLineGetFlag (Package, L"-d");\r
1130 VerboseFlag = (BOOLEAN)(ShellCommandLineGetFlag (Package, L"-v") || ShellCommandLineGetFlag (Package, L"-verbose"));\r
de8cea6f
RN
1131 RawValue = ShellCommandLineGetRawValue (Package, 1);\r
1132 ProtocolVal = ShellCommandLineGetValue (Package, L"-p");\r
4ba49616 1133\r
de8cea6f
RN
1134 if (RawValue == NULL) {\r
1135 if (ShellCommandLineGetFlag (Package, L"-p") && (ProtocolVal == NULL)) {\r
1136 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"dh", L"-p");\r
4ba49616 1137 ShellStatus = SHELL_INVALID_PARAMETER;\r
1138 } else {\r
1139 //\r
de8cea6f 1140 // Print information by protocol, The ProtocolVal maybe is name or GUID or NULL.\r
4ba49616 1141 //\r
de8cea6f 1142 ShellStatus = DoDhByProtocol (ProtocolVal, VerboseFlag, SfoFlag, Language, DriverFlag);\r
4ba49616 1143 }\r
de8cea6f
RN
1144 } else if ((RawValue != NULL) &&\r
1145 (gUnicodeCollation->StriColl(gUnicodeCollation, L"decode", (CHAR16 *) RawValue) == 0)) {\r
1146 if (ShellCommandLineGetFlag (Package, L"-p") && (ProtocolVal == NULL)) {\r
1147 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"dh", L"-p");\r
1148 ShellStatus = SHELL_INVALID_PARAMETER;\r
1149 } else {\r
4ba49616 1150 //\r
de8cea6f 1151 // Print decode informatino by protocol.\r
4ba49616 1152 //\r
de8cea6f
RN
1153 ShellStatus = DoDecodeByProtocol (ProtocolVal, Language);\r
1154 }\r
1155 } else {\r
1156 if (ShellCommandLineGetFlag (Package, L"-p")) {\r
1157 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"dh");\r
1158 ShellStatus = SHELL_INVALID_PARAMETER;\r
4ba49616 1159 } else {\r
de8cea6f
RN
1160 Status = ShellConvertStringToUint64 (RawValue, &Intermediate, TRUE, FALSE);\r
1161 if (EFI_ERROR(Status)) {\r
1162 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"dh", RawValue);\r
4ba49616 1163 ShellStatus = SHELL_INVALID_PARAMETER;\r
1164 } else {\r
de8cea6f
RN
1165 Handle = ConvertHandleIndexToHandle ((UINTN) Intermediate);\r
1166 if (Handle == NULL) {\r
1167 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"dh", RawValue);\r
1168 ShellStatus = SHELL_INVALID_PARAMETER;\r
1169 } else {\r
1170 //\r
1171 // Print information by handle.\r
1172 //\r
1173 DoDhByHandle (Handle, VerboseFlag, SfoFlag, Language, DriverFlag, FALSE);\r
1174 }\r
4ba49616 1175 }\r
1176 }\r
1177 }\r
1178\r
4ba49616 1179 ShellCommandLineFreeVarList (Package);\r
1180 SHELL_FREE_NON_NULL(Language);\r
1181 }\r
1182\r
1183 return (ShellStatus);\r
1184}\r