+/**\r
+ Gets the name of the loaded image.\r
+\r
+ @param[in] TheHandle The handle of the driver to get info on.\r
+ @param[out] Name The pointer to the pointer. Valid upon a successful return.\r
+\r
+ @retval EFI_SUCCESS The operation was successful.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+GetDriverImageName (\r
+ IN EFI_HANDLE TheHandle,\r
+ OUT CHAR16 **Name\r
+ )\r
+{\r
+ // get loaded image and devicepathtotext on image->Filepath\r
+ EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
+ EFI_STATUS Status;\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
+\r
+ if (TheHandle == NULL || Name == NULL) {\r
+ return (EFI_INVALID_PARAMETER);\r
+ }\r
+\r
+ Status = gBS->OpenProtocol (\r
+ TheHandle,\r
+ &gEfiLoadedImageProtocolGuid,\r
+ (VOID **) &LoadedImage,\r
+ gImageHandle,\r
+ NULL,\r
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+ );\r
+ if (EFI_ERROR(Status)) {\r
+ return (Status);\r
+ }\r
+ DevicePath = LoadedImage->FilePath;\r
+ *Name = gDevPathToText->ConvertDevicePathToText(DevicePath, TRUE, TRUE);\r
+ return (EFI_SUCCESS);\r
+}\r
+\r
+/**\r
+ Display driver model information for a given handle.\r
+ \r
+ @param[in] Handle The handle to display info on.\r
+ @param[in] BestName Use the best name?\r
+ @param[in] Language The language to output in.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DisplayDriverModelHandle (\r
+ IN EFI_HANDLE Handle,\r
+ IN BOOLEAN BestName,\r
+ IN CONST CHAR8 *Language OPTIONAL\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ BOOLEAN ConfigurationStatus;\r
+ BOOLEAN DiagnosticsStatus;\r
+ UINTN DriverBindingHandleCount;\r
+ EFI_HANDLE *DriverBindingHandleBuffer;\r
+ UINTN ParentControllerHandleCount;\r
+ EFI_HANDLE *ParentControllerHandleBuffer;\r
+ UINTN ChildControllerHandleCount;\r
+ EFI_HANDLE *ChildControllerHandleBuffer;\r
+ CHAR16 *TempStringPointer;\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
+ UINTN Index;\r
+ CHAR16 *DriverName;\r
+ EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;\r
+ UINTN NumberOfChildren;\r
+ UINTN HandleIndex;\r
+ UINTN ControllerHandleCount;\r
+ EFI_HANDLE *ControllerHandleBuffer;\r
+ UINTN ChildIndex;\r
+ BOOLEAN Image;\r
+\r
+ //\r
+ // See if Handle is a device handle and display its details.\r
+ //\r
+ DriverBindingHandleBuffer = NULL;\r
+ Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS (\r
+ Handle,\r
+ &DriverBindingHandleCount,\r
+ &DriverBindingHandleBuffer\r
+ );\r
+\r
+ ParentControllerHandleBuffer = NULL;\r
+ Status = PARSE_HANDLE_DATABASE_PARENTS (\r
+ Handle,\r
+ &ParentControllerHandleCount,\r
+ &ParentControllerHandleBuffer\r
+ );\r
+\r
+ ChildControllerHandleBuffer = NULL;\r
+ Status = ParseHandleDatabaseForChildControllers (\r
+ Handle,\r
+ &ChildControllerHandleCount,\r
+ &ChildControllerHandleBuffer\r
+ );\r
+\r
+ DiagnosticsStatus = FALSE;\r
+ ConfigurationStatus = FALSE;\r
+\r
+ if (!EFI_ERROR(gBS->OpenProtocol(Handle, &gEfiDriverConfigurationProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
+ ConfigurationStatus = TRUE;\r
+ }\r
+ if (!EFI_ERROR(gBS->OpenProtocol(Handle, &gEfiDriverConfiguration2ProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
+ ConfigurationStatus = TRUE;\r
+ }\r
+ if (!EFI_ERROR(gBS->OpenProtocol(Handle, &gEfiDriverDiagnosticsProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
+ DiagnosticsStatus = TRUE;\r
+ }\r
+ if (!EFI_ERROR(gBS->OpenProtocol(Handle, &gEfiDriverDiagnostics2ProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
+ DiagnosticsStatus = TRUE;\r
+ }\r
+\r
+ Status = EFI_SUCCESS;\r
+\r
+ if (DriverBindingHandleCount > 0 || ParentControllerHandleCount > 0 || ChildControllerHandleCount > 0) {\r
+\r
+\r
+\r
+ DevicePath = NULL;\r
+ TempStringPointer = NULL;\r
+ Status = gBS->HandleProtocol (Handle, &gEfiDevicePathProtocolGuid, (VOID**)&DevicePath);\r
+\r
+ Status = gEfiShellProtocol->GetDeviceName(Handle, EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8*)Language, &TempStringPointer);\r
+ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DH_OUTPUT_DRIVER1), gShellDriver1HiiHandle, TempStringPointer!=NULL?TempStringPointer:L"<Unknown>");\r
+ SHELL_FREE_NON_NULL(TempStringPointer);\r
+ \r
+ TempStringPointer = gDevPathToText->ConvertDevicePathToText(DevicePath, TRUE, FALSE);\r
+ ShellPrintHiiEx(\r
+ -1, \r
+ -1, \r
+ NULL, \r
+ STRING_TOKEN (STR_DH_OUTPUT_DRIVER2), \r
+ gShellDriver1HiiHandle, \r
+ TempStringPointer!=NULL?TempStringPointer:L"<None>",\r
+ ParentControllerHandleCount == 0?L"ROOT":(ChildControllerHandleCount > 0)?L"BUS":L"DEVICE",\r
+ ConfigurationStatus?L"YES":L"NO",\r
+ DiagnosticsStatus?L"YES":L"NO"\r
+ );\r
+\r
+ SHELL_FREE_NON_NULL(TempStringPointer);\r
+\r
+ if (DriverBindingHandleCount == 0) {\r
+ ShellPrintHiiEx(\r
+ -1, \r
+ -1, \r
+ NULL, \r
+ STRING_TOKEN (STR_DH_OUTPUT_DRIVER3), \r
+ gShellDriver1HiiHandle, \r
+ L"<None>"\r
+ );\r
+ } else {\r
+ ShellPrintHiiEx(\r
+ -1, \r
+ -1, \r
+ NULL, \r
+ STRING_TOKEN (STR_DH_OUTPUT_DRIVER3), \r
+ gShellDriver1HiiHandle, \r
+ L""\r
+ );\r
+ for (Index = 0; Index < DriverBindingHandleCount; Index++) {\r
+ Image = FALSE;\r
+ Status = GetDriverName (\r
+ DriverBindingHandleBuffer[Index],\r
+ Language,\r
+ &DriverName\r
+ );\r
+ if (DriverName == NULL) {\r
+ Status = GetDriverImageName (\r
+ DriverBindingHandleBuffer[Index],\r
+ &DriverName\r
+ );\r
+ }\r
+\r
+ if (Image) {\r
+ ShellPrintHiiEx(\r
+ -1, \r
+ -1, \r
+ NULL, \r
+ STRING_TOKEN (STR_DH_OUTPUT_DRIVER4A),\r
+ gShellDriver1HiiHandle,\r
+ ConvertHandleToHandleIndex (DriverBindingHandleBuffer[Index]),\r
+ DriverName!=NULL?DriverName:L"<Unknown>"\r
+ );\r
+ } else {\r
+ ShellPrintHiiEx(\r
+ -1, \r
+ -1, \r
+ NULL, \r
+ STRING_TOKEN (STR_DH_OUTPUT_DRIVER4B),\r
+ gShellDriver1HiiHandle,\r
+ ConvertHandleToHandleIndex (DriverBindingHandleBuffer[Index]),\r
+ DriverName!=NULL?DriverName:L"<Unknown>"\r
+ );\r
+ }\r
+ SHELL_FREE_NON_NULL(DriverName);\r
+ }\r
+ }\r
+\r
+ if (ParentControllerHandleCount == 0) {\r
+ ShellPrintHiiEx(\r
+ -1, \r
+ -1, \r
+ NULL, \r
+ STRING_TOKEN (STR_DH_OUTPUT_DRIVER5), \r
+ gShellDriver1HiiHandle, \r
+ L"<None>"\r
+ );\r
+ } else {\r
+ ShellPrintHiiEx(\r
+ -1, \r
+ -1, \r
+ NULL, \r
+ STRING_TOKEN (STR_DH_OUTPUT_DRIVER5), \r
+ gShellDriver1HiiHandle, \r
+ L""\r
+ );\r
+ for (Index = 0; Index < ParentControllerHandleCount; Index++) {\r
+ Status = gEfiShellProtocol->GetDeviceName(ParentControllerHandleBuffer[Index], EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8*)Language, &TempStringPointer);\r
+ ShellPrintHiiEx(\r
+ -1, \r
+ -1, \r
+ NULL, \r
+ STRING_TOKEN (STR_DH_OUTPUT_DRIVER5B),\r
+ gShellDriver1HiiHandle,\r
+ ConvertHandleToHandleIndex (ParentControllerHandleBuffer[Index]),\r
+ TempStringPointer!=NULL?TempStringPointer:L"<Unknown>"\r
+ );\r
+ SHELL_FREE_NON_NULL(TempStringPointer);\r
+ }\r
+ }\r
+\r
+ if (ChildControllerHandleCount == 0) {\r
+ ShellPrintHiiEx(\r
+ -1, \r
+ -1, \r
+ NULL, \r
+ STRING_TOKEN (STR_DH_OUTPUT_DRIVER6), \r
+ gShellDriver1HiiHandle, \r
+ L"<None>"\r
+ );\r
+ } else {\r
+ ShellPrintHiiEx(\r
+ -1, \r
+ -1, \r
+ NULL, \r
+ STRING_TOKEN (STR_DH_OUTPUT_DRIVER6), \r
+ gShellDriver1HiiHandle, \r
+ L""\r
+ );\r
+ for (Index = 0; Index < ChildControllerHandleCount; Index++) {\r
+ Status = gEfiShellProtocol->GetDeviceName(ChildControllerHandleBuffer[Index], EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8*)Language, &TempStringPointer);\r
+ ShellPrintHiiEx(\r
+ -1, \r
+ -1, \r
+ NULL, \r
+ STRING_TOKEN (STR_DH_OUTPUT_DRIVER6B),\r
+ gShellDriver1HiiHandle,\r
+ ConvertHandleToHandleIndex (ChildControllerHandleBuffer[Index]),\r
+ TempStringPointer!=NULL?TempStringPointer:L"<Unknown>"\r
+ );\r
+ SHELL_FREE_NON_NULL(TempStringPointer);\r
+ }\r
+ }\r
+ }\r
+\r
+ SHELL_FREE_NON_NULL(DriverBindingHandleBuffer);\r
+\r
+ SHELL_FREE_NON_NULL(ParentControllerHandleBuffer);\r
+\r
+ SHELL_FREE_NON_NULL(ChildControllerHandleBuffer);\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ //\r
+ // See if Handle is a driver binding handle and display its details.\r
+ //\r
+ Status = gBS->OpenProtocol (\r
+ Handle,\r
+ &gEfiDriverBindingProtocolGuid,\r
+ (VOID **) &DriverBinding,\r
+ NULL,\r
+ NULL,\r
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return EFI_SUCCESS;\r
+ }\r
+\r
+ NumberOfChildren = 0;\r
+ ControllerHandleBuffer = NULL;\r
+ Status = PARSE_HANDLE_DATABASE_DEVICES (\r
+ Handle,\r
+ &ControllerHandleCount,\r
+ &ControllerHandleBuffer\r
+ );\r
+ if (ControllerHandleCount > 0) {\r
+ for (HandleIndex = 0; HandleIndex < ControllerHandleCount; HandleIndex++) {\r
+ Status = PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (\r
+ Handle,\r
+ ControllerHandleBuffer[HandleIndex],\r
+ &ChildControllerHandleCount,\r
+ NULL\r
+ );\r
+ NumberOfChildren += ChildControllerHandleCount;\r
+ }\r
+ }\r
+\r
+ Status = GetDriverName (Handle, Language, &DriverName);\r
+\r
+ ShellPrintHiiEx(\r
+ -1, \r
+ -1, \r
+ NULL, \r
+ STRING_TOKEN (STR_DH_OUTPUT_DRIVER6B),\r
+ gShellDriver1HiiHandle,\r
+ ConvertHandleToHandleIndex(Handle),\r
+ DriverName!=NULL?DriverName:L"<Unknown>"\r
+ );\r
+ SHELL_FREE_NON_NULL(DriverName);\r
+ DriverName = NULL;\r
+ Status = GetDriverImageName (\r
+ Handle,\r
+ &DriverName\r
+ );\r
+ ShellPrintHiiEx(\r
+ -1, \r
+ -1, \r
+ NULL, \r
+ STRING_TOKEN (STR_DH_OUTPUT_DRIVER7B),\r
+ gShellDriver1HiiHandle,\r
+ DriverName!=NULL?DriverName:L"<Unknown>"\r
+ );\r
+ SHELL_FREE_NON_NULL(DriverName);\r
+\r
+ ShellPrintHiiEx(\r
+ -1, \r
+ -1, \r
+ NULL, \r
+ STRING_TOKEN (STR_DH_OUTPUT_DRIVER8), \r
+ gShellDriver1HiiHandle, \r
+ DriverBinding->Version,\r
+ NumberOfChildren > 0?L"Bus":ControllerHandleCount > 0?L"Device":L"<Unknown>",\r
+ ConfigurationStatus?L"YES":L"NO",\r
+ DiagnosticsStatus?L"YES":L"NO"\r
+ );\r
+\r
+ if (ControllerHandleCount == 0) {\r
+ ShellPrintHiiEx(\r
+ -1, \r
+ -1, \r
+ NULL, \r
+ STRING_TOKEN (STR_DH_OUTPUT_DRIVER6), \r
+ gShellDriver1HiiHandle, \r
+ L"None"\r
+ );\r
+ } else {\r
+ ShellPrintHiiEx(\r
+ -1, \r
+ -1, \r
+ NULL, \r
+ STRING_TOKEN (STR_DH_OUTPUT_DRIVER6), \r
+ gShellDriver1HiiHandle, \r
+ L""\r
+ );\r
+ for (HandleIndex = 0; HandleIndex < ControllerHandleCount; HandleIndex++) {\r
+ Status = gEfiShellProtocol->GetDeviceName(ControllerHandleBuffer[HandleIndex], EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8*)Language, &TempStringPointer);\r
+\r
+ ShellPrintHiiEx(\r
+ -1, \r
+ -1, \r
+ NULL, \r
+ STRING_TOKEN (STR_DH_OUTPUT_DRIVER9B),\r
+ gShellDriver1HiiHandle,\r
+ ConvertHandleToHandleIndex(ControllerHandleBuffer[HandleIndex]),\r
+ TempStringPointer!=NULL?TempStringPointer:L"<Unknown>"\r
+ );\r
+ SHELL_FREE_NON_NULL(TempStringPointer);\r
+\r
+ Status = PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (\r
+ Handle,\r
+ ControllerHandleBuffer[HandleIndex],\r
+ &ChildControllerHandleCount,\r
+ &ChildControllerHandleBuffer\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ for (ChildIndex = 0; ChildIndex < ChildControllerHandleCount; ChildIndex++) {\r
+ Status = gEfiShellProtocol->GetDeviceName(ChildControllerHandleBuffer[ChildIndex], EFI_DEVICE_NAME_USE_COMPONENT_NAME|EFI_DEVICE_NAME_USE_DEVICE_PATH, (CHAR8*)Language, &TempStringPointer);\r
+\r
+ ShellPrintHiiEx(\r
+ -1, \r
+ -1, \r
+ NULL, \r
+ STRING_TOKEN (STR_DH_OUTPUT_DRIVER6B),\r
+ gShellDriver1HiiHandle,\r
+ ConvertHandleToHandleIndex(ChildControllerHandleBuffer[ChildIndex]),\r
+ TempStringPointer!=NULL?TempStringPointer:L"<Unknown>"\r
+ );\r
+ SHELL_FREE_NON_NULL(TempStringPointer);\r
+ }\r
+\r
+ SHELL_FREE_NON_NULL (ChildControllerHandleBuffer);\r
+ }\r
+ }\r
+\r
+ SHELL_FREE_NON_NULL (ControllerHandleBuffer);\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Display information for a handle.\r
+\r
+ @param[in] TheHandle The handles to show info on.\r
+ @param[in] Verbose TRUE for extra info, FALSE otherwise.\r
+ @param[in] Sfo TRUE to output in standard format output (spec).\r
+ @param[in] Language Language string per UEFI specification.\r
+ @param[in] DriverInfo TRUE to show all info about the handle.\r
+ @param[in] Multiple TRUE indicates more than will be output,\r
+ FALSE for a single one.\r
+\r
+ @retval SHELL_SUCCESS The operation was successful.\r
+ @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid.\r
+**/\r