/** @file\r
Provides interface to advanced shell functionality for parsing both handle and protocol database.\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
**/\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
STATIC CONST EFI_GUID WinNtIoProtocolGuid = LOCAL_EFI_WIN_NT_BUS_DRIVER_IO_PROTOCOL_GUID;\r
STATIC CONST EFI_GUID WinNtSerialPortGuid = LOCAL_EFI_WIN_NT_SERIAL_PORT_GUID;\r
\r
-STATIC CONST PROTOCOL_INFO_BLOCK mGuidStringListNT[] = {\r
+STATIC CONST GUID_INFO_BLOCK mGuidStringListNT[] = {\r
{STRING_TOKEN(STR_WINNT_THUNK), (EFI_GUID*)&WinNtThunkProtocolGuid, NULL},\r
{STRING_TOKEN(STR_WINNT_DRIVER_IO), (EFI_GUID*)&WinNtIoProtocolGuid, NULL},\r
{STRING_TOKEN(STR_WINNT_SERIAL_PORT), (EFI_GUID*)&WinNtSerialPortGuid, NULL},\r
{STRING_TOKEN(STR_UNKNOWN_DEVICE), NULL, NULL},\r
};\r
\r
-STATIC CONST PROTOCOL_INFO_BLOCK mGuidStringList[] = {\r
+STATIC CONST GUID_INFO_BLOCK mGuidStringList[] = {\r
{STRING_TOKEN(STR_LOADED_IMAGE), &gEfiLoadedImageProtocolGuid, NULL},\r
{STRING_TOKEN(STR_DEVICE_PATH), &gEfiDevicePathProtocolGuid, DevicePathProtocolDumpInformation},\r
{STRING_TOKEN(STR_IMAGE_PATH), &gEfiLoadedImageDevicePathProtocolGuid, DevicePathProtocolDumpInformation},\r
{STRING_TOKEN(STR_LOAD_FILE), &gEfiLoadFileProtocolGuid, NULL},\r
{STRING_TOKEN(STR_LOAD_FILE2), &gEfiLoadFile2ProtocolGuid, NULL},\r
{STRING_TOKEN(STR_SIMPLE_FILE_SYS), &gEfiSimpleFileSystemProtocolGuid, NULL},\r
- {STRING_TOKEN(STR_FILE_INFO), &gEfiFileInfoGuid, NULL},\r
- {STRING_TOKEN(STR_FILE_SYS_INFO), &gEfiFileSystemInfoGuid, NULL},\r
{STRING_TOKEN(STR_TAPE_IO), &gEfiTapeIoProtocolGuid, NULL},\r
{STRING_TOKEN(STR_DISK_IO), &gEfiDiskIoProtocolGuid, NULL},\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
{STRING_TOKEN(STR_IPV4_CFG), &gEfiIp4ConfigProtocolGuid, NULL},\r
{STRING_TOKEN(STR_SHELL_PARAMETERS), &gEfiShellParametersProtocolGuid, NULL},\r
{STRING_TOKEN(STR_SHELL), &gEfiShellProtocolGuid, NULL},\r
- {STRING_TOKEN(STR_EFI_GLOBAL_VARIABLE), &gEfiGlobalVariableGuid, NULL},\r
{STRING_TOKEN(STR_UDPV4_SB), &gEfiUdp4ServiceBindingProtocolGuid, NULL},\r
{STRING_TOKEN(STR_UDPV4), &gEfiUdp4ProtocolGuid, NULL},\r
{STRING_TOKEN(STR_MTFTPV4_SB), &gEfiMtftp4ServiceBindingProtocolGuid, NULL},\r
{STRING_TOKEN(STR_HII_CONFIG_ROUT), &gEfiHiiConfigRoutingProtocolGuid, NULL},\r
{STRING_TOKEN(STR_HII_CONFIG_ACC), &gEfiHiiConfigAccessProtocolGuid, NULL},\r
{STRING_TOKEN(STR_HII_FORM_BROWSER2), &gEfiFormBrowser2ProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_DRIVER_FAM_OVERRIDE), &gEfiDriverFamilyOverrideProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_PCD), &gPcdProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_TCG), &gEfiTcgProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_HII_PACKAGE_LIST), &gEfiHiiPackageListProtocolGuid, NULL},\r
+\r
+//\r
+// the ones under this are deprecated by the current UEFI Spec, but may be found anyways...\r
+//\r
{STRING_TOKEN(STR_SHELL_INTERFACE), &gEfiShellInterfaceGuid, NULL},\r
{STRING_TOKEN(STR_SHELL_ENV2), &gEfiShellEnvironment2Guid, NULL},\r
{STRING_TOKEN(STR_SHELL_ENV), &gEfiShellEnvironment2Guid, NULL},\r
{STRING_TOKEN(STR_GPT_NBR), &gEfiPartTypeLegacyMbrGuid, NULL},\r
{STRING_TOKEN(STR_DRIVER_CONFIG), &gEfiDriverConfigurationProtocolGuid, NULL},\r
{STRING_TOKEN(STR_DRIVER_CONFIG2), &gEfiDriverConfiguration2ProtocolGuid, NULL},\r
+\r
+//\r
+// the ones under this are GUID identified structs, not protocols\r
+//\r
+ {STRING_TOKEN(STR_FILE_INFO), &gEfiFileInfoGuid, NULL},\r
+ {STRING_TOKEN(STR_FILE_SYS_INFO), &gEfiFileSystemInfoGuid, NULL},\r
+\r
+//\r
+// the ones under this are misc GUIDS.\r
+//\r
+ {STRING_TOKEN(STR_EFI_GLOBAL_VARIABLE), &gEfiGlobalVariableGuid, NULL},\r
+\r
+//\r
+// UEFI 2.2\r
+//\r
+ {STRING_TOKEN(STR_IP6_SB), &gEfiIp6ServiceBindingProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_IP6), &gEfiIp6ProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_IP6_CONFIG), &gEfiIp6ConfigProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_MTFTP6_SB), &gEfiMtftp6ServiceBindingProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_MTFTP6), &gEfiMtftp6ProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_DHCP6_SB), &gEfiDhcp6ServiceBindingProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_DHCP6), &gEfiDhcp6ProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_UDP6_SB), &gEfiUdp6ServiceBindingProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_UDP6), &gEfiUdp6ProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_TCP6_SB), &gEfiTcp6ServiceBindingProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_TCP6), &gEfiTcp6ProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_VLAN_CONFIG), &gEfiVlanConfigProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_EAP), &gEfiEapProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_EAP_MGMT), &gEfiEapManagementProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_FTP4_SB), &gEfiFtp4ServiceBindingProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_FTP4), &gEfiFtp4ProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_IP_SEC_CONFIG), &gEfiIpSecConfigProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_DH), &gEfiDriverHealthProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_DEF_IMG_LOAD), &gEfiDeferredImageLoadProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_USER_CRED), &gEfiUserCredentialProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_USER_MNGR), &gEfiUserManagerProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_ATA_PASS_THRU), &gEfiAtaPassThruProtocolGuid, NULL},\r
+\r
+//\r
+// UEFI 2.3\r
+//\r
+ {STRING_TOKEN(STR_FW_MGMT), &gEfiFirmwareManagementProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_IP_SEC), &gEfiIpSecProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_IP_SEC2), &gEfiIpSec2ProtocolGuid, NULL},\r
+\r
+//\r
+// UEFI 2.3.1\r
+//\r
+ {STRING_TOKEN(STR_KMS), &gEfiKmsProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_BLK_IO2), &gEfiBlockIo2ProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_SSC), &gEfiStorageSecurityCommandProtocolGuid, NULL},\r
+ {STRING_TOKEN(STR_UC2), &gEfiUserCredential2ProtocolGuid, NULL},\r
+\r
+//\r
+// terminator\r
+//\r
{STRING_TOKEN(STR_UNKNOWN_DEVICE), NULL, NULL},\r
};\r
\r
\r
@return The node.\r
**/\r
-CONST PROTOCOL_INFO_BLOCK *\r
+CONST GUID_INFO_BLOCK *\r
EFIAPI\r
InternalShellGetNodeFromGuid(\r
IN CONST EFI_GUID* Guid\r
)\r
{\r
- CONST PROTOCOL_INFO_BLOCK *ListWalker;\r
+ CONST GUID_INFO_BLOCK *ListWalker;\r
\r
ASSERT(Guid != NULL);\r
\r
IN CONST CHAR8 *Lang OPTIONAL\r
)\r
{\r
- CONST PROTOCOL_INFO_BLOCK *Id;\r
+ CONST GUID_INFO_BLOCK *Id;\r
\r
Id = InternalShellGetNodeFromGuid(Guid);\r
return (HiiGetString(mHandleParsingHiiHandle, Id->StringId, Lang));\r
IN CONST BOOLEAN Verbose\r
)\r
{\r
- CONST PROTOCOL_INFO_BLOCK *Id;\r
+ CONST GUID_INFO_BLOCK *Id;\r
\r
ASSERT(TheHandle != NULL);\r
ASSERT(Guid != NULL);\r
IN EFI_GUID **Guid\r
)\r
{\r
- CONST PROTOCOL_INFO_BLOCK *ListWalker;\r
+ CONST GUID_INFO_BLOCK *ListWalker;\r
CHAR16 *String;\r
\r
ASSERT(Guid != 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
+ 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