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