]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c
Add missing parameter in functions header.
[mirror_edk2.git] / ShellPkg / Library / UefiHandleParsingLib / UefiHandleParsingLib.c
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