/** 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; }
/** Function for 'drivers' command. @param[in] ImageHandle Handle to the Image (NULL if Internal). @param[in] SystemTable Pointer to the System Table (NULL if Internal). **/ SHELL_STATUS EFIAPI ShellCommandRunDrivers ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_STATUS Status; LIST_ENTRY *Package; CHAR16 *ProblemParam; SHELL_STATUS ShellStatus; CHAR8 *Language; CONST CHAR16 *Lang; EFI_HANDLE *HandleList; EFI_HANDLE *HandleWalker; UINTN ChildCount; UINTN DeviceCount; CHAR16 *Temp2; CHAR16 *FormatString; UINT32 DriverVersion; BOOLEAN DriverConfig; BOOLEAN DriverDiag; ShellStatus = SHELL_SUCCESS; Status = EFI_SUCCESS; Language = NULL; FormatString = NULL; // // initialize the shell lib (we must be in non-auto-init...) // Status = ShellInitialize(); ASSERT_EFI_ERROR(Status); Status = CommandInit(); ASSERT_EFI_ERROR(Status); // // parse the command line // Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR(Status)) { if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, ProblemParam); FreePool(ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { ASSERT(FALSE); } } else { if (ShellCommandLineGetCount(Package) > 1) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle); ShellStatus = SHELL_INVALID_PARAMETER; } else { Lang = ShellCommandLineGetValue(Package, L"-l"); if (Lang != NULL) { Language = AllocateZeroPool(StrSize(Lang)); AsciiSPrint(Language, StrSize(Lang), "%S", Lang); } else if (!ShellCommandLineGetFlag(Package, L"-l")){ ASSERT(Language == NULL); // Language = AllocateZeroPool(10); // AsciiSPrint(Language, 10, "en-us"); } else { ASSERT(Language == NULL); ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"-l"); ShellCommandLineFreeVarList (Package); return (SHELL_INVALID_PARAMETER); } if (ShellCommandLineGetFlag(Package, L"-sfo")) { FormatString = HiiGetString(gShellDriver1HiiHandle, STRING_TOKEN(STR_DRIVERS_ITEM_LINE_SFO), Language); } else { FormatString = HiiGetString(gShellDriver1HiiHandle, STRING_TOKEN(STR_DRIVERS_ITEM_LINE), Language); // // print the header row // ShellPrintHiiEx( -1, -1, Language, STRING_TOKEN(STR_DRIVERS_HEADER_LINES), gShellDriver1HiiHandle); } HandleList = GetHandleListByProtocol(&gEfiDriverBindingProtocolGuid); for (HandleWalker = HandleList ; HandleWalker != NULL && *HandleWalker != NULL ; HandleWalker++){ ChildCount = 0; DeviceCount = 0; Status = ParseHandleDatabaseForChildDevices (*HandleWalker, &ChildCount , NULL); Status = PARSE_HANDLE_DATABASE_DEVICES (*HandleWalker, &DeviceCount, NULL); Temp2 = GetDevicePathTextForHandle(*HandleWalker); DriverVersion = ReturnDriverVersion(*HandleWalker); DriverConfig = ReturnDriverConfig(*HandleWalker); DriverDiag = ReturnDriverDiag (*HandleWalker); Lang = GetStringNameFromHandle(*HandleWalker, Language==NULL?"en":Language); ShellPrintEx( -1, -1, FormatString, ConvertHandleToHandleIndex(*HandleWalker), DriverVersion, ChildCount > 0?L'B':(DeviceCount > 0?L'D':L'?'), DriverConfig?L'Y':L'N', DriverDiag?L'Y':L'N', DeviceCount, ChildCount, Lang, Temp2==NULL?L"":Temp2 ); if (Temp2 != NULL) { FreePool(Temp2); } } } SHELL_FREE_NON_NULL(Language); ShellCommandLineFreeVarList (Package); SHELL_FREE_NON_NULL(FormatString); } return (ShellStatus); }