]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellDriver1CommandsLib/Drivers.c
ShellPkg: Update header file including style
[mirror_edk2.git] / ShellPkg / Library / UefiShellDriver1CommandsLib / Drivers.c
index d6d75f06250cf30acc543ff04764784d0ff4ff50..26b785c5634eee95333830c2f2bfe3f06da33efa 100644 (file)
@@ -2,7 +2,7 @@
   Main file for Drivers shell Driver1 function.\r
 \r
   (C) Copyright 2012-2015 Hewlett-Packard Development Company, L.P.<BR>\r
-  Copyright (c) 2010 - 2015, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2010 - 2017, Intel Corporation. All rights reserved.<BR>\r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
@@ -33,7 +33,6 @@ STATIC CONST SHELL_PARAM_ITEM ParamList[] = {
                   free this memory.\r
 **/\r
 CHAR16*\r
-EFIAPI\r
 GetDevicePathTextForHandle(\r
   IN EFI_HANDLE TheHandle\r
   )\r
@@ -98,7 +97,6 @@ GetDevicePathTextForHandle(
   @retval FALSE             The driver does not have Driver Configuration.\r
 **/\r
 BOOLEAN\r
-EFIAPI\r
 ReturnDriverConfig(\r
   IN CONST EFI_HANDLE TheHandle\r
   )\r
@@ -120,7 +118,6 @@ ReturnDriverConfig(
   @retval FALSE             The driver does not have Driver Diagnostics.\r
 **/\r
 BOOLEAN\r
-EFIAPI\r
 ReturnDriverDiag(\r
   IN CONST EFI_HANDLE TheHandle\r
   )\r
@@ -145,7 +142,6 @@ ReturnDriverDiag(
   @retval 0xFFFFFFFF  An error ocurred.\r
 **/\r
 UINT32\r
-EFIAPI\r
 ReturnDriverVersion(\r
   IN CONST EFI_HANDLE TheHandle\r
   )\r
@@ -164,6 +160,92 @@ ReturnDriverVersion(
   return (RetVal);\r
 }\r
 \r
+/**\r
+  Get image name from Image Handle.\r
+\r
+  @param[in] Handle      Image Handle\r
+\r
+  @return         A pointer to the image name as a string.\r
+**/\r
+CHAR16 *\r
+GetImageNameFromHandle (\r
+  IN CONST EFI_HANDLE Handle\r
+  )\r
+{\r
+  EFI_STATUS                        Status;\r
+  EFI_DRIVER_BINDING_PROTOCOL       *DriverBinding;\r
+  EFI_LOADED_IMAGE_PROTOCOL         *LoadedImage;\r
+  EFI_DEVICE_PATH_PROTOCOL          *DevPathNode;\r
+  EFI_GUID                          *NameGuid;\r
+  CHAR16                            *ImageName;\r
+  UINTN                             BufferSize;\r
+  UINT32                            AuthenticationStatus;\r
+  EFI_FIRMWARE_VOLUME2_PROTOCOL     *Fv2;\r
+\r
+  LoadedImage   = NULL;\r
+  DriverBinding = NULL;\r
+  ImageName     = NULL;\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 NULL;\r
+  }\r
+  Status = gBS->OpenProtocol (\r
+                  DriverBinding->ImageHandle,\r
+                  &gEfiLoadedImageProtocolGuid,\r
+                  (VOID**)&LoadedImage,\r
+                  gImageHandle,\r
+                  NULL,\r
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                  );\r
+  if (!EFI_ERROR (Status)) {\r
+    DevPathNode = LoadedImage->FilePath;\r
+    if (DevPathNode == NULL) {\r
+      return NULL;\r
+    }\r
+    while (!IsDevicePathEnd (DevPathNode)) {\r
+      NameGuid = EfiGetNameGuidFromFwVolDevicePathNode ((MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *)DevPathNode);\r
+      if (NameGuid != NULL) {\r
+        Status = gBS->HandleProtocol (\r
+                        LoadedImage->DeviceHandle,\r
+                        &gEfiFirmwareVolume2ProtocolGuid,\r
+                        (VOID **)&Fv2\r
+                        );\r
+        if (!EFI_ERROR (Status)) {\r
+          Status = Fv2->ReadSection (\r
+                          Fv2,\r
+                          NameGuid,\r
+                          EFI_SECTION_USER_INTERFACE,\r
+                          0,\r
+                          (VOID **)&ImageName,\r
+                          &BufferSize,\r
+                          &AuthenticationStatus\r
+                          );\r
+          if (!EFI_ERROR (Status)) {\r
+            break;\r
+          }\r
+          ImageName = NULL;\r
+        }\r
+      }\r
+      //\r
+      // Next device path node\r
+      //\r
+      DevPathNode = NextDevicePathNode (DevPathNode);\r
+    }\r
+    if (ImageName == NULL) {\r
+      ImageName = ConvertDevicePathToText (LoadedImage->FilePath, TRUE, TRUE);\r
+    }\r
+  }\r
+  return ImageName;\r
+}\r
+\r
 /**\r
   Function for 'drivers' command.\r
 \r
@@ -187,9 +269,12 @@ ShellCommandRunDrivers (
   EFI_HANDLE          *HandleWalker;\r
   UINTN               ChildCount;\r
   UINTN               DeviceCount;\r
+  CHAR16              ChildCountStr[3];\r
+  CHAR16              DeviceCountStr[3];\r
   CHAR16              *Temp2;\r
   CONST CHAR16        *FullDriverName;\r
   CHAR16              *TruncatedDriverName;\r
+  CHAR16              *ImageName;\r
   CHAR16              *FormatString;\r
   UINT32              DriverVersion;\r
   BOOLEAN             DriverConfig;\r
@@ -278,34 +363,57 @@ ShellCommandRunDrivers (
         DriverConfig   = ReturnDriverConfig(*HandleWalker);\r
         DriverDiag     = ReturnDriverDiag  (*HandleWalker);\r
         FullDriverName = GetStringNameFromHandle(*HandleWalker, Language);\r
+        ImageName      = GetImageNameFromHandle (*HandleWalker);\r
 \r
+        UnicodeValueToStringS (ChildCountStr,  sizeof (ChildCountStr),  0, ChildCount,  0);\r
+        UnicodeValueToStringS (DeviceCountStr, sizeof (DeviceCountStr), 0, DeviceCount, 0);\r
         TruncatedDriverName = NULL;\r
         if (!SfoFlag && (FullDriverName != NULL)) {\r
           TruncatedDriverName = AllocateZeroPool ((MAX_LEN_DRIVER_NAME + 1) * sizeof (CHAR16));\r
           StrnCpyS (TruncatedDriverName, MAX_LEN_DRIVER_NAME + 1, FullDriverName, MAX_LEN_DRIVER_NAME);\r
         }\r
 \r
-        ShellPrintEx(\r
-          -1,\r
-          -1,\r
-          FormatString,\r
-          ConvertHandleToHandleIndex(*HandleWalker),\r
-          DriverVersion,\r
-          ChildCount > 0?L'B':(DeviceCount > 0?L'D':L'?'),\r
-          DriverConfig?L'Y':L'N',\r
-          DriverDiag?L'Y':L'N',\r
-          DeviceCount,\r
-          ChildCount,\r
-          SfoFlag?FullDriverName:TruncatedDriverName,\r
-          Temp2==NULL?L"":Temp2\r
-         );\r
+        if (!SfoFlag) {\r
+          ShellPrintEx (\r
+            -1,\r
+            -1,\r
+            FormatString,\r
+            ConvertHandleToHandleIndex (*HandleWalker),\r
+            DriverVersion,\r
+            ChildCount > 0 ? L'B' : (DeviceCount > 0 ? L'D' : L'?'),\r
+            DriverConfig ? L'X' : L'-',\r
+            DriverDiag ? L'X' : L'-',\r
+            DeviceCount > 0 ? DeviceCountStr : L"-",\r
+            ChildCount  > 0 ? ChildCountStr : L"-",\r
+            TruncatedDriverName,\r
+            ImageName == NULL ? L"" : ImageName\r
+            );\r
+        } else {\r
+          ShellPrintEx (\r
+            -1,\r
+            -1,\r
+            FormatString,\r
+            ConvertHandleToHandleIndex (*HandleWalker),\r
+            DriverVersion,\r
+            ChildCount > 0 ? L'B' : (DeviceCount > 0 ? L'D' : L'?'),\r
+            DriverConfig ? L'Y' : L'N',\r
+            DriverDiag ? L'Y' : L'N',\r
+            DeviceCount,\r
+            ChildCount,\r
+            FullDriverName,\r
+            Temp2 == NULL ? L"" : Temp2\r
+            );\r
+        }\r
         if (TruncatedDriverName != NULL) {\r
           FreePool (TruncatedDriverName);\r
         }\r
         if (Temp2 != NULL) {\r
           FreePool(Temp2);\r
         }\r
-        \r
+        if (ImageName != NULL) {\r
+          FreePool (ImageName);\r
+        }\r
+\r
         if (ShellGetExecutionBreakFlag ()) {\r
           ShellStatus = SHELL_ABORTED;\r
           break;\r