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
; 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
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
UINTN OpenInfoCount;\r
UINTN OpenInfoIndex;\r
UINTN ChildIndex;\r
+ INTN DriverBindingHandleIndex;\r
\r
ASSERT(HandleCount != NULL);\r
ASSERT(HandleBuffer != NULL);\r
*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
&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
)\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
//\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
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