Revision: 14032
          http://edk2.svn.sourceforge.net/edk2/?rev=14032&view=rev
Author:   vanjeff
Date:     2013-01-05 02:32:19 +0000 (Sat, 05 Jan 2013)
Log Message:
-----------
Sync patch r13786 from main trunk.
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.

Revision Links:
--------------
    http://edk2.svn.sourceforge.net/edk2/?rev=13786&view=rev

Modified Paths:
--------------
    
branches/UDK2010.SR1/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c
    branches/UDK2010.SR1/ShellPkg/Library/UefiShellDriver1CommandsLib/DevTree.c
    branches/UDK2010.SR1/ShellPkg/Library/UefiShellDriver1CommandsLib/Dh.c
    
branches/UDK2010.SR1/ShellPkg/Library/UefiShellDriver1CommandsLib/Disconnect.c
    branches/UDK2010.SR1/ShellPkg/Library/UefiShellDriver1CommandsLib/OpenInfo.c

Modified: 
branches/UDK2010.SR1/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c
===================================================================
--- 
branches/UDK2010.SR1/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c
   2013-01-05 01:34:13 UTC (rev 14031)
+++ 
branches/UDK2010.SR1/ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c
   2013-01-05 02:32:19 UTC (rev 14032)
@@ -890,7 +890,11 @@
   IN CONST EFI_HANDLE TheHandle
   )
 {
-  HANDLE_LIST *ListWalker;
+  EFI_STATUS   Status;
+  EFI_GUID     **ProtocolBuffer;
+  UINTN        ProtocolCount;
+  HANDLE_LIST  *ListWalker;
+
   if (TheHandle == NULL) {
     return 0;
   }
@@ -902,9 +906,34 @@
     ;  ListWalker = 
(HANDLE_LIST*)GetNextNode(&mHandleList.List.Link,&ListWalker->Link)
    ){
     if (ListWalker->TheHandle == TheHandle) {
+      //
+      // Verify that TheHandle is still present in the Handle Database
+      //
+      Status = gBS->ProtocolsPerHandle(TheHandle, &ProtocolBuffer, 
&ProtocolCount);
+      if (EFI_ERROR (Status)) {
+        //
+        // TheHandle is not present in the Handle Database, so delete from the 
handle list
+        //
+        RemoveEntryList (&ListWalker->Link);
+        return 0;
+      }
+      FreePool (ProtocolBuffer);
       return (ListWalker->TheIndex);
     }
   }
+
+  //
+  // Verify that TheHandle is valid handle
+  //
+  Status = gBS->ProtocolsPerHandle(TheHandle, &ProtocolBuffer, &ProtocolCount);
+  if (EFI_ERROR (Status)) {
+    //
+    // TheHandle is not valid, so do not add to handle list
+    //
+    return 0;
+  }
+  FreePool (ProtocolBuffer);
+
   ListWalker = AllocateZeroPool(sizeof(HANDLE_LIST));
   ASSERT(ListWalker != NULL);
   ListWalker->TheHandle = TheHandle;
