/** Function to print out configuration information on all configurable handles. @param[in] ChildrenToo TRUE to tewst for children. @param[in] Language ASCII string for language code. @param[in] UseHii TRUE to check for Hii and DPC, FALSE for DCP only. @retval SHELL_SUCCESS The operation was successful. **/ SHELL_STATUS EFIAPI PrintConfigInfoOnAll( IN CONST BOOLEAN ChildrenToo, IN CONST CHAR8 *Language, IN CONST BOOLEAN UseHii ) { EFI_HANDLE *HandleList; EFI_HANDLE *CurrentHandle; BOOLEAN Found; UINTN Index2; Found = FALSE; HandleList = NULL; CurrentHandle = NULL; if (UseHii) { // // HII method // HandleList = GetHandleListByProtocol(&gEfiHiiConfigAccessProtocolGuid); for (CurrentHandle = HandleList ; CurrentHandle != NULL && *CurrentHandle != NULL; CurrentHandle++){ Found = TRUE; Index2 = *CurrentHandle == NULL ? 0 : ConvertHandleToHandleIndex(*CurrentHandle); ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_DRVCFG_LINE_HII), gShellDriver1HiiHandle, Index2 ); } SHELL_FREE_NON_NULL(HandleList); } if (PreHiiDrvCfg ( Language, FALSE, 0, ChildrenToo, FALSE, FALSE, 0, 0, 0) == SHELL_SUCCESS) { Found = TRUE; } if (!Found) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DRVCFG_NONE), gShellDriver1HiiHandle); return (SHELL_SUCCESS); } return (SHELL_SUCCESS); }
/** Do the configuration in an environment without HII. @param[in] Language The language code. @param[in] ForceDefaults TRUE to force defaults, FALSE otherwise. @param[in] DefaultType If ForceDefaults is TRUE, specifies the default type. @param[in] AllChildren TRUE to configure all children, FALSE otherwise. @param[in] ValidateOptions TRUE to validate existing options, FALSE otherwise. @param[in] SetOptions TRUE to set options, FALSE otherwise. @param[in] DriverImageHandle The handle for the driver to configure. @param[in] DeviceHandle The handle of the device being managed by the Driver specified. @param[in] ChildHandle The handle of a child device of the specified device. @retval SHELL_NOT_FOUND A specified handle could not be found. @retval SHELL_INVALID_PARAMETER A parameter has a invalid value. **/ SHELL_STATUS EFIAPI PreHiiDrvCfg ( IN CONST CHAR8 *Language, IN BOOLEAN ForceDefaults, IN UINT32 DefaultType, IN BOOLEAN AllChildren, IN BOOLEAN ValidateOptions, IN BOOLEAN SetOptions, IN EFI_HANDLE DriverImageHandle, IN EFI_HANDLE DeviceHandle, IN EFI_HANDLE ChildHandle ) { EFI_STATUS Status; SHELL_STATUS ShellStatus; UINTN OuterLoopCounter; CHAR8 *BestLanguage; UINTN DriverImageHandleCount; EFI_HANDLE *DriverImageHandleBuffer; UINTN HandleCount; EFI_HANDLE *HandleBuffer; UINTN *HandleType; UINTN LoopCounter; UINTN ChildIndex; UINTN ChildHandleCount; EFI_HANDLE *ChildHandleBuffer; UINTN *ChildHandleType; EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED ActionRequired; EFI_DRIVER_CONFIGURATION_PROTOCOL *DriverConfiguration; BOOLEAN Iso639Language; UINTN HandleIndex1; UINTN HandleIndex2; UINTN HandleIndex3; ShellStatus = SHELL_SUCCESS; if (ChildHandle == NULL && AllChildren) { SetOptions = FALSE; } if (ForceDefaults) { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_DRVCFG_FORCE_D), gShellDriver1HiiHandle, DefaultType); } else if (ValidateOptions) { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_DRVCFG_VALIDATE), gShellDriver1HiiHandle); } else if (SetOptions) { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_DRVCFG_SET), gShellDriver1HiiHandle); } if (DriverImageHandle == 0) { DriverImageHandleBuffer = GetHandleListByProtocolList(CfgGuidList); if (DriverImageHandleBuffer == NULL) { ShellStatus = SHELL_NOT_FOUND; goto Done; } for ( HandleBuffer = DriverImageHandleBuffer, DriverImageHandleCount = 0 ; HandleBuffer != NULL && *HandleBuffer != NULL ; HandleBuffer++,DriverImageHandleCount++); } else { DriverImageHandleCount = 1; // // Allocate buffer to hold the image handle so as to // keep consistent with the above clause // DriverImageHandleBuffer = AllocatePool (sizeof (EFI_HANDLE)); ASSERT (DriverImageHandleBuffer); DriverImageHandleBuffer[0] = DriverImageHandle; } for (OuterLoopCounter = 0; OuterLoopCounter < DriverImageHandleCount; OuterLoopCounter++) { Iso639Language = FALSE; Status = gBS->OpenProtocol ( DriverImageHandleBuffer[OuterLoopCounter], &gEfiDriverConfiguration2ProtocolGuid, (VOID **) &DriverConfiguration, NULL, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL ); if (EFI_ERROR (Status)) { Iso639Language = TRUE; Status = gBS->OpenProtocol ( DriverImageHandleBuffer[OuterLoopCounter], &gEfiDriverConfigurationProtocolGuid, (VOID **) &DriverConfiguration, NULL, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL ); } if (EFI_ERROR (Status)) { // ShellPrintHiiEx( // -1, // -1, // NULL, // STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT), // gShellDriver1HiiHandle, // ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]) // ); ShellStatus = SHELL_UNSUPPORTED; continue; } BestLanguage = GetBestLanguage ( DriverConfiguration->SupportedLanguages, Iso639Language, Language!=NULL?Language:"", DriverConfiguration->SupportedLanguages, NULL ); if (BestLanguage == NULL) { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellDriver1HiiHandle, L"-l" ); ShellStatus = SHELL_INVALID_PARAMETER; continue; } Status = ParseHandleDatabaseByRelationshipWithType ( DriverImageHandleBuffer[OuterLoopCounter], NULL, &HandleCount, &HandleBuffer, &HandleType ); if (EFI_ERROR (Status)) { continue; } if (SetOptions && DeviceHandle == NULL) { gST->ConOut->ClearScreen (gST->ConOut); Status = DriverConfiguration->SetOptions ( DriverConfiguration, NULL, NULL, BestLanguage, &ActionRequired ); gST->ConOut->ClearScreen (gST->ConOut); ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_DRVCFG_ALL_LANG), gShellDriver1HiiHandle, ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]), DriverConfiguration->SupportedLanguages ); if (!EFI_ERROR (Status)) { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_DRVCFG_OPTIONS_SET), gShellDriver1HiiHandle); for (LoopCounter = 0; LoopCounter < HandleCount; LoopCounter++) { if ((HandleType[LoopCounter] & HR_CONTROLLER_HANDLE) == HR_CONTROLLER_HANDLE) { ShellCmdDriverConfigurationProcessActionRequired ( DriverImageHandleBuffer[OuterLoopCounter], HandleBuffer[LoopCounter], NULL, ActionRequired ); } } } else { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_DRVCFG_NOT_SET), gShellDriver1HiiHandle, Status); } continue; } for (LoopCounter = 0; LoopCounter < HandleCount; LoopCounter++) { if ((HandleType[LoopCounter] & HR_CONTROLLER_HANDLE) != HR_CONTROLLER_HANDLE) { continue; } if (DeviceHandle != NULL && DeviceHandle != HandleBuffer[LoopCounter]) { continue; } if (ChildHandle == NULL) { HandleIndex1 = ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]); HandleIndex2 = ConvertHandleToHandleIndex (HandleBuffer[LoopCounter]); ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_DRVCFG_CTRL_LANG), gShellDriver1HiiHandle, HandleIndex1, HandleIndex2, DriverConfiguration->SupportedLanguages ); if (ForceDefaults) { Status = DriverConfiguration->ForceDefaults ( DriverConfiguration, HandleBuffer[LoopCounter], NULL, DefaultType, &ActionRequired ); if (!EFI_ERROR (Status)) { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_DRVCFG_DEF_FORCED), gShellDriver1HiiHandle); ShellCmdDriverConfigurationProcessActionRequired ( DriverImageHandleBuffer[OuterLoopCounter], HandleBuffer[LoopCounter], NULL, ActionRequired ); } else { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_DRVCFG_FORCE_FAILED), gShellDriver1HiiHandle, Status); ShellStatus = SHELL_DEVICE_ERROR; } } else if (ValidateOptions) { Status = DriverConfiguration->OptionsValid ( DriverConfiguration, HandleBuffer[LoopCounter], NULL ); if (!EFI_ERROR (Status)) { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID), gShellDriver1HiiHandle); } else { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_DRVCFG_OPTIONS_INV), gShellDriver1HiiHandle, Status); ShellStatus = SHELL_DEVICE_ERROR; } } else if (SetOptions) { gST->ConOut->ClearScreen (gST->ConOut); Status = DriverConfiguration->SetOptions ( DriverConfiguration, HandleBuffer[LoopCounter], NULL, BestLanguage, &ActionRequired ); gST->ConOut->ClearScreen (gST->ConOut); HandleIndex1 = ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]); HandleIndex2 = ConvertHandleToHandleIndex (HandleBuffer[LoopCounter]); ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_DRVCFG_CTRL_LANG), gShellDriver1HiiHandle, HandleIndex1, HandleIndex2, DriverConfiguration->SupportedLanguages ); if (!EFI_ERROR (Status)) { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_DRVCFG_OPTIONS_SET), gShellDriver1HiiHandle); ShellCmdDriverConfigurationProcessActionRequired ( DriverImageHandleBuffer[OuterLoopCounter], HandleBuffer[LoopCounter], NULL, ActionRequired ); } else { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_DRVCFG_NOT_SET), gShellDriver1HiiHandle, Status); ShellStatus = SHELL_DEVICE_ERROR; } } else { Print (L"\n"); } } if (ChildHandle == NULL && !AllChildren) { continue; } Status = ParseHandleDatabaseByRelationshipWithType ( DriverImageHandleBuffer[OuterLoopCounter], HandleBuffer[LoopCounter], &ChildHandleCount, &ChildHandleBuffer, &ChildHandleType ); if (EFI_ERROR (Status)) { continue; } for (ChildIndex = 0; ChildIndex < ChildHandleCount; ChildIndex++) { if ((ChildHandleType[ChildIndex] & HR_CHILD_HANDLE) != HR_CHILD_HANDLE) { continue; } if (ChildHandle != NULL && ChildHandle != ChildHandleBuffer[ChildIndex]) { continue; } HandleIndex1 = ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]); HandleIndex2 = ConvertHandleToHandleIndex (HandleBuffer[LoopCounter]); HandleIndex3 = ConvertHandleToHandleIndex (ChildHandleBuffer[ChildIndex]); ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_DRVCFG_CHILD_LANG), gShellDriver1HiiHandle, HandleIndex1, HandleIndex2, HandleIndex3, DriverConfiguration->SupportedLanguages); if (ForceDefaults) { Status = DriverConfiguration->ForceDefaults ( DriverConfiguration, HandleBuffer[LoopCounter], ChildHandleBuffer[ChildIndex], DefaultType, &ActionRequired ); if (!EFI_ERROR (Status)) { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_DRVCFG_DEF_FORCED), gShellDriver1HiiHandle); ShellCmdDriverConfigurationProcessActionRequired ( DriverImageHandleBuffer[OuterLoopCounter], HandleBuffer[LoopCounter], ChildHandleBuffer[ChildIndex], ActionRequired ); } else { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_DRVCFG_FORCE_FAILED), gShellDriver1HiiHandle, Status); ShellStatus = SHELL_DEVICE_ERROR; } } else if (ValidateOptions) { Status = DriverConfiguration->OptionsValid ( DriverConfiguration, HandleBuffer[LoopCounter], ChildHandleBuffer[ChildIndex] ); if (!EFI_ERROR (Status)) { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID), gShellDriver1HiiHandle); } else { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_DRVCFG_OPTIONS_INV), gShellDriver1HiiHandle, Status); ShellStatus = SHELL_DEVICE_ERROR; } } else if (SetOptions) { gST->ConOut->ClearScreen (gST->ConOut); Status = DriverConfiguration->SetOptions ( DriverConfiguration, HandleBuffer[LoopCounter], ChildHandleBuffer[ChildIndex], BestLanguage, &ActionRequired ); gST->ConOut->ClearScreen (gST->ConOut); HandleIndex1 = ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]); HandleIndex2 = ConvertHandleToHandleIndex (HandleBuffer[LoopCounter]); HandleIndex3 = ConvertHandleToHandleIndex (ChildHandleBuffer[ChildIndex]); ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_DRVCFG_CHILD_LANG), gShellDriver1HiiHandle, HandleIndex1, HandleIndex2, HandleIndex3, DriverConfiguration->SupportedLanguages ); if (!EFI_ERROR (Status)) { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_DRVCFG_OPTIONS_SET), gShellDriver1HiiHandle); ShellCmdDriverConfigurationProcessActionRequired ( DriverImageHandleBuffer[OuterLoopCounter], HandleBuffer[LoopCounter], ChildHandleBuffer[ChildIndex], ActionRequired ); } else { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_DRVCFG_NOT_SET), gShellDriver1HiiHandle, Status); ShellStatus = SHELL_DEVICE_ERROR; } } else { Print (L"\n"); } } FreePool (ChildHandleBuffer); FreePool (ChildHandleType); } FreePool (BestLanguage); FreePool (HandleBuffer); FreePool (HandleType); } if (DriverImageHandle != NULL && DriverImageHandleCount != 0) { FreePool (DriverImageHandleBuffer); } Done: return ShellStatus; }
/** Function to read in HII configuration information from a file. @param[in] Handle The handle to get info for. @param[in] FileName The filename to read the info from. **/ SHELL_STATUS EFIAPI ConfigFromFile( IN EFI_HANDLE Handle, IN CONST CHAR16 *FileName ) { EFI_HII_DATABASE_PROTOCOL *HiiDatabase; EFI_STATUS Status; VOID *MainBuffer; UINT64 Temp; UINTN MainBufferSize; EFI_HII_HANDLE HiiHandle; SHELL_FILE_HANDLE FileHandle; CHAR16 *TempDevPathString; EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader; EFI_HII_PACKAGE_HEADER *PackageHeader; EFI_DEVICE_PATH_PROTOCOL *DevPath; UINTN HandleIndex; HiiDatabase = NULL; MainBufferSize = 0; MainBuffer = NULL; FileHandle = NULL; Status = ShellOpenFileByName(FileName, &FileHandle, EFI_FILE_MODE_READ, 0); if (EFI_ERROR(Status)) { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN(STR_GEN_FILE_OPEN), gShellDriver1HiiHandle, FileName, Status); return (SHELL_DEVICE_ERROR); } // // Locate HII Database protocol // Status = gBS->LocateProtocol ( &gEfiHiiDatabaseProtocolGuid, NULL, (VOID **) &HiiDatabase ); if (EFI_ERROR(Status) || HiiDatabase == NULL) { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN(STR_GEN_PROTOCOL_NF), gShellDriver1HiiHandle, L"EfiHiiDatabaseProtocol", &gEfiHiiDatabaseProtocolGuid); ShellCloseFile(&FileHandle); return (SHELL_NOT_FOUND); } Status = ShellGetFileSize(FileHandle, &Temp); MainBufferSize = (UINTN)Temp; if (EFI_ERROR(Status)) { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN(STR_FILE_READ_FAIL), gShellDriver1HiiHandle, FileName, Status); ShellCloseFile(&FileHandle); return (SHELL_DEVICE_ERROR); } MainBuffer = AllocateZeroPool((UINTN)MainBufferSize); if (EFI_ERROR(Status)) { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN(STR_GEN_OUT_MEM), gShellDriver1HiiHandle); ShellCloseFile(&FileHandle); return (SHELL_DEVICE_ERROR); } Status = ShellReadFile(FileHandle, &MainBufferSize, MainBuffer); if (EFI_ERROR(Status)) { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN(STR_FILE_READ_FAIL), gShellDriver1HiiHandle, FileName, Status); ShellCloseFile(&FileHandle); SHELL_FREE_NON_NULL(MainBuffer); return (SHELL_DEVICE_ERROR); } ShellCloseFile(&FileHandle); if (Handle != NULL) { // // User override in place. Just do it. // HiiHandle = NULL; Status = ConvertHandleToHiiHandle(Handle, &HiiHandle, HiiDatabase); if (EFI_ERROR(Status)) { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN(STR_GEN_HANDLE_NOT), gShellDriver1HiiHandle, ConvertHandleToHandleIndex(Handle), L"Device"); ShellCloseFile(&FileHandle); return (SHELL_DEVICE_ERROR); } Status = HiiDatabase->UpdatePackageList(HiiDatabase, HiiHandle, MainBuffer); if (EFI_ERROR(Status)) { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN(STR_GEN_UEFI_FUNC_ERROR), gShellDriver1HiiHandle, L"HiiDatabase->UpdatePackageList", Status); return (SHELL_DEVICE_ERROR); } } else { // // we need to parse the buffer and try to match the device paths for each item to try to find it's device path. // for (PackageListHeader = (EFI_HII_PACKAGE_LIST_HEADER*)MainBuffer ; PackageListHeader != NULL && ((CHAR8*)PackageListHeader) < (((CHAR8*)MainBuffer)+MainBufferSize) ; PackageListHeader = (EFI_HII_PACKAGE_LIST_HEADER*)(((CHAR8*)(PackageListHeader)) + PackageListHeader->PackageLength )) { for (PackageHeader = (EFI_HII_PACKAGE_HEADER*)(((CHAR8*)(PackageListHeader))+sizeof(EFI_HII_PACKAGE_LIST_HEADER)) ; PackageHeader != NULL && ((CHAR8*)PackageHeader) < (((CHAR8*)MainBuffer)+MainBufferSize) && PackageHeader->Type != EFI_HII_PACKAGE_END ; PackageHeader = (EFI_HII_PACKAGE_HEADER*)(((CHAR8*)(PackageHeader))+PackageHeader->Length)) { if (PackageHeader->Type == EFI_HII_PACKAGE_DEVICE_PATH) { HiiHandle = NULL; Status = FindHiiHandleViaDevPath((EFI_DEVICE_PATH_PROTOCOL*)(((CHAR8*)PackageHeader) + sizeof(EFI_HII_PACKAGE_HEADER)), &HiiHandle, HiiDatabase); if (EFI_ERROR(Status)) { // // print out an error. // TempDevPathString = ConvertDevicePathToText((EFI_DEVICE_PATH_PROTOCOL*)(((CHAR8*)PackageHeader) + sizeof(EFI_HII_PACKAGE_HEADER)), TRUE, TRUE); ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN(STR_DRVCFG_IN_FILE_NF), gShellDriver1HiiHandle, TempDevPathString); SHELL_FREE_NON_NULL(TempDevPathString); } else { Status = HiiDatabase->UpdatePackageList(HiiDatabase, HiiHandle, PackageListHeader); if (EFI_ERROR(Status)) { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN(STR_GEN_UEFI_FUNC_ERROR), gShellDriver1HiiHandle, L"HiiDatabase->UpdatePackageList", Status); return (SHELL_DEVICE_ERROR); } else { DevPath = (EFI_DEVICE_PATH_PROTOCOL*)(((CHAR8*)PackageHeader) + sizeof(EFI_HII_PACKAGE_HEADER)); gBS->LocateDevicePath(&gEfiHiiConfigAccessProtocolGuid, &DevPath, &Handle); HandleIndex = ConvertHandleToHandleIndex(Handle); ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN(STR_DRVCFG_DONE_HII), gShellDriver1HiiHandle, HandleIndex); } } } } } } SHELL_FREE_NON_NULL(MainBuffer); ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN(STR_DRVCFG_COMP), gShellDriver1HiiHandle); return (SHELL_SUCCESS); }
/** Function to print out all HII configuration information to a file. @param[in] Handle The handle to get info on. NULL to do all handles. @param[in] FileName The filename to rwite the info to. **/ SHELL_STATUS EFIAPI ConfigToFile( IN CONST EFI_HANDLE Handle, IN CONST CHAR16 *FileName ) { EFI_HII_DATABASE_PROTOCOL *HiiDatabase; EFI_STATUS Status; VOID *MainBuffer; UINTN MainBufferSize; EFI_HII_HANDLE HiiHandle; SHELL_FILE_HANDLE FileHandle; HiiDatabase = NULL; MainBufferSize = 0; MainBuffer = NULL; FileHandle = NULL; Status = ShellOpenFileByName(FileName, &FileHandle, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE|EFI_FILE_MODE_CREATE, 0); if (EFI_ERROR(Status)) { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN(STR_GEN_FILE_OPEN), gShellDriver1HiiHandle, FileName, Status); return (SHELL_DEVICE_ERROR); } // // Locate HII Database protocol // Status = gBS->LocateProtocol ( &gEfiHiiDatabaseProtocolGuid, NULL, (VOID **) &HiiDatabase ); if (EFI_ERROR(Status) || HiiDatabase == NULL) { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN(STR_GEN_PROTOCOL_NF), gShellDriver1HiiHandle, L"EfiHiiDatabaseProtocol", &gEfiHiiDatabaseProtocolGuid); ShellCloseFile(&FileHandle); return (SHELL_NOT_FOUND); } Status = ConvertHandleToHiiHandle(Handle, &HiiHandle, HiiDatabase); if (EFI_ERROR(Status)) { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN(STR_GEN_HANDLE_NOT), gShellDriver1HiiHandle, ConvertHandleToHandleIndex(Handle), L"Device"); ShellCloseFile(&FileHandle); return (SHELL_DEVICE_ERROR); } Status = HiiDatabase->ExportPackageLists(HiiDatabase, HiiHandle, &MainBufferSize, MainBuffer); if (Status == EFI_BUFFER_TOO_SMALL) { MainBuffer = AllocateZeroPool(MainBufferSize); Status = HiiDatabase->ExportPackageLists(HiiDatabase, HiiHandle, &MainBufferSize, MainBuffer); } Status = ShellWriteFile(FileHandle, &MainBufferSize, MainBuffer); ShellCloseFile(&FileHandle); SHELL_FREE_NON_NULL(MainBuffer); if (EFI_ERROR(Status)) { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN(STR_FILE_WRITE_FAIL), gShellDriver1HiiHandle, FileName, Status); return (SHELL_DEVICE_ERROR); } ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN(STR_DRVCFG_COMP), gShellDriver1HiiHandle); return (SHELL_SUCCESS); }
/** Function for 'drvcfg' 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 ShellCommandRunDrvCfg ( 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; CONST CHAR16 *HandleIndex1; CONST CHAR16 *HandleIndex2; CONST CHAR16 *HandleIndex3; CONST CHAR16 *ForceTypeString; BOOLEAN Force; BOOLEAN Set; BOOLEAN Validate; BOOLEAN InFromFile; BOOLEAN OutToFile; BOOLEAN AllChildren; BOOLEAN UseHii; UINT32 ForceType; UINT64 Intermediate; EFI_HANDLE Handle1; EFI_HANDLE Handle2; EFI_HANDLE Handle3; CONST CHAR16 *FileName; ShellStatus = SHELL_SUCCESS; Status = EFI_SUCCESS; Language = NULL; UseHii = TRUE; // // 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 (ParamListHii, &Package, &ProblemParam, TRUE); if (EFI_ERROR(Status) || ShellCommandLineGetCount(Package) > 2) { UseHii = FALSE; if (Package != NULL) { ShellCommandLineFreeVarList (Package); } SHELL_FREE_NON_NULL(ProblemParam); Status = ShellCommandLineParse (ParamListPreHii, &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; goto Done; } else { ASSERT(FALSE); } } } if (ShellStatus == SHELL_SUCCESS) { Lang = ShellCommandLineGetValue(Package, L"-l"); if (Lang != NULL) { Language = AllocateZeroPool(StrSize(Lang)); AsciiSPrint(Language, StrSize(Lang), "%S", Lang); } else if (ShellCommandLineGetFlag(Package, L"-l")){ ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"-l"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } Set = ShellCommandLineGetFlag (Package, L"-s"); Validate = ShellCommandLineGetFlag (Package, L"-v"); InFromFile = ShellCommandLineGetFlag (Package, L"-i"); OutToFile = ShellCommandLineGetFlag (Package, L"-o"); AllChildren = ShellCommandLineGetFlag (Package, L"-c"); Force = ShellCommandLineGetFlag (Package, L"-f"); ForceTypeString = ShellCommandLineGetValue(Package, L"-f"); if (OutToFile) { FileName = ShellCommandLineGetValue(Package, L"-o"); } else if (InFromFile) { FileName = ShellCommandLineGetValue(Package, L"-i"); } else { FileName = NULL; } if (InFromFile && EFI_ERROR(ShellFileExists(FileName))) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FIND_FAIL), gShellDriver1HiiHandle, FileName); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } if (OutToFile && !EFI_ERROR(ShellFileExists(FileName))) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_EXIST), gShellDriver1HiiHandle, FileName); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } if (Force && ForceTypeString == NULL) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"-f"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } if (Force) { Status = ShellConvertStringToUint64(ForceTypeString, &Intermediate, FALSE, FALSE); if (EFI_ERROR(Status)) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellDriver1HiiHandle, L"-f"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } ForceType = (UINT32)Intermediate; } else { ForceType = 0; } HandleIndex1 = ShellCommandLineGetRawValue(Package, 1); Handle1 = NULL; if (HandleIndex1 != NULL && !EFI_ERROR(ShellConvertStringToUint64(HandleIndex1, &Intermediate, TRUE, FALSE))) { Handle1 = ConvertHandleIndexToHandle((UINTN)Intermediate); if (Handle1 == NULL || (UINT64)(UINTN)Intermediate != Intermediate) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, HandleIndex1); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } } HandleIndex2 = ShellCommandLineGetRawValue(Package, 2); Handle2 = NULL; if (HandleIndex2 != NULL && !EFI_ERROR(ShellConvertStringToUint64(HandleIndex2, &Intermediate, TRUE, FALSE))) { Handle2 = ConvertHandleIndexToHandle((UINTN)Intermediate); if (Handle2 == NULL || (UINT64)(UINTN)Intermediate != Intermediate) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, HandleIndex2); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } } HandleIndex3 = ShellCommandLineGetRawValue(Package, 3); Handle3 = NULL; if (HandleIndex3 != NULL && !EFI_ERROR(ShellConvertStringToUint64(HandleIndex3, &Intermediate, TRUE, FALSE))) { Handle3 = ConvertHandleIndexToHandle((UINTN)Intermediate); if (Handle3 == NULL || (UINT64)(UINTN)Intermediate != Intermediate) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, HandleIndex3); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } } if ((InFromFile || OutToFile) && (FileName == NULL)) { if (FileName == NULL) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, InFromFile?L"-i":L"-o"); } else { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_HANDLE_REQ), gShellDriver1HiiHandle); } ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } if (!UseHii && (InFromFile || OutToFile)) { if (InFromFile) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"-i"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } if (OutToFile) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"-o"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } } if (Validate && Force) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONF), gShellDriver1HiiHandle, L"-v", L"-f"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } if (Validate && Set) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONF), gShellDriver1HiiHandle, L"-v", L"-s"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } if (Set && Force) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONF), gShellDriver1HiiHandle, L"-s", L"-f"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } if (OutToFile && InFromFile) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONF), gShellDriver1HiiHandle, L"-i", L"-o"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } // // We do HII first. // if (UseHii) { if (Handle1 != NULL && EFI_ERROR(gBS->OpenProtocol(Handle1, &gEfiHiiConfigAccessProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) { // // no HII on this handle. // ShellStatus = SHELL_UNSUPPORTED; } else if (Validate) { } else if (Force) { } else if (Set) { } else if (InFromFile) { ShellStatus = ConfigFromFile(Handle1, FileName); if (Handle1 != NULL && ShellStatus == SHELL_SUCCESS) { goto Done; } } else if (OutToFile) { ShellStatus = ConfigToFile(Handle1, FileName); if (Handle1 != NULL && ShellStatus == SHELL_SUCCESS) { goto Done; } } else if (HandleIndex1 == NULL) { // // display all that are configurable // ShellStatus = PrintConfigInfoOnAll(AllChildren, Language, UseHii); goto Done; } else { if (!EFI_ERROR(gBS->OpenProtocol(Handle1, &gEfiHiiConfigAccessProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_DRVCFG_LINE_HII), gShellDriver1HiiHandle, ConvertHandleToHandleIndex(Handle1) ); goto Done; } } } // // We allways need to do this one since it does both by default. // if (!InFromFile && !OutToFile) { ShellStatus = PreHiiDrvCfg ( Language, Force, ForceType, AllChildren, Validate, Set, Handle1, Handle2, Handle3); } if (ShellStatus == SHELL_UNSUPPORTED) { ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT), gShellDriver1HiiHandle, ConvertHandleToHandleIndex(Handle1) ); } } Done: ShellCommandLineFreeVarList (Package); SHELL_FREE_NON_NULL(Language); return (ShellStatus); }
/** Function for 'sermode' 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 ShellCommandRunSerMode ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_STATUS Status; SHELL_STATUS ShellStatus; UINTN Index; UINTN NoHandles; EFI_HANDLE *Handles; EFI_PARITY_TYPE Parity; EFI_STOP_BITS_TYPE StopBits; UINTN HandleIdx; UINTN BaudRate; UINTN DataBits; UINTN Value; EFI_SERIAL_IO_PROTOCOL *SerialIo; LIST_ENTRY *Package; CHAR16 *ProblemParam; CONST CHAR16 *Temp; UINT64 Intermediate; ShellStatus = SHELL_SUCCESS; HandleIdx = 0; Parity = DefaultParity; Handles = NULL; NoHandles = 0; Index = 0; Package = NULL; Status = ShellCommandLineParse (EmptyParamList, &Package, &ProblemParam, TRUE); if (EFI_ERROR(Status)) { if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"sermode", ProblemParam); FreePool(ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } else { ASSERT(FALSE); } } else { if (ShellCommandLineGetCount(Package) < 6 && ShellCommandLineGetCount(Package) > 2) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle, L"sermode"); ShellStatus = SHELL_INVALID_PARAMETER; } else if (ShellCommandLineGetCount(Package) > 6) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle, L"sermode"); ShellStatus = SHELL_INVALID_PARAMETER; } else { Temp = ShellCommandLineGetRawValue(Package, 1); if (Temp != NULL) { Status = ShellConvertStringToUint64(Temp, &Intermediate, TRUE, FALSE); HandleIdx = (UINTN)Intermediate; Temp = ShellCommandLineGetRawValue(Package, 2); if (Temp == NULL) { ShellStatus = DisplaySettings (HandleIdx, TRUE); goto Done; } } else { ShellStatus = DisplaySettings (0, FALSE); goto Done; } Temp = ShellCommandLineGetRawValue(Package, 2); if (Temp != NULL) { BaudRate = ShellStrToUintn(Temp); } else { ASSERT(FALSE); BaudRate = 0; } Temp = ShellCommandLineGetRawValue(Package, 3); if (Temp == NULL || StrLen(Temp)>1) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"sermode", Temp); ShellStatus = SHELL_INVALID_PARAMETER; } else { switch(Temp[0]){ case 'd': case 'D': Parity = DefaultParity; break; case 'n': case 'N': Parity = NoParity; break; case 'e': case 'E': Parity = EvenParity; break; case 'o': case 'O': Parity = OddParity; break; case 'm': case 'M': Parity = MarkParity; break; case 's': case 'S': Parity = SpaceParity; break; default: ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"sermode", Temp); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } } Temp = ShellCommandLineGetRawValue(Package, 4); if (Temp != NULL) { DataBits = ShellStrToUintn(Temp); } else { // // make sure this is some number not in the list below. // DataBits = 0; } switch (DataBits) { case 4: case 7: case 8: break; default: ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"sermode", Temp); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } Temp = ShellCommandLineGetRawValue(Package, 5); Value = ShellStrToUintn(Temp); switch (Value) { case 0: StopBits = DefaultStopBits; break; case 1: StopBits = OneStopBit; break; case 2: StopBits = TwoStopBits; break; case 15: StopBits = OneFiveStopBits; break; default: ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDebug1HiiHandle, L"sermode", Temp); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiSerialIoProtocolGuid, NULL, &NoHandles, &Handles); if (EFI_ERROR (Status)) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SERMODE_NO_FOUND), gShellDebug1HiiHandle, L"sermode"); ShellStatus = SHELL_INVALID_PARAMETER; goto Done; } for (Index = 0; Index < NoHandles; Index++) { if (ConvertHandleIndexToHandle (HandleIdx) != Handles[Index]) { continue; } Status = gBS->HandleProtocol (Handles[Index], &gEfiSerialIoProtocolGuid, (VOID**)&SerialIo); if (!EFI_ERROR (Status)) { Status = SerialIo->SetAttributes ( SerialIo, (UINT64) BaudRate, SerialIo->Mode->ReceiveFifoDepth, SerialIo->Mode->Timeout, Parity, (UINT8) DataBits, StopBits ); if (EFI_ERROR (Status)) { if (Status == EFI_INVALID_PARAMETER) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SERMODE_SET_UNSUPPORTED), gShellDebug1HiiHandle, L"sermode", ConvertHandleToHandleIndex(Handles[Index])); ShellStatus = SHELL_UNSUPPORTED; } else if (Status == EFI_DEVICE_ERROR) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SERMODE_SET_DEV_ERROR), gShellDebug1HiiHandle, L"sermode", ConvertHandleToHandleIndex(Handles[Index])); ShellStatus = SHELL_ACCESS_DENIED; } else { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SERMODE_SET_FAIL), gShellDebug1HiiHandle, L"sermode", ConvertHandleToHandleIndex(Handles[Index])); ShellStatus = SHELL_ACCESS_DENIED; } } else { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SERMODE_SET_HANDLE), gShellDebug1HiiHandle, ConvertHandleToHandleIndex(Handles[Index])); } break; } } } } if (ShellStatus == SHELL_SUCCESS && Index == NoHandles) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SERMODE_BAD_HANDLE), gShellDebug1HiiHandle, L"sermode", HandleIdx); ShellStatus = SHELL_INVALID_PARAMETER; } Done: if (Package != NULL) { ShellCommandLineFreeVarList (Package); } if (Handles != NULL) { FreePool (Handles); } return ShellStatus; }
/** Display information about a serial device by it's handle. If HandleValid is FALSE, do all devices. @param[in] HandleIdx The handle index for the device. @param[in] HandleValid TRUE if HandleIdx is valid. @retval SHELL_INVALID_PARAMETER A parameter was invalid. @retval SHELL_SUCCESS The operation was successful. **/ SHELL_STATUS EFIAPI DisplaySettings ( IN UINTN HandleIdx, IN BOOLEAN HandleValid ) { EFI_SERIAL_IO_PROTOCOL *SerialIo; UINTN NoHandles; EFI_HANDLE *Handles; EFI_STATUS Status; UINTN Index; CHAR16 *StopBits; CHAR16 Parity; SHELL_STATUS ShellStatus; Handles = NULL; StopBits = NULL; ShellStatus = SHELL_SUCCESS; Status = gBS->LocateHandleBuffer (ByProtocol, &gEfiSerialIoProtocolGuid, NULL, &NoHandles, &Handles); if (EFI_ERROR (Status)) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SERMODE_NO_FOUND), gShellDebug1HiiHandle, L"sermode"); return SHELL_INVALID_PARAMETER; } for (Index = 0; Index < NoHandles; Index++) { if (HandleValid) { if (ConvertHandleIndexToHandle(HandleIdx) != Handles[Index]) { continue; } } Status = gBS->HandleProtocol (Handles[Index], &gEfiSerialIoProtocolGuid, (VOID**)&SerialIo); if (!EFI_ERROR (Status)) { switch (SerialIo->Mode->Parity) { case DefaultParity: Parity = 'D'; break; case NoParity: Parity = 'N'; break; case EvenParity: Parity = 'E'; break; case OddParity: Parity = 'O'; break; case MarkParity: Parity = 'M'; break; case SpaceParity: Parity = 'S'; break; default: Parity = 'U'; } switch (SerialIo->Mode->StopBits) { case DefaultStopBits: StopBits = L"Default"; break; case OneStopBit: StopBits = L"1"; break; case TwoStopBits: StopBits = L"2"; break; case OneFiveStopBits: StopBits = L"1.5"; break; default: StopBits = L"Unknown"; } ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_SERMODE_DISPLAY), gShellDebug1HiiHandle, ConvertHandleToHandleIndex (Handles[Index]), Handles[Index], SerialIo->Mode->BaudRate, Parity, SerialIo->Mode->DataBits, StopBits ); } else { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SERMODE_NO_FOUND), gShellDebug1HiiHandle, L"sermode"); ShellStatus = SHELL_NOT_FOUND; break; } if (HandleValid) { break; } } if (Index == NoHandles) { if ((NoHandles != 0 && HandleValid) || 0 == NoHandles) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_SERMODE_NOT_FOUND), gShellDebug1HiiHandle, L"sermode"); ShellStatus = SHELL_NOT_FOUND; } } return ShellStatus; }
/** 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 'devices' 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 ShellCommandRunDevices ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_STATUS Status; LIST_ENTRY *Package; CHAR16 *ProblemParam; SHELL_STATUS ShellStatus; CHAR8 *Language; EFI_HANDLE *HandleList; EFI_HANDLE *HandleListWalker; CHAR16 Type; BOOLEAN Cfg; BOOLEAN Diag; UINTN Parents; UINTN Devices; UINTN Children; CHAR16 *Name; CONST CHAR16 *Lang; BOOLEAN SfoFlag; ShellStatus = SHELL_SUCCESS; Language = NULL; SfoFlag = FALSE; // // initialize the shell lib (we must be in non-auto-init...) // Status = ShellInitialize(); // ASSERT_EFI_ERROR(Status); Status = CommandInit(); // ASSERT_EFI_ERROR(Status); if (EFI_ERROR(Status)) { return SHELL_UNSUPPORTED; } // // 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, L"devices", ProblemParam); FreePool(ProblemParam); ShellStatus = SHELL_INVALID_PARAMETER; } /* else { ASSERT(FALSE); } */ } else { // // if more than 0 'value' parameters we have too many parameters // if (ShellCommandLineGetRawValue(Package, 1) != NULL){ // // error for too many parameters // ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"devices"); ShellStatus = SHELL_INVALID_PARAMETER; } else { // // get the language if necessary // 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"devices", L"-l"); ShellCommandLineFreeVarList (Package); return (SHELL_INVALID_PARAMETER); } // // Print Header // if (ShellCommandLineGetFlag (Package, L"-sfo")) { ShellPrintHiiEx (-1, -1, Language, STRING_TOKEN (STR_GEN_SFO_HEADER), gShellDriver1HiiHandle, L"devices"); SfoFlag = TRUE; } else { ShellPrintHiiEx (-1, -1, Language, STRING_TOKEN (STR_DEVICES_HEADER_LINES), gShellDriver1HiiHandle); } // // loop through each handle // HandleList = GetHandleListByProtocol(NULL); ASSERT(HandleList != NULL); for (HandleListWalker = HandleList ; HandleListWalker != NULL && *HandleListWalker != NULL /*&& !EFI_ERROR(Status)*/ ; HandleListWalker++ ){ // // get all the info on each handle // Name = NULL; Status = GetDeviceHandleInfo(*HandleListWalker, &Type, &Cfg, &Diag, &Parents, &Devices, &Children, &Name, Language); if (Name != NULL && (Parents != 0 || Devices != 0 || Children != 0)) { ShellPrintHiiEx ( -1, -1, Language, SfoFlag?STRING_TOKEN (STR_DEVICES_ITEM_LINE_SFO):STRING_TOKEN (STR_DEVICES_ITEM_LINE), gShellDriver1HiiHandle, ConvertHandleToHandleIndex (*HandleListWalker), Type, Cfg?(SfoFlag?L'Y':L'X'):(SfoFlag?L'N':L'-'), Diag?(SfoFlag?L'Y':L'X'):(SfoFlag?L'N':L'-'), Parents, Devices, Children, Name!=NULL?Name:L"<UNKNOWN>"); } if (Name != NULL) { FreePool(Name); } if (ShellGetExecutionBreakFlag ()) { ShellStatus = SHELL_ABORTED; break; } } if (HandleList != NULL) { FreePool(HandleList); } } SHELL_FREE_NON_NULL(Language); ShellCommandLineFreeVarList (Package); } return (ShellStatus); }
/** Connect controller(s) and driver(s). @param[in] ControllerHandle The handle to the controller. Should have driver binding on it. @param[in] DriverHandle The handle to the driver. Should have driver binding. @param[in] Recursive TRUE to connect recursively, FALSE otherwise. @param[in] Output TRUE to have info on the screen, FALSE otherwise. @param[in] AlwaysOutput Override Output for errors. @retval EFI_SUCCESS The operation was successful. **/ EFI_STATUS ConnectControllers ( IN CONST EFI_HANDLE ControllerHandle OPTIONAL, IN CONST EFI_HANDLE DriverHandle OPTIONAL, IN CONST BOOLEAN Recursive, IN CONST BOOLEAN Output, IN CONST BOOLEAN AlwaysOutput ) { EFI_STATUS Status; EFI_STATUS Status2; EFI_HANDLE *ControllerHandleList; EFI_HANDLE *DriverHandleList; EFI_HANDLE *HandleWalker; ControllerHandleList = NULL; Status = EFI_NOT_FOUND; Status2 = EFI_NOT_FOUND; // // If we have a single handle to connect make that a 'list' // if (DriverHandle == NULL) { DriverHandleList = NULL; } else { DriverHandleList = AllocateZeroPool(2*sizeof(EFI_HANDLE)); if (DriverHandleList == NULL) { return (EFI_OUT_OF_RESOURCES); } DriverHandleList[0] = DriverHandle; DriverHandleList[1] = NULL; } // // do we connect all controllers (with a loop) or a single one... // This is where we call the gBS->ConnectController function. // if (ControllerHandle == NULL) { ControllerHandleList = GetHandleListByProtocol(&gEfiDevicePathProtocolGuid); for (HandleWalker = ControllerHandleList ; HandleWalker != NULL && *HandleWalker != NULL ; HandleWalker++ ){ Status = gBS->ConnectController(*HandleWalker, DriverHandleList, NULL, Recursive); if (!EFI_ERROR(Status)) { Status2 = EFI_SUCCESS; } if ((Output && !EFI_ERROR(Status)) || AlwaysOutput) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN(STR_HANDLE_RESULT), gShellDriver1HiiHandle, L"Connect", ConvertHandleToHandleIndex(*HandleWalker), Status); } } } else { Status = gBS->ConnectController(ControllerHandle, DriverHandleList, NULL, Recursive); if (!EFI_ERROR(Status)) { Status2 = EFI_SUCCESS; } if ((Output && !EFI_ERROR(Status)) || AlwaysOutput) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN(STR_HANDLE_RESULT), gShellDriver1HiiHandle, L"Connect", ConvertHandleToHandleIndex(ControllerHandle), Status); } } // // Free any memory we allocated. // if (ControllerHandleList != NULL) { FreePool(ControllerHandleList); } if (DriverHandleList != NULL) { FreePool(DriverHandleList); } return (Status2); }
/** Do the diagnostics call for some set of handles. @param[in] Mode The type of diagnostic test to run. @param[in] Lang The language code to use. @param[in] AllChilds Should the test be on all children. @param[in] DriverHandle The driver handle to test with. @param[in] ControllerHandle The specific controller handle to test. @param[in] ChildHandle The specific child handle to test. @retval EFI_SUCCESS The operation was successful. @retval EFI_INVALID_PARAMETER A parameter had an invalid value. @retval EFI_NOT_FOUND No diagnostic handle could be found. **/ EFI_STATUS EFIAPI DoDiagnostics ( IN CONST DRV_DIAG_TEST_MODE Mode, IN CONST CHAR8 *Lang, IN CONST BOOLEAN AllChilds, IN CONST EFI_HANDLE DriverHandle, IN CONST EFI_HANDLE ControllerHandle, IN CONST EFI_HANDLE ChildHandle ) { EFI_DRIVER_DIAGNOSTICS_PROTOCOL *DriverDiagnostics; EFI_DRIVER_DIAGNOSTICS2_PROTOCOL *DriverDiagnostics2; EFI_HANDLE *DriverHandleList; EFI_HANDLE *ControllerHandleList; EFI_HANDLE *ChildHandleList; EFI_HANDLE *Walker; UINTN DriverHandleListCount; UINTN ControllerHandleListCount; UINTN ChildHandleListCount; UINTN DriverHandleListLoop; UINTN ControllerHandleListLoop; UINTN ChildHandleListLoop; EFI_STATUS Status; EFI_STATUS Status2; EFI_GUID *ErrorType; UINTN OutBufferSize; CHAR16 *OutBuffer; UINTN HandleIndex1; UINTN HandleIndex2; CHAR8 *Language; BOOLEAN Found; if ((ChildHandle != NULL && AllChilds) || (Mode >= TestModeMax)){ return (EFI_INVALID_PARAMETER); } DriverDiagnostics = NULL; DriverDiagnostics2 = NULL; Status = EFI_SUCCESS; Status2 = EFI_SUCCESS; DriverHandleList = NULL; ControllerHandleList = NULL; ChildHandleList = NULL; Language = NULL; OutBuffer = NULL; ErrorType = NULL; DriverHandleListCount = 0; ControllerHandleListCount = 0; ChildHandleListCount = 0; if (DriverHandle != NULL) { DriverHandleList = AllocateZeroPool(2*sizeof(EFI_HANDLE)); ASSERT(DriverHandleList!=NULL); DriverHandleList[0] = DriverHandle; DriverHandleListCount = 1; } else { DriverHandleList = GetHandleListByProtocolList(DiagGuidList); if (DriverHandleList == NULL) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROTOCOL_NF), gShellDriver1HiiHandle, L"gEfiDriverDiagnosticsProtocolGuid", &gEfiDriverDiagnosticsProtocolGuid); ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROTOCOL_NF), gShellDriver1HiiHandle, L"gEfiDriverDiagnostics2ProtocolGuid", &gEfiDriverDiagnostics2ProtocolGuid); return (EFI_NOT_FOUND); } for (Walker = DriverHandleList ; Walker != NULL && *Walker != NULL ; DriverHandleListCount++, Walker++); } if (ControllerHandle != NULL) { ControllerHandleList = AllocateZeroPool(2*sizeof(EFI_HANDLE)); ASSERT(ControllerHandleList!=NULL); ControllerHandleList[0] = ControllerHandle; ControllerHandleListCount = 1; } else { ControllerHandleList = NULL; } if (ChildHandle != NULL) { ChildHandleList = AllocateZeroPool(2*sizeof(EFI_HANDLE)); ASSERT(ChildHandleList!=NULL); ChildHandleList[0] = ChildHandle; ChildHandleListCount = 1; } else if (AllChilds) { ChildHandleList = NULL; // // This gets handled in the loop below. // } else { ChildHandleList = NULL; } if (Mode == TestModeList) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DRVDIAG_HEADER), gShellDriver1HiiHandle); } for (DriverHandleListLoop = 0 ; DriverHandleListLoop < DriverHandleListCount ; DriverHandleListLoop++ ){ if (Mode == TestModeList) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DRVDIAG_DRIVER_HEADER), gShellDriver1HiiHandle, ConvertHandleToHandleIndex(DriverHandleList[DriverHandleListLoop])); } if (ControllerHandle == NULL) { PARSE_HANDLE_DATABASE_DEVICES(DriverHandleList[DriverHandleListLoop], &ControllerHandleListCount, &ControllerHandleList); } if (ControllerHandleListCount == 0) { if (Mode == TestModeList) { ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DRVDIAG_DRIVER_NO_HANDLES), gShellDriver1HiiHandle); } } else { if (Mode == TestModeList) { ShellPrintEx(-1, -1, L"\r\n"); } for (ControllerHandleListLoop = 0 ; ControllerHandleListLoop < ControllerHandleListCount ; ControllerHandleListLoop++ ){ if (AllChilds) { ASSERT(ChildHandleList == NULL); PARSE_HANDLE_DATABASE_MANAGED_CHILDREN( DriverHandleList[DriverHandleListLoop], ControllerHandleList[ControllerHandleListLoop], &ChildHandleListCount, &ChildHandleList); } for (ChildHandleListLoop = 0 ; (ChildHandleListLoop < ChildHandleListCount || ChildHandleList == NULL) ; ChildHandleListLoop++ ){ Found = FALSE; if (Mode != TestModeList) { if (Lang == NULL || Lang[2] == '-') { // // Get the protocol pointer and call the function // Status = gBS->OpenProtocol( DriverHandleList[DriverHandleListLoop], &gEfiDriverDiagnostics2ProtocolGuid, (VOID**)&DriverDiagnostics2, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL); if (!EFI_ERROR(Status) && (DriverDiagnostics2 != NULL)) { Language = GetBestLanguageForDriver(DriverDiagnostics2->SupportedLanguages, Lang, FALSE); Found = TRUE; Status = DriverDiagnostics2->RunDiagnostics( DriverDiagnostics2, ControllerHandleList[ControllerHandleListLoop], ChildHandleList == NULL?NULL:ChildHandleList[ChildHandleListLoop], (EFI_DRIVER_DIAGNOSTIC_TYPE)Mode, Language, &ErrorType, &OutBufferSize, &OutBuffer); FreePool(Language); } } if (!Found && (Lang == NULL||(Lang!=NULL&&(Lang[2]!='-')))){ Status = gBS->OpenProtocol( DriverHandleList[DriverHandleListLoop], &gEfiDriverDiagnosticsProtocolGuid, (VOID**)&DriverDiagnostics, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL); if (!EFI_ERROR(Status)) { Language = GetBestLanguageForDriver(DriverDiagnostics->SupportedLanguages, Lang, FALSE); Status = DriverDiagnostics->RunDiagnostics( DriverDiagnostics, ControllerHandleList[ControllerHandleListLoop], ChildHandleList == NULL?NULL:ChildHandleList[ChildHandleListLoop], (EFI_DRIVER_DIAGNOSTIC_TYPE)Mode, Language, &ErrorType, &OutBufferSize, &OutBuffer); FreePool(Language); } } if (EFI_ERROR(Status)) { Status2 = Status; } HandleIndex1 = ConvertHandleToHandleIndex(DriverHandleList[DriverHandleListLoop]); HandleIndex2 = ConvertHandleToHandleIndex(ControllerHandleList[ControllerHandleListLoop]); ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_3P_RESULT), gShellDriver1HiiHandle, L"DrvDiag", HandleIndex1, HandleIndex2, ChildHandleList == NULL?0:ConvertHandleToHandleIndex(ChildHandleList[ChildHandleListLoop]), Status); if (OutBuffer!=NULL) { FreePool(OutBuffer); OutBuffer = NULL; } if (ErrorType!=NULL) { FreePool(ErrorType); ErrorType = NULL; } } else { HandleIndex1 = ConvertHandleToHandleIndex(DriverHandleList[DriverHandleListLoop]); HandleIndex2 = ConvertHandleToHandleIndex(ControllerHandleList[ControllerHandleListLoop]); // // Print out the information that this set can be tested // ShellPrintHiiEx( -1, -1, NULL, STRING_TOKEN (STR_DRV_DIAG_ITEM_LINE), gShellDriver1HiiHandle, HandleIndex1, HandleIndex2, ChildHandleList == NULL?0:ConvertHandleToHandleIndex(ChildHandleList[ChildHandleListLoop]) ); } // // If we are doing a single pass with NULL child jump out after a single loop // if (ChildHandleList == NULL) { break; } } if (AllChilds) { SHELL_FREE_NON_NULL(ChildHandleList); ChildHandleList = NULL; ChildHandleListCount = 0; } } if (ControllerHandle == NULL) { SHELL_FREE_NON_NULL(ControllerHandleList); ControllerHandleList = NULL; ControllerHandleListCount = 0; } } } if (DriverHandleList != NULL) { FreePool(DriverHandleList); } if (ControllerHandleList != NULL) { FreePool(ControllerHandleList); } if (ChildHandleList != NULL) { FreePool(ChildHandleList); } return (Status2); }
/** 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); }