]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDriver1CommandsLib/Dh.c
ShellPkg: Update header file including style
[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
f0b0e733 322 StrnCatGrow(&RetVal, &Size, L")\r\n", 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
708 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6), \r
709 gShellDriver1HiiHandle, \r
710 L"None"\r
711 );\r
712 } else {\r
713 ShellPrintHiiEx(\r
714 -1, \r
715 -1, \r
716 NULL, \r
717 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6), \r
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
749 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6B),\r
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
361a8267 805 ProtocolInfoString = GetProtocolInfoString(TheHandle, Language, L"\r\n", Verbose, TRUE);\r
4ba49616 806 ShellPrintHiiEx(\r
807 -1,\r
808 -1,\r
809 NULL,\r
810 STRING_TOKEN (STR_DH_OUTPUT_SINGLE),\r
811 gShellDriver1HiiHandle,\r
812 ConvertHandleToHandleIndex(TheHandle),\r
813 TheHandle,\r
28f898f8
CC
814 ProtocolInfoString==NULL?L"":ProtocolInfoString\r
815 );\r
4ba49616 816 }\r
361a8267 817\r
818 if (DriverInfo) {\r
819 DisplayDriverModelHandle ((EFI_HANDLE)TheHandle, TRUE, Language);\r
820 }\r
4ba49616 821 } else {\r
361a8267 822 ProtocolInfoString = GetProtocolInfoString(TheHandle, Language, L";", FALSE, FALSE);\r
4ba49616 823 ShellPrintHiiEx(\r
824 -1,\r
825 -1,\r
826 NULL,\r
827 STRING_TOKEN (STR_DH_OUTPUT_SFO),\r
828 gShellDriver1HiiHandle,\r
829 Multiple ?L"HandlesInfo":L"HandleInfo",\r
830 L"DriverName",\r
831 L"ControllerName",\r
832 ConvertHandleToHandleIndex(TheHandle),\r
833 L"DevPath",\r
28f898f8
CC
834 ProtocolInfoString==NULL?L"":ProtocolInfoString\r
835 );\r
4ba49616 836 }\r
837\r
4ba49616 838 if (ProtocolInfoString != NULL) {\r
839 FreePool(ProtocolInfoString);\r
840 }\r
4ba49616 841}\r
842\r
361a8267 843/**\r
844 Display information for all handles on a list.\r
845\r
846 @param[in] HandleList The NULL-terminated list of handles.\r
f0b0e733 847 @param[in] Verbose TRUE for extra info, FALSE otherwise.\r
361a8267 848 @param[in] Sfo TRUE to output in standard format output (spec).\r
849 @param[in] Language Language string per UEFI specification.\r
850 @param[in] DriverInfo TRUE to show all info about the handle.\r
851\r
28f898f8
CC
852 @retval SHELL_SUCCESS The operation was successful.\r
853 @retval SHELL_ABORTED The operation was aborted.\r
361a8267 854**/\r
4ba49616 855SHELL_STATUS\r
4ba49616 856DoDhForHandleList(\r
857 IN CONST EFI_HANDLE *HandleList,\r
f0b0e733 858 IN CONST BOOLEAN Verbose,\r
4ba49616 859 IN CONST BOOLEAN Sfo,\r
860 IN CONST CHAR8 *Language,\r
861 IN CONST BOOLEAN DriverInfo\r
862 )\r
863{\r
864 CONST EFI_HANDLE *HandleWalker;\r
865 SHELL_STATUS ShellStatus;\r
866\r
867 ShellStatus = SHELL_SUCCESS;\r
de8cea6f 868 for (HandleWalker = HandleList; HandleWalker != NULL && *HandleWalker != NULL; HandleWalker++) {\r
28f898f8 869 DoDhByHandle (*HandleWalker, Verbose, Sfo, Language, DriverInfo, TRUE);\r
376e7593
TS
870 if (ShellGetExecutionBreakFlag ()) {\r
871 ShellStatus = SHELL_ABORTED;\r
872 break;\r
873 }\r
4ba49616 874 }\r
875 return (ShellStatus);\r
876}\r
877\r
361a8267 878/**\r
de8cea6f 879 Display information for a GUID of protocol.\r
361a8267 880\r
de8cea6f 881 @param[in] Guid The pointer to the name of the protocol.\r
f0b0e733 882 @param[in] Verbose TRUE for extra info, FALSE otherwise.\r
de8cea6f 883 @param[in] Sfo TRUE to output in standard format output (spec).\r
361a8267 884 @param[in] Language Language string per UEFI specification.\r
885 @param[in] DriverInfo TRUE to show all info about the handle.\r
886\r
887 @retval SHELL_SUCCESS The operation was successful.\r
de8cea6f 888 @retval SHELL_NOT_FOUND The GUID was not found.\r
361a8267 889 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.\r
890**/\r
4ba49616 891SHELL_STATUS\r
de8cea6f
RN
892DoDhByProtocolGuid(\r
893 IN CONST GUID *Guid,\r
f0b0e733 894 IN CONST BOOLEAN Verbose,\r
de8cea6f 895 IN CONST BOOLEAN Sfo,\r
4ba49616 896 IN CONST CHAR8 *Language,\r
897 IN CONST BOOLEAN DriverInfo\r
898 )\r
899{\r
de8cea6f 900 CHAR16 *Name;\r
4ba49616 901 SHELL_STATUS ShellStatus;\r
de8cea6f 902 EFI_HANDLE *HandleList;\r
4ba49616 903\r
de8cea6f
RN
904 if (!Sfo) {\r
905 if (Guid == NULL) {\r
906 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_ALL_HEADER), gShellDriver1HiiHandle);\r
907 } else {\r
908 Name = GetStringNameFromGuid (Guid, NULL);\r
909 if (Name == NULL) {\r
910 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_GUID_HEADER), gShellDriver1HiiHandle, Guid);\r
911 } else {\r
912 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_NAME_HEADER), gShellDriver1HiiHandle, Name);\r
913 }\r
914 }\r
915 }\r
916 HandleList = GetHandleListByProtocol(Guid);\r
917 ShellStatus = DoDhForHandleList(HandleList, Verbose, Sfo, Language, DriverInfo);\r
918 SHELL_FREE_NON_NULL(HandleList);\r
4ba49616 919\r
de8cea6f 920 return ShellStatus;\r
4ba49616 921}\r
922\r
361a8267 923/**\r
de8cea6f
RN
924 Function to determine use which method to print information.\r
925 If Protocol is NULL, The function will print all information.\r
361a8267 926\r
de8cea6f 927 @param[in] Protocol The pointer to the name or GUID of protocol or NULL.\r
f0b0e733 928 @param[in] Verbose TRUE for extra info, FALSE otherwise.\r
361a8267 929 @param[in] Sfo TRUE to output in standard format output (spec).\r
930 @param[in] Language Language string per UEFI specification.\r
931 @param[in] DriverInfo TRUE to show all info about the handle.\r
932\r
de8cea6f
RN
933 @retval SHELL_SUCCESS The operation was successful.\r
934 @retval SHELL_NOT_FOUND The protocol was not found.\r
935 @retval SHELL_INVALID_PARAMETER Protocol is invalid parameter.\r
361a8267 936**/\r
4ba49616 937SHELL_STATUS\r
de8cea6f
RN
938DoDhByProtocol (\r
939 IN CONST CHAR16 *Protocol,\r
f0b0e733 940 IN CONST BOOLEAN Verbose,\r
4ba49616 941 IN CONST BOOLEAN Sfo,\r
942 IN CONST CHAR8 *Language,\r
943 IN CONST BOOLEAN DriverInfo\r
944 )\r
945{\r
de8cea6f
RN
946 EFI_GUID Guid;\r
947 EFI_GUID *GuidPtr;\r
4ba49616 948 EFI_STATUS Status;\r
4ba49616 949\r
de8cea6f
RN
950 if (Protocol == NULL) {\r
951 return DoDhByProtocolGuid (NULL, Verbose, Sfo, Language, DriverInfo);\r
952 } else {\r
953 Status = ConvertStrToGuid (Protocol, &Guid);\r
954 if (!EFI_ERROR (Status)) {\r
955 GuidPtr = &Guid;\r
956 } else {\r
957 //\r
958 // Protocol is a Name, convert it to GUID\r
959 //\r
960 Status = GetGuidFromStringName (Protocol, Language, &GuidPtr);\r
961 if (EFI_ERROR(Status)) {\r
962 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_NO_NAME_FOUND), gShellDriver1HiiHandle, Protocol);\r
963 return (SHELL_NOT_FOUND);\r
964 }\r
965 }\r
4ba49616 966\r
de8cea6f 967 return DoDhByProtocolGuid (GuidPtr, Verbose, Sfo, Language, DriverInfo);\r
4ba49616 968 }\r
de8cea6f 969}\r
4ba49616 970\r
de8cea6f
RN
971/**\r
972 Function to display decode information by Protocol.\r
973 The parameter Protocol is either a GUID or the name of protocol.\r
974 If the parameter Protocol is NULL, the function will print all\r
975 decode information.\r
4ba49616 976\r
de8cea6f
RN
977 @param[in] Protocol The pointer to the name or GUID of protocol.\r
978 @param[in] Language Language string per UEFI specification.\r
4ba49616 979\r
de8cea6f
RN
980 @retval SHELL_SUCCESS The operation was successful.\r
981 @retval SHELL_OUT_OT_RESOURCES A memory allocation failed.\r
982**/\r
983SHELL_STATUS\r
984DoDecodeByProtocol(\r
985 IN CONST CHAR16 *Protocol,\r
986 IN CONST CHAR8 *Language\r
987 )\r
988{\r
989 EFI_STATUS Status;\r
990 EFI_GUID *Guids;\r
991 EFI_GUID Guid;\r
992 UINTN Counts;\r
993 UINTN Index;\r
994 CHAR16 *Name;\r
995\r
996 if (Protocol == NULL) {\r
997 Counts = 0;\r
998 Status = GetAllMappingGuids (NULL, &Counts);\r
999 if (Status == EFI_BUFFER_TOO_SMALL) {\r
1000 Guids = AllocatePool (Counts * sizeof(EFI_GUID));\r
1001 if (Guids == NULL) {\r
1002 return SHELL_OUT_OF_RESOURCES;\r
1003 }\r
4ba49616 1004\r
de8cea6f
RN
1005 Status = GetAllMappingGuids (Guids, &Counts);\r
1006 if (Status == EFI_SUCCESS) {\r
1007 for (Index = 0; Index < Counts; Index++) {\r
1008 Name = GetStringNameFromGuid (&Guids[Index], Language);\r
1009 if (Name != NULL) {\r
1010 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_DECODE), gShellDriver1HiiHandle, Name, &Guids[Index]);\r
1011 } else {\r
1012 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_NO_GUID_FOUND), gShellDriver1HiiHandle, &Guids[Index]);\r
1013 }\r
1014 SHELL_FREE_NON_NULL (Name);\r
1015 }\r
1016 }\r
1017 FreePool (Guids);\r
1018 }\r
1019 } else {\r
1020 if (ConvertStrToGuid (Protocol, &Guid) == EFI_SUCCESS) {\r
1021 Name = GetStringNameFromGuid (&Guid, Language);\r
1022 if (Name != NULL) {\r
1023 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_DECODE), gShellDriver1HiiHandle, Name, &Guid);\r
1024 } else {\r
1025 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_NO_GUID_FOUND), gShellDriver1HiiHandle, &Guid);\r
1026 }\r
1027 SHELL_FREE_NON_NULL(Name);\r
1028 } else {\r
1029 Status = GetGuidFromStringName (Protocol, Language, &Guids);\r
1030 if (Status == EFI_SUCCESS) {\r
1031 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_DECODE), gShellDriver1HiiHandle, Protocol, Guids);\r
1032 } else {\r
1033 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DH_NO_NAME_FOUND), gShellDriver1HiiHandle, Protocol);\r
1034 }\r
1035 }\r
1036 }\r
1037\r
1038 return SHELL_SUCCESS;\r
4ba49616 1039}\r
1040\r
361a8267 1041/**\r
1042 Function for 'dh' command.\r
1043\r
1044 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
1045 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
1046**/\r
4ba49616 1047SHELL_STATUS\r
1048EFIAPI\r
1049ShellCommandRunDh (\r
1050 IN EFI_HANDLE ImageHandle,\r
1051 IN EFI_SYSTEM_TABLE *SystemTable\r
1052 )\r
1053{\r
1054 EFI_STATUS Status;\r
1055 LIST_ENTRY *Package;\r
1056 CHAR16 *ProblemParam;\r
1057 SHELL_STATUS ShellStatus;\r
1058 CHAR8 *Language;\r
1059 CONST CHAR16 *Lang;\r
28f898f8 1060 CONST CHAR16 *RawValue;\r
de8cea6f 1061 CONST CHAR16 *ProtocolVal;\r
28f898f8
CC
1062 BOOLEAN SfoFlag;\r
1063 BOOLEAN DriverFlag;\r
1064 BOOLEAN VerboseFlag;\r
361a8267 1065 UINT64 Intermediate;\r
de8cea6f 1066 EFI_HANDLE Handle;\r
4ba49616 1067\r
1068 ShellStatus = SHELL_SUCCESS;\r
1069 Status = EFI_SUCCESS;\r
1070 Language = NULL;\r
1071\r
1072 //\r
1073 // initialize the shell lib (we must be in non-auto-init...)\r
1074 //\r
1075 Status = ShellInitialize();\r
1076 ASSERT_EFI_ERROR(Status);\r
1077\r
1078 Status = CommandInit();\r
1079 ASSERT_EFI_ERROR(Status);\r
1080\r
1081 //\r
1082 // parse the command line\r
1083 //\r
1084 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
1085 if (EFI_ERROR(Status)) {\r
1086 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
bc280720 1087 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"dh", ProblemParam); \r
4ba49616 1088 FreePool(ProblemParam);\r
1089 ShellStatus = SHELL_INVALID_PARAMETER;\r
1090 } else {\r
1091 ASSERT(FALSE);\r
1092 }\r
1093 } else {\r
1094 if (ShellCommandLineGetCount(Package) > 2) {\r
bc280720 1095 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"dh"); \r
4ba49616 1096 ShellCommandLineFreeVarList (Package);\r
1097 return (SHELL_INVALID_PARAMETER);\r
1098 }\r
1099\r
28f898f8
CC
1100 if (ShellCommandLineGetFlag(Package, L"-l")) {\r
1101 Lang = ShellCommandLineGetValue(Package, L"-l");\r
1102 if (Lang != NULL) {\r
1103 Language = AllocateZeroPool(StrSize(Lang));\r
1104 AsciiSPrint(Language, StrSize(Lang), "%S", Lang);\r
1105 } else {\r
1106 ASSERT(Language == NULL);\r
1107 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN(STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"dh", L"-l");\r
1108 ShellCommandLineFreeVarList(Package);\r
1109 return (SHELL_INVALID_PARAMETER);\r
1110 }\r
1111 } else {\r
4ba49616 1112 Language = AllocateZeroPool(10);\r
1113 AsciiSPrint(Language, 10, "en-us");\r
4ba49616 1114 }\r
1115\r
28f898f8
CC
1116 SfoFlag = ShellCommandLineGetFlag (Package, L"-sfo");\r
1117 DriverFlag = ShellCommandLineGetFlag (Package, L"-d");\r
1118 VerboseFlag = (BOOLEAN)(ShellCommandLineGetFlag (Package, L"-v") || ShellCommandLineGetFlag (Package, L"-verbose"));\r
de8cea6f
RN
1119 RawValue = ShellCommandLineGetRawValue (Package, 1);\r
1120 ProtocolVal = ShellCommandLineGetValue (Package, L"-p");\r
4ba49616 1121\r
de8cea6f
RN
1122 if (RawValue == NULL) {\r
1123 if (ShellCommandLineGetFlag (Package, L"-p") && (ProtocolVal == NULL)) {\r
1124 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"dh", L"-p");\r
4ba49616 1125 ShellStatus = SHELL_INVALID_PARAMETER;\r
1126 } else {\r
1127 //\r
de8cea6f 1128 // Print information by protocol, The ProtocolVal maybe is name or GUID or NULL.\r
4ba49616 1129 //\r
de8cea6f 1130 ShellStatus = DoDhByProtocol (ProtocolVal, VerboseFlag, SfoFlag, Language, DriverFlag);\r
4ba49616 1131 }\r
de8cea6f
RN
1132 } else if ((RawValue != NULL) &&\r
1133 (gUnicodeCollation->StriColl(gUnicodeCollation, L"decode", (CHAR16 *) RawValue) == 0)) {\r
1134 if (ShellCommandLineGetFlag (Package, L"-p") && (ProtocolVal == NULL)) {\r
1135 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"dh", L"-p");\r
1136 ShellStatus = SHELL_INVALID_PARAMETER;\r
1137 } else {\r
4ba49616 1138 //\r
de8cea6f 1139 // Print decode informatino by protocol.\r
4ba49616 1140 //\r
de8cea6f
RN
1141 ShellStatus = DoDecodeByProtocol (ProtocolVal, Language);\r
1142 }\r
1143 } else {\r
1144 if (ShellCommandLineGetFlag (Package, L"-p")) {\r
1145 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"dh");\r
1146 ShellStatus = SHELL_INVALID_PARAMETER;\r
4ba49616 1147 } else {\r
de8cea6f
RN
1148 Status = ShellConvertStringToUint64 (RawValue, &Intermediate, TRUE, FALSE);\r
1149 if (EFI_ERROR(Status)) {\r
1150 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"dh", RawValue);\r
4ba49616 1151 ShellStatus = SHELL_INVALID_PARAMETER;\r
1152 } else {\r
de8cea6f
RN
1153 Handle = ConvertHandleIndexToHandle ((UINTN) Intermediate);\r
1154 if (Handle == NULL) {\r
1155 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"dh", RawValue);\r
1156 ShellStatus = SHELL_INVALID_PARAMETER;\r
1157 } else {\r
1158 //\r
1159 // Print information by handle.\r
1160 //\r
1161 DoDhByHandle (Handle, VerboseFlag, SfoFlag, Language, DriverFlag, FALSE);\r
1162 }\r
4ba49616 1163 }\r
1164 }\r
1165 }\r
1166\r
4ba49616 1167 ShellCommandLineFreeVarList (Package);\r
1168 SHELL_FREE_NON_NULL(Language);\r
1169 }\r
1170\r
1171 return (ShellStatus);\r
1172}\r