@@ -930,23 +959,36 @@
   IN CONST UINTN TheIndex
   )
 {
+  EFI_STATUS   Status;
+  EFI_GUID     **ProtocolBuffer;
+  UINTN        ProtocolCount;
   HANDLE_LIST *ListWalker;
 
   InternalShellInitHandleList();
 
   if (TheIndex >= mHandleList.NextIndex) {
-    return (NULL);
+    return NULL;
   }
 
   for (ListWalker = (HANDLE_LIST*)GetFirstNode(&mHandleList.List.Link)
     ;  !IsNull(&mHandleList.List.Link,&ListWalker->Link)
     ;  ListWalker = 
(HANDLE_LIST*)GetNextNode(&mHandleList.List.Link,&ListWalker->Link)
    ){
-    if (ListWalker->TheIndex == TheIndex) {
+    if (ListWalker->TheIndex == TheIndex && ListWalker->TheHandle != NULL) {
+      //
+      // Verify that LinkWalker->TheHandle is valid handle
+      //
+      Status = gBS->ProtocolsPerHandle(ListWalker->TheHandle, &ProtocolBuffer, 
&ProtocolCount);
+      if (EFI_ERROR (Status)) {
+        //
+        // TheHandle is not valid, so do not add to handle list
+        //
+        ListWalker->TheHandle = NULL;
+      }
       return (ListWalker->TheHandle);
     }
   }
-  return (NULL);
+  return NULL;
 }
 
 /**
@@ -994,6 +1036,7 @@
   UINTN                               OpenInfoCount;
   UINTN                               OpenInfoIndex;
   UINTN                               ChildIndex;
+  INTN                                DriverBindingHandleIndex;
 
   ASSERT(HandleCount  != NULL);
   ASSERT(HandleBuffer != NULL);
@@ -1021,7 +1064,14 @@
   *HandleType = AllocateZeroPool (*HandleCount * sizeof (UINTN));
   ASSERT(*HandleType != NULL);
 
+  DriverBindingHandleIndex = -1;
   for (HandleIndex = 0; HandleIndex < *HandleCount; HandleIndex++) {
+    if (DriverBindingHandle != NULL && (*HandleBuffer)[HandleIndex] == 
DriverBindingHandle) {
+      DriverBindingHandleIndex = (INTN)HandleIndex;
+    }
+  }
+
+  for (HandleIndex = 0; HandleIndex < *HandleCount; HandleIndex++) {
     //
     // Retrieve the list of all the protocols on each handle
     //
@@ -1030,102 +1080,150 @@
                   &ProtocolGuidArray,
                   &ArrayCount
                  );
-    if (!EFI_ERROR (Status)) {
+    if (EFI_ERROR (Status)) {
+      continue;
+    }
 
-      for (ProtocolIndex = 0; ProtocolIndex < ArrayCount; ProtocolIndex++) {
+    for (ProtocolIndex = 0; ProtocolIndex < ArrayCount; ProtocolIndex++) {
 
-        //
-        // Set the bit describing what this handle has
-        //
-        if        (CompareGuid (ProtocolGuidArray[ProtocolIndex], 
&gEfiLoadedImageProtocolGuid)         ) {
-          (*HandleType)[HandleIndex] |= HR_IMAGE_HANDLE;
-        } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], 
&gEfiDriverBindingProtocolGuid)       ) {
-          (*HandleType)[HandleIndex] |= HR_DRIVER_BINDING_HANDLE;
-        } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], 
&gEfiDriverConfiguration2ProtocolGuid)) {
-          (*HandleType)[HandleIndex] |= HR_DRIVER_CONFIGURATION_HANDLE;
-        } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], 
&gEfiDriverConfigurationProtocolGuid) ) {
-          (*HandleType)[HandleIndex] |= HR_DRIVER_CONFIGURATION_HANDLE;
-        } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], 
&gEfiDriverDiagnostics2ProtocolGuid)  ) {
-          (*HandleType)[HandleIndex] |= HR_DRIVER_DIAGNOSTICS_HANDLE;
-        } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], 
&gEfiDriverDiagnosticsProtocolGuid)   ) {
-          (*HandleType)[HandleIndex] |= HR_DRIVER_DIAGNOSTICS_HANDLE;
-        } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], 
&gEfiComponentName2ProtocolGuid)      ) {
-          (*HandleType)[HandleIndex] |= HR_COMPONENT_NAME_HANDLE;
-        } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], 
&gEfiComponentNameProtocolGuid)       ) {
-          (*HandleType)[HandleIndex] |= HR_COMPONENT_NAME_HANDLE;
-        } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], 
&gEfiDevicePathProtocolGuid)          ) {
-          (*HandleType)[HandleIndex] |= HR_DEVICE_HANDLE;
-        } else {
-          DEBUG_CODE_BEGIN();
-          ASSERT((*HandleType)[HandleIndex] == (*HandleType)[HandleIndex]);
-          DEBUG_CODE_END();
-        }
-        //
-        // Retrieve the list of agents that have opened each protocol
-        //
-        Status = gBS->OpenProtocolInformation (
+      //
+      // Set the bit describing what this handle has
+      //
+      if        (CompareGuid (ProtocolGuidArray[ProtocolIndex], 
&gEfiLoadedImageProtocolGuid)         ) {
+        (*HandleType)[HandleIndex] |= HR_IMAGE_HANDLE;
+      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], 
&gEfiDriverBindingProtocolGuid)       ) {
+        (*HandleType)[HandleIndex] |= HR_DRIVER_BINDING_HANDLE;
+      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], 
&gEfiDriverConfiguration2ProtocolGuid)) {
+        (*HandleType)[HandleIndex] |= HR_DRIVER_CONFIGURATION_HANDLE;
+      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], 
&gEfiDriverConfigurationProtocolGuid) ) {
+        (*HandleType)[HandleIndex] |= HR_DRIVER_CONFIGURATION_HANDLE;
+      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], 
&gEfiDriverDiagnostics2ProtocolGuid)  ) {
+        (*HandleType)[HandleIndex] |= HR_DRIVER_DIAGNOSTICS_HANDLE;
+      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], 
&gEfiDriverDiagnosticsProtocolGuid)   ) {
+        (*HandleType)[HandleIndex] |= HR_DRIVER_DIAGNOSTICS_HANDLE;
+      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], 
&gEfiComponentName2ProtocolGuid)      ) {
+        (*HandleType)[HandleIndex] |= HR_COMPONENT_NAME_HANDLE;
+      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], 
&gEfiComponentNameProtocolGuid)       ) {
+        (*HandleType)[HandleIndex] |= HR_COMPONENT_NAME_HANDLE;
+      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], 
&gEfiDevicePathProtocolGuid)          ) {
+        (*HandleType)[HandleIndex] |= HR_DEVICE_HANDLE;
+      } else {
+        DEBUG_CODE_BEGIN();
+        ASSERT((*HandleType)[HandleIndex] == (*HandleType)[HandleIndex]);
+        DEBUG_CODE_END();
+      }
+      //
+      // Retrieve the list of agents that have opened each protocol
+      //
+      Status = gBS->OpenProtocolInformation (
                       (*HandleBuffer)[HandleIndex],
                       ProtocolGuidArray[ProtocolIndex],
                       &OpenInfo,
                       &OpenInfoCount
                      );
-        if (!EFI_ERROR (Status)) {
+      if (EFI_ERROR (Status)) {
+        continue;
+      }
+
+      if (ControllerHandle == NULL) {
+        //
+        // ControllerHandle == NULL and DriverBindingHandle != NULL.  
+        // Return information on all the controller handles that the driver 
specified by DriverBindingHandle is managing
+        //
+        for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; 
OpenInfoIndex++) {
+          if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle && 
(OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) {
+            (*HandleType)[HandleIndex] |= (HR_DEVICE_HANDLE | 
HR_CONTROLLER_HANDLE);
+            if (DriverBindingHandleIndex != -1) {
+              (*HandleType)[DriverBindingHandleIndex] |= HR_DEVICE_DRIVER;
+            }
+          }
+          if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle && 
(OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 
0) {
+            (*HandleType)[HandleIndex] |= (HR_DEVICE_HANDLE | 
HR_CONTROLLER_HANDLE);
+            if (DriverBindingHandleIndex != -1) {
+              (*HandleType)[DriverBindingHandleIndex] |= (HR_BUS_DRIVER | 
HR_DEVICE_DRIVER);
+            }
+            for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {
+              if (OpenInfo[OpenInfoIndex].ControllerHandle == 
(*HandleBuffer)[ChildIndex]) {
+                (*HandleType)[ChildIndex] |= (HR_DEVICE_HANDLE | 
HR_CHILD_HANDLE);
+              }
+            }
+          }
+        }
+      }
+      if (DriverBindingHandle == NULL && ControllerHandle != NULL) {
+        if (ControllerHandle == (*HandleBuffer)[HandleIndex]) {
+          (*HandleType)[HandleIndex] |= (HR_DEVICE_HANDLE | 
HR_CONTROLLER_HANDLE);
           for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; 
OpenInfoIndex++) {
-            if (DriverBindingHandle != NULL && 
OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle) {
-              if ((OpenInfo[OpenInfoIndex].Attributes & 
EFI_OPEN_PROTOCOL_BY_DRIVER) == EFI_OPEN_PROTOCOL_BY_DRIVER) {
-                (*HandleType)[HandleIndex] |= (HR_DEVICE_HANDLE | 
HR_CONTROLLER_HANDLE);
+            if ((OpenInfo[OpenInfoIndex].Attributes & 
EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) {
+              for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {
+                if (OpenInfo[OpenInfoIndex].AgentHandle == 
(*HandleBuffer)[ChildIndex]) {
+                  (*HandleType)[ChildIndex] |= HR_DEVICE_DRIVER;
+                }
               }
-              if (ControllerHandle != NULL && (*HandleBuffer)[HandleIndex] == 
ControllerHandle) {
-                if ((OpenInfo[OpenInfoIndex].Attributes & 
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) == 
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) {
-                  for (ChildIndex = 0; ChildIndex < *HandleCount; 
ChildIndex++) {
-                    if ((*HandleBuffer)[ChildIndex] == 
OpenInfo[OpenInfoIndex].ControllerHandle) {
-                      (*HandleType)[ChildIndex] |= (HR_DEVICE_HANDLE | 
HR_CHILD_HANDLE);
-                    }
-                  }
+            }
+            if ((OpenInfo[OpenInfoIndex].Attributes & 
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
+              for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {
+                if (OpenInfo[OpenInfoIndex].AgentHandle == 
(*HandleBuffer)[ChildIndex]) {
+                  (*HandleType)[ChildIndex] |= (HR_BUS_DRIVER | 
HR_DEVICE_DRIVER);
                 }
+                if (OpenInfo[OpenInfoIndex].ControllerHandle == 
(*HandleBuffer)[ChildIndex]) {
+                  (*HandleType)[ChildIndex] |= (HR_DEVICE_HANDLE | 
HR_CHILD_HANDLE);
+                }
               }
             }
-            if (DriverBindingHandle == NULL && 
OpenInfo[OpenInfoIndex].ControllerHandle == ControllerHandle) {
-              if ((OpenInfo[OpenInfoIndex].Attributes & 
EFI_OPEN_PROTOCOL_BY_DRIVER) == EFI_OPEN_PROTOCOL_BY_DRIVER) {
-                for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {
-                  if ((*HandleBuffer)[ChildIndex] == 
OpenInfo[OpenInfoIndex].AgentHandle) {
-                    (*HandleType)[ChildIndex] |= HR_DEVICE_DRIVER;
-                  }
+          }
+        } else {
+          for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; 
OpenInfoIndex++) {
+            if ((OpenInfo[OpenInfoIndex].Attributes & 
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
+              if (OpenInfo[OpenInfoIndex].ControllerHandle == 
ControllerHandle) {
+                (*HandleType)[HandleIndex] |= (HR_DEVICE_HANDLE | 
HR_PARENT_HANDLE);
+              }
+            }
+          }
+        }
+      }
+      if (DriverBindingHandle != NULL && ControllerHandle != NULL) {
+        if (ControllerHandle == (*HandleBuffer)[HandleIndex]) {
+          (*HandleType)[HandleIndex] |= (HR_DEVICE_HANDLE | 
HR_CONTROLLER_HANDLE);
+          for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; 
OpenInfoIndex++) {
+            if ((OpenInfo[OpenInfoIndex].Attributes & 
EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) {
+              if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle) {
+                if (DriverBindingHandleIndex != -1) {
+                  (*HandleType)[DriverBindingHandleIndex] |= HR_DEVICE_DRIVER;
                 }
               }
-              if ((OpenInfo[OpenInfoIndex].Attributes & 
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) == 
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) {
-                (*HandleType)[HandleIndex] |= HR_PARENT_HANDLE;
+            }
+            if ((OpenInfo[OpenInfoIndex].Attributes & 
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
+              if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle) {
                 for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {
-                  if ((*HandleBuffer)[ChildIndex] == 
OpenInfo[OpenInfoIndex].AgentHandle) {
-                    (*HandleType)[ChildIndex] |= HR_BUS_DRIVER;
+                  if (OpenInfo[OpenInfoIndex].ControllerHandle == 
(*HandleBuffer)[ChildIndex]) {
+                    (*HandleType)[ChildIndex] |= (HR_DEVICE_HANDLE | 
HR_CHILD_HANDLE);
                   }
                 }
               }
+
+              for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {
+                if (OpenInfo[OpenInfoIndex].AgentHandle == 
(*HandleBuffer)[ChildIndex]) {
+                  (*HandleType)[ChildIndex] |= (HR_BUS_DRIVER | 
HR_DEVICE_DRIVER);
+                }
+              }
             }
           }
-
-          FreePool (OpenInfo);
+        } else {
+          for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; 
OpenInfoIndex++) {
+            if ((OpenInfo[OpenInfoIndex].Attributes & 
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
+              if (OpenInfo[OpenInfoIndex].ControllerHandle == 
ControllerHandle) {
+                (*HandleType)[HandleIndex] |= (HR_DEVICE_HANDLE | 
HR_PARENT_HANDLE);
+              }
+            }
+          }
         }
       }
-
-      FreePool (ProtocolGuidArray);
+      FreePool (OpenInfo);
     }
+    FreePool (ProtocolGuidArray);
   }
-
-  if (EFI_ERROR(Status)) {
-    if (*HandleType != NULL) {
-      FreePool (*HandleType);
-    }
-    if (*HandleBuffer != NULL) {
-      FreePool (*HandleBuffer);
-    }
-
-    *HandleCount  = 0;
-    *HandleBuffer = NULL;
-    *HandleType   = NULL;
-  }
-
-  return Status;
+  return EFI_SUCCESS;
 }
 
 /**
@@ -1280,14 +1378,13 @@
   )
 {
   EFI_STATUS  Status;
-//  UINTN       HandleIndex;
+  UINTN       HandleIndex;
   UINTN       DriverBindingHandleCount;
   EFI_HANDLE  *DriverBindingHandleBuffer;
   UINTN       DriverBindingHandleIndex;
   UINTN       ChildControllerHandleCount;
   EFI_HANDLE  *ChildControllerHandleBuffer;
   UINTN       ChildControllerHandleIndex;
-//  BOOLEAN     Found;
   EFI_HANDLE  *HandleBufferForReturn;
 
   if (MatchingHandleCount == NULL) {
@@ -1307,7 +1404,7 @@
   //
   // Get a buffer big enough for all the controllers.
   //
-  HandleBufferForReturn = GetHandleListByProtocol(&gEfiDevicePathProtocolGuid);
+  HandleBufferForReturn = GetHandleListByProtocol(NULL);
   if (HandleBufferForReturn == NULL) {
     FreePool (DriverBindingHandleBuffer);
     return (EFI_NOT_FOUND);
@@ -1328,18 +1425,14 @@
          ChildControllerHandleIndex < ChildControllerHandleCount;
          ChildControllerHandleIndex++
        ) {
-//      Found = FALSE;
-      HandleBufferForReturn[(*MatchingHandleCount)++] = 
ChildControllerHandleBuffer[ChildControllerHandleIndex];
-//      for (HandleIndex = 0; HandleBufferForReturn[HandleIndex] != NULL; 
HandleIndex++) {
-//        if (HandleBufferForReturn[HandleIndex] == 
ChildControllerHandleBuffer[ChildControllerHandleIndex]) {
-//          Found = TRUE;
-//          break;
-//        }
-//      }
-
-//      if (Found) {
-//        HandleBufferForReturn[(*MatchingHandleCount)++] = 
ChildControllerHandleBuffer[ChildControllerHandleIndex];
-//      }
+      for (HandleIndex = 0; HandleIndex < *MatchingHandleCount; HandleIndex++) 
{
+        if (HandleBufferForReturn[HandleIndex] == 
ChildControllerHandleBuffer[ChildControllerHandleIndex]) {
+          break;
+        }
+      }
+      if (HandleIndex >= *MatchingHandleCount) {
+        HandleBufferForReturn[(*MatchingHandleCount)++] = 
ChildControllerHandleBuffer[ChildControllerHandleIndex];
+      }
     }
 
     FreePool (ChildControllerHandleBuffer);

Modified: 
branches/UDK2010.SR1/ShellPkg/Library/UefiShellDriver1CommandsLib/DevTree.c
===================================================================
--- branches/UDK2010.SR1/ShellPkg/Library/UefiShellDriver1CommandsLib/DevTree.c 
2013-01-05 01:34:13 UTC (rev 14031)
+++ branches/UDK2010.SR1/ShellPkg/Library/UefiShellDriver1CommandsLib/DevTree.c 
2013-01-05 02:32:19 UTC (rev 14032)
@@ -1,7 +1,7 @@
 /** @file
   Main file for DevTree shell Driver1 function.
 
-  Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
+  Copyright (c) 2010 - 2012, Intel Corporation. All rights reserved.<BR>
   This program and the accompanying materials
   are licensed and made available under the terms and conditions of the BSD 
License
   which accompanies this distribution.  The full text of the license may be 
found at
@@ -84,23 +84,6 @@
     return SHELL_SUCCESS;
   }
 
-  //
-  // If we are at the begining then we want root handles they have no parents 
and do have device path.
-  //
-  if (IndentCharCount == 0) {
-    Status = gBS->OpenProtocol (
-                  TheHandle,
-                  &gEfiDevicePathProtocolGuid,
-                  NULL,
-                  NULL,
-                  NULL,
-                  EFI_OPEN_PROTOCOL_TEST_PROTOCOL
-                 );
-    if (EFI_ERROR (Status)) {
-      return SHELL_SUCCESS;
-    }
-  }
-
   FormatString        = AllocateZeroPool(StrSize(HiiString) + 
(10)*sizeof(FormatString[0]));
 
   ASSERT(HiiString    != NULL);
@@ -169,6 +152,8 @@
   EFI_HANDLE          TheHandle;
   BOOLEAN             FlagD;
   UINT64              Intermediate;
+  UINTN               ParentControllerHandleCount;
+  EFI_HANDLE          *ParentControllerHandleBuffer;
 
   ShellStatus         = SHELL_SUCCESS;
   Status              = EFI_SUCCESS;
@@ -226,6 +211,39 @@
         if (TheHandle == NULL){
           break;
         }
+
+        //
+        // Skip handles that do not have device path protocol
+        //
+        Status = gBS->OpenProtocol (
+                      TheHandle,
+                      &gEfiDevicePathProtocolGuid,
+                      NULL,
+                      NULL,
+                      NULL,
+                      EFI_OPEN_PROTOCOL_TEST_PROTOCOL
+                     );
+        if (EFI_ERROR (Status)) {
+          continue;
+        }
+
+        //
+        // Skip handles that do have parents
+        //
+        ParentControllerHandleBuffer = NULL;
+        Status = PARSE_HANDLE_DATABASE_PARENTS (
+                   TheHandle,
+                   &ParentControllerHandleCount,
+                   &ParentControllerHandleBuffer
+                   );
+        SHELL_FREE_NON_NULL (ParentControllerHandleBuffer);
+        if (ParentControllerHandleCount > 0) {
+          continue;
+        }
+
+        //
+        // Start a devtree from TheHandle that has a device path and no parents
+        //
         ShellStatus = DoDevTreeForHandle(TheHandle, Language, FlagD, 0, 
HiiString);
       }
     } else {

Modified: branches/UDK2010.SR1/ShellPkg/Library/UefiShellDriver1CommandsLib/Dh.c
===================================================================
--- branches/UDK2010.SR1/ShellPkg/Library/UefiShellDriver1CommandsLib/Dh.c      
2013-01-05 01:34:13 UTC (rev 14031)
+++ branches/UDK2010.SR1/ShellPkg/Library/UefiShellDriver1CommandsLib/Dh.c      
2013-01-05 02:32:19 UTC (rev 14032)
@@ -1,7 +1,7 @@
 /** @file
   Main file for Dh shell Driver1 function.
 
-  Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
+  Copyright (c) 2010 - 2012, Intel Corporation. All rights reserved.<BR>
   This program and the accompanying materials
   are licensed and made available under the terms and conditions of the BSD 
License
   which accompanies this distribution.  The full text of the license may be 
found at
@@ -394,11 +394,14 @@
                   Language,
                   &DriverName
                   );
-        if (DriverName == NULL) {
+        if (EFI_ERROR (Status)) {
           Status = GetDriverImageName (
                     DriverBindingHandleBuffer[Index],
                     &DriverName
                     );
+          if (EFI_ERROR (Status)) {
+            DriverName = NULL;
+          }
         }
 
         if (Image) {
@@ -537,6 +540,9 @@
   }
 
   Status = GetDriverName (Handle, Language, &DriverName);
+  if (EFI_ERROR (Status)) {
+    DriverName = NULL;
+  }
 
   ShellPrintHiiEx(
     -1, 
@@ -548,11 +554,13 @@
     DriverName!=NULL?DriverName:L"<Unknown>"
     );
   SHELL_FREE_NON_NULL(DriverName);
-  DriverName = NULL;
   Status = GetDriverImageName (
             Handle,
             &DriverName
             );
+  if (EFI_ERROR (Status)) {
+    DriverName = NULL;
+  }
   ShellPrintHiiEx(
     -1, 
     -1, 

Modified: 
branches/UDK2010.SR1/ShellPkg/Library/UefiShellDriver1CommandsLib/Disconnect.c
===================================================================
--- 
branches/UDK2010.SR1/ShellPkg/Library/UefiShellDriver1CommandsLib/Disconnect.c  
    2013-01-05 01:34:13 UTC (rev 14031)
+++ 
branches/UDK2010.SR1/ShellPkg/Library/UefiShellDriver1CommandsLib/Disconnect.c  
    2013-01-05 02:32:19 UTC (rev 14032)
@@ -1,7 +1,7 @@
 /** @file
   Main file for Disconnect shell Driver1 function.
 
-  Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
+  Copyright (c) 2010 - 2012, Intel Corporation. All rights reserved.<BR>
   This program and the accompanying materials
   are licensed and made available under the terms and conditions of the BSD 
License
   which accompanies this distribution.  The full text of the license may be 
found at
@@ -163,10 +163,6 @@
         } else if (Param3 != NULL && Handle3 == NULL) {
           ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), 
gShellDriver1HiiHandle, Param3);
           ShellStatus = SHELL_INVALID_PARAMETER;
-        } else if (EFI_ERROR(gBS->OpenProtocol(Handle1, 
&gEfiDevicePathProtocolGuid, NULL, gImageHandle, NULL, 
EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {
-          ASSERT(Param1 != NULL);
-          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_HANDLE_NOT), 
gShellDriver1HiiHandle, ShellStrToUintn(Param1), L"controller handle");
-          ShellStatus = SHELL_INVALID_PARAMETER;
         } else if (Handle2 != NULL && EFI_ERROR(gBS->OpenProtocol(Handle2, 
&gEfiDriverBindingProtocolGuid, NULL, gImageHandle, NULL, 
EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {
           ASSERT(Param2 != NULL);
           ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_HANDLE_NOT), 
gShellDriver1HiiHandle, ShellStrToUintn(Param2), L"driver handle");

Modified: 
branches/UDK2010.SR1/ShellPkg/Library/UefiShellDriver1CommandsLib/OpenInfo.c
===================================================================
--- 
branches/UDK2010.SR1/ShellPkg/Library/UefiShellDriver1CommandsLib/OpenInfo.c    
    2013-01-05 01:34:13 UTC (rev 14031)
+++ 
branches/UDK2010.SR1/ShellPkg/Library/UefiShellDriver1CommandsLib/OpenInfo.c    
    2013-01-05 02:32:19 UTC (rev 14032)
@@ -48,6 +48,7 @@
   CHAR16                              *TempString;
   UINTN                               HandleIndex;
   CONST CHAR16                        *Name;
+  UINTN                               ControllerIndex;
 
   if (TheHandle == NULL) {
     return (EFI_INVALID_PARAMETER);
@@ -98,9 +99,10 @@
                                                         OpenTypeString = 
StringDriverEx;  break;
             default:                                    OpenTypeString = 
StringUnknown;   break;
           }
-          HandleIndex = 
ConvertHandleToHandleIndex(OpenInfo[OpenInfoIndex].AgentHandle);
-          Name        = 
GetStringNameFromHandle(OpenInfo[OpenInfoIndex].AgentHandle, "en");
-          if (OpenInfo[OpenInfoIndex].ControllerHandle!=NULL) {
+          HandleIndex     = 
ConvertHandleToHandleIndex(OpenInfo[OpenInfoIndex].AgentHandle);
+          Name            = 
GetStringNameFromHandle(OpenInfo[OpenInfoIndex].AgentHandle, "en");
+          ControllerIndex = 
ConvertHandleToHandleIndex(OpenInfo[OpenInfoIndex].ControllerHandle);
+          if (ControllerIndex != 0) {
             ShellPrintHiiEx(
               -1,
               -1,
@@ -108,7 +110,7 @@
               STRING_TOKEN(STR_OPENINFO_LINE),
               gShellDriver1HiiHandle,
               HandleIndex,
-              
ConvertHandleToHandleIndex(OpenInfo[OpenInfoIndex].ControllerHandle),
+              ControllerIndex,
               OpenInfo[OpenInfoIndex].OpenCount,
               OpenTypeString,
               Name

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Master Visual Studio, SharePoint, SQL, ASP.NET, C# 2012, HTML5, CSS,
MVC, Windows 8 Apps, JavaScript and much more. Keep your skills current
with LearnDevNow - 3,200 step-by-step video tutorials by Microsoft
MVPs and experts. SALE $99.99 this month only -- learn more at:
http://p.sf.net/sfu/learnmore_122912
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to