/** Get information for a handle. @param[in] TheHandle The handles to show info on. @param[in] Language Language string per UEFI specification. @param[in] Separator Separator string between information blocks. @param[in] Verbose TRUE for extra info, FALSE otherwise. @param[in] ExtraInfo TRUE for extra info, FALSE otherwise. @retval SHELL_SUCCESS The operation was successful. @retval SHELL_INVALID_PARAMETER ProtocolName was NULL or invalid. **/ CHAR16* GetProtocolInfoString( IN CONST EFI_HANDLE TheHandle, IN CONST CHAR8 *Language, IN CONST CHAR16 *Separator, IN CONST BOOLEAN Verbose, IN CONST BOOLEAN ExtraInfo ) { EFI_GUID **ProtocolGuidArray; UINTN ArrayCount; UINTN ProtocolIndex; EFI_STATUS Status; CHAR16 *RetVal; UINTN Size; CHAR16 *Temp; CHAR16 GuidStr[40]; ProtocolGuidArray = NULL; RetVal = NULL; Size = 0; Status = gBS->ProtocolsPerHandle ( TheHandle, &ProtocolGuidArray, &ArrayCount ); if (!EFI_ERROR (Status)) { for (ProtocolIndex = 0; ProtocolIndex < ArrayCount; ProtocolIndex++) { Temp = GetStringNameFromGuid(ProtocolGuidArray[ProtocolIndex], Language); ASSERT((RetVal == NULL && Size == 0) || (RetVal != NULL)); if (Size != 0) { StrnCatGrow(&RetVal, &Size, Separator, 0); } StrnCatGrow(&RetVal, &Size, L"%H", 0); if (Temp == NULL) { UnicodeSPrint (GuidStr, sizeof (GuidStr), L"%g", ProtocolGuidArray[ProtocolIndex]); StrnCatGrow (&RetVal, &Size, GuidStr, 0); } else { StrnCatGrow(&RetVal, &Size, Temp, 0); FreePool(Temp); } StrnCatGrow(&RetVal, &Size, L"%N", 0); if (ExtraInfo) { Temp = GetProtocolInformationDump(TheHandle, ProtocolGuidArray[ProtocolIndex], Verbose); if (Temp != NULL) { ASSERT((RetVal == NULL && Size == 0) || (RetVal != NULL)); if (!Verbose) { StrnCatGrow(&RetVal, &Size, L"(", 0); StrnCatGrow(&RetVal, &Size, Temp, 0); StrnCatGrow(&RetVal, &Size, L")\r\n", 0); } else { StrnCatGrow(&RetVal, &Size, Separator, 0); StrnCatGrow(&RetVal, &Size, Temp, 0); } FreePool(Temp); } } } } SHELL_FREE_NON_NULL(ProtocolGuidArray); if (RetVal == NULL) { return (NULL); } ASSERT((RetVal == NULL && Size == 0) || (RetVal != NULL)); StrnCatGrow(&RetVal, &Size, Separator, 0); return (RetVal); }
/** Open the database and print out all the info about TheHandle. @param[in] TheHandle The handle to print info on. @retval EFI_SUCCESS The operation was successful. @retval EFI_INVALID_PARAMETER TheHandle was NULL. **/ EFI_STATUS TraverseHandleDatabase ( IN CONST EFI_HANDLE TheHandle ) { EFI_STATUS Status; EFI_GUID **ProtocolGuidArray; UINTN ArrayCount; UINTN ProtocolIndex; EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfo; UINTN OpenInfoCount; UINTN OpenInfoIndex; CONST CHAR16 *OpenTypeString; CHAR16 *TempString; UINTN HandleIndex; CONST CHAR16 *Name; UINTN ControllerIndex; if (TheHandle == NULL) { return (EFI_INVALID_PARAMETER); } // // Retrieve the list of all the protocols on the handle // Status = gBS->ProtocolsPerHandle ( TheHandle, &ProtocolGuidArray, &ArrayCount ); ASSERT_EFI_ERROR(Status); if (!EFI_ERROR (Status)) { for (ProtocolIndex = 0; ProtocolIndex < ArrayCount; ProtocolIndex++) { // // print out the human readable name for this one. // TempString = GetStringNameFromGuid(ProtocolGuidArray[ProtocolIndex], NULL); if (TempString == NULL) { continue; } ShellPrintEx(-1, -1, L"%H%s%N\r\n", TempString); FreePool(TempString); // // Retrieve the list of agents that have opened each protocol // Status = gBS->OpenProtocolInformation ( TheHandle, ProtocolGuidArray[ProtocolIndex], &OpenInfo, &OpenInfoCount ); ASSERT_EFI_ERROR(Status); if (!EFI_ERROR (Status)) { for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) { switch (OpenInfo[OpenInfoIndex].Attributes) { case EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL: OpenTypeString = StringHandProt; break; case EFI_OPEN_PROTOCOL_GET_PROTOCOL: OpenTypeString = StringGetProt; break; case EFI_OPEN_PROTOCOL_TEST_PROTOCOL: OpenTypeString = StringTestProt; break; case EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER: OpenTypeString = StringChild; break; case EFI_OPEN_PROTOCOL_BY_DRIVER: OpenTypeString = StringDriver; break; case EFI_OPEN_PROTOCOL_EXCLUSIVE: OpenTypeString = StringExclusive; break; case EFI_OPEN_PROTOCOL_BY_DRIVER|EFI_OPEN_PROTOCOL_EXCLUSIVE: OpenTypeString = StringDriverEx; break; default: OpenTypeString = StringUnknown; break; } HandleIndex = ConvertHandleToHandleIndex(OpenInfo[OpenInfoIndex].AgentHandle); Name = GetStringNameFromHandle(OpenInfo[OpenInfoIndex].AgentHandle, NULL); ControllerIndex = ConvertHandleToHandleIndex(OpenInfo[OpenInfoIndex].ControllerHandle); if (ControllerIndex != 0) { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN(STR_OPENINFO_LINE), gShellDriver1HiiHandle, HandleIndex, ControllerIndex, OpenInfo[OpenInfoIndex].OpenCount, OpenTypeString, Name ); } else { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN(STR_OPENINFO_MIN_LINE), gShellDriver1HiiHandle, HandleIndex, OpenInfo[OpenInfoIndex].OpenCount, OpenTypeString, Name ); } } FreePool (OpenInfo); } } FreePool (ProtocolGuidArray); } return Status; }