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