]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDriver1CommandsLib/Dh.c
ShellPkg: Add 3 missing function declaration comments and change a function static...
[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
205 StrnCatGrow(&RetVal, &Size, L")", 0);\r
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
731 @param[in] Sfo TRUE to output in standard format output (spec).\r
732 @param[in] Language Language string per UEFI specification.\r
733 @param[in] DriverInfo TRUE to show all info about the handle.\r
734\r
735 @retval SHELL_SUCCESS The operation was successful.\r
736 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.\r
737**/\r
4ba49616 738SHELL_STATUS\r
739EFIAPI\r
740DoDhForHandleList(\r
741 IN CONST EFI_HANDLE *HandleList,\r
742 IN CONST BOOLEAN Sfo,\r
743 IN CONST CHAR8 *Language,\r
744 IN CONST BOOLEAN DriverInfo\r
745 )\r
746{\r
747 CONST EFI_HANDLE *HandleWalker;\r
748 SHELL_STATUS ShellStatus;\r
749\r
750 ShellStatus = SHELL_SUCCESS;\r
751\r
752 for (HandleWalker = HandleList ; HandleWalker != NULL && *HandleWalker != NULL && ShellStatus == SHELL_SUCCESS; HandleWalker++) {\r
753 ShellStatus = DoDhByHandle(\r
754 *HandleWalker,\r
755 FALSE,\r
756 Sfo,\r
757 Language,\r
758 DriverInfo,\r
759 TRUE\r
760 );\r
761 }\r
762 return (ShellStatus);\r
763}\r
764\r
361a8267 765/**\r
766 Display information for all handles.\r
767\r
768 @param[in] Sfo TRUE to output in standard format output (spec).\r
769 @param[in] Language Language string per UEFI specification.\r
770 @param[in] DriverInfo TRUE to show all info about the handle.\r
771\r
772 @retval SHELL_SUCCESS The operation was successful.\r
773 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.\r
774**/\r
4ba49616 775SHELL_STATUS\r
776EFIAPI\r
777DoDhForAll(\r
778 IN CONST BOOLEAN Sfo,\r
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
790 Sfo,\r
791 Language,\r
792 DriverInfo);\r
793\r
794 FreePool(HandleList);\r
795\r
796 return (ShellStatus);\r
797}\r
798\r
361a8267 799/**\r
800 Display information for all handles which have a specific protocol.\r
801\r
802 @param[in] ProtocolName The pointer to the name of the protocol.\r
803 @param[in] Sfo TRUE to output in standard format output (spec).\r
804 @param[in] Language Language string per UEFI specification.\r
805 @param[in] DriverInfo TRUE to show all info about the handle.\r
806\r
807 @retval SHELL_SUCCESS The operation was successful.\r
808 @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.\r
809**/\r
4ba49616 810SHELL_STATUS\r
811EFIAPI\r
812DoDhByProtocol(\r
813 IN CONST CHAR16 *ProtocolName,\r
814 IN CONST BOOLEAN Sfo,\r
815 IN CONST CHAR8 *Language,\r
816 IN CONST BOOLEAN DriverInfo\r
817 )\r
818{\r
819 EFI_GUID *Guid;\r
820 EFI_STATUS Status;\r
821 EFI_HANDLE *HandleList;\r
822 SHELL_STATUS ShellStatus;\r
823\r
361a8267 824 if (ProtocolName == NULL) {\r
825 return (SHELL_INVALID_PARAMETER);\r
826 }\r
4ba49616 827\r
828 Status = GetGuidFromStringName(ProtocolName, Language, &Guid);\r
829 if (EFI_ERROR(Status)) {\r
830 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DH_NO_GUID_FOUND), gShellDriver1HiiHandle, ProtocolName);\r
831 return (SHELL_INVALID_PARAMETER);\r
832 }\r
833\r
834 HandleList = GetHandleListByProtocol(Guid);\r
835\r
836 ShellStatus = DoDhForHandleList(\r
837 HandleList,\r
838 Sfo,\r
839 Language,\r
840 DriverInfo);\r
841\r
842 SHELL_FREE_NON_NULL(HandleList);\r
843\r
844 return (ShellStatus);\r
845}\r
846\r
361a8267 847/**\r
848 Function for 'dh' command.\r
849\r
850 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
851 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
852**/\r
4ba49616 853SHELL_STATUS\r
854EFIAPI\r
855ShellCommandRunDh (\r
856 IN EFI_HANDLE ImageHandle,\r
857 IN EFI_SYSTEM_TABLE *SystemTable\r
858 )\r
859{\r
860 EFI_STATUS Status;\r
861 LIST_ENTRY *Package;\r
862 CHAR16 *ProblemParam;\r
863 SHELL_STATUS ShellStatus;\r
864 CHAR8 *Language;\r
865 CONST CHAR16 *Lang;\r
866 CONST CHAR16 *Temp2;\r
867 BOOLEAN SfoMode;\r
868 BOOLEAN FlagD;\r
869 BOOLEAN Verbose;\r
361a8267 870 UINT64 Intermediate;\r
4ba49616 871\r
872 ShellStatus = SHELL_SUCCESS;\r
873 Status = EFI_SUCCESS;\r
874 Language = NULL;\r
875\r
876 //\r
877 // initialize the shell lib (we must be in non-auto-init...)\r
878 //\r
879 Status = ShellInitialize();\r
880 ASSERT_EFI_ERROR(Status);\r
881\r
882 Status = CommandInit();\r
883 ASSERT_EFI_ERROR(Status);\r
884\r
885 //\r
886 // parse the command line\r
887 //\r
888 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
889 if (EFI_ERROR(Status)) {\r
890 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
891 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, ProblemParam);\r
892 FreePool(ProblemParam);\r
893 ShellStatus = SHELL_INVALID_PARAMETER;\r
894 } else {\r
895 ASSERT(FALSE);\r
896 }\r
897 } else {\r
898 if (ShellCommandLineGetCount(Package) > 2) {\r
899 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle);\r
900 ShellCommandLineFreeVarList (Package);\r
901 return (SHELL_INVALID_PARAMETER);\r
902 }\r
903\r
904 Lang = ShellCommandLineGetValue(Package, L"-l");\r
905 if (Lang != NULL) {\r
906 Language = AllocateZeroPool(StrSize(Lang));\r
907 AsciiSPrint(Language, StrSize(Lang), "%S", Lang);\r
908 } else if (!ShellCommandLineGetFlag(Package, L"-l")){\r
909 Language = AllocateZeroPool(10);\r
910 AsciiSPrint(Language, 10, "en-us");\r
911 } else {\r
912 ASSERT(Language == NULL);\r
913 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"-l");\r
914 ShellCommandLineFreeVarList (Package);\r
915 return (SHELL_INVALID_PARAMETER);\r
916 }\r
917\r
918 SfoMode = ShellCommandLineGetFlag(Package, L"-sfo");\r
919 FlagD = ShellCommandLineGetFlag(Package, L"-d");\r
361a8267 920 Verbose = (BOOLEAN)(ShellCommandLineGetFlag(Package, L"-v") || ShellCommandLineGetFlag(Package, L"-verbose"));\r
4ba49616 921\r
922 if (ShellCommandLineGetFlag(Package, L"-p")) {\r
923 if (ShellCommandLineGetCount(Package) > 1) {\r
924 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle);\r
925 ShellStatus = SHELL_INVALID_PARAMETER;\r
926 } else if (ShellCommandLineGetValue(Package, L"-p") == NULL) {\r
927 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"-p");\r
928 ShellStatus = SHELL_INVALID_PARAMETER;\r
929 } else {\r
930 //\r
931 // print by protocol\r
932 //\r
933 ShellStatus = DoDhByProtocol(\r
934 ShellCommandLineGetValue(Package, L"-p"),\r
935 SfoMode,\r
936 Lang==NULL?NULL:Language,\r
937 FlagD\r
938 );\r
939 }\r
940 } else {\r
941 Temp2 = ShellCommandLineGetRawValue(Package, 1);\r
942 if (Temp2 == NULL) {\r
943 //\r
944 // Print everything\r
945 //\r
946 ShellStatus = DoDhForAll(\r
947 SfoMode,\r
948 Lang==NULL?NULL:Language,\r
949 FlagD\r
950 );\r
951 } else {\r
361a8267 952 Status = ShellConvertStringToUint64(Temp2, &Intermediate, TRUE, FALSE);\r
953 if (EFI_ERROR(Status) || ConvertHandleIndexToHandle((UINTN)Intermediate) == NULL) {\r
4ba49616 954 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, Temp2);\r
955 ShellStatus = SHELL_INVALID_PARAMETER;\r
956 } else {\r
957 //\r
958 // print 1 handle\r
959 //\r
960 ShellStatus = DoDhByHandle(\r
361a8267 961 ConvertHandleIndexToHandle((UINTN)Intermediate),\r
4ba49616 962 Verbose,\r
963 SfoMode,\r
964 Lang==NULL?NULL:Language,\r
965 FlagD,\r
966 FALSE\r
967 );\r
968 }\r
969 }\r
970 }\r
971\r
972\r
973 ShellCommandLineFreeVarList (Package);\r
974 SHELL_FREE_NON_NULL(Language);\r
975 }\r
976\r
977 return (ShellStatus);\r
978}\r