14ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey/** @file
24ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  Main file for DrvCfg shell Driver1 function.
34ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
4c011b6c9e2baf57fc0557117e9875ceb3dca55a3Tapan Shah  (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
558972f5cf7e1163e474f961afe34e200fd5dac11Ruiyu Ni  Copyright (c) 2010 - 2016, Intel Corporation. All rights reserved.<BR>
64ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  This program and the accompanying materials
74ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  are licensed and made available under the terms and conditions of the BSD License
84ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  which accompanies this distribution.  The full text of the license may be found at
94ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  http://opensource.org/licenses/bsd-license.php
104ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
114ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
124ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
134ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
144ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey**/
154ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
164ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey#include "UefiShellDriver1CommandsLib.h"
174ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey#include <Protocol/HiiConfigAccess.h>
184ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey#include <Protocol/HiiDatabase.h>
194ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
204880c2c94d100238b310579fbd95313893a5353fjcarseySTATIC CONST EFI_GUID *CfgGuidList[] = {&gEfiDriverConfigurationProtocolGuid, &gEfiDriverConfiguration2ProtocolGuid, NULL};
214880c2c94d100238b310579fbd95313893a5353fjcarsey
224ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey/**
234880c2c94d100238b310579fbd95313893a5353fjcarsey  Find the EFI_HII_HANDLE by device path.
244ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
254880c2c94d100238b310579fbd95313893a5353fjcarsey  @param[in] DevPath1     The Device Path to match.
264880c2c94d100238b310579fbd95313893a5353fjcarsey  @param[out] HiiHandle   The EFI_HII_HANDLE after the converstion.
274880c2c94d100238b310579fbd95313893a5353fjcarsey  @param[in] HiiDb        The Hii database protocol
284ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
294880c2c94d100238b310579fbd95313893a5353fjcarsey  @retval EFI_SUCCESS     The operation was successful.
304880c2c94d100238b310579fbd95313893a5353fjcarsey  @retval EFI_NOT_FOUND   There was no EFI_HII_HANDLE found for that deviec path.
314ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey**/
324ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarseyEFI_STATUS
334880c2c94d100238b310579fbd95313893a5353fjcarseyFindHiiHandleViaDevPath(
344880c2c94d100238b310579fbd95313893a5353fjcarsey  IN CONST EFI_DEVICE_PATH_PROTOCOL *DevPath1,
354880c2c94d100238b310579fbd95313893a5353fjcarsey  OUT EFI_HII_HANDLE                *HiiHandle,
364880c2c94d100238b310579fbd95313893a5353fjcarsey  IN EFI_HII_DATABASE_PROTOCOL      *HiiDb
374ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  )
384ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey{
394880c2c94d100238b310579fbd95313893a5353fjcarsey  EFI_HII_HANDLE                *HandleBuffer;
404880c2c94d100238b310579fbd95313893a5353fjcarsey  UINTN                         HandleBufferSize;
414880c2c94d100238b310579fbd95313893a5353fjcarsey  VOID                          *MainBuffer;
424880c2c94d100238b310579fbd95313893a5353fjcarsey  UINTN                         MainBufferSize;
434880c2c94d100238b310579fbd95313893a5353fjcarsey  EFI_HII_PACKAGE_LIST_HEADER   *PackageListHeader;
444880c2c94d100238b310579fbd95313893a5353fjcarsey  EFI_HII_PACKAGE_HEADER        *PackageHeader;
454880c2c94d100238b310579fbd95313893a5353fjcarsey  UINTN                         LoopVariable;
464880c2c94d100238b310579fbd95313893a5353fjcarsey  EFI_DEVICE_PATH_PROTOCOL      *DevPath2;
474880c2c94d100238b310579fbd95313893a5353fjcarsey  EFI_STATUS                    Status;
484ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
494880c2c94d100238b310579fbd95313893a5353fjcarsey  ASSERT(DevPath1 != NULL);
504880c2c94d100238b310579fbd95313893a5353fjcarsey  ASSERT(HiiHandle != NULL);
514880c2c94d100238b310579fbd95313893a5353fjcarsey  ASSERT(*HiiHandle == NULL);
524880c2c94d100238b310579fbd95313893a5353fjcarsey  ASSERT(HiiDb != NULL);
534ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
544880c2c94d100238b310579fbd95313893a5353fjcarsey  HandleBufferSize  = 0;
554880c2c94d100238b310579fbd95313893a5353fjcarsey  HandleBuffer      = NULL;
564880c2c94d100238b310579fbd95313893a5353fjcarsey  Status = HiiDb->ListPackageLists(HiiDb, EFI_HII_PACKAGE_DEVICE_PATH, NULL, &HandleBufferSize, HandleBuffer);
574ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  if (Status == EFI_BUFFER_TOO_SMALL) {
584880c2c94d100238b310579fbd95313893a5353fjcarsey    HandleBuffer = AllocateZeroPool(HandleBufferSize);
5958972f5cf7e1163e474f961afe34e200fd5dac11Ruiyu Ni    if (HandleBuffer == NULL) {
6058972f5cf7e1163e474f961afe34e200fd5dac11Ruiyu Ni      Status = EFI_OUT_OF_RESOURCES;
6158972f5cf7e1163e474f961afe34e200fd5dac11Ruiyu Ni    } else {
6258972f5cf7e1163e474f961afe34e200fd5dac11Ruiyu Ni      Status = HiiDb->ListPackageLists (HiiDb, EFI_HII_PACKAGE_DEVICE_PATH, NULL, &HandleBufferSize, HandleBuffer);
6358972f5cf7e1163e474f961afe34e200fd5dac11Ruiyu Ni    }
644ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  }
654ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  if (EFI_ERROR(Status)) {
664880c2c94d100238b310579fbd95313893a5353fjcarsey    SHELL_FREE_NON_NULL(HandleBuffer);
674ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey    return (Status);
684ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  }
694ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
7072c8a89a653a6d393969d928b18fde86cf021901ydong  if (HandleBuffer == NULL) {
7172c8a89a653a6d393969d928b18fde86cf021901ydong    return EFI_NOT_FOUND;
7272c8a89a653a6d393969d928b18fde86cf021901ydong  }
7372c8a89a653a6d393969d928b18fde86cf021901ydong
744880c2c94d100238b310579fbd95313893a5353fjcarsey  for (LoopVariable = 0 ; LoopVariable < (HandleBufferSize/sizeof(HandleBuffer[0])) && *HiiHandle == NULL ; LoopVariable++) {
754880c2c94d100238b310579fbd95313893a5353fjcarsey    MainBufferSize    = 0;
764880c2c94d100238b310579fbd95313893a5353fjcarsey    MainBuffer        = NULL;
774880c2c94d100238b310579fbd95313893a5353fjcarsey    Status = HiiDb->ExportPackageLists(HiiDb, HandleBuffer[LoopVariable], &MainBufferSize, MainBuffer);
784880c2c94d100238b310579fbd95313893a5353fjcarsey    if (Status == EFI_BUFFER_TOO_SMALL) {
794880c2c94d100238b310579fbd95313893a5353fjcarsey      MainBuffer = AllocateZeroPool(MainBufferSize);
8058972f5cf7e1163e474f961afe34e200fd5dac11Ruiyu Ni      if (MainBuffer != NULL) {
8158972f5cf7e1163e474f961afe34e200fd5dac11Ruiyu Ni        Status = HiiDb->ExportPackageLists (HiiDb, HandleBuffer[LoopVariable], &MainBufferSize, MainBuffer);
8258972f5cf7e1163e474f961afe34e200fd5dac11Ruiyu Ni      }
8358972f5cf7e1163e474f961afe34e200fd5dac11Ruiyu Ni    }
8458972f5cf7e1163e474f961afe34e200fd5dac11Ruiyu Ni    if (EFI_ERROR (Status)) {
8558972f5cf7e1163e474f961afe34e200fd5dac11Ruiyu Ni      continue;
864880c2c94d100238b310579fbd95313893a5353fjcarsey    }
874880c2c94d100238b310579fbd95313893a5353fjcarsey    //
884880c2c94d100238b310579fbd95313893a5353fjcarsey    // Enumerate through the block of returned memory.
894880c2c94d100238b310579fbd95313893a5353fjcarsey    // This should actually be a small block, but we need to be sure.
904880c2c94d100238b310579fbd95313893a5353fjcarsey    //
914880c2c94d100238b310579fbd95313893a5353fjcarsey    for (PackageListHeader = (EFI_HII_PACKAGE_LIST_HEADER*)MainBuffer
924880c2c94d100238b310579fbd95313893a5353fjcarsey      ;  PackageListHeader != NULL && ((CHAR8*)PackageListHeader) < (((CHAR8*)MainBuffer)+MainBufferSize) && *HiiHandle == NULL
934880c2c94d100238b310579fbd95313893a5353fjcarsey      ;  PackageListHeader = (EFI_HII_PACKAGE_LIST_HEADER*)(((CHAR8*)(PackageListHeader)) + PackageListHeader->PackageLength )) {
944880c2c94d100238b310579fbd95313893a5353fjcarsey        for (PackageHeader = (EFI_HII_PACKAGE_HEADER*)(((CHAR8*)(PackageListHeader))+sizeof(EFI_HII_PACKAGE_LIST_HEADER))
954880c2c94d100238b310579fbd95313893a5353fjcarsey          ; PackageHeader != NULL && ((CHAR8*)PackageHeader) < (((CHAR8*)MainBuffer)+MainBufferSize) && PackageHeader->Type != EFI_HII_PACKAGE_END && *HiiHandle == NULL
964880c2c94d100238b310579fbd95313893a5353fjcarsey          ; PackageHeader = (EFI_HII_PACKAGE_HEADER*)(((CHAR8*)(PackageHeader))+PackageHeader->Length)) {
974880c2c94d100238b310579fbd95313893a5353fjcarsey            if (PackageHeader->Type == EFI_HII_PACKAGE_DEVICE_PATH) {
984880c2c94d100238b310579fbd95313893a5353fjcarsey              DevPath2 = (EFI_DEVICE_PATH_PROTOCOL*)(((CHAR8*)PackageHeader) + sizeof(EFI_HII_PACKAGE_HEADER));
994880c2c94d100238b310579fbd95313893a5353fjcarsey              if (DevicePathCompare(&DevPath1, &DevPath2) == 0) {
1004880c2c94d100238b310579fbd95313893a5353fjcarsey                *HiiHandle = HandleBuffer[LoopVariable];
1014880c2c94d100238b310579fbd95313893a5353fjcarsey                break;
1024880c2c94d100238b310579fbd95313893a5353fjcarsey              }
1034880c2c94d100238b310579fbd95313893a5353fjcarsey            }
1044880c2c94d100238b310579fbd95313893a5353fjcarsey        }
1054ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey    }
1064880c2c94d100238b310579fbd95313893a5353fjcarsey    SHELL_FREE_NON_NULL(MainBuffer);
1074ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  }
1084880c2c94d100238b310579fbd95313893a5353fjcarsey  SHELL_FREE_NON_NULL(HandleBuffer);
1094ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
1104880c2c94d100238b310579fbd95313893a5353fjcarsey  if (*HiiHandle == NULL) {
1114880c2c94d100238b310579fbd95313893a5353fjcarsey    return (EFI_NOT_FOUND);
1124880c2c94d100238b310579fbd95313893a5353fjcarsey  }
1134880c2c94d100238b310579fbd95313893a5353fjcarsey  return (EFI_SUCCESS);
1144880c2c94d100238b310579fbd95313893a5353fjcarsey}
1154ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
1164880c2c94d100238b310579fbd95313893a5353fjcarsey/**
1174880c2c94d100238b310579fbd95313893a5353fjcarsey  Convert a EFI_HANDLE to a EFI_HII_HANDLE.
1184ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
1194880c2c94d100238b310579fbd95313893a5353fjcarsey  @param[in] Handle       The EFI_HANDLE to convert.
1204880c2c94d100238b310579fbd95313893a5353fjcarsey  @param[out] HiiHandle   The EFI_HII_HANDLE after the converstion.
1214880c2c94d100238b310579fbd95313893a5353fjcarsey  @param[in] HiiDb        The Hii database protocol
1224ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
1234880c2c94d100238b310579fbd95313893a5353fjcarsey  @retval EFI_SUCCESS   The operation was successful.
1244880c2c94d100238b310579fbd95313893a5353fjcarsey**/
1254880c2c94d100238b310579fbd95313893a5353fjcarseyEFI_STATUS
1264880c2c94d100238b310579fbd95313893a5353fjcarseyConvertHandleToHiiHandle(
1274880c2c94d100238b310579fbd95313893a5353fjcarsey  IN CONST EFI_HANDLE           Handle,
1284880c2c94d100238b310579fbd95313893a5353fjcarsey  OUT EFI_HII_HANDLE            *HiiHandle,
1294880c2c94d100238b310579fbd95313893a5353fjcarsey  IN EFI_HII_DATABASE_PROTOCOL  *HiiDb
1304880c2c94d100238b310579fbd95313893a5353fjcarsey  )
1314880c2c94d100238b310579fbd95313893a5353fjcarsey{
1324880c2c94d100238b310579fbd95313893a5353fjcarsey  EFI_STATUS                    Status;
1334880c2c94d100238b310579fbd95313893a5353fjcarsey  EFI_DEVICE_PATH_PROTOCOL      *DevPath1;
1344ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
1354880c2c94d100238b310579fbd95313893a5353fjcarsey  if (HiiHandle == NULL || HiiDb == NULL) {
1364880c2c94d100238b310579fbd95313893a5353fjcarsey    return (EFI_INVALID_PARAMETER);
1374880c2c94d100238b310579fbd95313893a5353fjcarsey  }
1384880c2c94d100238b310579fbd95313893a5353fjcarsey  *HiiHandle = NULL;
1394880c2c94d100238b310579fbd95313893a5353fjcarsey
1404880c2c94d100238b310579fbd95313893a5353fjcarsey  if (Handle == NULL) {
1414880c2c94d100238b310579fbd95313893a5353fjcarsey    return (EFI_SUCCESS);
1424880c2c94d100238b310579fbd95313893a5353fjcarsey  }
1434880c2c94d100238b310579fbd95313893a5353fjcarsey
1444880c2c94d100238b310579fbd95313893a5353fjcarsey  DevPath1 = NULL;
1454880c2c94d100238b310579fbd95313893a5353fjcarsey  Status = gBS->OpenProtocol(Handle, &gEfiDevicePathProtocolGuid, (VOID**)&DevPath1, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);
1464880c2c94d100238b310579fbd95313893a5353fjcarsey  if (EFI_ERROR(Status) || DevPath1 == NULL) {
1474880c2c94d100238b310579fbd95313893a5353fjcarsey    return (EFI_NOT_FOUND);
1484880c2c94d100238b310579fbd95313893a5353fjcarsey  }
1494880c2c94d100238b310579fbd95313893a5353fjcarsey
1504880c2c94d100238b310579fbd95313893a5353fjcarsey  return (FindHiiHandleViaDevPath(DevPath1, HiiHandle, HiiDb));
1514ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey}
1524ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
1534ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey/**
1544880c2c94d100238b310579fbd95313893a5353fjcarsey  Function to print out all HII configuration information to a file.
1554ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
1564880c2c94d100238b310579fbd95313893a5353fjcarsey  @param[in] Handle           The handle to get info on.  NULL to do all handles.
1574880c2c94d100238b310579fbd95313893a5353fjcarsey  @param[in] FileName         The filename to rwite the info to.
1584ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey**/
1594ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarseySHELL_STATUS
1604880c2c94d100238b310579fbd95313893a5353fjcarseyConfigToFile(
1614880c2c94d100238b310579fbd95313893a5353fjcarsey  IN CONST EFI_HANDLE     Handle,
1624880c2c94d100238b310579fbd95313893a5353fjcarsey  IN CONST CHAR16         *FileName
1634ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  )
1644ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey{
1654880c2c94d100238b310579fbd95313893a5353fjcarsey  EFI_HII_DATABASE_PROTOCOL     *HiiDatabase;
1664880c2c94d100238b310579fbd95313893a5353fjcarsey  EFI_STATUS                    Status;
1674880c2c94d100238b310579fbd95313893a5353fjcarsey  VOID                          *MainBuffer;
1684880c2c94d100238b310579fbd95313893a5353fjcarsey  UINTN                         MainBufferSize;
1694880c2c94d100238b310579fbd95313893a5353fjcarsey  EFI_HII_HANDLE                HiiHandle;
1704880c2c94d100238b310579fbd95313893a5353fjcarsey  SHELL_FILE_HANDLE             FileHandle;
1714ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
1724880c2c94d100238b310579fbd95313893a5353fjcarsey  HiiDatabase       = NULL;
1734880c2c94d100238b310579fbd95313893a5353fjcarsey  MainBufferSize    = 0;
1744880c2c94d100238b310579fbd95313893a5353fjcarsey  MainBuffer        = NULL;
1754880c2c94d100238b310579fbd95313893a5353fjcarsey  FileHandle        = NULL;
1764ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
1774880c2c94d100238b310579fbd95313893a5353fjcarsey  Status = ShellOpenFileByName(FileName, &FileHandle, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE|EFI_FILE_MODE_CREATE, 0);
1784ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  if (EFI_ERROR(Status)) {
1794880c2c94d100238b310579fbd95313893a5353fjcarsey    ShellPrintHiiEx(
1804880c2c94d100238b310579fbd95313893a5353fjcarsey      -1,
1814880c2c94d100238b310579fbd95313893a5353fjcarsey      -1,
1824880c2c94d100238b310579fbd95313893a5353fjcarsey      NULL,
183bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah      STRING_TOKEN(STR_GEN_FILE_OPEN_FAIL),
184bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah      gShellDriver1HiiHandle,
185bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah      L"drvcfg",
1864880c2c94d100238b310579fbd95313893a5353fjcarsey      FileName,
1874880c2c94d100238b310579fbd95313893a5353fjcarsey      Status);
1884880c2c94d100238b310579fbd95313893a5353fjcarsey    return (SHELL_DEVICE_ERROR);
1894ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  }
1904ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
1914ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  //
1924880c2c94d100238b310579fbd95313893a5353fjcarsey  // Locate HII Database protocol
1934ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  //
1944880c2c94d100238b310579fbd95313893a5353fjcarsey  Status = gBS->LocateProtocol (
1954880c2c94d100238b310579fbd95313893a5353fjcarsey                  &gEfiHiiDatabaseProtocolGuid,
1964880c2c94d100238b310579fbd95313893a5353fjcarsey                  NULL,
1974880c2c94d100238b310579fbd95313893a5353fjcarsey                  (VOID **) &HiiDatabase
1984880c2c94d100238b310579fbd95313893a5353fjcarsey                  );
1994880c2c94d100238b310579fbd95313893a5353fjcarsey
2004880c2c94d100238b310579fbd95313893a5353fjcarsey  if (EFI_ERROR(Status) || HiiDatabase == NULL) {
2014880c2c94d100238b310579fbd95313893a5353fjcarsey    ShellPrintHiiEx(
2024880c2c94d100238b310579fbd95313893a5353fjcarsey      -1,
2034880c2c94d100238b310579fbd95313893a5353fjcarsey      -1,
2044880c2c94d100238b310579fbd95313893a5353fjcarsey      NULL,
2054880c2c94d100238b310579fbd95313893a5353fjcarsey      STRING_TOKEN(STR_GEN_PROTOCOL_NF),
206bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah      gShellDriver1HiiHandle,
207bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah      L"drvcfg",
2084880c2c94d100238b310579fbd95313893a5353fjcarsey      L"EfiHiiDatabaseProtocol",
2094880c2c94d100238b310579fbd95313893a5353fjcarsey      &gEfiHiiDatabaseProtocolGuid);
2104880c2c94d100238b310579fbd95313893a5353fjcarsey    ShellCloseFile(&FileHandle);
2114880c2c94d100238b310579fbd95313893a5353fjcarsey    return (SHELL_NOT_FOUND);
2124ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  }
2134ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
214eff60c11eadb1594fbd6d8f8906c5577c9f90026Kinney, Michael D  HiiHandle = NULL;
2154880c2c94d100238b310579fbd95313893a5353fjcarsey  Status = ConvertHandleToHiiHandle(Handle, &HiiHandle, HiiDatabase);
2164880c2c94d100238b310579fbd95313893a5353fjcarsey  if (EFI_ERROR(Status)) {
2174880c2c94d100238b310579fbd95313893a5353fjcarsey    ShellPrintHiiEx(
2184880c2c94d100238b310579fbd95313893a5353fjcarsey      -1,
2194880c2c94d100238b310579fbd95313893a5353fjcarsey      -1,
2204880c2c94d100238b310579fbd95313893a5353fjcarsey      NULL,
2214880c2c94d100238b310579fbd95313893a5353fjcarsey      STRING_TOKEN(STR_GEN_HANDLE_NOT),
222bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah      gShellDriver1HiiHandle,
223bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah      L"drvcfg",
2244880c2c94d100238b310579fbd95313893a5353fjcarsey      ConvertHandleToHandleIndex(Handle),
2254880c2c94d100238b310579fbd95313893a5353fjcarsey      L"Device");
2264880c2c94d100238b310579fbd95313893a5353fjcarsey    ShellCloseFile(&FileHandle);
2274880c2c94d100238b310579fbd95313893a5353fjcarsey    return (SHELL_DEVICE_ERROR);
2284ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  }
2294ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
2304880c2c94d100238b310579fbd95313893a5353fjcarsey  Status = HiiDatabase->ExportPackageLists(HiiDatabase, HiiHandle, &MainBufferSize, MainBuffer);
2314880c2c94d100238b310579fbd95313893a5353fjcarsey  if (Status == EFI_BUFFER_TOO_SMALL) {
2324880c2c94d100238b310579fbd95313893a5353fjcarsey    MainBuffer = AllocateZeroPool(MainBufferSize);
2334880c2c94d100238b310579fbd95313893a5353fjcarsey    Status = HiiDatabase->ExportPackageLists(HiiDatabase, HiiHandle, &MainBufferSize, MainBuffer);
2344ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  }
2354ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
2364880c2c94d100238b310579fbd95313893a5353fjcarsey  Status = ShellWriteFile(FileHandle, &MainBufferSize, MainBuffer);
2374880c2c94d100238b310579fbd95313893a5353fjcarsey
2384880c2c94d100238b310579fbd95313893a5353fjcarsey  ShellCloseFile(&FileHandle);
2394880c2c94d100238b310579fbd95313893a5353fjcarsey  SHELL_FREE_NON_NULL(MainBuffer);
2404880c2c94d100238b310579fbd95313893a5353fjcarsey
2414880c2c94d100238b310579fbd95313893a5353fjcarsey  if (EFI_ERROR(Status)) {
2424880c2c94d100238b310579fbd95313893a5353fjcarsey    ShellPrintHiiEx(
2434880c2c94d100238b310579fbd95313893a5353fjcarsey      -1,
2444880c2c94d100238b310579fbd95313893a5353fjcarsey      -1,
2454880c2c94d100238b310579fbd95313893a5353fjcarsey      NULL,
2464880c2c94d100238b310579fbd95313893a5353fjcarsey      STRING_TOKEN(STR_FILE_WRITE_FAIL),
247bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah      gShellDriver1HiiHandle,
248bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah      L"drvcfg",
249bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah      FileName);
2504880c2c94d100238b310579fbd95313893a5353fjcarsey    return (SHELL_DEVICE_ERROR);
2514880c2c94d100238b310579fbd95313893a5353fjcarsey  }
2524880c2c94d100238b310579fbd95313893a5353fjcarsey  ShellPrintHiiEx(
2534880c2c94d100238b310579fbd95313893a5353fjcarsey    -1,
2544880c2c94d100238b310579fbd95313893a5353fjcarsey    -1,
2554880c2c94d100238b310579fbd95313893a5353fjcarsey    NULL,
2564880c2c94d100238b310579fbd95313893a5353fjcarsey    STRING_TOKEN(STR_DRVCFG_COMP),
2574880c2c94d100238b310579fbd95313893a5353fjcarsey    gShellDriver1HiiHandle);
2584880c2c94d100238b310579fbd95313893a5353fjcarsey
2594880c2c94d100238b310579fbd95313893a5353fjcarsey  return (SHELL_SUCCESS);
2604ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey}
2614ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
2624ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey/**
2634880c2c94d100238b310579fbd95313893a5353fjcarsey  Function to read in HII configuration information from a file.
2644ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
2654880c2c94d100238b310579fbd95313893a5353fjcarsey  @param[in] Handle           The handle to get info for.
2664880c2c94d100238b310579fbd95313893a5353fjcarsey  @param[in] FileName         The filename to read the info from.
2674ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey**/
2684ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarseySHELL_STATUS
2694880c2c94d100238b310579fbd95313893a5353fjcarseyConfigFromFile(
2704880c2c94d100238b310579fbd95313893a5353fjcarsey  IN       EFI_HANDLE     Handle,
2714880c2c94d100238b310579fbd95313893a5353fjcarsey  IN CONST CHAR16         *FileName
2724ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  )
2734ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey{
2744880c2c94d100238b310579fbd95313893a5353fjcarsey  EFI_HII_DATABASE_PROTOCOL     *HiiDatabase;
2754880c2c94d100238b310579fbd95313893a5353fjcarsey  EFI_STATUS                    Status;
2764880c2c94d100238b310579fbd95313893a5353fjcarsey  VOID                          *MainBuffer;
2774880c2c94d100238b310579fbd95313893a5353fjcarsey  UINT64                        Temp;
2784880c2c94d100238b310579fbd95313893a5353fjcarsey  UINTN                         MainBufferSize;
2794880c2c94d100238b310579fbd95313893a5353fjcarsey  EFI_HII_HANDLE                HiiHandle;
2804880c2c94d100238b310579fbd95313893a5353fjcarsey  SHELL_FILE_HANDLE             FileHandle;
2814880c2c94d100238b310579fbd95313893a5353fjcarsey  CHAR16                        *TempDevPathString;
2824880c2c94d100238b310579fbd95313893a5353fjcarsey  EFI_HII_PACKAGE_LIST_HEADER   *PackageListHeader;
2834880c2c94d100238b310579fbd95313893a5353fjcarsey  EFI_HII_PACKAGE_HEADER        *PackageHeader;
2844880c2c94d100238b310579fbd95313893a5353fjcarsey  EFI_DEVICE_PATH_PROTOCOL      *DevPath;
2854880c2c94d100238b310579fbd95313893a5353fjcarsey  UINTN                         HandleIndex;
2864880c2c94d100238b310579fbd95313893a5353fjcarsey
2874880c2c94d100238b310579fbd95313893a5353fjcarsey  HiiDatabase       = NULL;
2884880c2c94d100238b310579fbd95313893a5353fjcarsey  MainBufferSize    = 0;
2894880c2c94d100238b310579fbd95313893a5353fjcarsey  MainBuffer        = NULL;
2904880c2c94d100238b310579fbd95313893a5353fjcarsey  FileHandle        = NULL;
2914880c2c94d100238b310579fbd95313893a5353fjcarsey
2924880c2c94d100238b310579fbd95313893a5353fjcarsey  Status = ShellOpenFileByName(FileName, &FileHandle, EFI_FILE_MODE_READ, 0);
2934880c2c94d100238b310579fbd95313893a5353fjcarsey  if (EFI_ERROR(Status)) {
2944880c2c94d100238b310579fbd95313893a5353fjcarsey    ShellPrintHiiEx(
2954880c2c94d100238b310579fbd95313893a5353fjcarsey      -1,
2964880c2c94d100238b310579fbd95313893a5353fjcarsey      -1,
2974880c2c94d100238b310579fbd95313893a5353fjcarsey      NULL,
298bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah      STRING_TOKEN(STR_GEN_FILE_OPEN_FAIL),
2994880c2c94d100238b310579fbd95313893a5353fjcarsey      gShellDriver1HiiHandle,
300bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah      L"drvcfg",
3014880c2c94d100238b310579fbd95313893a5353fjcarsey      FileName,
3024880c2c94d100238b310579fbd95313893a5353fjcarsey      Status);
3034880c2c94d100238b310579fbd95313893a5353fjcarsey    return (SHELL_DEVICE_ERROR);
3044880c2c94d100238b310579fbd95313893a5353fjcarsey  }
3054880c2c94d100238b310579fbd95313893a5353fjcarsey
3064880c2c94d100238b310579fbd95313893a5353fjcarsey  //
3074880c2c94d100238b310579fbd95313893a5353fjcarsey  // Locate HII Database protocol
3084880c2c94d100238b310579fbd95313893a5353fjcarsey  //
3094880c2c94d100238b310579fbd95313893a5353fjcarsey  Status = gBS->LocateProtocol (
3104880c2c94d100238b310579fbd95313893a5353fjcarsey                  &gEfiHiiDatabaseProtocolGuid,
3114880c2c94d100238b310579fbd95313893a5353fjcarsey                  NULL,
3124880c2c94d100238b310579fbd95313893a5353fjcarsey                  (VOID **) &HiiDatabase
3134880c2c94d100238b310579fbd95313893a5353fjcarsey                  );
3144ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
3154880c2c94d100238b310579fbd95313893a5353fjcarsey  if (EFI_ERROR(Status) || HiiDatabase == NULL) {
3164880c2c94d100238b310579fbd95313893a5353fjcarsey    ShellPrintHiiEx(
3174880c2c94d100238b310579fbd95313893a5353fjcarsey      -1,
3184880c2c94d100238b310579fbd95313893a5353fjcarsey      -1,
3194880c2c94d100238b310579fbd95313893a5353fjcarsey      NULL,
3204880c2c94d100238b310579fbd95313893a5353fjcarsey      STRING_TOKEN(STR_GEN_PROTOCOL_NF),
3214880c2c94d100238b310579fbd95313893a5353fjcarsey      gShellDriver1HiiHandle,
322bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah      L"drvcfg",
3234880c2c94d100238b310579fbd95313893a5353fjcarsey      L"EfiHiiDatabaseProtocol",
3244880c2c94d100238b310579fbd95313893a5353fjcarsey      &gEfiHiiDatabaseProtocolGuid);
3254880c2c94d100238b310579fbd95313893a5353fjcarsey    ShellCloseFile(&FileHandle);
3264880c2c94d100238b310579fbd95313893a5353fjcarsey    return (SHELL_NOT_FOUND);
3274880c2c94d100238b310579fbd95313893a5353fjcarsey  }
3284ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
3294880c2c94d100238b310579fbd95313893a5353fjcarsey  Status = ShellGetFileSize(FileHandle, &Temp);
3304880c2c94d100238b310579fbd95313893a5353fjcarsey  MainBufferSize = (UINTN)Temp;
3314880c2c94d100238b310579fbd95313893a5353fjcarsey  if (EFI_ERROR(Status)) {
3324ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey    ShellPrintHiiEx(
3334ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey      -1,
3344ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey      -1,
3354ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey      NULL,
3364880c2c94d100238b310579fbd95313893a5353fjcarsey      STRING_TOKEN(STR_FILE_READ_FAIL),
337bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah      gShellDriver1HiiHandle,
338bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah      L"drvcfg",
339bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah      FileName);
340bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah
3414880c2c94d100238b310579fbd95313893a5353fjcarsey    ShellCloseFile(&FileHandle);
3424880c2c94d100238b310579fbd95313893a5353fjcarsey    return (SHELL_DEVICE_ERROR);
3434880c2c94d100238b310579fbd95313893a5353fjcarsey  }
3444880c2c94d100238b310579fbd95313893a5353fjcarsey  MainBuffer = AllocateZeroPool((UINTN)MainBufferSize);
3454880c2c94d100238b310579fbd95313893a5353fjcarsey  if (EFI_ERROR(Status)) {
3464880c2c94d100238b310579fbd95313893a5353fjcarsey    ShellPrintHiiEx(
3474880c2c94d100238b310579fbd95313893a5353fjcarsey      -1,
3484880c2c94d100238b310579fbd95313893a5353fjcarsey      -1,
3494880c2c94d100238b310579fbd95313893a5353fjcarsey      NULL,
3504880c2c94d100238b310579fbd95313893a5353fjcarsey      STRING_TOKEN(STR_GEN_OUT_MEM),
351bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah      gShellDriver1HiiHandle, L"drvcfg");
3524880c2c94d100238b310579fbd95313893a5353fjcarsey    ShellCloseFile(&FileHandle);
3534880c2c94d100238b310579fbd95313893a5353fjcarsey    return (SHELL_DEVICE_ERROR);
3544ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  }
3554880c2c94d100238b310579fbd95313893a5353fjcarsey  Status = ShellReadFile(FileHandle, &MainBufferSize, MainBuffer);
3564880c2c94d100238b310579fbd95313893a5353fjcarsey  if (EFI_ERROR(Status)) {
3574880c2c94d100238b310579fbd95313893a5353fjcarsey    ShellPrintHiiEx(
3584880c2c94d100238b310579fbd95313893a5353fjcarsey      -1,
3594880c2c94d100238b310579fbd95313893a5353fjcarsey      -1,
3604880c2c94d100238b310579fbd95313893a5353fjcarsey      NULL,
3614880c2c94d100238b310579fbd95313893a5353fjcarsey      STRING_TOKEN(STR_FILE_READ_FAIL),
3624880c2c94d100238b310579fbd95313893a5353fjcarsey      gShellDriver1HiiHandle,
363bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah      L"drvcfg",
364bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah      FileName);
365bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah
3664880c2c94d100238b310579fbd95313893a5353fjcarsey    ShellCloseFile(&FileHandle);
3674880c2c94d100238b310579fbd95313893a5353fjcarsey    SHELL_FREE_NON_NULL(MainBuffer);
3684880c2c94d100238b310579fbd95313893a5353fjcarsey    return (SHELL_DEVICE_ERROR);
3694880c2c94d100238b310579fbd95313893a5353fjcarsey  }
3704880c2c94d100238b310579fbd95313893a5353fjcarsey
3714880c2c94d100238b310579fbd95313893a5353fjcarsey  ShellCloseFile(&FileHandle);
3724880c2c94d100238b310579fbd95313893a5353fjcarsey
3734880c2c94d100238b310579fbd95313893a5353fjcarsey  if (Handle != NULL) {
3744880c2c94d100238b310579fbd95313893a5353fjcarsey    //
3754880c2c94d100238b310579fbd95313893a5353fjcarsey    // User override in place.  Just do it.
3764880c2c94d100238b310579fbd95313893a5353fjcarsey    //
3774880c2c94d100238b310579fbd95313893a5353fjcarsey    HiiHandle         = NULL;
3784880c2c94d100238b310579fbd95313893a5353fjcarsey    Status = ConvertHandleToHiiHandle(Handle, &HiiHandle, HiiDatabase);
3794880c2c94d100238b310579fbd95313893a5353fjcarsey    if (EFI_ERROR(Status)) {
3804ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey      ShellPrintHiiEx(
3814ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey        -1,
3824ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey        -1,
3834ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey        NULL,
3844880c2c94d100238b310579fbd95313893a5353fjcarsey        STRING_TOKEN(STR_GEN_HANDLE_NOT),
385bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah        gShellDriver1HiiHandle, L"drvcfg",
3864880c2c94d100238b310579fbd95313893a5353fjcarsey        ConvertHandleToHandleIndex(Handle),
3874880c2c94d100238b310579fbd95313893a5353fjcarsey        L"Device");
3884880c2c94d100238b310579fbd95313893a5353fjcarsey      ShellCloseFile(&FileHandle);
3894880c2c94d100238b310579fbd95313893a5353fjcarsey      return (SHELL_DEVICE_ERROR);
3904880c2c94d100238b310579fbd95313893a5353fjcarsey    }
3914880c2c94d100238b310579fbd95313893a5353fjcarsey    Status = HiiDatabase->UpdatePackageList(HiiDatabase, HiiHandle, MainBuffer);
3924880c2c94d100238b310579fbd95313893a5353fjcarsey    if (EFI_ERROR(Status)) {
3934880c2c94d100238b310579fbd95313893a5353fjcarsey      ShellPrintHiiEx(
3944880c2c94d100238b310579fbd95313893a5353fjcarsey        -1,
3954880c2c94d100238b310579fbd95313893a5353fjcarsey        -1,
3964880c2c94d100238b310579fbd95313893a5353fjcarsey        NULL,
397bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah        STRING_TOKEN(STR_GEN_UEFI_FUNC_WARN),
398bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah        gShellDriver1HiiHandle,
399bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah        L"drvcfg",
4004880c2c94d100238b310579fbd95313893a5353fjcarsey        L"HiiDatabase->UpdatePackageList",
4014880c2c94d100238b310579fbd95313893a5353fjcarsey        Status);
4024880c2c94d100238b310579fbd95313893a5353fjcarsey      return (SHELL_DEVICE_ERROR);
4034880c2c94d100238b310579fbd95313893a5353fjcarsey    }
4044880c2c94d100238b310579fbd95313893a5353fjcarsey  } else {
4054880c2c94d100238b310579fbd95313893a5353fjcarsey    //
4064880c2c94d100238b310579fbd95313893a5353fjcarsey    // we need to parse the buffer and try to match the device paths for each item to try to find it's device path.
4074880c2c94d100238b310579fbd95313893a5353fjcarsey    //
4084880c2c94d100238b310579fbd95313893a5353fjcarsey
4094880c2c94d100238b310579fbd95313893a5353fjcarsey    for (PackageListHeader = (EFI_HII_PACKAGE_LIST_HEADER*)MainBuffer
4104880c2c94d100238b310579fbd95313893a5353fjcarsey      ;  PackageListHeader != NULL && ((CHAR8*)PackageListHeader) < (((CHAR8*)MainBuffer)+MainBufferSize)
4114880c2c94d100238b310579fbd95313893a5353fjcarsey      ;  PackageListHeader = (EFI_HII_PACKAGE_LIST_HEADER*)(((CHAR8*)(PackageListHeader)) + PackageListHeader->PackageLength )) {
4124880c2c94d100238b310579fbd95313893a5353fjcarsey        for (PackageHeader = (EFI_HII_PACKAGE_HEADER*)(((CHAR8*)(PackageListHeader))+sizeof(EFI_HII_PACKAGE_LIST_HEADER))
4134880c2c94d100238b310579fbd95313893a5353fjcarsey          ; PackageHeader != NULL && ((CHAR8*)PackageHeader) < (((CHAR8*)MainBuffer)+MainBufferSize) && PackageHeader->Type != EFI_HII_PACKAGE_END
4144880c2c94d100238b310579fbd95313893a5353fjcarsey          ; PackageHeader = (EFI_HII_PACKAGE_HEADER*)(((CHAR8*)(PackageHeader))+PackageHeader->Length)) {
4154880c2c94d100238b310579fbd95313893a5353fjcarsey            if (PackageHeader->Type == EFI_HII_PACKAGE_DEVICE_PATH) {
4164880c2c94d100238b310579fbd95313893a5353fjcarsey              HiiHandle         = NULL;
4174880c2c94d100238b310579fbd95313893a5353fjcarsey              Status = FindHiiHandleViaDevPath((EFI_DEVICE_PATH_PROTOCOL*)(((CHAR8*)PackageHeader) + sizeof(EFI_HII_PACKAGE_HEADER)), &HiiHandle, HiiDatabase);
4184880c2c94d100238b310579fbd95313893a5353fjcarsey              if (EFI_ERROR(Status)) {
4194880c2c94d100238b310579fbd95313893a5353fjcarsey                //
4204880c2c94d100238b310579fbd95313893a5353fjcarsey                // print out an error.
4214880c2c94d100238b310579fbd95313893a5353fjcarsey                //
422863986b3c8e67736d361b68e293d01e6f92f825cRuiyu Ni                TempDevPathString = ConvertDevicePathToText((EFI_DEVICE_PATH_PROTOCOL*)(((CHAR8*)PackageHeader) + sizeof(EFI_HII_PACKAGE_HEADER)), TRUE, TRUE);
4234880c2c94d100238b310579fbd95313893a5353fjcarsey                ShellPrintHiiEx(
4244880c2c94d100238b310579fbd95313893a5353fjcarsey                  -1,
4254880c2c94d100238b310579fbd95313893a5353fjcarsey                  -1,
4264880c2c94d100238b310579fbd95313893a5353fjcarsey                  NULL,
4274880c2c94d100238b310579fbd95313893a5353fjcarsey                  STRING_TOKEN(STR_DRVCFG_IN_FILE_NF),
4284880c2c94d100238b310579fbd95313893a5353fjcarsey                  gShellDriver1HiiHandle,
4294880c2c94d100238b310579fbd95313893a5353fjcarsey                  TempDevPathString);
4304880c2c94d100238b310579fbd95313893a5353fjcarsey                SHELL_FREE_NON_NULL(TempDevPathString);
4314880c2c94d100238b310579fbd95313893a5353fjcarsey             } else {
4324880c2c94d100238b310579fbd95313893a5353fjcarsey                Status = HiiDatabase->UpdatePackageList(HiiDatabase, HiiHandle, PackageListHeader);
4334880c2c94d100238b310579fbd95313893a5353fjcarsey                if (EFI_ERROR(Status)) {
4344880c2c94d100238b310579fbd95313893a5353fjcarsey                  ShellPrintHiiEx(
4354880c2c94d100238b310579fbd95313893a5353fjcarsey                    -1,
4364880c2c94d100238b310579fbd95313893a5353fjcarsey                    -1,
4374880c2c94d100238b310579fbd95313893a5353fjcarsey                    NULL,
438bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah                    STRING_TOKEN(STR_GEN_UEFI_FUNC_WARN),
4394880c2c94d100238b310579fbd95313893a5353fjcarsey                    gShellDriver1HiiHandle,
440bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah                    L"drvcfg",
4414880c2c94d100238b310579fbd95313893a5353fjcarsey                    L"HiiDatabase->UpdatePackageList",
4424880c2c94d100238b310579fbd95313893a5353fjcarsey                    Status);
4434880c2c94d100238b310579fbd95313893a5353fjcarsey                  return (SHELL_DEVICE_ERROR);
4444880c2c94d100238b310579fbd95313893a5353fjcarsey                } else {
4454880c2c94d100238b310579fbd95313893a5353fjcarsey                  DevPath = (EFI_DEVICE_PATH_PROTOCOL*)(((CHAR8*)PackageHeader) + sizeof(EFI_HII_PACKAGE_HEADER));
4464880c2c94d100238b310579fbd95313893a5353fjcarsey                  gBS->LocateDevicePath(&gEfiHiiConfigAccessProtocolGuid, &DevPath, &Handle);
4474880c2c94d100238b310579fbd95313893a5353fjcarsey                  HandleIndex = ConvertHandleToHandleIndex(Handle);
4484880c2c94d100238b310579fbd95313893a5353fjcarsey                  ShellPrintHiiEx(
4494880c2c94d100238b310579fbd95313893a5353fjcarsey                    -1,
4504880c2c94d100238b310579fbd95313893a5353fjcarsey                    -1,
4514880c2c94d100238b310579fbd95313893a5353fjcarsey                    NULL,
4524880c2c94d100238b310579fbd95313893a5353fjcarsey                    STRING_TOKEN(STR_DRVCFG_DONE_HII),
4534880c2c94d100238b310579fbd95313893a5353fjcarsey                    gShellDriver1HiiHandle,
4544880c2c94d100238b310579fbd95313893a5353fjcarsey                    HandleIndex);
4554880c2c94d100238b310579fbd95313893a5353fjcarsey                }
4564880c2c94d100238b310579fbd95313893a5353fjcarsey              }
4574880c2c94d100238b310579fbd95313893a5353fjcarsey            }
4584880c2c94d100238b310579fbd95313893a5353fjcarsey        }
4594ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey    }
4604ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  }
4614880c2c94d100238b310579fbd95313893a5353fjcarsey
4624880c2c94d100238b310579fbd95313893a5353fjcarsey  SHELL_FREE_NON_NULL(MainBuffer);
4634880c2c94d100238b310579fbd95313893a5353fjcarsey
4644880c2c94d100238b310579fbd95313893a5353fjcarsey
4654880c2c94d100238b310579fbd95313893a5353fjcarsey  ShellPrintHiiEx(
4664880c2c94d100238b310579fbd95313893a5353fjcarsey    -1,
4674880c2c94d100238b310579fbd95313893a5353fjcarsey    -1,
4684880c2c94d100238b310579fbd95313893a5353fjcarsey    NULL,
4694880c2c94d100238b310579fbd95313893a5353fjcarsey    STRING_TOKEN(STR_DRVCFG_COMP),
4704880c2c94d100238b310579fbd95313893a5353fjcarsey    gShellDriver1HiiHandle);
4714ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  return (SHELL_SUCCESS);
4724ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey}
4734ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
4746a5aa4d6dc8240128ebc667919cc8f5d68541f45jcarsey/**
4756a5aa4d6dc8240128ebc667919cc8f5d68541f45jcarsey  Present a requested action to the user.
4766a5aa4d6dc8240128ebc667919cc8f5d68541f45jcarsey
4776a5aa4d6dc8240128ebc667919cc8f5d68541f45jcarsey  @param[in] DriverImageHandle  The handle for the driver to configure.
4786a5aa4d6dc8240128ebc667919cc8f5d68541f45jcarsey  @param[in] ControllerHandle   The handle of the device being managed by the Driver specified.
4796a5aa4d6dc8240128ebc667919cc8f5d68541f45jcarsey  @param[in] ChildHandle        The handle of a child device of the specified device.
4806a5aa4d6dc8240128ebc667919cc8f5d68541f45jcarsey  @param[in] ActionRequired     The required HII action.
4816a5aa4d6dc8240128ebc667919cc8f5d68541f45jcarsey
4826a5aa4d6dc8240128ebc667919cc8f5d68541f45jcarsey  @retval SHELL_INVALID_PARAMETER   A parameter has a invalid value.
4836a5aa4d6dc8240128ebc667919cc8f5d68541f45jcarsey**/
4844880c2c94d100238b310579fbd95313893a5353fjcarseyEFI_STATUS
4854880c2c94d100238b310579fbd95313893a5353fjcarseyShellCmdDriverConfigurationProcessActionRequired (
4864880c2c94d100238b310579fbd95313893a5353fjcarsey  EFI_HANDLE                                DriverImageHandle,
4874880c2c94d100238b310579fbd95313893a5353fjcarsey  EFI_HANDLE                                ControllerHandle,
4884880c2c94d100238b310579fbd95313893a5353fjcarsey  EFI_HANDLE                                ChildHandle,
4894880c2c94d100238b310579fbd95313893a5353fjcarsey  EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED  ActionRequired
4904880c2c94d100238b310579fbd95313893a5353fjcarsey  )
4914880c2c94d100238b310579fbd95313893a5353fjcarsey{
4924880c2c94d100238b310579fbd95313893a5353fjcarsey  EFI_HANDLE  ConnectControllerContextOverride[2];
4934880c2c94d100238b310579fbd95313893a5353fjcarsey
4944880c2c94d100238b310579fbd95313893a5353fjcarsey  switch (ActionRequired) {
4954880c2c94d100238b310579fbd95313893a5353fjcarsey  case EfiDriverConfigurationActionNone:
4964880c2c94d100238b310579fbd95313893a5353fjcarsey    ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_DRVCFG_NONE), gShellDriver1HiiHandle);
4974880c2c94d100238b310579fbd95313893a5353fjcarsey    break;
4984880c2c94d100238b310579fbd95313893a5353fjcarsey
4994880c2c94d100238b310579fbd95313893a5353fjcarsey  case EfiDriverConfigurationActionStopController:
5004880c2c94d100238b310579fbd95313893a5353fjcarsey    ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_DRVCFG_STOP), gShellDriver1HiiHandle);
5014880c2c94d100238b310579fbd95313893a5353fjcarsey    ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_DRVCFG_ENTER_S), gShellDriver1HiiHandle, L"stop controller");
5024880c2c94d100238b310579fbd95313893a5353fjcarsey    ShellPromptForResponse(ShellPromptResponseTypeEnterContinue, NULL, NULL);
5034880c2c94d100238b310579fbd95313893a5353fjcarsey
5044880c2c94d100238b310579fbd95313893a5353fjcarsey    gBS->DisconnectController (ControllerHandle, DriverImageHandle, ChildHandle);
5054880c2c94d100238b310579fbd95313893a5353fjcarsey    ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_DRVCFG_CTLR_S), gShellDriver1HiiHandle, L"stopped");
5064880c2c94d100238b310579fbd95313893a5353fjcarsey    break;
5074880c2c94d100238b310579fbd95313893a5353fjcarsey
5084880c2c94d100238b310579fbd95313893a5353fjcarsey  case EfiDriverConfigurationActionRestartController:
5094880c2c94d100238b310579fbd95313893a5353fjcarsey    ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_DRVCFG_RESTART_S), gShellDriver1HiiHandle, L"controller");
5104880c2c94d100238b310579fbd95313893a5353fjcarsey    ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_DRVCFG_ENTER_S), gShellDriver1HiiHandle, L"restart controller");
5114880c2c94d100238b310579fbd95313893a5353fjcarsey    ShellPromptForResponse(ShellPromptResponseTypeEnterContinue, NULL, NULL);
5124880c2c94d100238b310579fbd95313893a5353fjcarsey
5134880c2c94d100238b310579fbd95313893a5353fjcarsey    gBS->DisconnectController (ControllerHandle, DriverImageHandle, ChildHandle);
5144880c2c94d100238b310579fbd95313893a5353fjcarsey    ConnectControllerContextOverride[0]  = DriverImageHandle;
5154880c2c94d100238b310579fbd95313893a5353fjcarsey    ConnectControllerContextOverride[1]  = NULL;
5164880c2c94d100238b310579fbd95313893a5353fjcarsey    gBS->ConnectController (ControllerHandle, ConnectControllerContextOverride, NULL, TRUE);
5174880c2c94d100238b310579fbd95313893a5353fjcarsey    ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_DRVCFG_CTLR_S), gShellDriver1HiiHandle, L"restarted");
5184880c2c94d100238b310579fbd95313893a5353fjcarsey    break;
5194880c2c94d100238b310579fbd95313893a5353fjcarsey
5204880c2c94d100238b310579fbd95313893a5353fjcarsey  case EfiDriverConfigurationActionRestartPlatform:
5214880c2c94d100238b310579fbd95313893a5353fjcarsey    ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_DRVCFG_RESTART_S), gShellDriver1HiiHandle, L"platform");
5224880c2c94d100238b310579fbd95313893a5353fjcarsey    ShellPrintHiiEx(-1,-1,NULL,STRING_TOKEN (STR_DRVCFG_ENTER_S), gShellDriver1HiiHandle, L"restart platform");
5234880c2c94d100238b310579fbd95313893a5353fjcarsey    ShellPromptForResponse(ShellPromptResponseTypeEnterContinue, NULL, NULL);
5244880c2c94d100238b310579fbd95313893a5353fjcarsey
5254880c2c94d100238b310579fbd95313893a5353fjcarsey    gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);
5264880c2c94d100238b310579fbd95313893a5353fjcarsey    break;
5274880c2c94d100238b310579fbd95313893a5353fjcarsey
5284880c2c94d100238b310579fbd95313893a5353fjcarsey  default:
5294880c2c94d100238b310579fbd95313893a5353fjcarsey    return (EFI_INVALID_PARAMETER);
5304880c2c94d100238b310579fbd95313893a5353fjcarsey  }
5314880c2c94d100238b310579fbd95313893a5353fjcarsey
5324880c2c94d100238b310579fbd95313893a5353fjcarsey  return EFI_SUCCESS;
5334880c2c94d100238b310579fbd95313893a5353fjcarsey}
5344880c2c94d100238b310579fbd95313893a5353fjcarsey
5356a5aa4d6dc8240128ebc667919cc8f5d68541f45jcarsey/**
5366a5aa4d6dc8240128ebc667919cc8f5d68541f45jcarsey  Do the configuration in an environment without HII.
5376a5aa4d6dc8240128ebc667919cc8f5d68541f45jcarsey
5386a5aa4d6dc8240128ebc667919cc8f5d68541f45jcarsey  @param[in] Language           The language code.
5396a5aa4d6dc8240128ebc667919cc8f5d68541f45jcarsey  @param[in] ForceDefaults      TRUE to force defaults, FALSE otherwise.
5406a5aa4d6dc8240128ebc667919cc8f5d68541f45jcarsey  @param[in] DefaultType        If ForceDefaults is TRUE, specifies the default type.
5416a5aa4d6dc8240128ebc667919cc8f5d68541f45jcarsey  @param[in] AllChildren        TRUE to configure all children, FALSE otherwise.
5426a5aa4d6dc8240128ebc667919cc8f5d68541f45jcarsey  @param[in] ValidateOptions    TRUE to validate existing options, FALSE otherwise.
5436a5aa4d6dc8240128ebc667919cc8f5d68541f45jcarsey  @param[in] SetOptions         TRUE to set options, FALSE otherwise.
5446a5aa4d6dc8240128ebc667919cc8f5d68541f45jcarsey  @param[in] DriverImageHandle  The handle for the driver to configure.
5456a5aa4d6dc8240128ebc667919cc8f5d68541f45jcarsey  @param[in] DeviceHandle       The handle of the device being managed by the Driver specified.
5466a5aa4d6dc8240128ebc667919cc8f5d68541f45jcarsey  @param[in] ChildHandle        The handle of a child device of the specified device.
5476a5aa4d6dc8240128ebc667919cc8f5d68541f45jcarsey
5486a5aa4d6dc8240128ebc667919cc8f5d68541f45jcarsey  @retval SHELL_NOT_FOUND           A specified handle could not be found.
5496a5aa4d6dc8240128ebc667919cc8f5d68541f45jcarsey  @retval SHELL_INVALID_PARAMETER   A parameter has a invalid value.
5506a5aa4d6dc8240128ebc667919cc8f5d68541f45jcarsey**/
5514880c2c94d100238b310579fbd95313893a5353fjcarseySHELL_STATUS
5524880c2c94d100238b310579fbd95313893a5353fjcarseyPreHiiDrvCfg (
5534880c2c94d100238b310579fbd95313893a5353fjcarsey  IN CONST CHAR8    *Language,
5544880c2c94d100238b310579fbd95313893a5353fjcarsey  IN BOOLEAN        ForceDefaults,
5554880c2c94d100238b310579fbd95313893a5353fjcarsey  IN UINT32         DefaultType,
5564880c2c94d100238b310579fbd95313893a5353fjcarsey  IN BOOLEAN        AllChildren,
5574880c2c94d100238b310579fbd95313893a5353fjcarsey  IN BOOLEAN        ValidateOptions,
5584880c2c94d100238b310579fbd95313893a5353fjcarsey  IN BOOLEAN        SetOptions,
5594880c2c94d100238b310579fbd95313893a5353fjcarsey  IN EFI_HANDLE     DriverImageHandle,
5604880c2c94d100238b310579fbd95313893a5353fjcarsey  IN EFI_HANDLE     DeviceHandle,
5614880c2c94d100238b310579fbd95313893a5353fjcarsey  IN EFI_HANDLE     ChildHandle
5624880c2c94d100238b310579fbd95313893a5353fjcarsey  )
5634880c2c94d100238b310579fbd95313893a5353fjcarsey{
5644880c2c94d100238b310579fbd95313893a5353fjcarsey  EFI_STATUS                                Status;
5654880c2c94d100238b310579fbd95313893a5353fjcarsey  SHELL_STATUS                              ShellStatus;
5664880c2c94d100238b310579fbd95313893a5353fjcarsey  UINTN                                     OuterLoopCounter;
5674880c2c94d100238b310579fbd95313893a5353fjcarsey  CHAR8                                     *BestLanguage;
5684880c2c94d100238b310579fbd95313893a5353fjcarsey  UINTN                                     DriverImageHandleCount;
5694880c2c94d100238b310579fbd95313893a5353fjcarsey  EFI_HANDLE                                *DriverImageHandleBuffer;
5704880c2c94d100238b310579fbd95313893a5353fjcarsey  UINTN                                     HandleCount;
5714880c2c94d100238b310579fbd95313893a5353fjcarsey  EFI_HANDLE                                *HandleBuffer;
5724880c2c94d100238b310579fbd95313893a5353fjcarsey  UINTN                                     *HandleType;
5734880c2c94d100238b310579fbd95313893a5353fjcarsey  UINTN                                     LoopCounter;
5744880c2c94d100238b310579fbd95313893a5353fjcarsey  UINTN                                     ChildIndex;
5754880c2c94d100238b310579fbd95313893a5353fjcarsey  UINTN                                     ChildHandleCount;
5764880c2c94d100238b310579fbd95313893a5353fjcarsey  EFI_HANDLE                                *ChildHandleBuffer;
5774880c2c94d100238b310579fbd95313893a5353fjcarsey  UINTN                                     *ChildHandleType;
5784880c2c94d100238b310579fbd95313893a5353fjcarsey  EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED  ActionRequired;
5794880c2c94d100238b310579fbd95313893a5353fjcarsey  EFI_DRIVER_CONFIGURATION_PROTOCOL         *DriverConfiguration;
5804880c2c94d100238b310579fbd95313893a5353fjcarsey  BOOLEAN                                   Iso639Language;
5814880c2c94d100238b310579fbd95313893a5353fjcarsey  UINTN                                     HandleIndex1;
5824880c2c94d100238b310579fbd95313893a5353fjcarsey  UINTN                                     HandleIndex2;
5834880c2c94d100238b310579fbd95313893a5353fjcarsey  UINTN                                     HandleIndex3;
5844880c2c94d100238b310579fbd95313893a5353fjcarsey
5854880c2c94d100238b310579fbd95313893a5353fjcarsey  ShellStatus = SHELL_SUCCESS;
5864880c2c94d100238b310579fbd95313893a5353fjcarsey
5874880c2c94d100238b310579fbd95313893a5353fjcarsey  if (ChildHandle == NULL && AllChildren) {
5884880c2c94d100238b310579fbd95313893a5353fjcarsey    SetOptions = FALSE;
5894880c2c94d100238b310579fbd95313893a5353fjcarsey  }
5904880c2c94d100238b310579fbd95313893a5353fjcarsey
5914880c2c94d100238b310579fbd95313893a5353fjcarsey  if (ForceDefaults) {
5924880c2c94d100238b310579fbd95313893a5353fjcarsey    ShellPrintHiiEx(
5934880c2c94d100238b310579fbd95313893a5353fjcarsey      -1,
5944880c2c94d100238b310579fbd95313893a5353fjcarsey      -1,
5954880c2c94d100238b310579fbd95313893a5353fjcarsey      NULL,
5964880c2c94d100238b310579fbd95313893a5353fjcarsey      STRING_TOKEN (STR_DRVCFG_FORCE_D),
5974880c2c94d100238b310579fbd95313893a5353fjcarsey      gShellDriver1HiiHandle,
5984880c2c94d100238b310579fbd95313893a5353fjcarsey      DefaultType);
5994880c2c94d100238b310579fbd95313893a5353fjcarsey  } else if (ValidateOptions) {
6004880c2c94d100238b310579fbd95313893a5353fjcarsey    ShellPrintHiiEx(
6014880c2c94d100238b310579fbd95313893a5353fjcarsey      -1,
6024880c2c94d100238b310579fbd95313893a5353fjcarsey      -1,
6034880c2c94d100238b310579fbd95313893a5353fjcarsey      NULL,
6044880c2c94d100238b310579fbd95313893a5353fjcarsey      STRING_TOKEN (STR_DRVCFG_VALIDATE),
6054880c2c94d100238b310579fbd95313893a5353fjcarsey      gShellDriver1HiiHandle);
6064880c2c94d100238b310579fbd95313893a5353fjcarsey  } else if (SetOptions) {
6074880c2c94d100238b310579fbd95313893a5353fjcarsey    ShellPrintHiiEx(
6084880c2c94d100238b310579fbd95313893a5353fjcarsey      -1,
6094880c2c94d100238b310579fbd95313893a5353fjcarsey      -1,
6104880c2c94d100238b310579fbd95313893a5353fjcarsey      NULL,
6114880c2c94d100238b310579fbd95313893a5353fjcarsey      STRING_TOKEN (STR_DRVCFG_SET),
6124880c2c94d100238b310579fbd95313893a5353fjcarsey      gShellDriver1HiiHandle);
6134880c2c94d100238b310579fbd95313893a5353fjcarsey  }
6144880c2c94d100238b310579fbd95313893a5353fjcarsey
6154880c2c94d100238b310579fbd95313893a5353fjcarsey  if (DriverImageHandle == 0) {
6164880c2c94d100238b310579fbd95313893a5353fjcarsey    DriverImageHandleBuffer = GetHandleListByProtocolList(CfgGuidList);
6174880c2c94d100238b310579fbd95313893a5353fjcarsey    if (DriverImageHandleBuffer == NULL) {
6184880c2c94d100238b310579fbd95313893a5353fjcarsey      ShellStatus = SHELL_NOT_FOUND;
6194880c2c94d100238b310579fbd95313893a5353fjcarsey      goto Done;
6204880c2c94d100238b310579fbd95313893a5353fjcarsey    }
6214880c2c94d100238b310579fbd95313893a5353fjcarsey    for (
6224880c2c94d100238b310579fbd95313893a5353fjcarsey      HandleBuffer = DriverImageHandleBuffer, DriverImageHandleCount = 0
6234880c2c94d100238b310579fbd95313893a5353fjcarsey      ; HandleBuffer != NULL && *HandleBuffer != NULL
6244880c2c94d100238b310579fbd95313893a5353fjcarsey      ; HandleBuffer++,DriverImageHandleCount++);
6254880c2c94d100238b310579fbd95313893a5353fjcarsey  } else {
6264880c2c94d100238b310579fbd95313893a5353fjcarsey    DriverImageHandleCount = 1;
6274880c2c94d100238b310579fbd95313893a5353fjcarsey    //
6284880c2c94d100238b310579fbd95313893a5353fjcarsey    // Allocate buffer to hold the image handle so as to
6294880c2c94d100238b310579fbd95313893a5353fjcarsey    // keep consistent with the above clause
6304880c2c94d100238b310579fbd95313893a5353fjcarsey    //
6314880c2c94d100238b310579fbd95313893a5353fjcarsey    DriverImageHandleBuffer = AllocatePool (sizeof (EFI_HANDLE));
6324880c2c94d100238b310579fbd95313893a5353fjcarsey    ASSERT (DriverImageHandleBuffer);
6334880c2c94d100238b310579fbd95313893a5353fjcarsey    DriverImageHandleBuffer[0] = DriverImageHandle;
6344880c2c94d100238b310579fbd95313893a5353fjcarsey  }
6354880c2c94d100238b310579fbd95313893a5353fjcarsey
6364880c2c94d100238b310579fbd95313893a5353fjcarsey  for (OuterLoopCounter = 0; OuterLoopCounter < DriverImageHandleCount; OuterLoopCounter++) {
6374880c2c94d100238b310579fbd95313893a5353fjcarsey    Iso639Language = FALSE;
6384880c2c94d100238b310579fbd95313893a5353fjcarsey    Status = gBS->OpenProtocol (
6394880c2c94d100238b310579fbd95313893a5353fjcarsey                  DriverImageHandleBuffer[OuterLoopCounter],
6404880c2c94d100238b310579fbd95313893a5353fjcarsey                  &gEfiDriverConfiguration2ProtocolGuid,
6414880c2c94d100238b310579fbd95313893a5353fjcarsey                  (VOID **) &DriverConfiguration,
6424880c2c94d100238b310579fbd95313893a5353fjcarsey                  NULL,
6434880c2c94d100238b310579fbd95313893a5353fjcarsey                  NULL,
6444880c2c94d100238b310579fbd95313893a5353fjcarsey                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
6454880c2c94d100238b310579fbd95313893a5353fjcarsey                  );
6464880c2c94d100238b310579fbd95313893a5353fjcarsey    if (EFI_ERROR (Status)) {
6474880c2c94d100238b310579fbd95313893a5353fjcarsey      Iso639Language = TRUE;
6484880c2c94d100238b310579fbd95313893a5353fjcarsey      Status = gBS->OpenProtocol (
6494880c2c94d100238b310579fbd95313893a5353fjcarsey                    DriverImageHandleBuffer[OuterLoopCounter],
6504880c2c94d100238b310579fbd95313893a5353fjcarsey                    &gEfiDriverConfigurationProtocolGuid,
6514880c2c94d100238b310579fbd95313893a5353fjcarsey                    (VOID **) &DriverConfiguration,
6524880c2c94d100238b310579fbd95313893a5353fjcarsey                    NULL,
6534880c2c94d100238b310579fbd95313893a5353fjcarsey                    NULL,
6544880c2c94d100238b310579fbd95313893a5353fjcarsey                    EFI_OPEN_PROTOCOL_GET_PROTOCOL
6554880c2c94d100238b310579fbd95313893a5353fjcarsey                    );
6564880c2c94d100238b310579fbd95313893a5353fjcarsey    }
6574880c2c94d100238b310579fbd95313893a5353fjcarsey    if (EFI_ERROR (Status)) {
6584880c2c94d100238b310579fbd95313893a5353fjcarsey//      ShellPrintHiiEx(
6594880c2c94d100238b310579fbd95313893a5353fjcarsey//        -1,
6604880c2c94d100238b310579fbd95313893a5353fjcarsey//        -1,
6614880c2c94d100238b310579fbd95313893a5353fjcarsey//        NULL,
6624880c2c94d100238b310579fbd95313893a5353fjcarsey//        STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT),
6634880c2c94d100238b310579fbd95313893a5353fjcarsey//        gShellDriver1HiiHandle,
6644880c2c94d100238b310579fbd95313893a5353fjcarsey//        ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter])
6654880c2c94d100238b310579fbd95313893a5353fjcarsey//        );
6664880c2c94d100238b310579fbd95313893a5353fjcarsey      ShellStatus = SHELL_UNSUPPORTED;
6674880c2c94d100238b310579fbd95313893a5353fjcarsey      continue;
6684880c2c94d100238b310579fbd95313893a5353fjcarsey    }
6694880c2c94d100238b310579fbd95313893a5353fjcarsey
6704880c2c94d100238b310579fbd95313893a5353fjcarsey    BestLanguage = GetBestLanguage (
6714880c2c94d100238b310579fbd95313893a5353fjcarsey                          DriverConfiguration->SupportedLanguages,
6724880c2c94d100238b310579fbd95313893a5353fjcarsey                          Iso639Language,
6734880c2c94d100238b310579fbd95313893a5353fjcarsey                          Language!=NULL?Language:"",
6744880c2c94d100238b310579fbd95313893a5353fjcarsey                          DriverConfiguration->SupportedLanguages,
6754880c2c94d100238b310579fbd95313893a5353fjcarsey                          NULL
6764880c2c94d100238b310579fbd95313893a5353fjcarsey                          );
6774880c2c94d100238b310579fbd95313893a5353fjcarsey    if (BestLanguage == NULL) {
6784880c2c94d100238b310579fbd95313893a5353fjcarsey      ShellPrintHiiEx(
6794880c2c94d100238b310579fbd95313893a5353fjcarsey        -1,
6804880c2c94d100238b310579fbd95313893a5353fjcarsey        -1,
6814880c2c94d100238b310579fbd95313893a5353fjcarsey        NULL,
682bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah        STRING_TOKEN (STR_GEN_NO_VALUE),
6834880c2c94d100238b310579fbd95313893a5353fjcarsey        gShellDriver1HiiHandle,
684bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah        L"drvcfg",
6854880c2c94d100238b310579fbd95313893a5353fjcarsey        L"-l"
6864880c2c94d100238b310579fbd95313893a5353fjcarsey        );
6874880c2c94d100238b310579fbd95313893a5353fjcarsey      ShellStatus = SHELL_INVALID_PARAMETER;
6884880c2c94d100238b310579fbd95313893a5353fjcarsey      continue;
6894880c2c94d100238b310579fbd95313893a5353fjcarsey    }
6904880c2c94d100238b310579fbd95313893a5353fjcarsey
6914880c2c94d100238b310579fbd95313893a5353fjcarsey    Status = ParseHandleDatabaseByRelationshipWithType (
6924880c2c94d100238b310579fbd95313893a5353fjcarsey              DriverImageHandleBuffer[OuterLoopCounter],
6934880c2c94d100238b310579fbd95313893a5353fjcarsey              NULL,
6944880c2c94d100238b310579fbd95313893a5353fjcarsey              &HandleCount,
6954880c2c94d100238b310579fbd95313893a5353fjcarsey              &HandleBuffer,
6964880c2c94d100238b310579fbd95313893a5353fjcarsey              &HandleType
6974880c2c94d100238b310579fbd95313893a5353fjcarsey              );
6984880c2c94d100238b310579fbd95313893a5353fjcarsey    if (EFI_ERROR (Status)) {
6994880c2c94d100238b310579fbd95313893a5353fjcarsey      continue;
7004880c2c94d100238b310579fbd95313893a5353fjcarsey    }
7014880c2c94d100238b310579fbd95313893a5353fjcarsey
7024880c2c94d100238b310579fbd95313893a5353fjcarsey    if (SetOptions && DeviceHandle == NULL) {
7034880c2c94d100238b310579fbd95313893a5353fjcarsey
7044880c2c94d100238b310579fbd95313893a5353fjcarsey      gST->ConOut->ClearScreen (gST->ConOut);
7054880c2c94d100238b310579fbd95313893a5353fjcarsey      Status = DriverConfiguration->SetOptions (
7064880c2c94d100238b310579fbd95313893a5353fjcarsey                                      DriverConfiguration,
7074880c2c94d100238b310579fbd95313893a5353fjcarsey                                      NULL,
7084880c2c94d100238b310579fbd95313893a5353fjcarsey                                      NULL,
7094880c2c94d100238b310579fbd95313893a5353fjcarsey                                      BestLanguage,
7104880c2c94d100238b310579fbd95313893a5353fjcarsey                                      &ActionRequired
7114880c2c94d100238b310579fbd95313893a5353fjcarsey                                      );
7124880c2c94d100238b310579fbd95313893a5353fjcarsey      gST->ConOut->ClearScreen (gST->ConOut);
7134880c2c94d100238b310579fbd95313893a5353fjcarsey
7144880c2c94d100238b310579fbd95313893a5353fjcarsey      ShellPrintHiiEx(
7154880c2c94d100238b310579fbd95313893a5353fjcarsey        -1,
7164880c2c94d100238b310579fbd95313893a5353fjcarsey        -1,
7174880c2c94d100238b310579fbd95313893a5353fjcarsey        NULL,
7184880c2c94d100238b310579fbd95313893a5353fjcarsey        STRING_TOKEN (STR_DRVCFG_ALL_LANG),
7194880c2c94d100238b310579fbd95313893a5353fjcarsey        gShellDriver1HiiHandle,
7204880c2c94d100238b310579fbd95313893a5353fjcarsey        ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]),
7214880c2c94d100238b310579fbd95313893a5353fjcarsey        DriverConfiguration->SupportedLanguages
7224880c2c94d100238b310579fbd95313893a5353fjcarsey        );
7234880c2c94d100238b310579fbd95313893a5353fjcarsey      if (!EFI_ERROR (Status)) {
7244880c2c94d100238b310579fbd95313893a5353fjcarsey        ShellPrintHiiEx(
7254880c2c94d100238b310579fbd95313893a5353fjcarsey          -1,
7264880c2c94d100238b310579fbd95313893a5353fjcarsey          -1,
7274880c2c94d100238b310579fbd95313893a5353fjcarsey          NULL,
7284880c2c94d100238b310579fbd95313893a5353fjcarsey          STRING_TOKEN (STR_DRVCFG_OPTIONS_SET),
7294880c2c94d100238b310579fbd95313893a5353fjcarsey          gShellDriver1HiiHandle);
7304880c2c94d100238b310579fbd95313893a5353fjcarsey        for (LoopCounter = 0; LoopCounter < HandleCount; LoopCounter++) {
7314880c2c94d100238b310579fbd95313893a5353fjcarsey          if ((HandleType[LoopCounter] & HR_CONTROLLER_HANDLE) == HR_CONTROLLER_HANDLE) {
7324880c2c94d100238b310579fbd95313893a5353fjcarsey            ShellCmdDriverConfigurationProcessActionRequired (
7334880c2c94d100238b310579fbd95313893a5353fjcarsey              DriverImageHandleBuffer[OuterLoopCounter],
7344880c2c94d100238b310579fbd95313893a5353fjcarsey              HandleBuffer[LoopCounter],
7354880c2c94d100238b310579fbd95313893a5353fjcarsey              NULL,
7364880c2c94d100238b310579fbd95313893a5353fjcarsey              ActionRequired
7374880c2c94d100238b310579fbd95313893a5353fjcarsey              );
7384880c2c94d100238b310579fbd95313893a5353fjcarsey          }
7394880c2c94d100238b310579fbd95313893a5353fjcarsey        }
7404880c2c94d100238b310579fbd95313893a5353fjcarsey      } else {
7414880c2c94d100238b310579fbd95313893a5353fjcarsey        ShellPrintHiiEx(
7424880c2c94d100238b310579fbd95313893a5353fjcarsey          -1,
7434880c2c94d100238b310579fbd95313893a5353fjcarsey          -1,
7444880c2c94d100238b310579fbd95313893a5353fjcarsey          NULL,
7454880c2c94d100238b310579fbd95313893a5353fjcarsey          STRING_TOKEN (STR_DRVCFG_NOT_SET),
7464880c2c94d100238b310579fbd95313893a5353fjcarsey          gShellDriver1HiiHandle,
7474880c2c94d100238b310579fbd95313893a5353fjcarsey          Status);
7484880c2c94d100238b310579fbd95313893a5353fjcarsey      }
7494880c2c94d100238b310579fbd95313893a5353fjcarsey      continue;
7504880c2c94d100238b310579fbd95313893a5353fjcarsey    }
7514880c2c94d100238b310579fbd95313893a5353fjcarsey
7524880c2c94d100238b310579fbd95313893a5353fjcarsey    for (LoopCounter = 0; LoopCounter < HandleCount; LoopCounter++) {
7534880c2c94d100238b310579fbd95313893a5353fjcarsey      if ((HandleType[LoopCounter] & HR_CONTROLLER_HANDLE) != HR_CONTROLLER_HANDLE) {
7544880c2c94d100238b310579fbd95313893a5353fjcarsey        continue;
7554880c2c94d100238b310579fbd95313893a5353fjcarsey      }
7564880c2c94d100238b310579fbd95313893a5353fjcarsey      if (DeviceHandle != NULL && DeviceHandle != HandleBuffer[LoopCounter]) {
7574880c2c94d100238b310579fbd95313893a5353fjcarsey        continue;
7584880c2c94d100238b310579fbd95313893a5353fjcarsey      }
7594880c2c94d100238b310579fbd95313893a5353fjcarsey      if (ChildHandle == NULL) {
7604880c2c94d100238b310579fbd95313893a5353fjcarsey        HandleIndex1 = ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]);
7614880c2c94d100238b310579fbd95313893a5353fjcarsey        HandleIndex2 = ConvertHandleToHandleIndex (HandleBuffer[LoopCounter]);
7624880c2c94d100238b310579fbd95313893a5353fjcarsey        ShellPrintHiiEx(
7634880c2c94d100238b310579fbd95313893a5353fjcarsey          -1,
7644880c2c94d100238b310579fbd95313893a5353fjcarsey          -1,
7654880c2c94d100238b310579fbd95313893a5353fjcarsey          NULL,
7664880c2c94d100238b310579fbd95313893a5353fjcarsey          STRING_TOKEN (STR_DRVCFG_CTRL_LANG),
7674880c2c94d100238b310579fbd95313893a5353fjcarsey          gShellDriver1HiiHandle,
7684880c2c94d100238b310579fbd95313893a5353fjcarsey          HandleIndex1,
7694880c2c94d100238b310579fbd95313893a5353fjcarsey          HandleIndex2,
7704880c2c94d100238b310579fbd95313893a5353fjcarsey          DriverConfiguration->SupportedLanguages
7714880c2c94d100238b310579fbd95313893a5353fjcarsey          );
7724880c2c94d100238b310579fbd95313893a5353fjcarsey
7734880c2c94d100238b310579fbd95313893a5353fjcarsey        if (ForceDefaults) {
7744880c2c94d100238b310579fbd95313893a5353fjcarsey          Status = DriverConfiguration->ForceDefaults (
7754880c2c94d100238b310579fbd95313893a5353fjcarsey                                          DriverConfiguration,
7764880c2c94d100238b310579fbd95313893a5353fjcarsey                                          HandleBuffer[LoopCounter],
7774880c2c94d100238b310579fbd95313893a5353fjcarsey                                          NULL,
7784880c2c94d100238b310579fbd95313893a5353fjcarsey                                          DefaultType,
7794880c2c94d100238b310579fbd95313893a5353fjcarsey                                          &ActionRequired
7804880c2c94d100238b310579fbd95313893a5353fjcarsey                                          );
7814880c2c94d100238b310579fbd95313893a5353fjcarsey
7824880c2c94d100238b310579fbd95313893a5353fjcarsey          if (!EFI_ERROR (Status)) {
7834880c2c94d100238b310579fbd95313893a5353fjcarsey            ShellPrintHiiEx(
7844880c2c94d100238b310579fbd95313893a5353fjcarsey              -1,
7854880c2c94d100238b310579fbd95313893a5353fjcarsey              -1,
7864880c2c94d100238b310579fbd95313893a5353fjcarsey              NULL,
7874880c2c94d100238b310579fbd95313893a5353fjcarsey              STRING_TOKEN (STR_DRVCFG_DEF_FORCED),
7884880c2c94d100238b310579fbd95313893a5353fjcarsey              gShellDriver1HiiHandle);
7894880c2c94d100238b310579fbd95313893a5353fjcarsey            ShellCmdDriverConfigurationProcessActionRequired (
7904880c2c94d100238b310579fbd95313893a5353fjcarsey              DriverImageHandleBuffer[OuterLoopCounter],
7914880c2c94d100238b310579fbd95313893a5353fjcarsey              HandleBuffer[LoopCounter],
7924880c2c94d100238b310579fbd95313893a5353fjcarsey              NULL,
7934880c2c94d100238b310579fbd95313893a5353fjcarsey              ActionRequired
7944880c2c94d100238b310579fbd95313893a5353fjcarsey              );
7954880c2c94d100238b310579fbd95313893a5353fjcarsey          } else {
7964880c2c94d100238b310579fbd95313893a5353fjcarsey            ShellPrintHiiEx(
7974880c2c94d100238b310579fbd95313893a5353fjcarsey              -1,
7984880c2c94d100238b310579fbd95313893a5353fjcarsey              -1,
7994880c2c94d100238b310579fbd95313893a5353fjcarsey              NULL,
8004880c2c94d100238b310579fbd95313893a5353fjcarsey              STRING_TOKEN (STR_DRVCFG_FORCE_FAILED),
8014880c2c94d100238b310579fbd95313893a5353fjcarsey              gShellDriver1HiiHandle,
8024880c2c94d100238b310579fbd95313893a5353fjcarsey              Status);
8034880c2c94d100238b310579fbd95313893a5353fjcarsey           ShellStatus = SHELL_DEVICE_ERROR;
8044880c2c94d100238b310579fbd95313893a5353fjcarsey         }
8054880c2c94d100238b310579fbd95313893a5353fjcarsey        } else if (ValidateOptions) {
8064880c2c94d100238b310579fbd95313893a5353fjcarsey          Status = DriverConfiguration->OptionsValid (
8074880c2c94d100238b310579fbd95313893a5353fjcarsey                                          DriverConfiguration,
8084880c2c94d100238b310579fbd95313893a5353fjcarsey                                          HandleBuffer[LoopCounter],
8094880c2c94d100238b310579fbd95313893a5353fjcarsey                                          NULL
8104880c2c94d100238b310579fbd95313893a5353fjcarsey                                          );
8114880c2c94d100238b310579fbd95313893a5353fjcarsey
8124880c2c94d100238b310579fbd95313893a5353fjcarsey          if (!EFI_ERROR (Status)) {
8134880c2c94d100238b310579fbd95313893a5353fjcarsey            ShellPrintHiiEx(
8144880c2c94d100238b310579fbd95313893a5353fjcarsey              -1,
8154880c2c94d100238b310579fbd95313893a5353fjcarsey              -1,
8164880c2c94d100238b310579fbd95313893a5353fjcarsey              NULL,
8174880c2c94d100238b310579fbd95313893a5353fjcarsey              STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID),
8184880c2c94d100238b310579fbd95313893a5353fjcarsey              gShellDriver1HiiHandle);
8194880c2c94d100238b310579fbd95313893a5353fjcarsey          } else {
8204880c2c94d100238b310579fbd95313893a5353fjcarsey            ShellPrintHiiEx(
8214880c2c94d100238b310579fbd95313893a5353fjcarsey              -1,
8224880c2c94d100238b310579fbd95313893a5353fjcarsey              -1,
8234880c2c94d100238b310579fbd95313893a5353fjcarsey              NULL,
8244880c2c94d100238b310579fbd95313893a5353fjcarsey              STRING_TOKEN (STR_DRVCFG_OPTIONS_INV),
8254880c2c94d100238b310579fbd95313893a5353fjcarsey              gShellDriver1HiiHandle,
8264880c2c94d100238b310579fbd95313893a5353fjcarsey              Status);
8274880c2c94d100238b310579fbd95313893a5353fjcarsey            ShellStatus = SHELL_DEVICE_ERROR;
8284880c2c94d100238b310579fbd95313893a5353fjcarsey          }
8294880c2c94d100238b310579fbd95313893a5353fjcarsey        } else if (SetOptions) {
8304880c2c94d100238b310579fbd95313893a5353fjcarsey          gST->ConOut->ClearScreen (gST->ConOut);
8314880c2c94d100238b310579fbd95313893a5353fjcarsey          Status = DriverConfiguration->SetOptions (
8324880c2c94d100238b310579fbd95313893a5353fjcarsey                                          DriverConfiguration,
8334880c2c94d100238b310579fbd95313893a5353fjcarsey                                          HandleBuffer[LoopCounter],
8344880c2c94d100238b310579fbd95313893a5353fjcarsey                                          NULL,
8354880c2c94d100238b310579fbd95313893a5353fjcarsey                                          BestLanguage,
8364880c2c94d100238b310579fbd95313893a5353fjcarsey                                          &ActionRequired
8374880c2c94d100238b310579fbd95313893a5353fjcarsey                                          );
8384880c2c94d100238b310579fbd95313893a5353fjcarsey          gST->ConOut->ClearScreen (gST->ConOut);
8394880c2c94d100238b310579fbd95313893a5353fjcarsey          HandleIndex1 = ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]);
8404880c2c94d100238b310579fbd95313893a5353fjcarsey          HandleIndex2 = ConvertHandleToHandleIndex (HandleBuffer[LoopCounter]);
8414880c2c94d100238b310579fbd95313893a5353fjcarsey          ShellPrintHiiEx(
8424880c2c94d100238b310579fbd95313893a5353fjcarsey            -1,
8434880c2c94d100238b310579fbd95313893a5353fjcarsey            -1,
8444880c2c94d100238b310579fbd95313893a5353fjcarsey            NULL,
8454880c2c94d100238b310579fbd95313893a5353fjcarsey            STRING_TOKEN (STR_DRVCFG_CTRL_LANG),
8464880c2c94d100238b310579fbd95313893a5353fjcarsey            gShellDriver1HiiHandle,
8474880c2c94d100238b310579fbd95313893a5353fjcarsey            HandleIndex1,
8484880c2c94d100238b310579fbd95313893a5353fjcarsey            HandleIndex2,
8494880c2c94d100238b310579fbd95313893a5353fjcarsey            DriverConfiguration->SupportedLanguages
8504880c2c94d100238b310579fbd95313893a5353fjcarsey            );
8514880c2c94d100238b310579fbd95313893a5353fjcarsey          if (!EFI_ERROR (Status)) {
8524880c2c94d100238b310579fbd95313893a5353fjcarsey            ShellPrintHiiEx(
8534880c2c94d100238b310579fbd95313893a5353fjcarsey              -1,
8544880c2c94d100238b310579fbd95313893a5353fjcarsey              -1,
8554880c2c94d100238b310579fbd95313893a5353fjcarsey              NULL,
8564880c2c94d100238b310579fbd95313893a5353fjcarsey              STRING_TOKEN (STR_DRVCFG_OPTIONS_SET),
8574880c2c94d100238b310579fbd95313893a5353fjcarsey              gShellDriver1HiiHandle);
8584880c2c94d100238b310579fbd95313893a5353fjcarsey
8594880c2c94d100238b310579fbd95313893a5353fjcarsey            ShellCmdDriverConfigurationProcessActionRequired (
8604880c2c94d100238b310579fbd95313893a5353fjcarsey              DriverImageHandleBuffer[OuterLoopCounter],
8614880c2c94d100238b310579fbd95313893a5353fjcarsey              HandleBuffer[LoopCounter],
8624880c2c94d100238b310579fbd95313893a5353fjcarsey              NULL,
8634880c2c94d100238b310579fbd95313893a5353fjcarsey              ActionRequired
8644880c2c94d100238b310579fbd95313893a5353fjcarsey              );
8654880c2c94d100238b310579fbd95313893a5353fjcarsey
8664880c2c94d100238b310579fbd95313893a5353fjcarsey          } else {
8674880c2c94d100238b310579fbd95313893a5353fjcarsey            ShellPrintHiiEx(
8684880c2c94d100238b310579fbd95313893a5353fjcarsey              -1,
8694880c2c94d100238b310579fbd95313893a5353fjcarsey              -1,
8704880c2c94d100238b310579fbd95313893a5353fjcarsey              NULL,
8714880c2c94d100238b310579fbd95313893a5353fjcarsey              STRING_TOKEN (STR_DRVCFG_NOT_SET),
8724880c2c94d100238b310579fbd95313893a5353fjcarsey              gShellDriver1HiiHandle,
8734880c2c94d100238b310579fbd95313893a5353fjcarsey              Status);
8744880c2c94d100238b310579fbd95313893a5353fjcarsey            ShellStatus = SHELL_DEVICE_ERROR;
8754880c2c94d100238b310579fbd95313893a5353fjcarsey          }
8764880c2c94d100238b310579fbd95313893a5353fjcarsey        } else {
8774880c2c94d100238b310579fbd95313893a5353fjcarsey          Print (L"\n");
8784880c2c94d100238b310579fbd95313893a5353fjcarsey        }
8794880c2c94d100238b310579fbd95313893a5353fjcarsey      }
8804880c2c94d100238b310579fbd95313893a5353fjcarsey
8814880c2c94d100238b310579fbd95313893a5353fjcarsey      if (ChildHandle == NULL && !AllChildren) {
8824880c2c94d100238b310579fbd95313893a5353fjcarsey        continue;
8834880c2c94d100238b310579fbd95313893a5353fjcarsey      }
8844880c2c94d100238b310579fbd95313893a5353fjcarsey
8854880c2c94d100238b310579fbd95313893a5353fjcarsey      Status = ParseHandleDatabaseByRelationshipWithType (
8864880c2c94d100238b310579fbd95313893a5353fjcarsey                DriverImageHandleBuffer[OuterLoopCounter],
8874880c2c94d100238b310579fbd95313893a5353fjcarsey                HandleBuffer[LoopCounter],
8884880c2c94d100238b310579fbd95313893a5353fjcarsey                &ChildHandleCount,
8894880c2c94d100238b310579fbd95313893a5353fjcarsey                &ChildHandleBuffer,
8904880c2c94d100238b310579fbd95313893a5353fjcarsey                &ChildHandleType
8914880c2c94d100238b310579fbd95313893a5353fjcarsey                );
8924880c2c94d100238b310579fbd95313893a5353fjcarsey      if (EFI_ERROR (Status)) {
8934880c2c94d100238b310579fbd95313893a5353fjcarsey        continue;
8944880c2c94d100238b310579fbd95313893a5353fjcarsey      }
8954880c2c94d100238b310579fbd95313893a5353fjcarsey
8964880c2c94d100238b310579fbd95313893a5353fjcarsey      for (ChildIndex = 0; ChildIndex < ChildHandleCount; ChildIndex++) {
8974880c2c94d100238b310579fbd95313893a5353fjcarsey
8984880c2c94d100238b310579fbd95313893a5353fjcarsey        if ((ChildHandleType[ChildIndex] & HR_CHILD_HANDLE) != HR_CHILD_HANDLE) {
8994880c2c94d100238b310579fbd95313893a5353fjcarsey          continue;
9004880c2c94d100238b310579fbd95313893a5353fjcarsey        }
9014880c2c94d100238b310579fbd95313893a5353fjcarsey
9024880c2c94d100238b310579fbd95313893a5353fjcarsey        if (ChildHandle != NULL && ChildHandle != ChildHandleBuffer[ChildIndex]) {
9034880c2c94d100238b310579fbd95313893a5353fjcarsey          continue;
9044880c2c94d100238b310579fbd95313893a5353fjcarsey        }
9054880c2c94d100238b310579fbd95313893a5353fjcarsey
9064880c2c94d100238b310579fbd95313893a5353fjcarsey        HandleIndex1 = ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]);
9074880c2c94d100238b310579fbd95313893a5353fjcarsey        HandleIndex2 = ConvertHandleToHandleIndex (HandleBuffer[LoopCounter]);
9084880c2c94d100238b310579fbd95313893a5353fjcarsey        HandleIndex3 = ConvertHandleToHandleIndex (ChildHandleBuffer[ChildIndex]);
9094880c2c94d100238b310579fbd95313893a5353fjcarsey        ShellPrintHiiEx(
9104880c2c94d100238b310579fbd95313893a5353fjcarsey          -1,
9114880c2c94d100238b310579fbd95313893a5353fjcarsey          -1,
9124880c2c94d100238b310579fbd95313893a5353fjcarsey          NULL,
9134880c2c94d100238b310579fbd95313893a5353fjcarsey          STRING_TOKEN (STR_DRVCFG_CHILD_LANG),
9144880c2c94d100238b310579fbd95313893a5353fjcarsey          gShellDriver1HiiHandle,
9154880c2c94d100238b310579fbd95313893a5353fjcarsey          HandleIndex1,
9164880c2c94d100238b310579fbd95313893a5353fjcarsey          HandleIndex2,
9174880c2c94d100238b310579fbd95313893a5353fjcarsey          HandleIndex3,
9184880c2c94d100238b310579fbd95313893a5353fjcarsey          DriverConfiguration->SupportedLanguages);
9194880c2c94d100238b310579fbd95313893a5353fjcarsey
9204880c2c94d100238b310579fbd95313893a5353fjcarsey        if (ForceDefaults) {
9214880c2c94d100238b310579fbd95313893a5353fjcarsey          Status = DriverConfiguration->ForceDefaults (
9224880c2c94d100238b310579fbd95313893a5353fjcarsey                                          DriverConfiguration,
9234880c2c94d100238b310579fbd95313893a5353fjcarsey                                          HandleBuffer[LoopCounter],
9244880c2c94d100238b310579fbd95313893a5353fjcarsey                                          ChildHandleBuffer[ChildIndex],
9254880c2c94d100238b310579fbd95313893a5353fjcarsey                                          DefaultType,
9264880c2c94d100238b310579fbd95313893a5353fjcarsey                                          &ActionRequired
9274880c2c94d100238b310579fbd95313893a5353fjcarsey                                          );
9284880c2c94d100238b310579fbd95313893a5353fjcarsey
9294880c2c94d100238b310579fbd95313893a5353fjcarsey          if (!EFI_ERROR (Status)) {
9304880c2c94d100238b310579fbd95313893a5353fjcarsey            ShellPrintHiiEx(
9314880c2c94d100238b310579fbd95313893a5353fjcarsey              -1,
9324880c2c94d100238b310579fbd95313893a5353fjcarsey              -1,
9334880c2c94d100238b310579fbd95313893a5353fjcarsey              NULL,
9344880c2c94d100238b310579fbd95313893a5353fjcarsey              STRING_TOKEN (STR_DRVCFG_DEF_FORCED),
9354880c2c94d100238b310579fbd95313893a5353fjcarsey              gShellDriver1HiiHandle);
9364880c2c94d100238b310579fbd95313893a5353fjcarsey
9374880c2c94d100238b310579fbd95313893a5353fjcarsey            ShellCmdDriverConfigurationProcessActionRequired (
9384880c2c94d100238b310579fbd95313893a5353fjcarsey              DriverImageHandleBuffer[OuterLoopCounter],
9394880c2c94d100238b310579fbd95313893a5353fjcarsey              HandleBuffer[LoopCounter],
9404880c2c94d100238b310579fbd95313893a5353fjcarsey              ChildHandleBuffer[ChildIndex],
9414880c2c94d100238b310579fbd95313893a5353fjcarsey              ActionRequired
9424880c2c94d100238b310579fbd95313893a5353fjcarsey              );
9434880c2c94d100238b310579fbd95313893a5353fjcarsey
9444880c2c94d100238b310579fbd95313893a5353fjcarsey          } else {
9454880c2c94d100238b310579fbd95313893a5353fjcarsey            ShellPrintHiiEx(
9464880c2c94d100238b310579fbd95313893a5353fjcarsey              -1,
9474880c2c94d100238b310579fbd95313893a5353fjcarsey              -1,
9484880c2c94d100238b310579fbd95313893a5353fjcarsey              NULL,
9494880c2c94d100238b310579fbd95313893a5353fjcarsey              STRING_TOKEN (STR_DRVCFG_FORCE_FAILED),
9504880c2c94d100238b310579fbd95313893a5353fjcarsey              gShellDriver1HiiHandle,
9514880c2c94d100238b310579fbd95313893a5353fjcarsey              Status);
9524880c2c94d100238b310579fbd95313893a5353fjcarsey            ShellStatus = SHELL_DEVICE_ERROR;
9534880c2c94d100238b310579fbd95313893a5353fjcarsey          }
9544880c2c94d100238b310579fbd95313893a5353fjcarsey        } else if (ValidateOptions) {
9554880c2c94d100238b310579fbd95313893a5353fjcarsey          Status = DriverConfiguration->OptionsValid (
9564880c2c94d100238b310579fbd95313893a5353fjcarsey                                          DriverConfiguration,
9574880c2c94d100238b310579fbd95313893a5353fjcarsey                                          HandleBuffer[LoopCounter],
9584880c2c94d100238b310579fbd95313893a5353fjcarsey                                          ChildHandleBuffer[ChildIndex]
9594880c2c94d100238b310579fbd95313893a5353fjcarsey                                          );
9604880c2c94d100238b310579fbd95313893a5353fjcarsey
9614880c2c94d100238b310579fbd95313893a5353fjcarsey          if (!EFI_ERROR (Status)) {
9624880c2c94d100238b310579fbd95313893a5353fjcarsey            ShellPrintHiiEx(
9634880c2c94d100238b310579fbd95313893a5353fjcarsey              -1,
9644880c2c94d100238b310579fbd95313893a5353fjcarsey              -1,
9654880c2c94d100238b310579fbd95313893a5353fjcarsey              NULL,
9664880c2c94d100238b310579fbd95313893a5353fjcarsey              STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID),
9674880c2c94d100238b310579fbd95313893a5353fjcarsey              gShellDriver1HiiHandle);
9684880c2c94d100238b310579fbd95313893a5353fjcarsey          } else {
9694880c2c94d100238b310579fbd95313893a5353fjcarsey            ShellPrintHiiEx(
9704880c2c94d100238b310579fbd95313893a5353fjcarsey              -1,
9714880c2c94d100238b310579fbd95313893a5353fjcarsey              -1,
9724880c2c94d100238b310579fbd95313893a5353fjcarsey              NULL,
9734880c2c94d100238b310579fbd95313893a5353fjcarsey              STRING_TOKEN (STR_DRVCFG_OPTIONS_INV),
9744880c2c94d100238b310579fbd95313893a5353fjcarsey              gShellDriver1HiiHandle,
9754880c2c94d100238b310579fbd95313893a5353fjcarsey              Status);
9764880c2c94d100238b310579fbd95313893a5353fjcarsey            ShellStatus = SHELL_DEVICE_ERROR;
9774880c2c94d100238b310579fbd95313893a5353fjcarsey          }
9784880c2c94d100238b310579fbd95313893a5353fjcarsey        } else if (SetOptions) {
9794880c2c94d100238b310579fbd95313893a5353fjcarsey          gST->ConOut->ClearScreen (gST->ConOut);
9804880c2c94d100238b310579fbd95313893a5353fjcarsey          Status = DriverConfiguration->SetOptions (
9814880c2c94d100238b310579fbd95313893a5353fjcarsey                                          DriverConfiguration,
9824880c2c94d100238b310579fbd95313893a5353fjcarsey                                          HandleBuffer[LoopCounter],
9834880c2c94d100238b310579fbd95313893a5353fjcarsey                                          ChildHandleBuffer[ChildIndex],
9844880c2c94d100238b310579fbd95313893a5353fjcarsey                                          BestLanguage,
9854880c2c94d100238b310579fbd95313893a5353fjcarsey                                          &ActionRequired
9864880c2c94d100238b310579fbd95313893a5353fjcarsey                                          );
9874880c2c94d100238b310579fbd95313893a5353fjcarsey          gST->ConOut->ClearScreen (gST->ConOut);
9884880c2c94d100238b310579fbd95313893a5353fjcarsey          HandleIndex1 = ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]);
9894880c2c94d100238b310579fbd95313893a5353fjcarsey          HandleIndex2 = ConvertHandleToHandleIndex (HandleBuffer[LoopCounter]);
9904880c2c94d100238b310579fbd95313893a5353fjcarsey          HandleIndex3 = ConvertHandleToHandleIndex (ChildHandleBuffer[ChildIndex]);
9914880c2c94d100238b310579fbd95313893a5353fjcarsey          ShellPrintHiiEx(
9924880c2c94d100238b310579fbd95313893a5353fjcarsey            -1,
9934880c2c94d100238b310579fbd95313893a5353fjcarsey            -1,
9944880c2c94d100238b310579fbd95313893a5353fjcarsey            NULL,
9954880c2c94d100238b310579fbd95313893a5353fjcarsey            STRING_TOKEN (STR_DRVCFG_CHILD_LANG),
9964880c2c94d100238b310579fbd95313893a5353fjcarsey            gShellDriver1HiiHandle,
9974880c2c94d100238b310579fbd95313893a5353fjcarsey            HandleIndex1,
9984880c2c94d100238b310579fbd95313893a5353fjcarsey            HandleIndex2,
9994880c2c94d100238b310579fbd95313893a5353fjcarsey            HandleIndex3,
10004880c2c94d100238b310579fbd95313893a5353fjcarsey            DriverConfiguration->SupportedLanguages
10014880c2c94d100238b310579fbd95313893a5353fjcarsey            );
10024880c2c94d100238b310579fbd95313893a5353fjcarsey          if (!EFI_ERROR (Status)) {
10034880c2c94d100238b310579fbd95313893a5353fjcarsey            ShellPrintHiiEx(
10044880c2c94d100238b310579fbd95313893a5353fjcarsey              -1,
10054880c2c94d100238b310579fbd95313893a5353fjcarsey              -1,
10064880c2c94d100238b310579fbd95313893a5353fjcarsey              NULL,
10074880c2c94d100238b310579fbd95313893a5353fjcarsey              STRING_TOKEN (STR_DRVCFG_OPTIONS_SET),
10084880c2c94d100238b310579fbd95313893a5353fjcarsey              gShellDriver1HiiHandle);
10094880c2c94d100238b310579fbd95313893a5353fjcarsey
10104880c2c94d100238b310579fbd95313893a5353fjcarsey            ShellCmdDriverConfigurationProcessActionRequired (
10114880c2c94d100238b310579fbd95313893a5353fjcarsey              DriverImageHandleBuffer[OuterLoopCounter],
10124880c2c94d100238b310579fbd95313893a5353fjcarsey              HandleBuffer[LoopCounter],
10134880c2c94d100238b310579fbd95313893a5353fjcarsey              ChildHandleBuffer[ChildIndex],
10144880c2c94d100238b310579fbd95313893a5353fjcarsey              ActionRequired
10154880c2c94d100238b310579fbd95313893a5353fjcarsey              );
10164880c2c94d100238b310579fbd95313893a5353fjcarsey
10174880c2c94d100238b310579fbd95313893a5353fjcarsey          } else {
10184880c2c94d100238b310579fbd95313893a5353fjcarsey            ShellPrintHiiEx(
10194880c2c94d100238b310579fbd95313893a5353fjcarsey              -1,
10204880c2c94d100238b310579fbd95313893a5353fjcarsey              -1,
10214880c2c94d100238b310579fbd95313893a5353fjcarsey              NULL,
10224880c2c94d100238b310579fbd95313893a5353fjcarsey              STRING_TOKEN (STR_DRVCFG_NOT_SET),
10234880c2c94d100238b310579fbd95313893a5353fjcarsey              gShellDriver1HiiHandle,
10244880c2c94d100238b310579fbd95313893a5353fjcarsey              Status);
10254880c2c94d100238b310579fbd95313893a5353fjcarsey            ShellStatus = SHELL_DEVICE_ERROR;
10264880c2c94d100238b310579fbd95313893a5353fjcarsey          }
10274880c2c94d100238b310579fbd95313893a5353fjcarsey        } else {
10284880c2c94d100238b310579fbd95313893a5353fjcarsey          Print (L"\n");
10294880c2c94d100238b310579fbd95313893a5353fjcarsey        }
10304880c2c94d100238b310579fbd95313893a5353fjcarsey      }
10314880c2c94d100238b310579fbd95313893a5353fjcarsey
10324880c2c94d100238b310579fbd95313893a5353fjcarsey      FreePool (ChildHandleBuffer);
10334880c2c94d100238b310579fbd95313893a5353fjcarsey      FreePool (ChildHandleType);
10344880c2c94d100238b310579fbd95313893a5353fjcarsey    }
10354880c2c94d100238b310579fbd95313893a5353fjcarsey
10364880c2c94d100238b310579fbd95313893a5353fjcarsey    FreePool (BestLanguage);
10374880c2c94d100238b310579fbd95313893a5353fjcarsey    FreePool (HandleBuffer);
10384880c2c94d100238b310579fbd95313893a5353fjcarsey    FreePool (HandleType);
10394880c2c94d100238b310579fbd95313893a5353fjcarsey  }
10404880c2c94d100238b310579fbd95313893a5353fjcarsey
10414880c2c94d100238b310579fbd95313893a5353fjcarsey  if (DriverImageHandle != NULL && DriverImageHandleCount != 0) {
10424880c2c94d100238b310579fbd95313893a5353fjcarsey    FreePool (DriverImageHandleBuffer);
10434880c2c94d100238b310579fbd95313893a5353fjcarsey  }
10444880c2c94d100238b310579fbd95313893a5353fjcarsey
10454880c2c94d100238b310579fbd95313893a5353fjcarseyDone:
10464880c2c94d100238b310579fbd95313893a5353fjcarsey  return ShellStatus;
10474880c2c94d100238b310579fbd95313893a5353fjcarsey}
10484880c2c94d100238b310579fbd95313893a5353fjcarsey
10494ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey/**
10504ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  Function to print out configuration information on all configurable handles.
10514ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
10524ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  @param[in] ChildrenToo    TRUE to tewst for children.
10534880c2c94d100238b310579fbd95313893a5353fjcarsey  @param[in] Language       ASCII string for language code.
10544880c2c94d100238b310579fbd95313893a5353fjcarsey  @param[in] UseHii         TRUE to check for Hii and DPC, FALSE for DCP only.
10554ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
10564ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  @retval SHELL_SUCCESS     The operation was successful.
10574ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey**/
10584ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarseySHELL_STATUS
10594ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarseyPrintConfigInfoOnAll(
10604880c2c94d100238b310579fbd95313893a5353fjcarsey  IN CONST BOOLEAN ChildrenToo,
10614880c2c94d100238b310579fbd95313893a5353fjcarsey  IN CONST CHAR8   *Language,
10624880c2c94d100238b310579fbd95313893a5353fjcarsey  IN CONST BOOLEAN UseHii
10634ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  )
10644ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey{
10654ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  EFI_HANDLE        *HandleList;
10664ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  EFI_HANDLE        *CurrentHandle;
10674ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  BOOLEAN           Found;
10684880c2c94d100238b310579fbd95313893a5353fjcarsey  UINTN             Index2;
10694880c2c94d100238b310579fbd95313893a5353fjcarsey
10704ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
10714ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  Found             = FALSE;
10724ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  HandleList        = NULL;
10734ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  CurrentHandle     = NULL;
10744ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
10754880c2c94d100238b310579fbd95313893a5353fjcarsey  if (UseHii) {
10764880c2c94d100238b310579fbd95313893a5353fjcarsey    //
10774880c2c94d100238b310579fbd95313893a5353fjcarsey    // HII method
10784880c2c94d100238b310579fbd95313893a5353fjcarsey    //
10794880c2c94d100238b310579fbd95313893a5353fjcarsey    HandleList = GetHandleListByProtocol(&gEfiHiiConfigAccessProtocolGuid);
10804880c2c94d100238b310579fbd95313893a5353fjcarsey    for (CurrentHandle = HandleList ; CurrentHandle != NULL && *CurrentHandle != NULL; CurrentHandle++){
10814880c2c94d100238b310579fbd95313893a5353fjcarsey      Found = TRUE;
10824880c2c94d100238b310579fbd95313893a5353fjcarsey      Index2 = *CurrentHandle == NULL ? 0 : ConvertHandleToHandleIndex(*CurrentHandle);
10834880c2c94d100238b310579fbd95313893a5353fjcarsey      ShellPrintHiiEx(
10844880c2c94d100238b310579fbd95313893a5353fjcarsey        -1,
10854880c2c94d100238b310579fbd95313893a5353fjcarsey        -1,
10864880c2c94d100238b310579fbd95313893a5353fjcarsey        NULL,
10874880c2c94d100238b310579fbd95313893a5353fjcarsey        STRING_TOKEN (STR_DRVCFG_LINE_HII),
10884880c2c94d100238b310579fbd95313893a5353fjcarsey        gShellDriver1HiiHandle,
10894880c2c94d100238b310579fbd95313893a5353fjcarsey        Index2
10904880c2c94d100238b310579fbd95313893a5353fjcarsey        );
10914ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey    }
10924880c2c94d100238b310579fbd95313893a5353fjcarsey    SHELL_FREE_NON_NULL(HandleList);
10934ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  }
10944ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
10954880c2c94d100238b310579fbd95313893a5353fjcarsey  if (PreHiiDrvCfg (
10964880c2c94d100238b310579fbd95313893a5353fjcarsey    Language,
10974880c2c94d100238b310579fbd95313893a5353fjcarsey    FALSE,
10984880c2c94d100238b310579fbd95313893a5353fjcarsey    0,
10994880c2c94d100238b310579fbd95313893a5353fjcarsey    ChildrenToo,
11004880c2c94d100238b310579fbd95313893a5353fjcarsey    FALSE,
11014880c2c94d100238b310579fbd95313893a5353fjcarsey    FALSE,
11024880c2c94d100238b310579fbd95313893a5353fjcarsey    0,
11034880c2c94d100238b310579fbd95313893a5353fjcarsey    0,
11044880c2c94d100238b310579fbd95313893a5353fjcarsey    0) == SHELL_SUCCESS) {
11054880c2c94d100238b310579fbd95313893a5353fjcarsey      Found = TRUE;
11064ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  }
11074880c2c94d100238b310579fbd95313893a5353fjcarsey
11084ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  if (!Found) {
1109885f7fd0c767c2b39e6b60d20b575e7e95d4638dJaben Carsey    ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_DRVCFG_NONE_FOUND), gShellDriver1HiiHandle);
11104ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey    return (SHELL_SUCCESS);
11114ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  }
11124880c2c94d100238b310579fbd95313893a5353fjcarsey
11134880c2c94d100238b310579fbd95313893a5353fjcarsey  return (SHELL_SUCCESS);
11144ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey}
11154ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
11164880c2c94d100238b310579fbd95313893a5353fjcarseySTATIC CONST SHELL_PARAM_ITEM ParamListHii[] = {
11174ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  {L"-s", TypeFlag},
11184ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  {L"-l", TypeValue},
11194ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  {L"-f", TypeValue},
11204ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  {L"-o", TypeValue},
11214ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  {L"-i", TypeValue},
11224ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  {NULL, TypeMax}
11234ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  };
11244880c2c94d100238b310579fbd95313893a5353fjcarseySTATIC CONST SHELL_PARAM_ITEM ParamListPreHii[] = {
11254880c2c94d100238b310579fbd95313893a5353fjcarsey  {L"-c", TypeFlag},
11264880c2c94d100238b310579fbd95313893a5353fjcarsey  {L"-s", TypeFlag},
11274880c2c94d100238b310579fbd95313893a5353fjcarsey  {L"-v", TypeFlag},
11284880c2c94d100238b310579fbd95313893a5353fjcarsey  {L"-l", TypeValue},
11294880c2c94d100238b310579fbd95313893a5353fjcarsey  {L"-f", TypeValue},
11304880c2c94d100238b310579fbd95313893a5353fjcarsey  {NULL, TypeMax}
11314880c2c94d100238b310579fbd95313893a5353fjcarsey  };
11324ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
1133361a8267362f755cca29495afa79efa0e9fd9714jcarsey/**
1134361a8267362f755cca29495afa79efa0e9fd9714jcarsey  Function for 'drvcfg' command.
1135361a8267362f755cca29495afa79efa0e9fd9714jcarsey
1136361a8267362f755cca29495afa79efa0e9fd9714jcarsey  @param[in] ImageHandle  Handle to the Image (NULL if Internal).
1137361a8267362f755cca29495afa79efa0e9fd9714jcarsey  @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
1138361a8267362f755cca29495afa79efa0e9fd9714jcarsey**/
11394ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarseySHELL_STATUS
11404ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarseyEFIAPI
11414ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarseyShellCommandRunDrvCfg (
11424ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  IN EFI_HANDLE        ImageHandle,
11434ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  IN EFI_SYSTEM_TABLE  *SystemTable
11444ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  )
11454ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey{
11464ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  EFI_STATUS          Status;
11474ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  LIST_ENTRY          *Package;
11484ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  CHAR16              *ProblemParam;
11494ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  SHELL_STATUS        ShellStatus;
11504ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  CHAR8               *Language;
11514ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  CONST CHAR16        *Lang;
11524880c2c94d100238b310579fbd95313893a5353fjcarsey  CONST CHAR16        *HandleIndex1;
11534880c2c94d100238b310579fbd95313893a5353fjcarsey  CONST CHAR16        *HandleIndex2;
11544880c2c94d100238b310579fbd95313893a5353fjcarsey  CONST CHAR16        *HandleIndex3;
11554880c2c94d100238b310579fbd95313893a5353fjcarsey  CONST CHAR16        *ForceTypeString;
11564880c2c94d100238b310579fbd95313893a5353fjcarsey  BOOLEAN             Force;
11574880c2c94d100238b310579fbd95313893a5353fjcarsey  BOOLEAN             Set;
11584880c2c94d100238b310579fbd95313893a5353fjcarsey  BOOLEAN             Validate;
11594880c2c94d100238b310579fbd95313893a5353fjcarsey  BOOLEAN             InFromFile;
11604880c2c94d100238b310579fbd95313893a5353fjcarsey  BOOLEAN             OutToFile;
11614880c2c94d100238b310579fbd95313893a5353fjcarsey  BOOLEAN             AllChildren;
11624880c2c94d100238b310579fbd95313893a5353fjcarsey  BOOLEAN             UseHii;
11634880c2c94d100238b310579fbd95313893a5353fjcarsey  UINT32              ForceType;
11644880c2c94d100238b310579fbd95313893a5353fjcarsey  UINT64              Intermediate;
11654880c2c94d100238b310579fbd95313893a5353fjcarsey  EFI_HANDLE          Handle1;
11664880c2c94d100238b310579fbd95313893a5353fjcarsey  EFI_HANDLE          Handle2;
11674880c2c94d100238b310579fbd95313893a5353fjcarsey  EFI_HANDLE          Handle3;
11684880c2c94d100238b310579fbd95313893a5353fjcarsey  CONST CHAR16        *FileName;
11694ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
11704ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  ShellStatus         = SHELL_SUCCESS;
11714ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  Status              = EFI_SUCCESS;
11724ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  Language            = NULL;
11734880c2c94d100238b310579fbd95313893a5353fjcarsey  UseHii              = TRUE;
117457a3e4f9b5805e5443c7c1b0814d76abe8bcfa11Qiu Shumin  ProblemParam        = NULL;
11754ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
11764ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  //
11774ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  // initialize the shell lib (we must be in non-auto-init...)
11784ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  //
11794ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  Status = ShellInitialize();
11804ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  ASSERT_EFI_ERROR(Status);
11814ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
11824ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  Status = CommandInit();
11834ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  ASSERT_EFI_ERROR(Status);
11844ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
11854ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  //
11864ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  // parse the command line
11874ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  //
11884880c2c94d100238b310579fbd95313893a5353fjcarsey  Status = ShellCommandLineParse (ParamListHii, &Package, &ProblemParam, TRUE);
11894880c2c94d100238b310579fbd95313893a5353fjcarsey  if (EFI_ERROR(Status) || ShellCommandLineGetCount(Package) > 2) {
11904880c2c94d100238b310579fbd95313893a5353fjcarsey    UseHii = FALSE;
11914880c2c94d100238b310579fbd95313893a5353fjcarsey    if (Package != NULL) {
11924880c2c94d100238b310579fbd95313893a5353fjcarsey      ShellCommandLineFreeVarList (Package);
11934ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey    }
11944880c2c94d100238b310579fbd95313893a5353fjcarsey    SHELL_FREE_NON_NULL(ProblemParam);
11954880c2c94d100238b310579fbd95313893a5353fjcarsey    Status = ShellCommandLineParse (ParamListPreHii, &Package, &ProblemParam, TRUE);
11964880c2c94d100238b310579fbd95313893a5353fjcarsey    if (EFI_ERROR(Status)) {
11974880c2c94d100238b310579fbd95313893a5353fjcarsey      if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
1198bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"drvcfg", ProblemParam);
11994880c2c94d100238b310579fbd95313893a5353fjcarsey        FreePool(ProblemParam);
12004880c2c94d100238b310579fbd95313893a5353fjcarsey        ShellStatus = SHELL_INVALID_PARAMETER;
12014880c2c94d100238b310579fbd95313893a5353fjcarsey        goto Done;
12024880c2c94d100238b310579fbd95313893a5353fjcarsey      } else {
12034880c2c94d100238b310579fbd95313893a5353fjcarsey        ASSERT(FALSE);
12044880c2c94d100238b310579fbd95313893a5353fjcarsey      }
12054880c2c94d100238b310579fbd95313893a5353fjcarsey    }
12064880c2c94d100238b310579fbd95313893a5353fjcarsey  }
12074880c2c94d100238b310579fbd95313893a5353fjcarsey  if (ShellStatus == SHELL_SUCCESS) {
1208c6fc823413861c6bcafbb21bae9aab66b8ee5a24Dandan Bi    if (ShellCommandLineGetCount(Package) > 4) {
1209c6fc823413861c6bcafbb21bae9aab66b8ee5a24Dandan Bi      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"drvcfg");
1210c6fc823413861c6bcafbb21bae9aab66b8ee5a24Dandan Bi      ShellStatus = SHELL_INVALID_PARAMETER;
1211c6fc823413861c6bcafbb21bae9aab66b8ee5a24Dandan Bi      goto Done;
1212c6fc823413861c6bcafbb21bae9aab66b8ee5a24Dandan Bi    }
12134ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey    Lang = ShellCommandLineGetValue(Package, L"-l");
12144ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey    if (Lang != NULL) {
12154ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey      Language = AllocateZeroPool(StrSize(Lang));
12164ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey      AsciiSPrint(Language, StrSize(Lang), "%S", Lang);
12174880c2c94d100238b310579fbd95313893a5353fjcarsey    } else if (ShellCommandLineGetFlag(Package, L"-l")){
1218bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"drvcfg",  L"-l");
12194880c2c94d100238b310579fbd95313893a5353fjcarsey      ShellStatus = SHELL_INVALID_PARAMETER;
12204880c2c94d100238b310579fbd95313893a5353fjcarsey      goto Done;
12214880c2c94d100238b310579fbd95313893a5353fjcarsey    }
12224880c2c94d100238b310579fbd95313893a5353fjcarsey    Set                 = ShellCommandLineGetFlag (Package, L"-s");
12234880c2c94d100238b310579fbd95313893a5353fjcarsey    Validate            = ShellCommandLineGetFlag (Package, L"-v");
12244880c2c94d100238b310579fbd95313893a5353fjcarsey    InFromFile          = ShellCommandLineGetFlag (Package, L"-i");
12254880c2c94d100238b310579fbd95313893a5353fjcarsey    OutToFile           = ShellCommandLineGetFlag (Package, L"-o");
12264880c2c94d100238b310579fbd95313893a5353fjcarsey    AllChildren         = ShellCommandLineGetFlag (Package, L"-c");
12274880c2c94d100238b310579fbd95313893a5353fjcarsey    Force               = ShellCommandLineGetFlag (Package, L"-f");
12284880c2c94d100238b310579fbd95313893a5353fjcarsey    ForceTypeString     = ShellCommandLineGetValue(Package, L"-f");
12294880c2c94d100238b310579fbd95313893a5353fjcarsey
12304880c2c94d100238b310579fbd95313893a5353fjcarsey    if (OutToFile) {
12314880c2c94d100238b310579fbd95313893a5353fjcarsey      FileName = ShellCommandLineGetValue(Package, L"-o");
12324880c2c94d100238b310579fbd95313893a5353fjcarsey    } else if (InFromFile) {
12334880c2c94d100238b310579fbd95313893a5353fjcarsey      FileName = ShellCommandLineGetValue(Package, L"-i");
12344880c2c94d100238b310579fbd95313893a5353fjcarsey    } else {
12354880c2c94d100238b310579fbd95313893a5353fjcarsey      FileName = NULL;
12364880c2c94d100238b310579fbd95313893a5353fjcarsey    }
12374880c2c94d100238b310579fbd95313893a5353fjcarsey
12384880c2c94d100238b310579fbd95313893a5353fjcarsey    if (InFromFile && EFI_ERROR(ShellFileExists(FileName))) {
1239bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FIND_FAIL), gShellDriver1HiiHandle, L"drvcfg", FileName);
12404880c2c94d100238b310579fbd95313893a5353fjcarsey      ShellStatus = SHELL_INVALID_PARAMETER;
12414880c2c94d100238b310579fbd95313893a5353fjcarsey      goto Done;
12424880c2c94d100238b310579fbd95313893a5353fjcarsey    }
12434880c2c94d100238b310579fbd95313893a5353fjcarsey    if (OutToFile && !EFI_ERROR(ShellFileExists(FileName))) {
1244bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_EXIST), gShellDriver1HiiHandle, L"drvcfg", FileName);
12454880c2c94d100238b310579fbd95313893a5353fjcarsey      ShellStatus = SHELL_INVALID_PARAMETER;
12464880c2c94d100238b310579fbd95313893a5353fjcarsey      goto Done;
12474880c2c94d100238b310579fbd95313893a5353fjcarsey    }
12484880c2c94d100238b310579fbd95313893a5353fjcarsey    if (Force && ForceTypeString == NULL) {
1249bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"drvcfg", L"-f");
12504880c2c94d100238b310579fbd95313893a5353fjcarsey      ShellStatus = SHELL_INVALID_PARAMETER;
12514880c2c94d100238b310579fbd95313893a5353fjcarsey      goto Done;
12524880c2c94d100238b310579fbd95313893a5353fjcarsey    }
12534880c2c94d100238b310579fbd95313893a5353fjcarsey    if (Force) {
12544880c2c94d100238b310579fbd95313893a5353fjcarsey      Status = ShellConvertStringToUint64(ForceTypeString, &Intermediate, FALSE, FALSE);
12554880c2c94d100238b310579fbd95313893a5353fjcarsey      if (EFI_ERROR(Status)) {
1256bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellDriver1HiiHandle, L"drvcfg", ForceTypeString, L"-f");
12574880c2c94d100238b310579fbd95313893a5353fjcarsey        ShellStatus = SHELL_INVALID_PARAMETER;
12584880c2c94d100238b310579fbd95313893a5353fjcarsey        goto Done;
12594880c2c94d100238b310579fbd95313893a5353fjcarsey      }
12604880c2c94d100238b310579fbd95313893a5353fjcarsey      ForceType = (UINT32)Intermediate;
12614880c2c94d100238b310579fbd95313893a5353fjcarsey    } else {
12624880c2c94d100238b310579fbd95313893a5353fjcarsey      ForceType = 0;
12634880c2c94d100238b310579fbd95313893a5353fjcarsey    }
12644880c2c94d100238b310579fbd95313893a5353fjcarsey    HandleIndex1        = ShellCommandLineGetRawValue(Package, 1);
12654880c2c94d100238b310579fbd95313893a5353fjcarsey    Handle1             = NULL;
12664880c2c94d100238b310579fbd95313893a5353fjcarsey    if (HandleIndex1 != NULL && !EFI_ERROR(ShellConvertStringToUint64(HandleIndex1, &Intermediate, TRUE, FALSE))) {
12674880c2c94d100238b310579fbd95313893a5353fjcarsey      Handle1 = ConvertHandleIndexToHandle((UINTN)Intermediate);
12684880c2c94d100238b310579fbd95313893a5353fjcarsey      if (Handle1 == NULL || (UINT64)(UINTN)Intermediate != Intermediate) {
1269bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"drvcfg", HandleIndex1);
12704880c2c94d100238b310579fbd95313893a5353fjcarsey        ShellStatus = SHELL_INVALID_PARAMETER;
12714880c2c94d100238b310579fbd95313893a5353fjcarsey        goto Done;
12724880c2c94d100238b310579fbd95313893a5353fjcarsey      }
12734880c2c94d100238b310579fbd95313893a5353fjcarsey    }
12744880c2c94d100238b310579fbd95313893a5353fjcarsey    HandleIndex2        = ShellCommandLineGetRawValue(Package, 2);
12754880c2c94d100238b310579fbd95313893a5353fjcarsey    Handle2             = NULL;
12764880c2c94d100238b310579fbd95313893a5353fjcarsey    if (HandleIndex2 != NULL && !EFI_ERROR(ShellConvertStringToUint64(HandleIndex2, &Intermediate, TRUE, FALSE))) {
12774880c2c94d100238b310579fbd95313893a5353fjcarsey      Handle2 = ConvertHandleIndexToHandle((UINTN)Intermediate);
12784880c2c94d100238b310579fbd95313893a5353fjcarsey      if (Handle2 == NULL || (UINT64)(UINTN)Intermediate != Intermediate) {
1279bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"drvcfg", HandleIndex2);
12804880c2c94d100238b310579fbd95313893a5353fjcarsey        ShellStatus = SHELL_INVALID_PARAMETER;
12814880c2c94d100238b310579fbd95313893a5353fjcarsey        goto Done;
12824880c2c94d100238b310579fbd95313893a5353fjcarsey      }
12834880c2c94d100238b310579fbd95313893a5353fjcarsey    }
12844880c2c94d100238b310579fbd95313893a5353fjcarsey    HandleIndex3        = ShellCommandLineGetRawValue(Package, 3);
12854880c2c94d100238b310579fbd95313893a5353fjcarsey    Handle3             = NULL;
12864880c2c94d100238b310579fbd95313893a5353fjcarsey    if (HandleIndex3 != NULL && !EFI_ERROR(ShellConvertStringToUint64(HandleIndex3, &Intermediate, TRUE, FALSE))) {
12874880c2c94d100238b310579fbd95313893a5353fjcarsey      Handle3 = ConvertHandleIndexToHandle((UINTN)Intermediate);
12884880c2c94d100238b310579fbd95313893a5353fjcarsey      if (Handle3 == NULL || (UINT64)(UINTN)Intermediate != Intermediate) {
1289bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"drvcfg", HandleIndex3);
12904880c2c94d100238b310579fbd95313893a5353fjcarsey        ShellStatus = SHELL_INVALID_PARAMETER;
12914880c2c94d100238b310579fbd95313893a5353fjcarsey        goto Done;
12924880c2c94d100238b310579fbd95313893a5353fjcarsey      }
12934880c2c94d100238b310579fbd95313893a5353fjcarsey    }
12944880c2c94d100238b310579fbd95313893a5353fjcarsey
12954880c2c94d100238b310579fbd95313893a5353fjcarsey    if ((InFromFile || OutToFile) && (FileName == NULL)) {
12964880c2c94d100238b310579fbd95313893a5353fjcarsey      if (FileName == NULL) {
1297bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"drvcfg",  InFromFile?L"-i":L"-o");
12984880c2c94d100238b310579fbd95313893a5353fjcarsey      } else {
1299bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_HANDLE_REQ), gShellDriver1HiiHandle, L"drvcfg");
13004880c2c94d100238b310579fbd95313893a5353fjcarsey      }
13014880c2c94d100238b310579fbd95313893a5353fjcarsey      ShellStatus = SHELL_INVALID_PARAMETER;
13024880c2c94d100238b310579fbd95313893a5353fjcarsey      goto Done;
13034880c2c94d100238b310579fbd95313893a5353fjcarsey    }
13044880c2c94d100238b310579fbd95313893a5353fjcarsey    if (!UseHii && (InFromFile || OutToFile)) {
13054880c2c94d100238b310579fbd95313893a5353fjcarsey      if (InFromFile) {
1306bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDriver1HiiHandle, L"drvcfg", L"-i");
13074880c2c94d100238b310579fbd95313893a5353fjcarsey        ShellStatus = SHELL_INVALID_PARAMETER;
13084880c2c94d100238b310579fbd95313893a5353fjcarsey        goto Done;
13094880c2c94d100238b310579fbd95313893a5353fjcarsey      }
13104880c2c94d100238b310579fbd95313893a5353fjcarsey      if (OutToFile) {
1311bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah        ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDriver1HiiHandle, L"drvcfg", L"-o");
13124880c2c94d100238b310579fbd95313893a5353fjcarsey        ShellStatus = SHELL_INVALID_PARAMETER;
13134880c2c94d100238b310579fbd95313893a5353fjcarsey        goto Done;
13144880c2c94d100238b310579fbd95313893a5353fjcarsey      }
13154880c2c94d100238b310579fbd95313893a5353fjcarsey    }
13164880c2c94d100238b310579fbd95313893a5353fjcarsey    if (Validate && Force) {
1317bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDriver1HiiHandle, L"drvcfg", L"-v", L"-f");
13184880c2c94d100238b310579fbd95313893a5353fjcarsey      ShellStatus = SHELL_INVALID_PARAMETER;
13194880c2c94d100238b310579fbd95313893a5353fjcarsey      goto Done;
13204880c2c94d100238b310579fbd95313893a5353fjcarsey    }
13214880c2c94d100238b310579fbd95313893a5353fjcarsey    if (Validate && Set) {
1322bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDriver1HiiHandle, L"drvcfg", L"-v", L"-s");
13234880c2c94d100238b310579fbd95313893a5353fjcarsey      ShellStatus = SHELL_INVALID_PARAMETER;
13244880c2c94d100238b310579fbd95313893a5353fjcarsey      goto Done;
13254880c2c94d100238b310579fbd95313893a5353fjcarsey    }
13264880c2c94d100238b310579fbd95313893a5353fjcarsey    if (Set && Force) {
1327bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDriver1HiiHandle, L"drvcfg", L"-s", L"-f");
13284880c2c94d100238b310579fbd95313893a5353fjcarsey      ShellStatus = SHELL_INVALID_PARAMETER;
13294880c2c94d100238b310579fbd95313893a5353fjcarsey      goto Done;
13304880c2c94d100238b310579fbd95313893a5353fjcarsey    }
13314880c2c94d100238b310579fbd95313893a5353fjcarsey    if (OutToFile && InFromFile) {
1332bc2807206bf0af2332691495d0ac2822d075a754Tapan Shah      ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDriver1HiiHandle, L"drvcfg", L"-i", L"-o");
13334880c2c94d100238b310579fbd95313893a5353fjcarsey      ShellStatus = SHELL_INVALID_PARAMETER;
13344880c2c94d100238b310579fbd95313893a5353fjcarsey      goto Done;
13354ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey    }
13364ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey
13374ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey    //
13384880c2c94d100238b310579fbd95313893a5353fjcarsey    // We do HII first.
13394ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey    //
13404880c2c94d100238b310579fbd95313893a5353fjcarsey    if (UseHii) {
13414880c2c94d100238b310579fbd95313893a5353fjcarsey      if (Handle1 != NULL && EFI_ERROR(gBS->OpenProtocol(Handle1, &gEfiHiiConfigAccessProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {
13424ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey        //
13434880c2c94d100238b310579fbd95313893a5353fjcarsey        // no HII on this handle.
13444ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey        //
13454880c2c94d100238b310579fbd95313893a5353fjcarsey        ShellStatus = SHELL_UNSUPPORTED;
13464880c2c94d100238b310579fbd95313893a5353fjcarsey      } else if (Validate) {
13474880c2c94d100238b310579fbd95313893a5353fjcarsey      } else if (Force) {
13484880c2c94d100238b310579fbd95313893a5353fjcarsey      } else if (Set) {
13494880c2c94d100238b310579fbd95313893a5353fjcarsey      } else if (InFromFile) {
13504880c2c94d100238b310579fbd95313893a5353fjcarsey        ShellStatus = ConfigFromFile(Handle1, FileName);
13514880c2c94d100238b310579fbd95313893a5353fjcarsey        if (Handle1 != NULL && ShellStatus == SHELL_SUCCESS) {
13524880c2c94d100238b310579fbd95313893a5353fjcarsey          goto Done;
13534880c2c94d100238b310579fbd95313893a5353fjcarsey        }
13544880c2c94d100238b310579fbd95313893a5353fjcarsey      } else if (OutToFile) {
13554880c2c94d100238b310579fbd95313893a5353fjcarsey        ShellStatus = ConfigToFile(Handle1, FileName);
13564880c2c94d100238b310579fbd95313893a5353fjcarsey        if (Handle1 != NULL && ShellStatus == SHELL_SUCCESS) {
13574880c2c94d100238b310579fbd95313893a5353fjcarsey          goto Done;
13584880c2c94d100238b310579fbd95313893a5353fjcarsey        }
13594880c2c94d100238b310579fbd95313893a5353fjcarsey      } else if (HandleIndex1 == NULL) {
13604880c2c94d100238b310579fbd95313893a5353fjcarsey        //
13614880c2c94d100238b310579fbd95313893a5353fjcarsey        // display all that are configurable
13624880c2c94d100238b310579fbd95313893a5353fjcarsey        //
13634880c2c94d100238b310579fbd95313893a5353fjcarsey        ShellStatus = PrintConfigInfoOnAll(AllChildren, Language, UseHii);
13644880c2c94d100238b310579fbd95313893a5353fjcarsey        goto Done;
13654880c2c94d100238b310579fbd95313893a5353fjcarsey      } else {
13664880c2c94d100238b310579fbd95313893a5353fjcarsey        if (!EFI_ERROR(gBS->OpenProtocol(Handle1, &gEfiHiiConfigAccessProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {
13674880c2c94d100238b310579fbd95313893a5353fjcarsey          ShellPrintHiiEx(
13684880c2c94d100238b310579fbd95313893a5353fjcarsey            -1,
13694880c2c94d100238b310579fbd95313893a5353fjcarsey            -1,
13704880c2c94d100238b310579fbd95313893a5353fjcarsey            NULL,
13714880c2c94d100238b310579fbd95313893a5353fjcarsey            STRING_TOKEN (STR_DRVCFG_LINE_HII),
13724880c2c94d100238b310579fbd95313893a5353fjcarsey            gShellDriver1HiiHandle,
13734880c2c94d100238b310579fbd95313893a5353fjcarsey            ConvertHandleToHandleIndex(Handle1)
13744880c2c94d100238b310579fbd95313893a5353fjcarsey            );
13754880c2c94d100238b310579fbd95313893a5353fjcarsey          goto Done;
13764ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey        }
13774ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey      }
13784880c2c94d100238b310579fbd95313893a5353fjcarsey    }
13794880c2c94d100238b310579fbd95313893a5353fjcarsey
13804880c2c94d100238b310579fbd95313893a5353fjcarsey    //
13814880c2c94d100238b310579fbd95313893a5353fjcarsey    // We allways need to do this one since it does both by default.
13824880c2c94d100238b310579fbd95313893a5353fjcarsey    //
13834880c2c94d100238b310579fbd95313893a5353fjcarsey    if (!InFromFile && !OutToFile) {
13844880c2c94d100238b310579fbd95313893a5353fjcarsey      ShellStatus = PreHiiDrvCfg (
13854880c2c94d100238b310579fbd95313893a5353fjcarsey        Language,
13864880c2c94d100238b310579fbd95313893a5353fjcarsey        Force,
13874880c2c94d100238b310579fbd95313893a5353fjcarsey        ForceType,
13884880c2c94d100238b310579fbd95313893a5353fjcarsey        AllChildren,
13894880c2c94d100238b310579fbd95313893a5353fjcarsey        Validate,
13904880c2c94d100238b310579fbd95313893a5353fjcarsey        Set,
13914880c2c94d100238b310579fbd95313893a5353fjcarsey        Handle1,
13924880c2c94d100238b310579fbd95313893a5353fjcarsey        Handle2,
13934880c2c94d100238b310579fbd95313893a5353fjcarsey        Handle3);
13944880c2c94d100238b310579fbd95313893a5353fjcarsey    }
13954880c2c94d100238b310579fbd95313893a5353fjcarsey
13964880c2c94d100238b310579fbd95313893a5353fjcarsey    if (ShellStatus == SHELL_UNSUPPORTED) {
13974880c2c94d100238b310579fbd95313893a5353fjcarsey      ShellPrintHiiEx(
13984880c2c94d100238b310579fbd95313893a5353fjcarsey        -1,
13994880c2c94d100238b310579fbd95313893a5353fjcarsey        -1,
14004880c2c94d100238b310579fbd95313893a5353fjcarsey        NULL,
14014880c2c94d100238b310579fbd95313893a5353fjcarsey        STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT),
14024880c2c94d100238b310579fbd95313893a5353fjcarsey        gShellDriver1HiiHandle,
14034880c2c94d100238b310579fbd95313893a5353fjcarsey        ConvertHandleToHandleIndex(Handle1)
14044880c2c94d100238b310579fbd95313893a5353fjcarsey        );
14054ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey    }
14064ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  }
14074880c2c94d100238b310579fbd95313893a5353fjcarsey
14084880c2c94d100238b310579fbd95313893a5353fjcarseyDone:
14094ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  ShellCommandLineFreeVarList (Package);
14104ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  SHELL_FREE_NON_NULL(Language);
14114ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey  return (ShellStatus);
14124ba49616416ad8ce57c61d0bb0a80c7b5dbf434bjcarsey}
1413