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