]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDriver1CommandsLib/Dh.c
ShellPkg: Fix typos in comments and variables
[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
0d807dae 5 Copyright (c) 2010 - 2014, 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
361a8267 44/**\r
45 Get the name of a driver by it's handle.\r
46\r
47 If a name is found the memory must be callee freed.\r
48\r
49 @param[in] TheHandle The driver's handle.\r
50 @param[in] Language The language to use.\r
51 @param[in] NameFound Upon a successful return the name found.\r
52\r
53 @retval EFI_SUCCESS The name was found.\r
54**/\r
55EFI_STATUS\r
361a8267 56GetDriverName (\r
57 IN EFI_HANDLE TheHandle,\r
58 IN CONST CHAR8 *Language,\r
59 IN CHAR16 **NameFound\r
60 )\r
61{\r
62 CHAR8 *Lang;\r
361a8267 63 EFI_STATUS Status;\r
64 EFI_COMPONENT_NAME2_PROTOCOL *CompName2;\r
65 CHAR16 *NameToReturn;\r
66 //\r
67 // Go through those handles until we get one that passes for GetComponentName\r
68 //\r
69 Status = gBS->OpenProtocol(\r
70 TheHandle,\r
71 &gEfiComponentName2ProtocolGuid,\r
72 (VOID**)&CompName2,\r
73 gImageHandle,\r
74 NULL,\r
75 EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
76 if (EFI_ERROR(Status)) {\r
77 Status = gBS->OpenProtocol(\r
78 TheHandle,\r
79 &gEfiComponentNameProtocolGuid,\r
80 (VOID**)&CompName2,\r
81 gImageHandle,\r
82 NULL,\r
83 EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
84 }\r
85\r
86 if (EFI_ERROR(Status)) {\r
87 return (EFI_NOT_FOUND);\r
88 }\r
a71003f2 89 Lang = GetBestLanguageForDriver (CompName2->SupportedLanguages, Language, FALSE);\r
361a8267 90 Status = CompName2->GetDriverName(CompName2, Lang, &NameToReturn);\r
91 FreePool(Lang);\r
92\r
93 if (!EFI_ERROR(Status) && NameToReturn != NULL) {\r
94 *NameFound = NULL;\r
95 StrnCatGrow(NameFound, NULL, NameToReturn, 0);\r
96 }\r
97 return (Status);\r
98}\r
99\r
100/**\r
101 Discover if a protocol guid is one of the UEFI Driver Model Protocols.\r
102\r
103 @param[in] Guid The guid to test.\r
104\r
105 @retval TRUE The guid does represent a driver model protocol.\r
106 @retval FALSE The guid does not represent a driver model protocol.\r
107**/\r
4ba49616 108BOOLEAN\r
4ba49616 109IsDriverProt (\r
110 IN CONST EFI_GUID *Guid\r
111 )\r
112{\r
113 CONST EFI_GUID **GuidWalker;\r
114 BOOLEAN GuidFound;\r
115 GuidFound = FALSE;\r
116 for (GuidWalker = UefiDriverModelProtocolsGuidArray\r
117 ; GuidWalker != NULL && *GuidWalker != NULL\r
118 ; GuidWalker++\r
119 ){\r
120 if (CompareGuid(*GuidWalker, Guid)) {\r
121 GuidFound = TRUE;\r
122 break;\r
123 }\r
124 }\r
125 return (GuidFound);\r
126}\r
127\r
361a8267 128/**\r
129 Get information for a handle.\r
130\r
131 @param[in] TheHandle The handles to show info on.\r
132 @param[in] Language Language string per UEFI specification.\r
268d3445 133 @param[in] Separator Separator string between information blocks.\r
361a8267 134 @param[in] Verbose TRUE for extra info, FALSE otherwise.\r
135 @param[in] ExtraInfo TRUE for extra info, FALSE otherwise.\r
136\r
137 @retval SHELL_SUCCESS The operation was successful.\r
138 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.\r
139**/\r
4ba49616 140CHAR16*\r
4ba49616 141GetProtocolInfoString(\r
142 IN CONST EFI_HANDLE TheHandle,\r
143 IN CONST CHAR8 *Language,\r
268d3445 144 IN CONST CHAR16 *Separator,\r
4ba49616 145 IN CONST BOOLEAN Verbose,\r
146 IN CONST BOOLEAN ExtraInfo\r
147 )\r
148{\r
149 EFI_GUID **ProtocolGuidArray;\r
150 UINTN ArrayCount;\r
151 UINTN ProtocolIndex;\r
152 EFI_STATUS Status;\r
153 CHAR16 *RetVal;\r
154 UINTN Size;\r
155 CHAR16 *Temp;\r
156\r
157 ProtocolGuidArray = NULL;\r
361a8267 158 RetVal = NULL;\r
159 Size = 0;\r
4ba49616 160\r
161 Status = gBS->ProtocolsPerHandle (\r
162 TheHandle,\r
163 &ProtocolGuidArray,\r
164 &ArrayCount\r
165 );\r
166 if (!EFI_ERROR (Status)) {\r
4ba49616 167 for (ProtocolIndex = 0; ProtocolIndex < ArrayCount; ProtocolIndex++) {\r
168 Temp = GetStringNameFromGuid(ProtocolGuidArray[ProtocolIndex], Language);\r
169 if (Temp != NULL) {\r
170 ASSERT((RetVal == NULL && Size == 0) || (RetVal != NULL));\r
171 if (Size != 0) {\r
268d3445 172 StrnCatGrow(&RetVal, &Size, Separator, 0);\r
4ba49616 173 }\r
174 StrnCatGrow(&RetVal, &Size, L"%H", 0);\r
175 StrnCatGrow(&RetVal, &Size, Temp, 0);\r
176 StrnCatGrow(&RetVal, &Size, L"%N", 0);\r
177 FreePool(Temp);\r
178 }\r
179 if (ExtraInfo) {\r
180 Temp = GetProtocolInformationDump(TheHandle, ProtocolGuidArray[ProtocolIndex], Verbose);\r
181 if (Temp != NULL) {\r
182 ASSERT((RetVal == NULL && Size == 0) || (RetVal != NULL));\r
183 if (!Verbose) {\r
184 StrnCatGrow(&RetVal, &Size, L"(", 0);\r
185 StrnCatGrow(&RetVal, &Size, Temp, 0);\r
f0b0e733 186 StrnCatGrow(&RetVal, &Size, L")\r\n", 0);\r
4ba49616 187 } else {\r
268d3445 188 StrnCatGrow(&RetVal, &Size, Separator, 0);\r
4ba49616 189 StrnCatGrow(&RetVal, &Size, Temp, 0);\r
190 }\r
191 FreePool(Temp);\r
192 }\r
193 }\r
194 }\r
4ba49616 195 }\r
361a8267 196 \r
197 SHELL_FREE_NON_NULL(ProtocolGuidArray);\r
4ba49616 198\r
361a8267 199 if (RetVal == NULL) {\r
200 return (NULL);\r
4ba49616 201 }\r
361a8267 202\r
4ba49616 203 ASSERT((RetVal == NULL && Size == 0) || (RetVal != NULL));\r
268d3445 204 StrnCatGrow(&RetVal, &Size, Separator, 0);\r
4ba49616 205 return (RetVal);\r
206}\r
207\r
361a8267 208/**\r
209 Gets the name of the loaded image.\r
210\r
211 @param[in] TheHandle The handle of the driver to get info on.\r
212 @param[out] Name The pointer to the pointer. Valid upon a successful return.\r
213\r
214 @retval EFI_SUCCESS The operation was successful.\r
215**/\r
216EFI_STATUS\r
361a8267 217GetDriverImageName (\r
218 IN EFI_HANDLE TheHandle,\r
219 OUT CHAR16 **Name\r
220 )\r
221{\r
222 // get loaded image and devicepathtotext on image->Filepath\r
223 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
224 EFI_STATUS Status;\r
225 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
226\r
227 if (TheHandle == NULL || Name == NULL) {\r
228 return (EFI_INVALID_PARAMETER);\r
229 }\r
230\r
231 Status = gBS->OpenProtocol (\r
232 TheHandle,\r
233 &gEfiLoadedImageProtocolGuid,\r
234 (VOID **) &LoadedImage,\r
235 gImageHandle,\r
236 NULL,\r
237 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
238 );\r
239 if (EFI_ERROR(Status)) {\r
240 return (Status);\r
241 }\r
242 DevicePath = LoadedImage->FilePath;\r
863986b3 243 *Name = ConvertDevicePathToText(DevicePath, TRUE, TRUE);\r
361a8267 244 return (EFI_SUCCESS);\r
245}\r
246\r
247/**\r
248 Display driver model information for a given handle.\r
249 \r
250 @param[in] Handle The handle to display info on.\r
251 @param[in] BestName Use the best name?\r
252 @param[in] Language The language to output in.\r
253**/\r
254EFI_STATUS\r
361a8267 255DisplayDriverModelHandle (\r
256 IN EFI_HANDLE Handle,\r
257 IN BOOLEAN BestName,\r
258 IN CONST CHAR8 *Language OPTIONAL\r
259 )\r
260{\r
261 EFI_STATUS Status;\r
262 BOOLEAN ConfigurationStatus;\r
263 BOOLEAN DiagnosticsStatus;\r
264 UINTN DriverBindingHandleCount;\r
265 EFI_HANDLE *DriverBindingHandleBuffer;\r
266 UINTN ParentControllerHandleCount;\r
267 EFI_HANDLE *ParentControllerHandleBuffer;\r
268 UINTN ChildControllerHandleCount;\r
269 EFI_HANDLE *ChildControllerHandleBuffer;\r
270 CHAR16 *TempStringPointer;\r
271 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
272 UINTN Index;\r
273 CHAR16 *DriverName;\r
274 EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;\r
275 UINTN NumberOfChildren;\r
276 UINTN HandleIndex;\r
277 UINTN ControllerHandleCount;\r
278 EFI_HANDLE *ControllerHandleBuffer;\r
279 UINTN ChildIndex;\r
280 BOOLEAN Image;\r
281\r
0d807dae
ED
282 DriverName = NULL;\r
283\r
361a8267 284 //\r
285 // See if Handle is a device handle and display its details.\r
286 //\r
287 DriverBindingHandleBuffer = NULL;\r
288 Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS (\r
289 Handle,\r
290 &DriverBindingHandleCount,\r
291 &DriverBindingHandleBuffer\r
292 );\r
293\r
294 ParentControllerHandleBuffer = NULL;\r
295 Status = PARSE_HANDLE_DATABASE_PARENTS (\r
296 Handle,\r
297 &ParentControllerHandleCount,\r
298 &ParentControllerHandleBuffer\r
299 );\r
300\r
301 ChildControllerHandleBuffer = NULL;\r
302 Status = ParseHandleDatabaseForChildControllers (\r
303 Handle,\r
304 &ChildControllerHandleCount,\r
305 &ChildControllerHandleBuffer\r
306 );\r
307\r
308 DiagnosticsStatus = FALSE;\r
309 ConfigurationStatus = FALSE;\r
310\r
311 if (!EFI_ERROR(gBS->OpenProtocol(Handle, &gEfiDriverConfigurationProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
312 ConfigurationStatus = TRUE;\r
313 }\r
314 if (!EFI_ERROR(gBS->OpenProtocol(Handle, &gEfiDriverConfiguration2ProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
315 ConfigurationStatus = TRUE;\r
316 }\r
317 if (!EFI_ERROR(gBS->OpenProtocol(Handle, &gEfiDriverDiagnosticsProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
318 DiagnosticsStatus = TRUE;\r
319 }\r
320 if (!EFI_ERROR(gBS->OpenProtocol(Handle, &gEfiDriverDiagnostics2ProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
321 DiagnosticsStatus = TRUE;\r
322 }\r
323\r
324 Status = EFI_SUCCESS;\r
325\r
326 if (DriverBindingHandleCount > 0 || ParentControllerHandleCount > 0 || ChildControllerHandleCount > 0) {\r
327\r
328\r
329\r
330 DevicePath = NULL;\r
331 TempStringPointer = NULL;\r
332 Status = gBS->HandleProtocol (Handle, &gEfiDevicePathProtocolGuid, (VOID**)&DevicePath);\r
333\r
334 Status = gEfiShellProtocol->GetDeviceName(Handle, EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8*)Language, &TempStringPointer);\r
335 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_DRIVER1), gShellDriver1HiiHandle, TempStringPointer!=NULL?TempStringPointer:L"<Unknown>");\r
336 SHELL_FREE_NON_NULL(TempStringPointer);\r
337 \r
863986b3 338 TempStringPointer = ConvertDevicePathToText(DevicePath, TRUE, FALSE);\r
361a8267 339 ShellPrintHiiEx(\r
340 -1, \r
341 -1, \r
342 NULL, \r
343 STRING_TOKEN (STR_DH_OUTPUT_DRIVER2), \r
344 gShellDriver1HiiHandle, \r
345 TempStringPointer!=NULL?TempStringPointer:L"<None>",\r
346 ParentControllerHandleCount == 0?L"ROOT":(ChildControllerHandleCount > 0)?L"BUS":L"DEVICE",\r
347 ConfigurationStatus?L"YES":L"NO",\r
348 DiagnosticsStatus?L"YES":L"NO"\r
349 );\r
350\r
351 SHELL_FREE_NON_NULL(TempStringPointer);\r
352\r
353 if (DriverBindingHandleCount == 0) {\r
354 ShellPrintHiiEx(\r
355 -1, \r
356 -1, \r
357 NULL, \r
358 STRING_TOKEN (STR_DH_OUTPUT_DRIVER3), \r
359 gShellDriver1HiiHandle, \r
360 L"<None>"\r
361 );\r
362 } else {\r
363 ShellPrintHiiEx(\r
364 -1, \r
365 -1, \r
366 NULL, \r
367 STRING_TOKEN (STR_DH_OUTPUT_DRIVER3), \r
368 gShellDriver1HiiHandle, \r
369 L""\r
370 );\r
371 for (Index = 0; Index < DriverBindingHandleCount; Index++) {\r
372 Image = FALSE;\r
373 Status = GetDriverName (\r
374 DriverBindingHandleBuffer[Index],\r
375 Language,\r
376 &DriverName\r
377 );\r
f330ff35 378 if (EFI_ERROR (Status)) {\r
361a8267 379 Status = GetDriverImageName (\r
380 DriverBindingHandleBuffer[Index],\r
381 &DriverName\r
382 );\r
f330ff35 383 if (EFI_ERROR (Status)) {\r
384 DriverName = NULL;\r
385 }\r
361a8267 386 }\r
387\r
388 if (Image) {\r
389 ShellPrintHiiEx(\r
390 -1, \r
391 -1, \r
392 NULL, \r
393 STRING_TOKEN (STR_DH_OUTPUT_DRIVER4A),\r
394 gShellDriver1HiiHandle,\r
395 ConvertHandleToHandleIndex (DriverBindingHandleBuffer[Index]),\r
396 DriverName!=NULL?DriverName:L"<Unknown>"\r
397 );\r
398 } else {\r
399 ShellPrintHiiEx(\r
400 -1, \r
401 -1, \r
402 NULL, \r
403 STRING_TOKEN (STR_DH_OUTPUT_DRIVER4B),\r
404 gShellDriver1HiiHandle,\r
405 ConvertHandleToHandleIndex (DriverBindingHandleBuffer[Index]),\r
406 DriverName!=NULL?DriverName:L"<Unknown>"\r
407 );\r
408 }\r
409 SHELL_FREE_NON_NULL(DriverName);\r
410 }\r
411 }\r
412\r
413 if (ParentControllerHandleCount == 0) {\r
414 ShellPrintHiiEx(\r
415 -1, \r
416 -1, \r
417 NULL, \r
418 STRING_TOKEN (STR_DH_OUTPUT_DRIVER5), \r
419 gShellDriver1HiiHandle, \r
420 L"<None>"\r
421 );\r
422 } else {\r
423 ShellPrintHiiEx(\r
424 -1, \r
425 -1, \r
426 NULL, \r
427 STRING_TOKEN (STR_DH_OUTPUT_DRIVER5), \r
428 gShellDriver1HiiHandle, \r
429 L""\r
430 );\r
431 for (Index = 0; Index < ParentControllerHandleCount; Index++) {\r
432 Status = gEfiShellProtocol->GetDeviceName(ParentControllerHandleBuffer[Index], EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8*)Language, &TempStringPointer);\r
433 ShellPrintHiiEx(\r
434 -1, \r
435 -1, \r
436 NULL, \r
437 STRING_TOKEN (STR_DH_OUTPUT_DRIVER5B),\r
438 gShellDriver1HiiHandle,\r
439 ConvertHandleToHandleIndex (ParentControllerHandleBuffer[Index]),\r
440 TempStringPointer!=NULL?TempStringPointer:L"<Unknown>"\r
441 );\r
442 SHELL_FREE_NON_NULL(TempStringPointer);\r
443 }\r
444 }\r
445\r
446 if (ChildControllerHandleCount == 0) {\r
447 ShellPrintHiiEx(\r
448 -1, \r
449 -1, \r
450 NULL, \r
451 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6), \r
452 gShellDriver1HiiHandle, \r
453 L"<None>"\r
454 );\r
455 } else {\r
456 ShellPrintHiiEx(\r
457 -1, \r
458 -1, \r
459 NULL, \r
460 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6), \r
461 gShellDriver1HiiHandle, \r
462 L""\r
463 );\r
464 for (Index = 0; Index < ChildControllerHandleCount; Index++) {\r
465 Status = gEfiShellProtocol->GetDeviceName(ChildControllerHandleBuffer[Index], EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8*)Language, &TempStringPointer);\r
466 ShellPrintHiiEx(\r
467 -1, \r
468 -1, \r
469 NULL, \r
470 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6B),\r
471 gShellDriver1HiiHandle,\r
472 ConvertHandleToHandleIndex (ChildControllerHandleBuffer[Index]),\r
473 TempStringPointer!=NULL?TempStringPointer:L"<Unknown>"\r
474 );\r
475 SHELL_FREE_NON_NULL(TempStringPointer);\r
476 }\r
477 }\r
478 }\r
479\r
480 SHELL_FREE_NON_NULL(DriverBindingHandleBuffer);\r
481\r
482 SHELL_FREE_NON_NULL(ParentControllerHandleBuffer);\r
483\r
484 SHELL_FREE_NON_NULL(ChildControllerHandleBuffer);\r
485\r
486 if (EFI_ERROR (Status)) {\r
487 return Status;\r
488 }\r
489 //\r
490 // See if Handle is a driver binding handle and display its details.\r
491 //\r
492 Status = gBS->OpenProtocol (\r
493 Handle,\r
494 &gEfiDriverBindingProtocolGuid,\r
495 (VOID **) &DriverBinding,\r
496 NULL,\r
497 NULL,\r
498 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
499 );\r
500 if (EFI_ERROR (Status)) {\r
501 return EFI_SUCCESS;\r
502 }\r
503\r
504 NumberOfChildren = 0;\r
505 ControllerHandleBuffer = NULL;\r
506 Status = PARSE_HANDLE_DATABASE_DEVICES (\r
507 Handle,\r
508 &ControllerHandleCount,\r
509 &ControllerHandleBuffer\r
510 );\r
511 if (ControllerHandleCount > 0) {\r
512 for (HandleIndex = 0; HandleIndex < ControllerHandleCount; HandleIndex++) {\r
513 Status = PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (\r
514 Handle,\r
515 ControllerHandleBuffer[HandleIndex],\r
516 &ChildControllerHandleCount,\r
517 NULL\r
518 );\r
519 NumberOfChildren += ChildControllerHandleCount;\r
520 }\r
521 }\r
522\r
523 Status = GetDriverName (Handle, Language, &DriverName);\r
f330ff35 524 if (EFI_ERROR (Status)) {\r
525 DriverName = NULL;\r
526 }\r
361a8267 527\r
528 ShellPrintHiiEx(\r
529 -1, \r
530 -1, \r
531 NULL, \r
532 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6B),\r
533 gShellDriver1HiiHandle,\r
534 ConvertHandleToHandleIndex(Handle),\r
535 DriverName!=NULL?DriverName:L"<Unknown>"\r
536 );\r
537 SHELL_FREE_NON_NULL(DriverName);\r
361a8267 538 Status = GetDriverImageName (\r
539 Handle,\r
540 &DriverName\r
541 );\r
f330ff35 542 if (EFI_ERROR (Status)) {\r
543 DriverName = NULL;\r
544 }\r
361a8267 545 ShellPrintHiiEx(\r
546 -1, \r
547 -1, \r
548 NULL, \r
549 STRING_TOKEN (STR_DH_OUTPUT_DRIVER7B),\r
550 gShellDriver1HiiHandle,\r
551 DriverName!=NULL?DriverName:L"<Unknown>"\r
552 );\r
553 SHELL_FREE_NON_NULL(DriverName);\r
554\r
555 ShellPrintHiiEx(\r
556 -1, \r
557 -1, \r
558 NULL, \r
559 STRING_TOKEN (STR_DH_OUTPUT_DRIVER8), \r
560 gShellDriver1HiiHandle, \r
561 DriverBinding->Version,\r
562 NumberOfChildren > 0?L"Bus":ControllerHandleCount > 0?L"Device":L"<Unknown>",\r
563 ConfigurationStatus?L"YES":L"NO",\r
564 DiagnosticsStatus?L"YES":L"NO"\r
565 );\r
566\r
567 if (ControllerHandleCount == 0) {\r
568 ShellPrintHiiEx(\r
569 -1, \r
570 -1, \r
571 NULL, \r
572 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6), \r
573 gShellDriver1HiiHandle, \r
574 L"None"\r
575 );\r
576 } else {\r
577 ShellPrintHiiEx(\r
578 -1, \r
579 -1, \r
580 NULL, \r
581 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6), \r
582 gShellDriver1HiiHandle, \r
583 L""\r
584 );\r
585 for (HandleIndex = 0; HandleIndex < ControllerHandleCount; HandleIndex++) {\r
586 Status = gEfiShellProtocol->GetDeviceName(ControllerHandleBuffer[HandleIndex], EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8*)Language, &TempStringPointer);\r
587\r
588 ShellPrintHiiEx(\r
589 -1, \r
590 -1, \r
591 NULL, \r
592 STRING_TOKEN (STR_DH_OUTPUT_DRIVER9B),\r
593 gShellDriver1HiiHandle,\r
594 ConvertHandleToHandleIndex(ControllerHandleBuffer[HandleIndex]),\r
595 TempStringPointer!=NULL?TempStringPointer:L"<Unknown>"\r
596 );\r
597 SHELL_FREE_NON_NULL(TempStringPointer);\r
598\r
599 Status = PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (\r
600 Handle,\r
601 ControllerHandleBuffer[HandleIndex],\r
602 &ChildControllerHandleCount,\r
603 &ChildControllerHandleBuffer\r
604 );\r
605 if (!EFI_ERROR (Status)) {\r
606 for (ChildIndex = 0; ChildIndex < ChildControllerHandleCount; ChildIndex++) {\r
607 Status = gEfiShellProtocol->GetDeviceName(ChildControllerHandleBuffer[ChildIndex], EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8*)Language, &TempStringPointer);\r
608\r
609 ShellPrintHiiEx(\r
610 -1, \r
611 -1, \r
612 NULL, \r
613 STRING_TOKEN (STR_DH_OUTPUT_DRIVER6B),\r
614 gShellDriver1HiiHandle,\r
615 ConvertHandleToHandleIndex(ChildControllerHandleBuffer[ChildIndex]),\r
616 TempStringPointer!=NULL?TempStringPointer:L"<Unknown>"\r
617 );\r
618 SHELL_FREE_NON_NULL(TempStringPointer);\r
619 }\r
620\r
621 SHELL_FREE_NON_NULL (ChildControllerHandleBuffer);\r
622 }\r
623 }\r
624\r
625 SHELL_FREE_NON_NULL (ControllerHandleBuffer);\r
626 }\r
627\r
628 return EFI_SUCCESS;\r
629}\r
630\r
631/**\r
632 Display information for a handle.\r
633\r
634 @param[in] TheHandle The handles to show info on.\r
635 @param[in] Verbose TRUE for extra info, FALSE otherwise.\r
636 @param[in] Sfo TRUE to output in standard format output (spec).\r
637 @param[in] Language Language string per UEFI specification.\r
638 @param[in] DriverInfo TRUE to show all info about the handle.\r
639 @param[in] Multiple TRUE indicates more than will be output,\r
640 FALSE for a single one.\r
641\r
642 @retval SHELL_SUCCESS The operation was successful.\r
643 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.\r
644**/\r
4ba49616 645SHELL_STATUS\r
4ba49616 646DoDhByHandle(\r
647 IN CONST EFI_HANDLE TheHandle,\r
648 IN CONST BOOLEAN Verbose,\r
649 IN CONST BOOLEAN Sfo,\r
650 IN CONST CHAR8 *Language,\r
651 IN CONST BOOLEAN DriverInfo,\r
652 IN CONST BOOLEAN Multiple\r
653 )\r
654{\r
655 CHAR16 *ProtocolInfoString;\r
656 SHELL_STATUS ShellStatus;\r
4ba49616 657\r
4ba49616 658 ShellStatus = SHELL_SUCCESS;\r
659 ProtocolInfoString = NULL;\r
660\r
661 if (!Sfo) {\r
662 if (Multiple) {\r
361a8267 663 ProtocolInfoString = GetProtocolInfoString(TheHandle, Language, L" ", Verbose, TRUE);\r
4ba49616 664 ShellPrintHiiEx(\r
665 -1,\r
666 -1,\r
667 NULL,\r
668 STRING_TOKEN (STR_DH_OUTPUT),\r
669 gShellDriver1HiiHandle,\r
670 ConvertHandleToHandleIndex(TheHandle),\r
671 ProtocolInfoString==NULL?L"":ProtocolInfoString);\r
672 } else {\r
361a8267 673 ProtocolInfoString = GetProtocolInfoString(TheHandle, Language, L"\r\n", Verbose, TRUE);\r
4ba49616 674 ShellPrintHiiEx(\r
675 -1,\r
676 -1,\r
677 NULL,\r
678 STRING_TOKEN (STR_DH_OUTPUT_SINGLE),\r
679 gShellDriver1HiiHandle,\r
680 ConvertHandleToHandleIndex(TheHandle),\r
681 TheHandle,\r
682 ProtocolInfoString==NULL?L"":ProtocolInfoString);\r
683 }\r
361a8267 684\r
685 if (DriverInfo) {\r
686 DisplayDriverModelHandle ((EFI_HANDLE)TheHandle, TRUE, Language);\r
687 }\r
4ba49616 688 } else {\r
361a8267 689 ProtocolInfoString = GetProtocolInfoString(TheHandle, Language, L";", FALSE, FALSE);\r
4ba49616 690 ShellPrintHiiEx(\r
691 -1,\r
692 -1,\r
693 NULL,\r
694 STRING_TOKEN (STR_DH_OUTPUT_SFO),\r
695 gShellDriver1HiiHandle,\r
696 Multiple ?L"HandlesInfo":L"HandleInfo",\r
697 L"DriverName",\r
698 L"ControllerName",\r
699 ConvertHandleToHandleIndex(TheHandle),\r
700 L"DevPath",\r
701 ProtocolInfoString==NULL?L"":ProtocolInfoString);\r
702\r
703\r
704 }\r
705\r
706\r
707 if (ProtocolInfoString != NULL) {\r
708 FreePool(ProtocolInfoString);\r
709 }\r
710 return (ShellStatus);\r
711}\r
712\r
361a8267 713/**\r
714 Display information for all handles on a list.\r
715\r
716 @param[in] HandleList The NULL-terminated list of handles.\r
f0b0e733 717 @param[in] Verbose TRUE for extra info, FALSE otherwise.\r
361a8267 718 @param[in] Sfo TRUE to output in standard format output (spec).\r
719 @param[in] Language Language string per UEFI specification.\r
720 @param[in] DriverInfo TRUE to show all info about the handle.\r
721\r
722 @retval SHELL_SUCCESS The operation was successful.\r
723 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.\r
724**/\r
4ba49616 725SHELL_STATUS\r
4ba49616 726DoDhForHandleList(\r
727 IN CONST EFI_HANDLE *HandleList,\r
f0b0e733 728 IN CONST BOOLEAN Verbose,\r
4ba49616 729 IN CONST BOOLEAN Sfo,\r
730 IN CONST CHAR8 *Language,\r
731 IN CONST BOOLEAN DriverInfo\r
732 )\r
733{\r
734 CONST EFI_HANDLE *HandleWalker;\r
735 SHELL_STATUS ShellStatus;\r
736\r
737 ShellStatus = SHELL_SUCCESS;\r
738\r
739 for (HandleWalker = HandleList ; HandleWalker != NULL && *HandleWalker != NULL && ShellStatus == SHELL_SUCCESS; HandleWalker++) {\r
740 ShellStatus = DoDhByHandle(\r
741 *HandleWalker,\r
f0b0e733 742 Verbose,\r
4ba49616 743 Sfo,\r
744 Language,\r
745 DriverInfo,\r
746 TRUE\r
747 );\r
376e7593
TS
748 if (ShellGetExecutionBreakFlag ()) {\r
749 ShellStatus = SHELL_ABORTED;\r
750 break;\r
751 }\r
4ba49616 752 }\r
753 return (ShellStatus);\r
754}\r
755\r
361a8267 756/**\r
757 Display information for all handles.\r
758\r
759 @param[in] Sfo TRUE to output in standard format output (spec).\r
f0b0e733 760 @param[in] Verbose TRUE for extra info, FALSE otherwise.\r
361a8267 761 @param[in] Language Language string per UEFI specification.\r
762 @param[in] DriverInfo TRUE to show all info about the handle.\r
763\r
764 @retval SHELL_SUCCESS The operation was successful.\r
765 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.\r
766**/\r
4ba49616 767SHELL_STATUS\r
4ba49616 768DoDhForAll(\r
769 IN CONST BOOLEAN Sfo,\r
f0b0e733 770 IN CONST BOOLEAN Verbose,\r
4ba49616 771 IN CONST CHAR8 *Language,\r
772 IN CONST BOOLEAN DriverInfo\r
773 )\r
774{\r
775 EFI_HANDLE *HandleList;\r
776 SHELL_STATUS ShellStatus;\r
777\r
778 HandleList = GetHandleListByProtocol(NULL);\r
779\r
780 ShellStatus = DoDhForHandleList(\r
781 HandleList,\r
f0b0e733 782 Verbose,\r
4ba49616 783 Sfo,\r
784 Language,\r
785 DriverInfo);\r
786\r
787 FreePool(HandleList);\r
788\r
789 return (ShellStatus);\r
790}\r
791\r
361a8267 792/**\r
793 Display information for all handles which have a specific protocol.\r
794\r
795 @param[in] ProtocolName The pointer to the name of the protocol.\r
f0b0e733 796 @param[in] Verbose TRUE for extra info, FALSE otherwise.\r
361a8267 797 @param[in] Sfo TRUE to output in standard format output (spec).\r
798 @param[in] Language Language string per UEFI specification.\r
799 @param[in] DriverInfo TRUE to show all info about the handle.\r
800\r
801 @retval SHELL_SUCCESS The operation was successful.\r
802 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.\r
803**/\r
4ba49616 804SHELL_STATUS\r
4ba49616 805DoDhByProtocol(\r
806 IN CONST CHAR16 *ProtocolName,\r
f0b0e733 807 IN CONST BOOLEAN Verbose,\r
4ba49616 808 IN CONST BOOLEAN Sfo,\r
809 IN CONST CHAR8 *Language,\r
810 IN CONST BOOLEAN DriverInfo\r
811 )\r
812{\r
813 EFI_GUID *Guid;\r
814 EFI_STATUS Status;\r
815 EFI_HANDLE *HandleList;\r
816 SHELL_STATUS ShellStatus;\r
817\r
361a8267 818 if (ProtocolName == NULL) {\r
819 return (SHELL_INVALID_PARAMETER);\r
820 }\r
4ba49616 821\r
822 Status = GetGuidFromStringName(ProtocolName, Language, &Guid);\r
823 if (EFI_ERROR(Status)) {\r
824 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DH_NO_GUID_FOUND), gShellDriver1HiiHandle, ProtocolName);\r
825 return (SHELL_INVALID_PARAMETER);\r
826 }\r
827\r
828 HandleList = GetHandleListByProtocol(Guid);\r
829\r
830 ShellStatus = DoDhForHandleList(\r
831 HandleList,\r
f0b0e733 832 Verbose,\r
4ba49616 833 Sfo,\r
834 Language,\r
835 DriverInfo);\r
836\r
837 SHELL_FREE_NON_NULL(HandleList);\r
838\r
839 return (ShellStatus);\r
840}\r
841\r
361a8267 842/**\r
843 Function for 'dh' command.\r
844\r
845 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
846 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
847**/\r
4ba49616 848SHELL_STATUS\r
849EFIAPI\r
850ShellCommandRunDh (\r
851 IN EFI_HANDLE ImageHandle,\r
852 IN EFI_SYSTEM_TABLE *SystemTable\r
853 )\r
854{\r
855 EFI_STATUS Status;\r
856 LIST_ENTRY *Package;\r
857 CHAR16 *ProblemParam;\r
858 SHELL_STATUS ShellStatus;\r
859 CHAR8 *Language;\r
860 CONST CHAR16 *Lang;\r
861 CONST CHAR16 *Temp2;\r
862 BOOLEAN SfoMode;\r
863 BOOLEAN FlagD;\r
864 BOOLEAN Verbose;\r
361a8267 865 UINT64 Intermediate;\r
4ba49616 866\r
867 ShellStatus = SHELL_SUCCESS;\r
868 Status = EFI_SUCCESS;\r
869 Language = NULL;\r
870\r
871 //\r
872 // initialize the shell lib (we must be in non-auto-init...)\r
873 //\r
874 Status = ShellInitialize();\r
875 ASSERT_EFI_ERROR(Status);\r
876\r
877 Status = CommandInit();\r
878 ASSERT_EFI_ERROR(Status);\r
879\r
880 //\r
881 // parse the command line\r
882 //\r
883 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
884 if (EFI_ERROR(Status)) {\r
885 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
bc280720 886 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"dh", ProblemParam); \r
4ba49616 887 FreePool(ProblemParam);\r
888 ShellStatus = SHELL_INVALID_PARAMETER;\r
889 } else {\r
890 ASSERT(FALSE);\r
891 }\r
892 } else {\r
893 if (ShellCommandLineGetCount(Package) > 2) {\r
bc280720 894 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"dh"); \r
4ba49616 895 ShellCommandLineFreeVarList (Package);\r
896 return (SHELL_INVALID_PARAMETER);\r
897 }\r
898\r
899 Lang = ShellCommandLineGetValue(Package, L"-l");\r
900 if (Lang != NULL) {\r
901 Language = AllocateZeroPool(StrSize(Lang));\r
902 AsciiSPrint(Language, StrSize(Lang), "%S", Lang);\r
903 } else if (!ShellCommandLineGetFlag(Package, L"-l")){\r
904 Language = AllocateZeroPool(10);\r
905 AsciiSPrint(Language, 10, "en-us");\r
906 } else {\r
907 ASSERT(Language == NULL);\r
bc280720 908 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"dh", L"-l"); \r
4ba49616 909 ShellCommandLineFreeVarList (Package);\r
910 return (SHELL_INVALID_PARAMETER);\r
911 }\r
912\r
913 SfoMode = ShellCommandLineGetFlag(Package, L"-sfo");\r
914 FlagD = ShellCommandLineGetFlag(Package, L"-d");\r
361a8267 915 Verbose = (BOOLEAN)(ShellCommandLineGetFlag(Package, L"-v") || ShellCommandLineGetFlag(Package, L"-verbose"));\r
4ba49616 916\r
917 if (ShellCommandLineGetFlag(Package, L"-p")) {\r
918 if (ShellCommandLineGetCount(Package) > 1) {\r
bc280720 919 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"dh"); \r
4ba49616 920 ShellStatus = SHELL_INVALID_PARAMETER;\r
921 } else if (ShellCommandLineGetValue(Package, L"-p") == NULL) {\r
bc280720 922 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"dh", L"-p"); \r
4ba49616 923 ShellStatus = SHELL_INVALID_PARAMETER;\r
924 } else {\r
925 //\r
926 // print by protocol\r
927 //\r
928 ShellStatus = DoDhByProtocol(\r
929 ShellCommandLineGetValue(Package, L"-p"),\r
f0b0e733 930 Verbose,\r
4ba49616 931 SfoMode,\r
932 Lang==NULL?NULL:Language,\r
933 FlagD\r
934 );\r
935 }\r
936 } else {\r
937 Temp2 = ShellCommandLineGetRawValue(Package, 1);\r
938 if (Temp2 == NULL) {\r
939 //\r
940 // Print everything\r
941 //\r
942 ShellStatus = DoDhForAll(\r
943 SfoMode,\r
f0b0e733 944 Verbose,\r
4ba49616 945 Lang==NULL?NULL:Language,\r
946 FlagD\r
947 );\r
948 } else {\r
361a8267 949 Status = ShellConvertStringToUint64(Temp2, &Intermediate, TRUE, FALSE);\r
950 if (EFI_ERROR(Status) || ConvertHandleIndexToHandle((UINTN)Intermediate) == NULL) {\r
bc280720 951 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"dh", Temp2); \r
4ba49616 952 ShellStatus = SHELL_INVALID_PARAMETER;\r
953 } else {\r
954 //\r
955 // print 1 handle\r
956 //\r
957 ShellStatus = DoDhByHandle(\r
361a8267 958 ConvertHandleIndexToHandle((UINTN)Intermediate),\r
4ba49616 959 Verbose,\r
960 SfoMode,\r
961 Lang==NULL?NULL:Language,\r
962 FlagD,\r
963 FALSE\r
964 );\r
965 }\r
966 }\r
967 }\r
968\r
969\r
970 ShellCommandLineFreeVarList (Package);\r
971 SHELL_FREE_NON_NULL(Language);\r
972 }\r
973\r
974 return (ShellStatus);\r
975}\r