**/\r
\r
#include "UefiHandleParsingLib.h"\r
+#include "IndustryStandard/Acpi10.h"\r
\r
EFI_HANDLE mHandleParsingHiiHandle;\r
HANDLE_INDEX_LIST mHandleList = {{{NULL,NULL},0,0},0};\r
}\r
*/\r
\r
+/**\r
+ Function to dump information about PciRootBridgeIo.\r
+\r
+ This will allocate the return buffer from boot services pool.\r
+\r
+ @param[in] TheHandle The handle that has PciRootBridgeIo installed.\r
+ @param[in] Verbose TRUE for additional information, FALSE otherwise.\r
+\r
+ @retval A poitner to a string containing the information.\r
+**/\r
+CHAR16*\r
+EFIAPI\r
+PciRootBridgeIoDumpInformation(\r
+ IN CONST EFI_HANDLE TheHandle,\r
+ IN CONST BOOLEAN Verbose\r
+ )\r
+{\r
+ EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo;\r
+ EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Configuration;\r
+ UINT64 Supports;\r
+ UINT64 Attributes;\r
+ CHAR16 *Temp;\r
+ CHAR16 *Temp2;\r
+ CHAR16 *RetVal;\r
+ EFI_STATUS Status;\r
+\r
+ RetVal = NULL;\r
+\r
+ if (!Verbose) {\r
+ return (CatSPrint(NULL, L"PciRootBridgeIo"));\r
+ }\r
+\r
+ Status = gBS->HandleProtocol(\r
+ TheHandle,\r
+ &gEfiPciRootBridgeIoProtocolGuid,\r
+ (VOID**)&PciRootBridgeIo);\r
+\r
+ if (EFI_ERROR(Status)) {\r
+ return NULL;\r
+ }\r
+\r
+ Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_PH), NULL);\r
+ ASSERT (Temp != NULL);\r
+ Temp2 = CatSPrint(L"\r\n", Temp, PciRootBridgeIo->ParentHandle);\r
+ FreePool(Temp);\r
+ RetVal = Temp2;\r
+ Temp2 = NULL;\r
+ \r
+ Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_SEG), NULL);\r
+ ASSERT (Temp != NULL);\r
+ Temp2 = CatSPrint(RetVal, Temp, PciRootBridgeIo->SegmentNumber);\r
+ FreePool(Temp);\r
+ FreePool(RetVal);\r
+ RetVal = Temp2;\r
+ Temp2 = NULL;\r
+\r
+ Supports = 0;\r
+ Attributes = 0;\r
+ Status = PciRootBridgeIo->GetAttributes (PciRootBridgeIo, &Supports, &Attributes);\r
+ if (!EFI_ERROR(Status)) {\r
+ Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_ATT), NULL);\r
+ ASSERT (Temp != NULL); \r
+ Temp2 = CatSPrint(RetVal, Temp, Attributes);\r
+ FreePool(Temp);\r
+ FreePool(RetVal);\r
+ RetVal = Temp2;\r
+ Temp2 = NULL;\r
+ \r
+ Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_SUPPORTS), NULL);\r
+ ASSERT (Temp != NULL);\r
+ Temp2 = CatSPrint(RetVal, Temp, Supports);\r
+ FreePool(Temp);\r
+ FreePool(RetVal);\r
+ RetVal = Temp2;\r
+ Temp2 = NULL;\r
+ }\r
+\r
+ Configuration = NULL;\r
+ Status = PciRootBridgeIo->Configuration (PciRootBridgeIo, (VOID **) &Configuration);\r
+ if (!EFI_ERROR(Status) && Configuration != NULL) {\r
+ Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_TITLE), NULL);\r
+ ASSERT (Temp != NULL);\r
+ Temp2 = CatSPrint(RetVal, Temp, Supports);\r
+ FreePool(Temp);\r
+ FreePool(RetVal);\r
+ RetVal = Temp2;\r
+ Temp2 = NULL;\r
+ while (Configuration->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR) {\r
+ Temp = NULL;\r
+ switch (Configuration->ResType) {\r
+ case ACPI_ADDRESS_SPACE_TYPE_MEM:\r
+ Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_MEM), NULL);\r
+ break;\r
+ case ACPI_ADDRESS_SPACE_TYPE_IO:\r
+ Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_IO), NULL);\r
+ break;\r
+ case ACPI_ADDRESS_SPACE_TYPE_BUS:\r
+ Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_PCIRB_DUMP_BUS), NULL);\r
+ break;\r
+ }\r
+ if (Temp != NULL) {\r
+ Temp2 = CatSPrint(RetVal, L"%s", Temp);\r
+ FreePool(Temp);\r
+ FreePool(RetVal);\r
+ RetVal = Temp2;\r
+ Temp2 = NULL;\r
+ }\r
+\r
+ Temp2 = CatSPrint(RetVal, \r
+ L"%H%02x %016lx %016lx %02x%N\r\n",\r
+ Configuration->SpecificFlag,\r
+ Configuration->AddrRangeMin,\r
+ Configuration->AddrRangeMax,\r
+ Configuration->AddrSpaceGranularity\r
+ );\r
+ FreePool(RetVal);\r
+ RetVal = Temp2;\r
+ Temp2 = NULL;\r
+ Configuration++;\r
+ }\r
+ }\r
+ return (RetVal);\r
+}\r
+\r
/**\r
Function to dump information about SimpleTextOut.\r
\r
Temp == NULL?L"":Temp,\r
Index == Dev->Mode->Mode ? L'*' : L' ',\r
Index,\r
- !EFI_ERROR(Status)?Col:-1,\r
- !EFI_ERROR(Status)?Row:-1\r
+ !EFI_ERROR(Status)?(INTN)Col:-1,\r
+ !EFI_ERROR(Status)?(INTN)Row:-1\r
);\r
}\r
FreePool(Temp);\r
CHAR16 *Temp;\r
CHAR16 *Temp2;\r
EFI_STATUS Status;\r
- EFI_DEVICE_PATH_TO_TEXT_PROTOCOL *DevPathToText;\r
Temp = NULL;\r
\r
- Status = gBS->LocateProtocol(&gEfiDevicePathToTextProtocolGuid, NULL, (VOID**)&DevPathToText);\r
+ Status = gBS->OpenProtocol(TheHandle, &gEfiDevicePathProtocolGuid, (VOID**)&DevPath, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
if (!EFI_ERROR(Status)) {\r
- Status = gBS->OpenProtocol(TheHandle, &gEfiDevicePathProtocolGuid, (VOID**)&DevPath, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
- if (!EFI_ERROR(Status)) {\r
- //\r
- // I cannot decide whether to allow shortcuts here (the second BOOLEAN on the next line)\r
- //\r
- Temp = DevPathToText->ConvertDevicePathToText(DevPath, TRUE, TRUE);\r
- gBS->CloseProtocol(TheHandle, &gEfiDevicePathProtocolGuid, gImageHandle, NULL);\r
- }\r
+ //\r
+ // I cannot decide whether to allow shortcuts here (the second BOOLEAN on the next line)\r
+ //\r
+ Temp = ConvertDevicePathToText(DevPath, TRUE, TRUE);\r
+ gBS->CloseProtocol(TheHandle, &gEfiDevicePathProtocolGuid, gImageHandle, NULL);\r
}\r
if (!Verbose && Temp != NULL && StrLen(Temp) > 30) {\r
Temp2 = NULL;\r
//\r
#define LOCAL_EFI_WIN_NT_THUNK_PROTOCOL_GUID \\r
{ \\r
- 0x58c518b1, 0x76f3, 0x11d4, 0xbc, 0xea, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 \\r
+ 0x58c518b1, 0x76f3, 0x11d4, { 0xbc, 0xea, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \\r
}\r
\r
#define LOCAL_EFI_WIN_NT_BUS_DRIVER_IO_PROTOCOL_GUID \\r
{ \\r
- 0x96eb4ad6, 0xa32a, 0x11d4, 0xbc, 0xfd, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 \\r
+ 0x96eb4ad6, 0xa32a, 0x11d4, { 0xbc, 0xfd, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \\r
}\r
\r
#define LOCAL_EFI_WIN_NT_SERIAL_PORT_GUID \\r
{ \\r
- 0xc95a93d, 0xa006, 0x11d4, 0xbc, 0xfa, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 \\r
+ 0xc95a93d, 0xa006, 0x11d4, { 0xbc, 0xfa, 0x0, 0x80, 0xc7, 0x3c, 0x88, 0x81 } \\r
}\r
STATIC CONST EFI_GUID WinNtThunkProtocolGuid = LOCAL_EFI_WIN_NT_THUNK_PROTOCOL_GUID;\r
STATIC CONST EFI_GUID WinNtIoProtocolGuid = LOCAL_EFI_WIN_NT_BUS_DRIVER_IO_PROTOCOL_GUID;\r
{STRING_TOKEN(STR_BLK_IO), &gEfiBlockIoProtocolGuid, NULL},\r
{STRING_TOKEN(STR_UC), &gEfiUnicodeCollationProtocolGuid, NULL},\r
{STRING_TOKEN(STR_UC2), &gEfiUnicodeCollation2ProtocolGuid, NULL},\r
- {STRING_TOKEN(STR_PCIRB_IO), &gEfiPciRootBridgeIoProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_PCIRB_IO), &gEfiPciRootBridgeIoProtocolGuid, PciRootBridgeIoDumpInformation},\r
{STRING_TOKEN(STR_PCI_IO), &gEfiPciIoProtocolGuid, NULL},\r
{STRING_TOKEN(STR_SCSI_PT), &gEfiScsiPassThruProtocolGuid, NULL},\r
{STRING_TOKEN(STR_SCSI_IO), &gEfiScsiIoProtocolGuid, NULL},\r
return (EFI_NOT_FOUND);\r
}\r
\r
+/**\r
+ Get best support language for this driver.\r
+ \r
+ First base on the current platform used language to search,Second base on the \r
+ default language to search. The caller need to free the buffer of the best \r
+ language.\r
+\r
+ @param[in] SupportedLanguages The support languages for this driver.\r
+ @param[in] Iso639Language Whether get language for ISO639.\r
+\r
+ @return The best support language for this driver.\r
+**/\r
+CHAR8 *\r
+GetBestLanguageForDriver (\r
+ IN CONST CHAR8 *SupportedLanguages, \r
+ IN BOOLEAN Iso639Language\r
+ )\r
+{\r
+ CHAR8 *LanguageVariable;\r
+ CHAR8 *BestLanguage;\r
+\r
+ LanguageVariable = GetVariable (Iso639Language ? L"Lang" : L"PlatformLang", &gEfiGlobalVariableGuid);\r
+\r
+ BestLanguage = GetBestLanguage(\r
+ SupportedLanguages,\r
+ Iso639Language,\r
+ (LanguageVariable != NULL) ? LanguageVariable : "",\r
+ Iso639Language ? "en" : "en-US",\r
+ NULL\r
+ );\r
+\r
+ if (LanguageVariable != NULL) {\r
+ FreePool (LanguageVariable);\r
+ }\r
+\r
+ return BestLanguage;\r
+}\r
+\r
/**\r
Function to retrieve the driver name (if possible) from the ComponentName or\r
ComponentName2 protocol\r
EFI_COMPONENT_NAME2_PROTOCOL *CompNameStruct;\r
EFI_STATUS Status;\r
CHAR16 *RetVal;\r
+ CHAR8 *BestLang;\r
+\r
+ BestLang = NULL;\r
\r
Status = gBS->OpenProtocol(\r
TheHandle,\r
NULL,\r
EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
if (!EFI_ERROR(Status)) {\r
+ if (Language == NULL) {\r
+ BestLang = GetBestLanguageForDriver (CompNameStruct->SupportedLanguages, FALSE);\r
+ Language = BestLang;\r
+ }\r
Status = CompNameStruct->GetDriverName(CompNameStruct, (CHAR8*)Language, &RetVal);\r
+\r
+ if (BestLang != NULL) {\r
+ FreePool (BestLang);\r
+ BestLang = NULL;\r
+ }\r
if (!EFI_ERROR(Status)) {\r
return (RetVal);\r
}\r
NULL,\r
EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
if (!EFI_ERROR(Status)) {\r
+ if (Language == NULL) {\r
+ BestLang = GetBestLanguageForDriver (CompNameStruct->SupportedLanguages, FALSE);\r
+ Language = BestLang;\r
+ }\r
Status = CompNameStruct->GetDriverName(CompNameStruct, (CHAR8*)Language, &RetVal);\r
+ \r
+ if (BestLang != NULL) {\r
+ FreePool (BestLang);\r
+ }\r
if (!EFI_ERROR(Status)) {\r
return (RetVal);\r
}\r
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
- }\r
- }\r
-\r
- if (EFI_ERROR(Status)) {\r
- if (*HandleType != NULL) {\r
- FreePool (*HandleType);\r
+ FreePool (OpenInfo);\r
}\r
- if (*HandleBuffer != NULL) {\r
- FreePool (*HandleBuffer);\r
- }\r
-\r
- *HandleCount = 0;\r
- *HandleBuffer = NULL;\r
- *HandleType = NULL;\r
+ FreePool (ProtocolGuidArray);\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