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