]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Contributed-under: TianoCore Contribution Agreement 1.0
authormdkinney <mdkinney@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 5 Oct 2012 22:26:25 +0000 (22:26 +0000)
committermdkinney <mdkinney@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 5 Oct 2012 22:26:25 +0000 (22:26 +0000)
Signed-off-by: Michael Kinney <michael.d.kinney@intel.com>
Reviewed-by: Jaben Carsey <Jaben.carsey@intel.com>
1) ShellPkg/Library/UefiHandleParsingLib
    a. UefiHandleParsingLib.c – ConvertHandleToHandleIndex() and ConvertHandleIndexToHandle()
        i. Update to work correctly when handles are destroyed due to driver disconnect operations.  Same handle index is never reused.
    b. UefiHandleParsingLib.c – ParseHandleDatabaseByRelationshipWithType() and ParseHandleDatabaseForChildControllers()
        i. Expand to handle Service Binding Protocol usage such as Network stack.
2) ShellPkg/Library/UefiShellDriver1CommandsLib
    a. DevTree.c – Fix bug where the same handle is shown more than once.
    b. Dh.c – Fix use of GetDriverName() and GetDriverImageName().  The status returned must always be evaluated.
    c. Disconnect.c – Remove requirement that a handle being disconnected must support Device Path Protocol.  This prevents driver model handles without device paths from being disconnected (i.e. Network Stack)
    d. OpenInfo.c – Fix bug when showing open info about a ControllerHandle that has been destroyed due to a disconnect or an unload operation.
    e. UefiShellDriver1CommandsLib.uni – Fix “drivers” command formatting when handle indexes have more than 2 characters.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13786 6f19259b-4bc3-4df7-8a09-765794883524

ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c
ShellPkg/Library/UefiShellDriver1CommandsLib/DevTree.c
ShellPkg/Library/UefiShellDriver1CommandsLib/Dh.c
ShellPkg/Library/UefiShellDriver1CommandsLib/Disconnect.c
ShellPkg/Library/UefiShellDriver1CommandsLib/OpenInfo.c
ShellPkg/Library/UefiShellDriver1CommandsLib/UefiShellDriver1CommandsLib.uni

index e9e3d8204d651b2b46870c50d5f1618d41cce4a2..202e1fa0202d8b49822b59c9529b19c07c76643b 100644 (file)
@@ -948,7 +948,11 @@ ConvertHandleToHandleIndex(
   IN CONST EFI_HANDLE TheHandle\r
   )\r
 {\r
-  HANDLE_LIST *ListWalker;\r
+  EFI_STATUS   Status;\r
+  EFI_GUID     **ProtocolBuffer;\r
+  UINTN        ProtocolCount;\r
+  HANDLE_LIST  *ListWalker;\r
+\r
   if (TheHandle == NULL) {\r
     return 0;\r
   }\r
@@ -960,9 +964,34 @@ ConvertHandleToHandleIndex(
     ;  ListWalker = (HANDLE_LIST*)GetNextNode(&mHandleList.List.Link,&ListWalker->Link)\r
    ){\r
     if (ListWalker->TheHandle == TheHandle) {\r
+      //\r
+      // Verify that TheHandle is still present in the Handle Database\r
+      //\r
+      Status = gBS->ProtocolsPerHandle(TheHandle, &ProtocolBuffer, &ProtocolCount);\r
+      if (EFI_ERROR (Status)) {\r
+        //\r
+        // TheHandle is not present in the Handle Database, so delete from the handle list\r
+        //\r
+        RemoveEntryList (&ListWalker->Link);\r
+        return 0;\r
+      }\r
+      FreePool (ProtocolBuffer);\r
       return (ListWalker->TheIndex);\r
     }\r
   }\r
+\r
+  //\r
+  // Verify that TheHandle is valid handle\r
+  //\r
+  Status = gBS->ProtocolsPerHandle(TheHandle, &ProtocolBuffer, &ProtocolCount);\r
+  if (EFI_ERROR (Status)) {\r
+    //\r
+    // TheHandle is not valid, so do not add to handle list\r
+    //\r
+    return 0;\r
+  }\r
+  FreePool (ProtocolBuffer);\r
+\r
   ListWalker = AllocateZeroPool(sizeof(HANDLE_LIST));\r
   ASSERT(ListWalker != NULL);\r
   ListWalker->TheHandle = TheHandle;\r
@@ -988,23 +1017,36 @@ ConvertHandleIndexToHandle(
   IN CONST UINTN TheIndex\r
   )\r
 {\r
+  EFI_STATUS   Status;\r
+  EFI_GUID     **ProtocolBuffer;\r
+  UINTN        ProtocolCount;\r
   HANDLE_LIST *ListWalker;\r
 \r
   InternalShellInitHandleList();\r
 \r
   if (TheIndex >= mHandleList.NextIndex) {\r
-    return (NULL);\r
+    return NULL;\r
   }\r
 \r
   for (ListWalker = (HANDLE_LIST*)GetFirstNode(&mHandleList.List.Link)\r
     ;  !IsNull(&mHandleList.List.Link,&ListWalker->Link)\r
     ;  ListWalker = (HANDLE_LIST*)GetNextNode(&mHandleList.List.Link,&ListWalker->Link)\r
    ){\r
-    if (ListWalker->TheIndex == TheIndex) {\r
+    if (ListWalker->TheIndex == TheIndex && ListWalker->TheHandle != NULL) {\r
+      //\r
+      // Verify that LinkWalker->TheHandle is valid handle\r
+      //\r
+      Status = gBS->ProtocolsPerHandle(ListWalker->TheHandle, &ProtocolBuffer, &ProtocolCount);\r
+      if (EFI_ERROR (Status)) {\r
+        //\r
+        // TheHandle is not valid, so do not add to handle list\r
+        //\r
+        ListWalker->TheHandle = NULL;\r
+      }\r
       return (ListWalker->TheHandle);\r
     }\r
   }\r
-  return (NULL);\r
+  return NULL;\r
 }\r
 \r
 /**\r
@@ -1052,6 +1094,7 @@ ParseHandleDatabaseByRelationshipWithType (
   UINTN                               OpenInfoCount;\r
   UINTN                               OpenInfoIndex;\r
   UINTN                               ChildIndex;\r
+  INTN                                DriverBindingHandleIndex;\r
 \r
   ASSERT(HandleCount  != NULL);\r
   ASSERT(HandleBuffer != NULL);\r
@@ -1079,6 +1122,13 @@ ParseHandleDatabaseByRelationshipWithType (
   *HandleType = AllocateZeroPool (*HandleCount * sizeof (UINTN));\r
   ASSERT(*HandleType != NULL);\r
 \r
+  DriverBindingHandleIndex = -1;\r
+  for (HandleIndex = 0; HandleIndex < *HandleCount; HandleIndex++) {\r
+    if (DriverBindingHandle != NULL && (*HandleBuffer)[HandleIndex] == DriverBindingHandle) {\r
+      DriverBindingHandleIndex = (INTN)HandleIndex;\r
+    }\r
+  }\r
+\r
   for (HandleIndex = 0; HandleIndex < *HandleCount; HandleIndex++) {\r
     //\r
     // Retrieve the list of all the protocols on each handle\r
@@ -1088,102 +1138,150 @@ ParseHandleDatabaseByRelationshipWithType (
                   &ProtocolGuidArray,\r
                   &ArrayCount\r
                  );\r
-    if (!EFI_ERROR (Status)) {\r
+    if (EFI_ERROR (Status)) {\r
+      continue;\r
+    }\r
 \r
-      for (ProtocolIndex = 0; ProtocolIndex < ArrayCount; ProtocolIndex++) {\r
+    for (ProtocolIndex = 0; ProtocolIndex < ArrayCount; ProtocolIndex++) {\r
 \r
-        //\r
-        // Set the bit describing what this handle has\r
-        //\r
-        if        (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiLoadedImageProtocolGuid)         ) {\r
-          (*HandleType)[HandleIndex] |= HR_IMAGE_HANDLE;\r
-        } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverBindingProtocolGuid)       ) {\r
-          (*HandleType)[HandleIndex] |= HR_DRIVER_BINDING_HANDLE;\r
-        } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverConfiguration2ProtocolGuid)) {\r
-          (*HandleType)[HandleIndex] |= HR_DRIVER_CONFIGURATION_HANDLE;\r
-        } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverConfigurationProtocolGuid) ) {\r
-          (*HandleType)[HandleIndex] |= HR_DRIVER_CONFIGURATION_HANDLE;\r
-        } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverDiagnostics2ProtocolGuid)  ) {\r
-          (*HandleType)[HandleIndex] |= HR_DRIVER_DIAGNOSTICS_HANDLE;\r
-        } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverDiagnosticsProtocolGuid)   ) {\r
-          (*HandleType)[HandleIndex] |= HR_DRIVER_DIAGNOSTICS_HANDLE;\r
-        } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiComponentName2ProtocolGuid)      ) {\r
-          (*HandleType)[HandleIndex] |= HR_COMPONENT_NAME_HANDLE;\r
-        } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiComponentNameProtocolGuid)       ) {\r
-          (*HandleType)[HandleIndex] |= HR_COMPONENT_NAME_HANDLE;\r
-        } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDevicePathProtocolGuid)          ) {\r
-          (*HandleType)[HandleIndex] |= HR_DEVICE_HANDLE;\r
-        } else {\r
-          DEBUG_CODE_BEGIN();\r
-          ASSERT((*HandleType)[HandleIndex] == (*HandleType)[HandleIndex]);\r
-          DEBUG_CODE_END();\r
-        }\r
-        //\r
-        // Retrieve the list of agents that have opened each protocol\r
-        //\r
-        Status = gBS->OpenProtocolInformation (\r
+      //\r
+      // Set the bit describing what this handle has\r
+      //\r
+      if        (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiLoadedImageProtocolGuid)         ) {\r
+        (*HandleType)[HandleIndex] |= HR_IMAGE_HANDLE;\r
+      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverBindingProtocolGuid)       ) {\r
+        (*HandleType)[HandleIndex] |= HR_DRIVER_BINDING_HANDLE;\r
+      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverConfiguration2ProtocolGuid)) {\r
+        (*HandleType)[HandleIndex] |= HR_DRIVER_CONFIGURATION_HANDLE;\r
+      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverConfigurationProtocolGuid) ) {\r
+        (*HandleType)[HandleIndex] |= HR_DRIVER_CONFIGURATION_HANDLE;\r
+      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverDiagnostics2ProtocolGuid)  ) {\r
+        (*HandleType)[HandleIndex] |= HR_DRIVER_DIAGNOSTICS_HANDLE;\r
+      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverDiagnosticsProtocolGuid)   ) {\r
+        (*HandleType)[HandleIndex] |= HR_DRIVER_DIAGNOSTICS_HANDLE;\r
+      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiComponentName2ProtocolGuid)      ) {\r
+        (*HandleType)[HandleIndex] |= HR_COMPONENT_NAME_HANDLE;\r
+      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiComponentNameProtocolGuid)       ) {\r
+        (*HandleType)[HandleIndex] |= HR_COMPONENT_NAME_HANDLE;\r
+      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDevicePathProtocolGuid)          ) {\r
+        (*HandleType)[HandleIndex] |= HR_DEVICE_HANDLE;\r
+      } else {\r
+        DEBUG_CODE_BEGIN();\r
+        ASSERT((*HandleType)[HandleIndex] == (*HandleType)[HandleIndex]);\r
+        DEBUG_CODE_END();\r
+      }\r
+      //\r
+      // Retrieve the list of agents that have opened each protocol\r
+      //\r
+      Status = gBS->OpenProtocolInformation (\r
                       (*HandleBuffer)[HandleIndex],\r
                       ProtocolGuidArray[ProtocolIndex],\r
                       &OpenInfo,\r
                       &OpenInfoCount\r
                      );\r
-        if (!EFI_ERROR (Status)) {\r
+      if (EFI_ERROR (Status)) {\r
+        continue;\r
+      }\r
+\r
+      if (ControllerHandle == NULL) {\r
+        //\r
+        // ControllerHandle == NULL and DriverBindingHandle != NULL.  \r
+        // Return information on all the controller handles that the driver specified by DriverBindingHandle is managing\r
+        //\r
+        for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {\r
+          if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle && (OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) {\r
+            (*HandleType)[HandleIndex] |= (HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE);\r
+            if (DriverBindingHandleIndex != -1) {\r
+              (*HandleType)[DriverBindingHandleIndex] |= HR_DEVICE_DRIVER;\r
+            }\r
+          }\r
+          if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle && (OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
+            (*HandleType)[HandleIndex] |= (HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE);\r
+            if (DriverBindingHandleIndex != -1) {\r
+              (*HandleType)[DriverBindingHandleIndex] |= (HR_BUS_DRIVER | HR_DEVICE_DRIVER);\r
+            }\r
+            for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {\r
+              if (OpenInfo[OpenInfoIndex].ControllerHandle == (*HandleBuffer)[ChildIndex]) {\r
+                (*HandleType)[ChildIndex] |= (HR_DEVICE_HANDLE | HR_CHILD_HANDLE);\r
+              }\r
+            }\r
+          }\r
+        }\r
+      }\r
+      if (DriverBindingHandle == NULL && ControllerHandle != NULL) {\r
+        if (ControllerHandle == (*HandleBuffer)[HandleIndex]) {\r
+          (*HandleType)[HandleIndex] |= (HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE);\r
           for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {\r
-            if (DriverBindingHandle != NULL && OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle) {\r
-              if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) == EFI_OPEN_PROTOCOL_BY_DRIVER) {\r
-                (*HandleType)[HandleIndex] |= (HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE);\r
+            if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) {\r
+              for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {\r
+                if (OpenInfo[OpenInfoIndex].AgentHandle == (*HandleBuffer)[ChildIndex]) {\r
+                  (*HandleType)[ChildIndex] |= HR_DEVICE_DRIVER;\r
+                }\r
               }\r
-              if (ControllerHandle != NULL && (*HandleBuffer)[HandleIndex] == ControllerHandle) {\r
-                if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) == EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) {\r
-                  for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {\r
-                    if ((*HandleBuffer)[ChildIndex] == OpenInfo[OpenInfoIndex].ControllerHandle) {\r
-                      (*HandleType)[ChildIndex] |= (HR_DEVICE_HANDLE | HR_CHILD_HANDLE);\r
-                    }\r
-                  }\r
+            }\r
+            if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
+              for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {\r
+                if (OpenInfo[OpenInfoIndex].AgentHandle == (*HandleBuffer)[ChildIndex]) {\r
+                  (*HandleType)[ChildIndex] |= (HR_BUS_DRIVER | HR_DEVICE_DRIVER);\r
+                }\r
+                if (OpenInfo[OpenInfoIndex].ControllerHandle == (*HandleBuffer)[ChildIndex]) {\r
+                  (*HandleType)[ChildIndex] |= (HR_DEVICE_HANDLE | HR_CHILD_HANDLE);\r
                 }\r
               }\r
             }\r
-            if (DriverBindingHandle == NULL && OpenInfo[OpenInfoIndex].ControllerHandle == ControllerHandle) {\r
-              if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) == EFI_OPEN_PROTOCOL_BY_DRIVER) {\r
-                for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {\r
-                  if ((*HandleBuffer)[ChildIndex] == OpenInfo[OpenInfoIndex].AgentHandle) {\r
-                    (*HandleType)[ChildIndex] |= HR_DEVICE_DRIVER;\r
-                  }\r
+          }\r
+        } else {\r
+          for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {\r
+            if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
+              if (OpenInfo[OpenInfoIndex].ControllerHandle == ControllerHandle) {\r
+                (*HandleType)[HandleIndex] |= (HR_DEVICE_HANDLE | HR_PARENT_HANDLE);\r
+              }\r
+            }\r
+          }\r
+        }\r
+      }\r
+      if (DriverBindingHandle != NULL && ControllerHandle != NULL) {\r
+        if (ControllerHandle == (*HandleBuffer)[HandleIndex]) {\r
+          (*HandleType)[HandleIndex] |= (HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE);\r
+          for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {\r
+            if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) {\r
+              if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle) {\r
+                if (DriverBindingHandleIndex != -1) {\r
+                  (*HandleType)[DriverBindingHandleIndex] |= HR_DEVICE_DRIVER;\r
                 }\r
               }\r
-              if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) == EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) {\r
-                (*HandleType)[HandleIndex] |= HR_PARENT_HANDLE;\r
+            }\r
+            if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
+              if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle) {\r
                 for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {\r
-                  if ((*HandleBuffer)[ChildIndex] == OpenInfo[OpenInfoIndex].AgentHandle) {\r
-                    (*HandleType)[ChildIndex] |= HR_BUS_DRIVER;\r
+                  if (OpenInfo[OpenInfoIndex].ControllerHandle == (*HandleBuffer)[ChildIndex]) {\r
+                    (*HandleType)[ChildIndex] |= (HR_DEVICE_HANDLE | HR_CHILD_HANDLE);\r
                   }\r
                 }\r
               }\r
+\r
+              for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {\r
+                if (OpenInfo[OpenInfoIndex].AgentHandle == (*HandleBuffer)[ChildIndex]) {\r
+                  (*HandleType)[ChildIndex] |= (HR_BUS_DRIVER | HR_DEVICE_DRIVER);\r
+                }\r
+              }\r
+            }\r
+          }\r
+        } else {\r
+          for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {\r
+            if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
+              if (OpenInfo[OpenInfoIndex].ControllerHandle == ControllerHandle) {\r
+                (*HandleType)[HandleIndex] |= (HR_DEVICE_HANDLE | HR_PARENT_HANDLE);\r
+              }\r
             }\r
           }\r
-\r
-          FreePool (OpenInfo);\r
         }\r
       }\r
-\r
-      FreePool (ProtocolGuidArray);\r
+      FreePool (OpenInfo);\r
     }\r
+    FreePool (ProtocolGuidArray);\r
   }\r
-\r
-  if (EFI_ERROR(Status)) {\r
-    if (*HandleType != NULL) {\r
-      FreePool (*HandleType);\r
-    }\r
-    if (*HandleBuffer != NULL) {\r
-      FreePool (*HandleBuffer);\r
-    }\r
-\r
-    *HandleCount  = 0;\r
-    *HandleBuffer = NULL;\r
-    *HandleType   = NULL;\r
-  }\r
-\r
-  return Status;\r
+  return EFI_SUCCESS;\r
 }\r
 \r
 /**\r
@@ -1338,14 +1436,13 @@ ParseHandleDatabaseForChildControllers(
   )\r
 {\r
   EFI_STATUS  Status;\r
-//  UINTN       HandleIndex;\r
+  UINTN       HandleIndex;\r
   UINTN       DriverBindingHandleCount;\r
   EFI_HANDLE  *DriverBindingHandleBuffer;\r
   UINTN       DriverBindingHandleIndex;\r
   UINTN       ChildControllerHandleCount;\r
   EFI_HANDLE  *ChildControllerHandleBuffer;\r
   UINTN       ChildControllerHandleIndex;\r
-//  BOOLEAN     Found;\r
   EFI_HANDLE  *HandleBufferForReturn;\r
 \r
   if (MatchingHandleCount == NULL) {\r
@@ -1365,7 +1462,7 @@ ParseHandleDatabaseForChildControllers(
   //\r
   // Get a buffer big enough for all the controllers.\r
   //\r
-  HandleBufferForReturn = GetHandleListByProtocol(&gEfiDevicePathProtocolGuid);\r
+  HandleBufferForReturn = GetHandleListByProtocol(NULL);\r
   if (HandleBufferForReturn == NULL) {\r
     FreePool (DriverBindingHandleBuffer);\r
     return (EFI_NOT_FOUND);\r
@@ -1386,18 +1483,14 @@ ParseHandleDatabaseForChildControllers(
          ChildControllerHandleIndex < ChildControllerHandleCount;\r
          ChildControllerHandleIndex++\r
        ) {\r
-//      Found = FALSE;\r
-      HandleBufferForReturn[(*MatchingHandleCount)++] = ChildControllerHandleBuffer[ChildControllerHandleIndex];\r
-//      for (HandleIndex = 0; HandleBufferForReturn[HandleIndex] != NULL; HandleIndex++) {\r
-//        if (HandleBufferForReturn[HandleIndex] == ChildControllerHandleBuffer[ChildControllerHandleIndex]) {\r
-//          Found = TRUE;\r
-//          break;\r
-//        }\r
-//      }\r
-\r
-//      if (Found) {\r
-//        HandleBufferForReturn[(*MatchingHandleCount)++] = ChildControllerHandleBuffer[ChildControllerHandleIndex];\r
-//      }\r
+      for (HandleIndex = 0; HandleIndex < *MatchingHandleCount; HandleIndex++) {\r
+        if (HandleBufferForReturn[HandleIndex] == ChildControllerHandleBuffer[ChildControllerHandleIndex]) {\r
+          break;\r
+        }\r
+      }\r
+      if (HandleIndex >= *MatchingHandleCount) {\r
+        HandleBufferForReturn[(*MatchingHandleCount)++] = ChildControllerHandleBuffer[ChildControllerHandleIndex];\r
+      }\r
     }\r
 \r
     FreePool (ChildControllerHandleBuffer);\r
index a66bdec06b20c5de3b4dd9b2e4b1f61190bec5f4..15487703790d2d8f24f8d45a357c29cfbf14ca4c 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Main file for DevTree shell Driver1 function.\r
 \r
-  Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2010 - 2012, 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
@@ -84,23 +84,6 @@ DoDevTreeForHandle(
     return SHELL_SUCCESS;\r
   }\r
 \r
-  //\r
-  // If we are at the begining then we want root handles they have no parents and do have device path.\r
-  //\r
-  if (IndentCharCount == 0) {\r
-    Status = gBS->OpenProtocol (\r
-                  TheHandle,\r
-                  &gEfiDevicePathProtocolGuid,\r
-                  NULL,\r
-                  NULL,\r
-                  NULL,\r
-                  EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
-                 );\r
-    if (EFI_ERROR (Status)) {\r
-      return SHELL_SUCCESS;\r
-    }\r
-  }\r
-\r
   FormatString        = AllocateZeroPool(StrSize(HiiString) + (10)*sizeof(FormatString[0]));\r
 \r
   ASSERT(HiiString    != NULL);\r
@@ -169,6 +152,8 @@ ShellCommandRunDevTree (
   EFI_HANDLE          TheHandle;\r
   BOOLEAN             FlagD;\r
   UINT64              Intermediate;\r
+  UINTN               ParentControllerHandleCount;\r
+  EFI_HANDLE          *ParentControllerHandleBuffer;\r
 \r
   ShellStatus         = SHELL_SUCCESS;\r
   Status              = EFI_SUCCESS;\r
@@ -226,6 +211,39 @@ ShellCommandRunDevTree (
         if (TheHandle == NULL){\r
           break;\r
         }\r
+\r
+        //\r
+        // Skip handles that do not have device path protocol\r
+        //\r
+        Status = gBS->OpenProtocol (\r
+                      TheHandle,\r
+                      &gEfiDevicePathProtocolGuid,\r
+                      NULL,\r
+                      NULL,\r
+                      NULL,\r
+                      EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
+                     );\r
+        if (EFI_ERROR (Status)) {\r
+          continue;\r
+        }\r
+\r
+        //\r
+        // Skip handles that do have parents\r
+        //\r
+        ParentControllerHandleBuffer = NULL;\r
+        Status = PARSE_HANDLE_DATABASE_PARENTS (\r
+                   TheHandle,\r
+                   &ParentControllerHandleCount,\r
+                   &ParentControllerHandleBuffer\r
+                   );\r
+        SHELL_FREE_NON_NULL (ParentControllerHandleBuffer);\r
+        if (ParentControllerHandleCount > 0) {\r
+          continue;\r
+        }\r
+\r
+        //\r
+        // Start a devtree from TheHandle that has a device path and no parents\r
+        //\r
         ShellStatus = DoDevTreeForHandle(TheHandle, Language, FlagD, 0, HiiString);\r
       }\r
     } else {\r
index 1b42b23addc3923191cfcdc0663fdc2263bb9f68..a0dc1394117f441754fe67759f9c0025df4909b0 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Main file for Dh shell Driver1 function.\r
 \r
-  Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2010 - 2012, 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
@@ -394,11 +394,14 @@ DisplayDriverModelHandle (
                   Language,\r
                   &DriverName\r
                   );\r
-        if (DriverName == NULL) {\r
+        if (EFI_ERROR (Status)) {\r
           Status = GetDriverImageName (\r
                     DriverBindingHandleBuffer[Index],\r
                     &DriverName\r
                     );\r
+          if (EFI_ERROR (Status)) {\r
+            DriverName = NULL;\r
+          }\r
         }\r
 \r
         if (Image) {\r
@@ -537,6 +540,9 @@ DisplayDriverModelHandle (
   }\r
 \r
   Status = GetDriverName (Handle, Language, &DriverName);\r
+  if (EFI_ERROR (Status)) {\r
+    DriverName = NULL;\r
+  }\r
 \r
   ShellPrintHiiEx(\r
     -1, \r
@@ -548,11 +554,13 @@ DisplayDriverModelHandle (
     DriverName!=NULL?DriverName:L"<Unknown>"\r
     );\r
   SHELL_FREE_NON_NULL(DriverName);\r
-  DriverName = NULL;\r
   Status = GetDriverImageName (\r
             Handle,\r
             &DriverName\r
             );\r
+  if (EFI_ERROR (Status)) {\r
+    DriverName = NULL;\r
+  }\r
   ShellPrintHiiEx(\r
     -1, \r
     -1, \r
index 96233f9b53b3f84e7b479497226f2abf4b8d9949..a33bed9dc82aec5e2194aa8efd187672b014fc02 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Main file for Disconnect shell Driver1 function.\r
 \r
-  Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2010 - 2012, 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
@@ -163,10 +163,6 @@ ShellCommandRunDisconnect (
         } else if (Param3 != NULL && Handle3 == NULL) {\r
           ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, Param3);\r
           ShellStatus = SHELL_INVALID_PARAMETER;\r
-        } else if (EFI_ERROR(gBS->OpenProtocol(Handle1, &gEfiDevicePathProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
-          ASSERT(Param1 != NULL);\r
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_HANDLE_NOT), gShellDriver1HiiHandle, ShellStrToUintn(Param1), L"controller handle");\r
-          ShellStatus = SHELL_INVALID_PARAMETER;\r
         } else if (Handle2 != NULL && EFI_ERROR(gBS->OpenProtocol(Handle2, &gEfiDriverBindingProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
           ASSERT(Param2 != NULL);\r
           ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_HANDLE_NOT), gShellDriver1HiiHandle, ShellStrToUintn(Param2), L"driver handle");\r
index 368948307efe76fba090722d4f9e940a9c506ca3..2922f42d1ec53fa79bfd511547d87f43f9f44a35 100644 (file)
@@ -48,6 +48,7 @@ TraverseHandleDatabase (
   CHAR16                              *TempString;\r
   UINTN                               HandleIndex;\r
   CONST CHAR16                        *Name;\r
+  UINTN                               ControllerIndex;\r
 \r
   if (TheHandle == NULL) {\r
     return (EFI_INVALID_PARAMETER);\r
@@ -98,9 +99,10 @@ TraverseHandleDatabase (
                                                         OpenTypeString = StringDriverEx;  break;\r
             default:                                    OpenTypeString = StringUnknown;   break;\r
           }\r
-          HandleIndex = ConvertHandleToHandleIndex(OpenInfo[OpenInfoIndex].AgentHandle);\r
-          Name        = GetStringNameFromHandle(OpenInfo[OpenInfoIndex].AgentHandle, NULL);\r
-          if (OpenInfo[OpenInfoIndex].ControllerHandle!=NULL) {\r
+          HandleIndex     = ConvertHandleToHandleIndex(OpenInfo[OpenInfoIndex].AgentHandle);\r
+          Name            = GetStringNameFromHandle(OpenInfo[OpenInfoIndex].AgentHandle, NULL);\r
+          ControllerIndex = ConvertHandleToHandleIndex(OpenInfo[OpenInfoIndex].ControllerHandle);\r
+          if (ControllerIndex != 0) {\r
             ShellPrintHiiEx(\r
               -1,\r
               -1,\r
@@ -108,7 +110,7 @@ TraverseHandleDatabase (
               STRING_TOKEN(STR_OPENINFO_LINE),\r
               gShellDriver1HiiHandle,\r
               HandleIndex,\r
-              ConvertHandleToHandleIndex(OpenInfo[OpenInfoIndex].ControllerHandle),\r
+              ControllerIndex,\r
               OpenInfo[OpenInfoIndex].OpenCount,\r
               OpenTypeString,\r
               Name\r
index 6c669795aa44748a1d419b225ed0aef8d2f1a9dc..9ffad7ec04275b61bd2f182e0abe00afcb8becc2 100644 (file)
Binary files a/ShellPkg/Library/UefiShellDriver1CommandsLib/UefiShellDriver1CommandsLib.uni and b/ShellPkg/Library/UefiShellDriver1CommandsLib/UefiShellDriver1CommandsLib.uni differ