REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the ShellPkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Ray Ni <ray.ni@intel.com>
		
			
				
	
	
		
			1480 lines
		
	
	
		
			48 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			1480 lines
		
	
	
		
			48 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  Main file for DrvCfg shell Driver1 function.
 | 
						|
 | 
						|
  (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
 | 
						|
  Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>
 | 
						|
  SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#include "UefiShellDriver1CommandsLib.h"
 | 
						|
#include <Protocol/HiiConfigAccess.h>
 | 
						|
#include <Protocol/HiiDatabase.h>
 | 
						|
 | 
						|
STATIC CONST EFI_GUID  *CfgGuidList[] = { &gEfiDriverConfigurationProtocolGuid, &gEfiDriverConfiguration2ProtocolGuid, NULL };
 | 
						|
 | 
						|
/**
 | 
						|
  Find the EFI_HII_HANDLE by device path.
 | 
						|
 | 
						|
  @param[in] DevPath1     The Device Path to match.
 | 
						|
  @param[out] HiiHandle   The EFI_HII_HANDLE after the converstion.
 | 
						|
  @param[in] HiiDb        The Hii database protocol
 | 
						|
 | 
						|
  @retval EFI_SUCCESS     The operation was successful.
 | 
						|
  @retval EFI_NOT_FOUND   There was no EFI_HII_HANDLE found for that deviec path.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FindHiiHandleViaDevPath (
 | 
						|
  IN CONST EFI_DEVICE_PATH_PROTOCOL  *DevPath1,
 | 
						|
  OUT EFI_HII_HANDLE                 *HiiHandle,
 | 
						|
  IN EFI_HII_DATABASE_PROTOCOL       *HiiDb
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_HII_HANDLE               *HandleBuffer;
 | 
						|
  UINTN                        HandleBufferSize;
 | 
						|
  VOID                         *MainBuffer;
 | 
						|
  UINTN                        MainBufferSize;
 | 
						|
  EFI_HII_PACKAGE_LIST_HEADER  *PackageListHeader;
 | 
						|
  EFI_HII_PACKAGE_HEADER       *PackageHeader;
 | 
						|
  UINTN                        LoopVariable;
 | 
						|
  EFI_DEVICE_PATH_PROTOCOL     *DevPath2;
 | 
						|
  EFI_STATUS                   Status;
 | 
						|
 | 
						|
  ASSERT (DevPath1 != NULL);
 | 
						|
  ASSERT (HiiHandle != NULL);
 | 
						|
  ASSERT (*HiiHandle == NULL);
 | 
						|
  ASSERT (HiiDb != NULL);
 | 
						|
 | 
						|
  HandleBufferSize = 0;
 | 
						|
  HandleBuffer     = NULL;
 | 
						|
  Status           = HiiDb->ListPackageLists (HiiDb, EFI_HII_PACKAGE_DEVICE_PATH, NULL, &HandleBufferSize, HandleBuffer);
 | 
						|
  if (Status == EFI_BUFFER_TOO_SMALL) {
 | 
						|
    HandleBuffer = AllocateZeroPool (HandleBufferSize);
 | 
						|
    if (HandleBuffer == NULL) {
 | 
						|
      Status = EFI_OUT_OF_RESOURCES;
 | 
						|
    } else {
 | 
						|
      Status = HiiDb->ListPackageLists (HiiDb, EFI_HII_PACKAGE_DEVICE_PATH, NULL, &HandleBufferSize, HandleBuffer);
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    SHELL_FREE_NON_NULL (HandleBuffer);
 | 
						|
    return (Status);
 | 
						|
  }
 | 
						|
 | 
						|
  if (HandleBuffer == NULL) {
 | 
						|
    return EFI_NOT_FOUND;
 | 
						|
  }
 | 
						|
 | 
						|
  for (LoopVariable = 0; LoopVariable < (HandleBufferSize/sizeof (HandleBuffer[0])) && *HiiHandle == NULL; LoopVariable++) {
 | 
						|
    MainBufferSize = 0;
 | 
						|
    MainBuffer     = NULL;
 | 
						|
    Status         = HiiDb->ExportPackageLists (HiiDb, HandleBuffer[LoopVariable], &MainBufferSize, MainBuffer);
 | 
						|
    if (Status == EFI_BUFFER_TOO_SMALL) {
 | 
						|
      MainBuffer = AllocateZeroPool (MainBufferSize);
 | 
						|
      if (MainBuffer != NULL) {
 | 
						|
        Status = HiiDb->ExportPackageLists (HiiDb, HandleBuffer[LoopVariable], &MainBufferSize, MainBuffer);
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    if (EFI_ERROR (Status)) {
 | 
						|
      continue;
 | 
						|
    }
 | 
						|
 | 
						|
    //
 | 
						|
    // Enumerate through the block of returned memory.
 | 
						|
    // This should actually be a small block, but we need to be sure.
 | 
						|
    //
 | 
						|
    for (PackageListHeader = (EFI_HII_PACKAGE_LIST_HEADER *)MainBuffer
 | 
						|
         ; PackageListHeader != NULL && ((CHAR8 *)PackageListHeader) < (((CHAR8 *)MainBuffer)+MainBufferSize) && *HiiHandle == NULL
 | 
						|
         ; PackageListHeader = (EFI_HII_PACKAGE_LIST_HEADER *)(((CHAR8 *)(PackageListHeader)) + PackageListHeader->PackageLength))
 | 
						|
    {
 | 
						|
      for (PackageHeader = (EFI_HII_PACKAGE_HEADER *)(((CHAR8 *)(PackageListHeader))+sizeof (EFI_HII_PACKAGE_LIST_HEADER))
 | 
						|
           ; PackageHeader != NULL && ((CHAR8 *)PackageHeader) < (((CHAR8 *)MainBuffer)+MainBufferSize) && PackageHeader->Type != EFI_HII_PACKAGE_END && *HiiHandle == NULL
 | 
						|
           ; PackageHeader = (EFI_HII_PACKAGE_HEADER *)(((CHAR8 *)(PackageHeader))+PackageHeader->Length))
 | 
						|
      {
 | 
						|
        if (PackageHeader->Type == EFI_HII_PACKAGE_DEVICE_PATH) {
 | 
						|
          DevPath2 = (EFI_DEVICE_PATH_PROTOCOL *)(((CHAR8 *)PackageHeader) + sizeof (EFI_HII_PACKAGE_HEADER));
 | 
						|
          if (DevicePathCompare (&DevPath1, &DevPath2) == 0) {
 | 
						|
            *HiiHandle = HandleBuffer[LoopVariable];
 | 
						|
            break;
 | 
						|
          }
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    SHELL_FREE_NON_NULL (MainBuffer);
 | 
						|
  }
 | 
						|
 | 
						|
  SHELL_FREE_NON_NULL (HandleBuffer);
 | 
						|
 | 
						|
  if (*HiiHandle == NULL) {
 | 
						|
    return (EFI_NOT_FOUND);
 | 
						|
  }
 | 
						|
 | 
						|
  return (EFI_SUCCESS);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Convert a EFI_HANDLE to a EFI_HII_HANDLE.
 | 
						|
 | 
						|
  @param[in] Handle       The EFI_HANDLE to convert.
 | 
						|
  @param[out] HiiHandle   The EFI_HII_HANDLE after the converstion.
 | 
						|
  @param[in] HiiDb        The Hii database protocol
 | 
						|
 | 
						|
  @retval EFI_SUCCESS   The operation was successful.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
ConvertHandleToHiiHandle (
 | 
						|
  IN CONST EFI_HANDLE           Handle,
 | 
						|
  OUT EFI_HII_HANDLE            *HiiHandle,
 | 
						|
  IN EFI_HII_DATABASE_PROTOCOL  *HiiDb
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS                Status;
 | 
						|
  EFI_DEVICE_PATH_PROTOCOL  *DevPath1;
 | 
						|
 | 
						|
  if ((HiiHandle == NULL) || (HiiDb == NULL)) {
 | 
						|
    return (EFI_INVALID_PARAMETER);
 | 
						|
  }
 | 
						|
 | 
						|
  *HiiHandle = NULL;
 | 
						|
 | 
						|
  if (Handle == NULL) {
 | 
						|
    return (EFI_SUCCESS);
 | 
						|
  }
 | 
						|
 | 
						|
  DevPath1 = NULL;
 | 
						|
  Status   = gBS->OpenProtocol (Handle, &gEfiDevicePathProtocolGuid, (VOID **)&DevPath1, gImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);
 | 
						|
  if (EFI_ERROR (Status) || (DevPath1 == NULL)) {
 | 
						|
    return (EFI_NOT_FOUND);
 | 
						|
  }
 | 
						|
 | 
						|
  return (FindHiiHandleViaDevPath (DevPath1, HiiHandle, HiiDb));
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Function to print out all HII configuration information to a file.
 | 
						|
 | 
						|
  @param[in] Handle           The handle to get info on.  NULL to do all handles.
 | 
						|
  @param[in] FileName         The filename to rwite the info to.
 | 
						|
**/
 | 
						|
SHELL_STATUS
 | 
						|
ConfigToFile (
 | 
						|
  IN CONST EFI_HANDLE  Handle,
 | 
						|
  IN CONST CHAR16      *FileName
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_HII_DATABASE_PROTOCOL  *HiiDatabase;
 | 
						|
  EFI_STATUS                 Status;
 | 
						|
  VOID                       *MainBuffer;
 | 
						|
  UINTN                      MainBufferSize;
 | 
						|
  EFI_HII_HANDLE             HiiHandle;
 | 
						|
  SHELL_FILE_HANDLE          FileHandle;
 | 
						|
 | 
						|
  HiiDatabase    = NULL;
 | 
						|
  MainBufferSize = 0;
 | 
						|
  MainBuffer     = NULL;
 | 
						|
  FileHandle     = NULL;
 | 
						|
 | 
						|
  Status = ShellOpenFileByName (FileName, &FileHandle, EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE|EFI_FILE_MODE_CREATE, 0);
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    ShellPrintHiiEx (
 | 
						|
      -1,
 | 
						|
      -1,
 | 
						|
      NULL,
 | 
						|
      STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL),
 | 
						|
      gShellDriver1HiiHandle,
 | 
						|
      L"drvcfg",
 | 
						|
      FileName,
 | 
						|
      Status
 | 
						|
      );
 | 
						|
    return (SHELL_DEVICE_ERROR);
 | 
						|
  }
 | 
						|
 | 
						|
  //
 | 
						|
  // Locate HII Database protocol
 | 
						|
  //
 | 
						|
  Status = gBS->LocateProtocol (
 | 
						|
                  &gEfiHiiDatabaseProtocolGuid,
 | 
						|
                  NULL,
 | 
						|
                  (VOID **)&HiiDatabase
 | 
						|
                  );
 | 
						|
 | 
						|
  if (EFI_ERROR (Status) || (HiiDatabase == NULL)) {
 | 
						|
    ShellPrintHiiEx (
 | 
						|
      -1,
 | 
						|
      -1,
 | 
						|
      NULL,
 | 
						|
      STRING_TOKEN (STR_GEN_PROTOCOL_NF),
 | 
						|
      gShellDriver1HiiHandle,
 | 
						|
      L"drvcfg",
 | 
						|
      L"EfiHiiDatabaseProtocol",
 | 
						|
      &gEfiHiiDatabaseProtocolGuid
 | 
						|
      );
 | 
						|
    ShellCloseFile (&FileHandle);
 | 
						|
    return (SHELL_NOT_FOUND);
 | 
						|
  }
 | 
						|
 | 
						|
  HiiHandle = NULL;
 | 
						|
  Status    = ConvertHandleToHiiHandle (Handle, &HiiHandle, HiiDatabase);
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    ShellPrintHiiEx (
 | 
						|
      -1,
 | 
						|
      -1,
 | 
						|
      NULL,
 | 
						|
      STRING_TOKEN (STR_GEN_HANDLE_NOT),
 | 
						|
      gShellDriver1HiiHandle,
 | 
						|
      L"drvcfg",
 | 
						|
      ConvertHandleToHandleIndex (Handle),
 | 
						|
      L"Device"
 | 
						|
      );
 | 
						|
    ShellCloseFile (&FileHandle);
 | 
						|
    return (SHELL_DEVICE_ERROR);
 | 
						|
  }
 | 
						|
 | 
						|
  Status = HiiDatabase->ExportPackageLists (HiiDatabase, HiiHandle, &MainBufferSize, MainBuffer);
 | 
						|
  if (Status == EFI_BUFFER_TOO_SMALL) {
 | 
						|
    MainBuffer = AllocateZeroPool (MainBufferSize);
 | 
						|
    Status     = HiiDatabase->ExportPackageLists (HiiDatabase, HiiHandle, &MainBufferSize, MainBuffer);
 | 
						|
  }
 | 
						|
 | 
						|
  Status = ShellWriteFile (FileHandle, &MainBufferSize, MainBuffer);
 | 
						|
 | 
						|
  ShellCloseFile (&FileHandle);
 | 
						|
  SHELL_FREE_NON_NULL (MainBuffer);
 | 
						|
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    ShellPrintHiiEx (
 | 
						|
      -1,
 | 
						|
      -1,
 | 
						|
      NULL,
 | 
						|
      STRING_TOKEN (STR_FILE_WRITE_FAIL),
 | 
						|
      gShellDriver1HiiHandle,
 | 
						|
      L"drvcfg",
 | 
						|
      FileName
 | 
						|
      );
 | 
						|
    return (SHELL_DEVICE_ERROR);
 | 
						|
  }
 | 
						|
 | 
						|
  ShellPrintHiiEx (
 | 
						|
    -1,
 | 
						|
    -1,
 | 
						|
    NULL,
 | 
						|
    STRING_TOKEN (STR_DRVCFG_COMP),
 | 
						|
    gShellDriver1HiiHandle
 | 
						|
    );
 | 
						|
 | 
						|
  return (SHELL_SUCCESS);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Function to read in HII configuration information from a file.
 | 
						|
 | 
						|
  @param[in] Handle           The handle to get info for.
 | 
						|
  @param[in] FileName         The filename to read the info from.
 | 
						|
**/
 | 
						|
SHELL_STATUS
 | 
						|
ConfigFromFile (
 | 
						|
  IN       EFI_HANDLE  Handle,
 | 
						|
  IN CONST CHAR16      *FileName
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_HII_DATABASE_PROTOCOL    *HiiDatabase;
 | 
						|
  EFI_STATUS                   Status;
 | 
						|
  VOID                         *MainBuffer;
 | 
						|
  UINT64                       Temp;
 | 
						|
  UINTN                        MainBufferSize;
 | 
						|
  EFI_HII_HANDLE               HiiHandle;
 | 
						|
  SHELL_FILE_HANDLE            FileHandle;
 | 
						|
  CHAR16                       *TempDevPathString;
 | 
						|
  EFI_HII_PACKAGE_LIST_HEADER  *PackageListHeader;
 | 
						|
  EFI_HII_PACKAGE_HEADER       *PackageHeader;
 | 
						|
  EFI_DEVICE_PATH_PROTOCOL     *DevPath;
 | 
						|
  UINTN                        HandleIndex;
 | 
						|
 | 
						|
  HiiDatabase    = NULL;
 | 
						|
  MainBufferSize = 0;
 | 
						|
  MainBuffer     = NULL;
 | 
						|
  FileHandle     = NULL;
 | 
						|
 | 
						|
  Status = ShellOpenFileByName (FileName, &FileHandle, EFI_FILE_MODE_READ, 0);
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    ShellPrintHiiEx (
 | 
						|
      -1,
 | 
						|
      -1,
 | 
						|
      NULL,
 | 
						|
      STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL),
 | 
						|
      gShellDriver1HiiHandle,
 | 
						|
      L"drvcfg",
 | 
						|
      FileName,
 | 
						|
      Status
 | 
						|
      );
 | 
						|
    return (SHELL_DEVICE_ERROR);
 | 
						|
  }
 | 
						|
 | 
						|
  //
 | 
						|
  // Locate HII Database protocol
 | 
						|
  //
 | 
						|
  Status = gBS->LocateProtocol (
 | 
						|
                  &gEfiHiiDatabaseProtocolGuid,
 | 
						|
                  NULL,
 | 
						|
                  (VOID **)&HiiDatabase
 | 
						|
                  );
 | 
						|
 | 
						|
  if (EFI_ERROR (Status) || (HiiDatabase == NULL)) {
 | 
						|
    ShellPrintHiiEx (
 | 
						|
      -1,
 | 
						|
      -1,
 | 
						|
      NULL,
 | 
						|
      STRING_TOKEN (STR_GEN_PROTOCOL_NF),
 | 
						|
      gShellDriver1HiiHandle,
 | 
						|
      L"drvcfg",
 | 
						|
      L"EfiHiiDatabaseProtocol",
 | 
						|
      &gEfiHiiDatabaseProtocolGuid
 | 
						|
      );
 | 
						|
    ShellCloseFile (&FileHandle);
 | 
						|
    return (SHELL_NOT_FOUND);
 | 
						|
  }
 | 
						|
 | 
						|
  Status         = ShellGetFileSize (FileHandle, &Temp);
 | 
						|
  MainBufferSize = (UINTN)Temp;
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    ShellPrintHiiEx (
 | 
						|
      -1,
 | 
						|
      -1,
 | 
						|
      NULL,
 | 
						|
      STRING_TOKEN (STR_FILE_READ_FAIL),
 | 
						|
      gShellDriver1HiiHandle,
 | 
						|
      L"drvcfg",
 | 
						|
      FileName
 | 
						|
      );
 | 
						|
 | 
						|
    ShellCloseFile (&FileHandle);
 | 
						|
    return (SHELL_DEVICE_ERROR);
 | 
						|
  }
 | 
						|
 | 
						|
  MainBuffer = AllocateZeroPool ((UINTN)MainBufferSize);
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    ShellPrintHiiEx (
 | 
						|
      -1,
 | 
						|
      -1,
 | 
						|
      NULL,
 | 
						|
      STRING_TOKEN (STR_GEN_OUT_MEM),
 | 
						|
      gShellDriver1HiiHandle,
 | 
						|
      L"drvcfg"
 | 
						|
      );
 | 
						|
    ShellCloseFile (&FileHandle);
 | 
						|
    return (SHELL_DEVICE_ERROR);
 | 
						|
  }
 | 
						|
 | 
						|
  Status = ShellReadFile (FileHandle, &MainBufferSize, MainBuffer);
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    ShellPrintHiiEx (
 | 
						|
      -1,
 | 
						|
      -1,
 | 
						|
      NULL,
 | 
						|
      STRING_TOKEN (STR_FILE_READ_FAIL),
 | 
						|
      gShellDriver1HiiHandle,
 | 
						|
      L"drvcfg",
 | 
						|
      FileName
 | 
						|
      );
 | 
						|
 | 
						|
    ShellCloseFile (&FileHandle);
 | 
						|
    SHELL_FREE_NON_NULL (MainBuffer);
 | 
						|
    return (SHELL_DEVICE_ERROR);
 | 
						|
  }
 | 
						|
 | 
						|
  ShellCloseFile (&FileHandle);
 | 
						|
 | 
						|
  if (Handle != NULL) {
 | 
						|
    //
 | 
						|
    // User override in place.  Just do it.
 | 
						|
    //
 | 
						|
    HiiHandle = NULL;
 | 
						|
    Status    = ConvertHandleToHiiHandle (Handle, &HiiHandle, HiiDatabase);
 | 
						|
    if (EFI_ERROR (Status)) {
 | 
						|
      ShellPrintHiiEx (
 | 
						|
        -1,
 | 
						|
        -1,
 | 
						|
        NULL,
 | 
						|
        STRING_TOKEN (STR_GEN_HANDLE_NOT),
 | 
						|
        gShellDriver1HiiHandle,
 | 
						|
        L"drvcfg",
 | 
						|
        ConvertHandleToHandleIndex (Handle),
 | 
						|
        L"Device"
 | 
						|
        );
 | 
						|
      ShellCloseFile (&FileHandle);
 | 
						|
      return (SHELL_DEVICE_ERROR);
 | 
						|
    }
 | 
						|
 | 
						|
    Status = HiiDatabase->UpdatePackageList (HiiDatabase, HiiHandle, MainBuffer);
 | 
						|
    if (EFI_ERROR (Status)) {
 | 
						|
      ShellPrintHiiEx (
 | 
						|
        -1,
 | 
						|
        -1,
 | 
						|
        NULL,
 | 
						|
        STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN),
 | 
						|
        gShellDriver1HiiHandle,
 | 
						|
        L"drvcfg",
 | 
						|
        L"HiiDatabase->UpdatePackageList",
 | 
						|
        Status
 | 
						|
        );
 | 
						|
      return (SHELL_DEVICE_ERROR);
 | 
						|
    }
 | 
						|
  } else {
 | 
						|
    //
 | 
						|
    // we need to parse the buffer and try to match the device paths for each item to try to find it's device path.
 | 
						|
    //
 | 
						|
 | 
						|
    for (PackageListHeader = (EFI_HII_PACKAGE_LIST_HEADER *)MainBuffer
 | 
						|
         ; PackageListHeader != NULL && ((CHAR8 *)PackageListHeader) < (((CHAR8 *)MainBuffer)+MainBufferSize)
 | 
						|
         ; PackageListHeader = (EFI_HII_PACKAGE_LIST_HEADER *)(((CHAR8 *)(PackageListHeader)) + PackageListHeader->PackageLength))
 | 
						|
    {
 | 
						|
      for (PackageHeader = (EFI_HII_PACKAGE_HEADER *)(((CHAR8 *)(PackageListHeader))+sizeof (EFI_HII_PACKAGE_LIST_HEADER))
 | 
						|
           ; PackageHeader != NULL && ((CHAR8 *)PackageHeader) < (((CHAR8 *)MainBuffer)+MainBufferSize) && PackageHeader->Type != EFI_HII_PACKAGE_END
 | 
						|
           ; PackageHeader = (EFI_HII_PACKAGE_HEADER *)(((CHAR8 *)(PackageHeader))+PackageHeader->Length))
 | 
						|
      {
 | 
						|
        if (PackageHeader->Type == EFI_HII_PACKAGE_DEVICE_PATH) {
 | 
						|
          HiiHandle = NULL;
 | 
						|
          Status    = FindHiiHandleViaDevPath ((EFI_DEVICE_PATH_PROTOCOL *)(((CHAR8 *)PackageHeader) + sizeof (EFI_HII_PACKAGE_HEADER)), &HiiHandle, HiiDatabase);
 | 
						|
          if (EFI_ERROR (Status)) {
 | 
						|
            //
 | 
						|
            // print out an error.
 | 
						|
            //
 | 
						|
            TempDevPathString = ConvertDevicePathToText ((EFI_DEVICE_PATH_PROTOCOL *)(((CHAR8 *)PackageHeader) + sizeof (EFI_HII_PACKAGE_HEADER)), TRUE, TRUE);
 | 
						|
            ShellPrintHiiEx (
 | 
						|
              -1,
 | 
						|
              -1,
 | 
						|
              NULL,
 | 
						|
              STRING_TOKEN (STR_DRVCFG_IN_FILE_NF),
 | 
						|
              gShellDriver1HiiHandle,
 | 
						|
              TempDevPathString
 | 
						|
              );
 | 
						|
            SHELL_FREE_NON_NULL (TempDevPathString);
 | 
						|
          } else {
 | 
						|
            Status = HiiDatabase->UpdatePackageList (HiiDatabase, HiiHandle, PackageListHeader);
 | 
						|
            if (EFI_ERROR (Status)) {
 | 
						|
              ShellPrintHiiEx (
 | 
						|
                -1,
 | 
						|
                -1,
 | 
						|
                NULL,
 | 
						|
                STRING_TOKEN (STR_GEN_UEFI_FUNC_WARN),
 | 
						|
                gShellDriver1HiiHandle,
 | 
						|
                L"drvcfg",
 | 
						|
                L"HiiDatabase->UpdatePackageList",
 | 
						|
                Status
 | 
						|
                );
 | 
						|
              return (SHELL_DEVICE_ERROR);
 | 
						|
            } else {
 | 
						|
              DevPath = (EFI_DEVICE_PATH_PROTOCOL *)(((CHAR8 *)PackageHeader) + sizeof (EFI_HII_PACKAGE_HEADER));
 | 
						|
              gBS->LocateDevicePath (&gEfiHiiConfigAccessProtocolGuid, &DevPath, &Handle);
 | 
						|
              HandleIndex = ConvertHandleToHandleIndex (Handle);
 | 
						|
              ShellPrintHiiEx (
 | 
						|
                -1,
 | 
						|
                -1,
 | 
						|
                NULL,
 | 
						|
                STRING_TOKEN (STR_DRVCFG_DONE_HII),
 | 
						|
                gShellDriver1HiiHandle,
 | 
						|
                HandleIndex
 | 
						|
                );
 | 
						|
            }
 | 
						|
          }
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  SHELL_FREE_NON_NULL (MainBuffer);
 | 
						|
 | 
						|
  ShellPrintHiiEx (
 | 
						|
    -1,
 | 
						|
    -1,
 | 
						|
    NULL,
 | 
						|
    STRING_TOKEN (STR_DRVCFG_COMP),
 | 
						|
    gShellDriver1HiiHandle
 | 
						|
    );
 | 
						|
  return (SHELL_SUCCESS);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Present a requested action to the user.
 | 
						|
 | 
						|
  @param[in] DriverImageHandle  The handle for the driver to configure.
 | 
						|
  @param[in] ControllerHandle   The handle of the device being managed by the Driver specified.
 | 
						|
  @param[in] ChildHandle        The handle of a child device of the specified device.
 | 
						|
  @param[in] ActionRequired     The required HII action.
 | 
						|
 | 
						|
  @retval SHELL_INVALID_PARAMETER   A parameter has a invalid value.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
ShellCmdDriverConfigurationProcessActionRequired (
 | 
						|
  EFI_HANDLE                                DriverImageHandle,
 | 
						|
  EFI_HANDLE                                ControllerHandle,
 | 
						|
  EFI_HANDLE                                ChildHandle,
 | 
						|
  EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED  ActionRequired
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_HANDLE  ConnectControllerContextOverride[2];
 | 
						|
 | 
						|
  switch (ActionRequired) {
 | 
						|
    case EfiDriverConfigurationActionNone:
 | 
						|
      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DRVCFG_NONE), gShellDriver1HiiHandle);
 | 
						|
      break;
 | 
						|
 | 
						|
    case EfiDriverConfigurationActionStopController:
 | 
						|
      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DRVCFG_STOP), gShellDriver1HiiHandle);
 | 
						|
      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DRVCFG_ENTER_S), gShellDriver1HiiHandle, L"stop controller");
 | 
						|
      ShellPromptForResponse (ShellPromptResponseTypeEnterContinue, NULL, NULL);
 | 
						|
 | 
						|
      gBS->DisconnectController (ControllerHandle, DriverImageHandle, ChildHandle);
 | 
						|
      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DRVCFG_CTLR_S), gShellDriver1HiiHandle, L"stopped");
 | 
						|
      break;
 | 
						|
 | 
						|
    case EfiDriverConfigurationActionRestartController:
 | 
						|
      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DRVCFG_RESTART_S), gShellDriver1HiiHandle, L"controller");
 | 
						|
      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DRVCFG_ENTER_S), gShellDriver1HiiHandle, L"restart controller");
 | 
						|
      ShellPromptForResponse (ShellPromptResponseTypeEnterContinue, NULL, NULL);
 | 
						|
 | 
						|
      gBS->DisconnectController (ControllerHandle, DriverImageHandle, ChildHandle);
 | 
						|
      ConnectControllerContextOverride[0] = DriverImageHandle;
 | 
						|
      ConnectControllerContextOverride[1] = NULL;
 | 
						|
      gBS->ConnectController (ControllerHandle, ConnectControllerContextOverride, NULL, TRUE);
 | 
						|
      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DRVCFG_CTLR_S), gShellDriver1HiiHandle, L"restarted");
 | 
						|
      break;
 | 
						|
 | 
						|
    case EfiDriverConfigurationActionRestartPlatform:
 | 
						|
      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DRVCFG_RESTART_S), gShellDriver1HiiHandle, L"platform");
 | 
						|
      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DRVCFG_ENTER_S), gShellDriver1HiiHandle, L"restart platform");
 | 
						|
      ShellPromptForResponse (ShellPromptResponseTypeEnterContinue, NULL, NULL);
 | 
						|
 | 
						|
      gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);
 | 
						|
      break;
 | 
						|
 | 
						|
    default:
 | 
						|
      return (EFI_INVALID_PARAMETER);
 | 
						|
  }
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Do the configuration in an environment without HII.
 | 
						|
 | 
						|
  @param[in] Language           The language code.
 | 
						|
  @param[in] ForceDefaults      TRUE to force defaults, FALSE otherwise.
 | 
						|
  @param[in] DefaultType        If ForceDefaults is TRUE, specifies the default type.
 | 
						|
  @param[in] AllChildren        TRUE to configure all children, FALSE otherwise.
 | 
						|
  @param[in] ValidateOptions    TRUE to validate existing options, FALSE otherwise.
 | 
						|
  @param[in] SetOptions         TRUE to set options, FALSE otherwise.
 | 
						|
  @param[in] DriverImageHandle  The handle for the driver to configure.
 | 
						|
  @param[in] DeviceHandle       The handle of the device being managed by the Driver specified.
 | 
						|
  @param[in] ChildHandle        The handle of a child device of the specified device.
 | 
						|
 | 
						|
  @retval SHELL_NOT_FOUND           A specified handle could not be found.
 | 
						|
  @retval SHELL_INVALID_PARAMETER   A parameter has a invalid value.
 | 
						|
**/
 | 
						|
SHELL_STATUS
 | 
						|
PreHiiDrvCfg (
 | 
						|
  IN CONST CHAR8  *Language,
 | 
						|
  IN BOOLEAN      ForceDefaults,
 | 
						|
  IN UINT32       DefaultType,
 | 
						|
  IN BOOLEAN      AllChildren,
 | 
						|
  IN BOOLEAN      ValidateOptions,
 | 
						|
  IN BOOLEAN      SetOptions,
 | 
						|
  IN EFI_HANDLE   DriverImageHandle,
 | 
						|
  IN EFI_HANDLE   DeviceHandle,
 | 
						|
  IN EFI_HANDLE   ChildHandle
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS                                Status;
 | 
						|
  SHELL_STATUS                              ShellStatus;
 | 
						|
  UINTN                                     OuterLoopCounter;
 | 
						|
  CHAR8                                     *BestLanguage;
 | 
						|
  UINTN                                     DriverImageHandleCount;
 | 
						|
  EFI_HANDLE                                *DriverImageHandleBuffer;
 | 
						|
  UINTN                                     HandleCount;
 | 
						|
  EFI_HANDLE                                *HandleBuffer;
 | 
						|
  UINTN                                     *HandleType;
 | 
						|
  UINTN                                     LoopCounter;
 | 
						|
  UINTN                                     ChildIndex;
 | 
						|
  UINTN                                     ChildHandleCount;
 | 
						|
  EFI_HANDLE                                *ChildHandleBuffer;
 | 
						|
  UINTN                                     *ChildHandleType;
 | 
						|
  EFI_DRIVER_CONFIGURATION_ACTION_REQUIRED  ActionRequired;
 | 
						|
  EFI_DRIVER_CONFIGURATION_PROTOCOL         *DriverConfiguration;
 | 
						|
  BOOLEAN                                   Iso639Language;
 | 
						|
  UINTN                                     HandleIndex1;
 | 
						|
  UINTN                                     HandleIndex2;
 | 
						|
  UINTN                                     HandleIndex3;
 | 
						|
 | 
						|
  ShellStatus = SHELL_SUCCESS;
 | 
						|
 | 
						|
  if ((ChildHandle == NULL) && AllChildren) {
 | 
						|
    SetOptions = FALSE;
 | 
						|
  }
 | 
						|
 | 
						|
  if (ForceDefaults) {
 | 
						|
    ShellPrintHiiEx (
 | 
						|
      -1,
 | 
						|
      -1,
 | 
						|
      NULL,
 | 
						|
      STRING_TOKEN (STR_DRVCFG_FORCE_D),
 | 
						|
      gShellDriver1HiiHandle,
 | 
						|
      DefaultType
 | 
						|
      );
 | 
						|
  } else if (ValidateOptions) {
 | 
						|
    ShellPrintHiiEx (
 | 
						|
      -1,
 | 
						|
      -1,
 | 
						|
      NULL,
 | 
						|
      STRING_TOKEN (STR_DRVCFG_VALIDATE),
 | 
						|
      gShellDriver1HiiHandle
 | 
						|
      );
 | 
						|
  } else if (SetOptions) {
 | 
						|
    ShellPrintHiiEx (
 | 
						|
      -1,
 | 
						|
      -1,
 | 
						|
      NULL,
 | 
						|
      STRING_TOKEN (STR_DRVCFG_SET),
 | 
						|
      gShellDriver1HiiHandle
 | 
						|
      );
 | 
						|
  }
 | 
						|
 | 
						|
  if (DriverImageHandle == 0) {
 | 
						|
    DriverImageHandleBuffer = GetHandleListByProtocolList (CfgGuidList);
 | 
						|
    if (DriverImageHandleBuffer == NULL) {
 | 
						|
      ShellStatus = SHELL_NOT_FOUND;
 | 
						|
      goto Done;
 | 
						|
    }
 | 
						|
 | 
						|
    for (
 | 
						|
         HandleBuffer = DriverImageHandleBuffer, DriverImageHandleCount = 0
 | 
						|
         ; HandleBuffer != NULL && *HandleBuffer != NULL
 | 
						|
         ; HandleBuffer++, DriverImageHandleCount++)
 | 
						|
    {
 | 
						|
    }
 | 
						|
  } else {
 | 
						|
    DriverImageHandleCount = 1;
 | 
						|
    //
 | 
						|
    // Allocate buffer to hold the image handle so as to
 | 
						|
    // keep consistent with the above clause
 | 
						|
    //
 | 
						|
    DriverImageHandleBuffer = AllocatePool (sizeof (EFI_HANDLE));
 | 
						|
    ASSERT (DriverImageHandleBuffer);
 | 
						|
    DriverImageHandleBuffer[0] = DriverImageHandle;
 | 
						|
  }
 | 
						|
 | 
						|
  for (OuterLoopCounter = 0; OuterLoopCounter < DriverImageHandleCount; OuterLoopCounter++) {
 | 
						|
    Iso639Language = FALSE;
 | 
						|
    Status         = gBS->OpenProtocol (
 | 
						|
                            DriverImageHandleBuffer[OuterLoopCounter],
 | 
						|
                            &gEfiDriverConfiguration2ProtocolGuid,
 | 
						|
                            (VOID **)&DriverConfiguration,
 | 
						|
                            NULL,
 | 
						|
                            NULL,
 | 
						|
                            EFI_OPEN_PROTOCOL_GET_PROTOCOL
 | 
						|
                            );
 | 
						|
    if (EFI_ERROR (Status)) {
 | 
						|
      Iso639Language = TRUE;
 | 
						|
      Status         = gBS->OpenProtocol (
 | 
						|
                              DriverImageHandleBuffer[OuterLoopCounter],
 | 
						|
                              &gEfiDriverConfigurationProtocolGuid,
 | 
						|
                              (VOID **)&DriverConfiguration,
 | 
						|
                              NULL,
 | 
						|
                              NULL,
 | 
						|
                              EFI_OPEN_PROTOCOL_GET_PROTOCOL
 | 
						|
                              );
 | 
						|
    }
 | 
						|
 | 
						|
    if (EFI_ERROR (Status)) {
 | 
						|
      //      ShellPrintHiiEx(
 | 
						|
      //        -1,
 | 
						|
      //        -1,
 | 
						|
      //        NULL,
 | 
						|
      //        STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT),
 | 
						|
      //        gShellDriver1HiiHandle,
 | 
						|
      //        ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter])
 | 
						|
      //        );
 | 
						|
      ShellStatus = SHELL_UNSUPPORTED;
 | 
						|
      continue;
 | 
						|
    }
 | 
						|
 | 
						|
    BestLanguage = GetBestLanguage (
 | 
						|
                     DriverConfiguration->SupportedLanguages,
 | 
						|
                     Iso639Language,
 | 
						|
                     Language != NULL ? Language : "",
 | 
						|
                     DriverConfiguration->SupportedLanguages,
 | 
						|
                     NULL
 | 
						|
                     );
 | 
						|
    if (BestLanguage == NULL) {
 | 
						|
      ShellPrintHiiEx (
 | 
						|
        -1,
 | 
						|
        -1,
 | 
						|
        NULL,
 | 
						|
        STRING_TOKEN (STR_GEN_NO_VALUE),
 | 
						|
        gShellDriver1HiiHandle,
 | 
						|
        L"drvcfg",
 | 
						|
        L"-l"
 | 
						|
        );
 | 
						|
      ShellStatus = SHELL_INVALID_PARAMETER;
 | 
						|
      continue;
 | 
						|
    }
 | 
						|
 | 
						|
    Status = ParseHandleDatabaseByRelationshipWithType (
 | 
						|
               DriverImageHandleBuffer[OuterLoopCounter],
 | 
						|
               NULL,
 | 
						|
               &HandleCount,
 | 
						|
               &HandleBuffer,
 | 
						|
               &HandleType
 | 
						|
               );
 | 
						|
    if (EFI_ERROR (Status)) {
 | 
						|
      continue;
 | 
						|
    }
 | 
						|
 | 
						|
    if (SetOptions && (DeviceHandle == NULL)) {
 | 
						|
      gST->ConOut->ClearScreen (gST->ConOut);
 | 
						|
      Status = DriverConfiguration->SetOptions (
 | 
						|
                                      DriverConfiguration,
 | 
						|
                                      NULL,
 | 
						|
                                      NULL,
 | 
						|
                                      BestLanguage,
 | 
						|
                                      &ActionRequired
 | 
						|
                                      );
 | 
						|
      gST->ConOut->ClearScreen (gST->ConOut);
 | 
						|
 | 
						|
      ShellPrintHiiEx (
 | 
						|
        -1,
 | 
						|
        -1,
 | 
						|
        NULL,
 | 
						|
        STRING_TOKEN (STR_DRVCFG_ALL_LANG),
 | 
						|
        gShellDriver1HiiHandle,
 | 
						|
        ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]),
 | 
						|
        DriverConfiguration->SupportedLanguages
 | 
						|
        );
 | 
						|
      if (!EFI_ERROR (Status)) {
 | 
						|
        ShellPrintHiiEx (
 | 
						|
          -1,
 | 
						|
          -1,
 | 
						|
          NULL,
 | 
						|
          STRING_TOKEN (STR_DRVCFG_OPTIONS_SET),
 | 
						|
          gShellDriver1HiiHandle
 | 
						|
          );
 | 
						|
        for (LoopCounter = 0; LoopCounter < HandleCount; LoopCounter++) {
 | 
						|
          if ((HandleType[LoopCounter] & HR_CONTROLLER_HANDLE) == HR_CONTROLLER_HANDLE) {
 | 
						|
            ShellCmdDriverConfigurationProcessActionRequired (
 | 
						|
              DriverImageHandleBuffer[OuterLoopCounter],
 | 
						|
              HandleBuffer[LoopCounter],
 | 
						|
              NULL,
 | 
						|
              ActionRequired
 | 
						|
              );
 | 
						|
          }
 | 
						|
        }
 | 
						|
      } else {
 | 
						|
        ShellPrintHiiEx (
 | 
						|
          -1,
 | 
						|
          -1,
 | 
						|
          NULL,
 | 
						|
          STRING_TOKEN (STR_DRVCFG_NOT_SET),
 | 
						|
          gShellDriver1HiiHandle,
 | 
						|
          Status
 | 
						|
          );
 | 
						|
      }
 | 
						|
 | 
						|
      continue;
 | 
						|
    }
 | 
						|
 | 
						|
    for (LoopCounter = 0; LoopCounter < HandleCount; LoopCounter++) {
 | 
						|
      if ((HandleType[LoopCounter] & HR_CONTROLLER_HANDLE) != HR_CONTROLLER_HANDLE) {
 | 
						|
        continue;
 | 
						|
      }
 | 
						|
 | 
						|
      if ((DeviceHandle != NULL) && (DeviceHandle != HandleBuffer[LoopCounter])) {
 | 
						|
        continue;
 | 
						|
      }
 | 
						|
 | 
						|
      if (ChildHandle == NULL) {
 | 
						|
        HandleIndex1 = ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]);
 | 
						|
        HandleIndex2 = ConvertHandleToHandleIndex (HandleBuffer[LoopCounter]);
 | 
						|
        ShellPrintHiiEx (
 | 
						|
          -1,
 | 
						|
          -1,
 | 
						|
          NULL,
 | 
						|
          STRING_TOKEN (STR_DRVCFG_CTRL_LANG),
 | 
						|
          gShellDriver1HiiHandle,
 | 
						|
          HandleIndex1,
 | 
						|
          HandleIndex2,
 | 
						|
          DriverConfiguration->SupportedLanguages
 | 
						|
          );
 | 
						|
 | 
						|
        if (ForceDefaults) {
 | 
						|
          Status = DriverConfiguration->ForceDefaults (
 | 
						|
                                          DriverConfiguration,
 | 
						|
                                          HandleBuffer[LoopCounter],
 | 
						|
                                          NULL,
 | 
						|
                                          DefaultType,
 | 
						|
                                          &ActionRequired
 | 
						|
                                          );
 | 
						|
 | 
						|
          if (!EFI_ERROR (Status)) {
 | 
						|
            ShellPrintHiiEx (
 | 
						|
              -1,
 | 
						|
              -1,
 | 
						|
              NULL,
 | 
						|
              STRING_TOKEN (STR_DRVCFG_DEF_FORCED),
 | 
						|
              gShellDriver1HiiHandle
 | 
						|
              );
 | 
						|
            ShellCmdDriverConfigurationProcessActionRequired (
 | 
						|
              DriverImageHandleBuffer[OuterLoopCounter],
 | 
						|
              HandleBuffer[LoopCounter],
 | 
						|
              NULL,
 | 
						|
              ActionRequired
 | 
						|
              );
 | 
						|
          } else {
 | 
						|
            ShellPrintHiiEx (
 | 
						|
              -1,
 | 
						|
              -1,
 | 
						|
              NULL,
 | 
						|
              STRING_TOKEN (STR_DRVCFG_FORCE_FAILED),
 | 
						|
              gShellDriver1HiiHandle,
 | 
						|
              Status
 | 
						|
              );
 | 
						|
            ShellStatus = SHELL_DEVICE_ERROR;
 | 
						|
          }
 | 
						|
        } else if (ValidateOptions) {
 | 
						|
          Status = DriverConfiguration->OptionsValid (
 | 
						|
                                          DriverConfiguration,
 | 
						|
                                          HandleBuffer[LoopCounter],
 | 
						|
                                          NULL
 | 
						|
                                          );
 | 
						|
 | 
						|
          if (!EFI_ERROR (Status)) {
 | 
						|
            ShellPrintHiiEx (
 | 
						|
              -1,
 | 
						|
              -1,
 | 
						|
              NULL,
 | 
						|
              STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID),
 | 
						|
              gShellDriver1HiiHandle
 | 
						|
              );
 | 
						|
          } else {
 | 
						|
            ShellPrintHiiEx (
 | 
						|
              -1,
 | 
						|
              -1,
 | 
						|
              NULL,
 | 
						|
              STRING_TOKEN (STR_DRVCFG_OPTIONS_INV),
 | 
						|
              gShellDriver1HiiHandle,
 | 
						|
              Status
 | 
						|
              );
 | 
						|
            ShellStatus = SHELL_DEVICE_ERROR;
 | 
						|
          }
 | 
						|
        } else if (SetOptions) {
 | 
						|
          gST->ConOut->ClearScreen (gST->ConOut);
 | 
						|
          Status = DriverConfiguration->SetOptions (
 | 
						|
                                          DriverConfiguration,
 | 
						|
                                          HandleBuffer[LoopCounter],
 | 
						|
                                          NULL,
 | 
						|
                                          BestLanguage,
 | 
						|
                                          &ActionRequired
 | 
						|
                                          );
 | 
						|
          gST->ConOut->ClearScreen (gST->ConOut);
 | 
						|
          HandleIndex1 = ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]);
 | 
						|
          HandleIndex2 = ConvertHandleToHandleIndex (HandleBuffer[LoopCounter]);
 | 
						|
          ShellPrintHiiEx (
 | 
						|
            -1,
 | 
						|
            -1,
 | 
						|
            NULL,
 | 
						|
            STRING_TOKEN (STR_DRVCFG_CTRL_LANG),
 | 
						|
            gShellDriver1HiiHandle,
 | 
						|
            HandleIndex1,
 | 
						|
            HandleIndex2,
 | 
						|
            DriverConfiguration->SupportedLanguages
 | 
						|
            );
 | 
						|
          if (!EFI_ERROR (Status)) {
 | 
						|
            ShellPrintHiiEx (
 | 
						|
              -1,
 | 
						|
              -1,
 | 
						|
              NULL,
 | 
						|
              STRING_TOKEN (STR_DRVCFG_OPTIONS_SET),
 | 
						|
              gShellDriver1HiiHandle
 | 
						|
              );
 | 
						|
 | 
						|
            ShellCmdDriverConfigurationProcessActionRequired (
 | 
						|
              DriverImageHandleBuffer[OuterLoopCounter],
 | 
						|
              HandleBuffer[LoopCounter],
 | 
						|
              NULL,
 | 
						|
              ActionRequired
 | 
						|
              );
 | 
						|
          } else {
 | 
						|
            ShellPrintHiiEx (
 | 
						|
              -1,
 | 
						|
              -1,
 | 
						|
              NULL,
 | 
						|
              STRING_TOKEN (STR_DRVCFG_NOT_SET),
 | 
						|
              gShellDriver1HiiHandle,
 | 
						|
              Status
 | 
						|
              );
 | 
						|
            ShellStatus = SHELL_DEVICE_ERROR;
 | 
						|
          }
 | 
						|
        } else {
 | 
						|
          Print (L"\n");
 | 
						|
        }
 | 
						|
      }
 | 
						|
 | 
						|
      if ((ChildHandle == NULL) && !AllChildren) {
 | 
						|
        continue;
 | 
						|
      }
 | 
						|
 | 
						|
      Status = ParseHandleDatabaseByRelationshipWithType (
 | 
						|
                 DriverImageHandleBuffer[OuterLoopCounter],
 | 
						|
                 HandleBuffer[LoopCounter],
 | 
						|
                 &ChildHandleCount,
 | 
						|
                 &ChildHandleBuffer,
 | 
						|
                 &ChildHandleType
 | 
						|
                 );
 | 
						|
      if (EFI_ERROR (Status)) {
 | 
						|
        continue;
 | 
						|
      }
 | 
						|
 | 
						|
      for (ChildIndex = 0; ChildIndex < ChildHandleCount; ChildIndex++) {
 | 
						|
        if ((ChildHandleType[ChildIndex] & HR_CHILD_HANDLE) != HR_CHILD_HANDLE) {
 | 
						|
          continue;
 | 
						|
        }
 | 
						|
 | 
						|
        if ((ChildHandle != NULL) && (ChildHandle != ChildHandleBuffer[ChildIndex])) {
 | 
						|
          continue;
 | 
						|
        }
 | 
						|
 | 
						|
        HandleIndex1 = ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]);
 | 
						|
        HandleIndex2 = ConvertHandleToHandleIndex (HandleBuffer[LoopCounter]);
 | 
						|
        HandleIndex3 = ConvertHandleToHandleIndex (ChildHandleBuffer[ChildIndex]);
 | 
						|
        ShellPrintHiiEx (
 | 
						|
          -1,
 | 
						|
          -1,
 | 
						|
          NULL,
 | 
						|
          STRING_TOKEN (STR_DRVCFG_CHILD_LANG),
 | 
						|
          gShellDriver1HiiHandle,
 | 
						|
          HandleIndex1,
 | 
						|
          HandleIndex2,
 | 
						|
          HandleIndex3,
 | 
						|
          DriverConfiguration->SupportedLanguages
 | 
						|
          );
 | 
						|
 | 
						|
        if (ForceDefaults) {
 | 
						|
          Status = DriverConfiguration->ForceDefaults (
 | 
						|
                                          DriverConfiguration,
 | 
						|
                                          HandleBuffer[LoopCounter],
 | 
						|
                                          ChildHandleBuffer[ChildIndex],
 | 
						|
                                          DefaultType,
 | 
						|
                                          &ActionRequired
 | 
						|
                                          );
 | 
						|
 | 
						|
          if (!EFI_ERROR (Status)) {
 | 
						|
            ShellPrintHiiEx (
 | 
						|
              -1,
 | 
						|
              -1,
 | 
						|
              NULL,
 | 
						|
              STRING_TOKEN (STR_DRVCFG_DEF_FORCED),
 | 
						|
              gShellDriver1HiiHandle
 | 
						|
              );
 | 
						|
 | 
						|
            ShellCmdDriverConfigurationProcessActionRequired (
 | 
						|
              DriverImageHandleBuffer[OuterLoopCounter],
 | 
						|
              HandleBuffer[LoopCounter],
 | 
						|
              ChildHandleBuffer[ChildIndex],
 | 
						|
              ActionRequired
 | 
						|
              );
 | 
						|
          } else {
 | 
						|
            ShellPrintHiiEx (
 | 
						|
              -1,
 | 
						|
              -1,
 | 
						|
              NULL,
 | 
						|
              STRING_TOKEN (STR_DRVCFG_FORCE_FAILED),
 | 
						|
              gShellDriver1HiiHandle,
 | 
						|
              Status
 | 
						|
              );
 | 
						|
            ShellStatus = SHELL_DEVICE_ERROR;
 | 
						|
          }
 | 
						|
        } else if (ValidateOptions) {
 | 
						|
          Status = DriverConfiguration->OptionsValid (
 | 
						|
                                          DriverConfiguration,
 | 
						|
                                          HandleBuffer[LoopCounter],
 | 
						|
                                          ChildHandleBuffer[ChildIndex]
 | 
						|
                                          );
 | 
						|
 | 
						|
          if (!EFI_ERROR (Status)) {
 | 
						|
            ShellPrintHiiEx (
 | 
						|
              -1,
 | 
						|
              -1,
 | 
						|
              NULL,
 | 
						|
              STRING_TOKEN (STR_DRVCFG_OPTIONS_VALID),
 | 
						|
              gShellDriver1HiiHandle
 | 
						|
              );
 | 
						|
          } else {
 | 
						|
            ShellPrintHiiEx (
 | 
						|
              -1,
 | 
						|
              -1,
 | 
						|
              NULL,
 | 
						|
              STRING_TOKEN (STR_DRVCFG_OPTIONS_INV),
 | 
						|
              gShellDriver1HiiHandle,
 | 
						|
              Status
 | 
						|
              );
 | 
						|
            ShellStatus = SHELL_DEVICE_ERROR;
 | 
						|
          }
 | 
						|
        } else if (SetOptions) {
 | 
						|
          gST->ConOut->ClearScreen (gST->ConOut);
 | 
						|
          Status = DriverConfiguration->SetOptions (
 | 
						|
                                          DriverConfiguration,
 | 
						|
                                          HandleBuffer[LoopCounter],
 | 
						|
                                          ChildHandleBuffer[ChildIndex],
 | 
						|
                                          BestLanguage,
 | 
						|
                                          &ActionRequired
 | 
						|
                                          );
 | 
						|
          gST->ConOut->ClearScreen (gST->ConOut);
 | 
						|
          HandleIndex1 = ConvertHandleToHandleIndex (DriverImageHandleBuffer[OuterLoopCounter]);
 | 
						|
          HandleIndex2 = ConvertHandleToHandleIndex (HandleBuffer[LoopCounter]);
 | 
						|
          HandleIndex3 = ConvertHandleToHandleIndex (ChildHandleBuffer[ChildIndex]);
 | 
						|
          ShellPrintHiiEx (
 | 
						|
            -1,
 | 
						|
            -1,
 | 
						|
            NULL,
 | 
						|
            STRING_TOKEN (STR_DRVCFG_CHILD_LANG),
 | 
						|
            gShellDriver1HiiHandle,
 | 
						|
            HandleIndex1,
 | 
						|
            HandleIndex2,
 | 
						|
            HandleIndex3,
 | 
						|
            DriverConfiguration->SupportedLanguages
 | 
						|
            );
 | 
						|
          if (!EFI_ERROR (Status)) {
 | 
						|
            ShellPrintHiiEx (
 | 
						|
              -1,
 | 
						|
              -1,
 | 
						|
              NULL,
 | 
						|
              STRING_TOKEN (STR_DRVCFG_OPTIONS_SET),
 | 
						|
              gShellDriver1HiiHandle
 | 
						|
              );
 | 
						|
 | 
						|
            ShellCmdDriverConfigurationProcessActionRequired (
 | 
						|
              DriverImageHandleBuffer[OuterLoopCounter],
 | 
						|
              HandleBuffer[LoopCounter],
 | 
						|
              ChildHandleBuffer[ChildIndex],
 | 
						|
              ActionRequired
 | 
						|
              );
 | 
						|
          } else {
 | 
						|
            ShellPrintHiiEx (
 | 
						|
              -1,
 | 
						|
              -1,
 | 
						|
              NULL,
 | 
						|
              STRING_TOKEN (STR_DRVCFG_NOT_SET),
 | 
						|
              gShellDriver1HiiHandle,
 | 
						|
              Status
 | 
						|
              );
 | 
						|
            ShellStatus = SHELL_DEVICE_ERROR;
 | 
						|
          }
 | 
						|
        } else {
 | 
						|
          Print (L"\n");
 | 
						|
        }
 | 
						|
      }
 | 
						|
 | 
						|
      FreePool (ChildHandleBuffer);
 | 
						|
      FreePool (ChildHandleType);
 | 
						|
    }
 | 
						|
 | 
						|
    FreePool (BestLanguage);
 | 
						|
    FreePool (HandleBuffer);
 | 
						|
    FreePool (HandleType);
 | 
						|
  }
 | 
						|
 | 
						|
  if ((DriverImageHandle != NULL) && (DriverImageHandleCount != 0)) {
 | 
						|
    FreePool (DriverImageHandleBuffer);
 | 
						|
  }
 | 
						|
 | 
						|
Done:
 | 
						|
  return ShellStatus;
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
  Function to print out configuration information on all configurable handles.
 | 
						|
 | 
						|
  @param[in] ChildrenToo    TRUE to tewst for children.
 | 
						|
  @param[in] Language       ASCII string for language code.
 | 
						|
  @param[in] UseHii         TRUE to check for Hii and DPC, FALSE for DCP only.
 | 
						|
 | 
						|
  @retval SHELL_SUCCESS     The operation was successful.
 | 
						|
**/
 | 
						|
SHELL_STATUS
 | 
						|
PrintConfigInfoOnAll (
 | 
						|
  IN CONST BOOLEAN  ChildrenToo,
 | 
						|
  IN CONST CHAR8    *Language,
 | 
						|
  IN CONST BOOLEAN  UseHii
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_HANDLE  *HandleList;
 | 
						|
  EFI_HANDLE  *CurrentHandle;
 | 
						|
  BOOLEAN     Found;
 | 
						|
  UINTN       Index2;
 | 
						|
 | 
						|
  Found         = FALSE;
 | 
						|
  HandleList    = NULL;
 | 
						|
  CurrentHandle = NULL;
 | 
						|
 | 
						|
  if (UseHii) {
 | 
						|
    //
 | 
						|
    // HII method
 | 
						|
    //
 | 
						|
    HandleList = GetHandleListByProtocol (&gEfiHiiConfigAccessProtocolGuid);
 | 
						|
    for (CurrentHandle = HandleList; CurrentHandle != NULL && *CurrentHandle != NULL; CurrentHandle++) {
 | 
						|
      Found  = TRUE;
 | 
						|
      Index2 = *CurrentHandle == NULL ? 0 : ConvertHandleToHandleIndex (*CurrentHandle);
 | 
						|
      ShellPrintHiiEx (
 | 
						|
        -1,
 | 
						|
        -1,
 | 
						|
        NULL,
 | 
						|
        STRING_TOKEN (STR_DRVCFG_LINE_HII),
 | 
						|
        gShellDriver1HiiHandle,
 | 
						|
        Index2
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    SHELL_FREE_NON_NULL (HandleList);
 | 
						|
  }
 | 
						|
 | 
						|
  if (PreHiiDrvCfg (
 | 
						|
        Language,
 | 
						|
        FALSE,
 | 
						|
        0,
 | 
						|
        ChildrenToo,
 | 
						|
        FALSE,
 | 
						|
        FALSE,
 | 
						|
        0,
 | 
						|
        0,
 | 
						|
        0
 | 
						|
        ) == SHELL_SUCCESS)
 | 
						|
  {
 | 
						|
    Found = TRUE;
 | 
						|
  }
 | 
						|
 | 
						|
  if (!Found) {
 | 
						|
    ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_DRVCFG_NONE_FOUND), gShellDriver1HiiHandle);
 | 
						|
    return (SHELL_SUCCESS);
 | 
						|
  }
 | 
						|
 | 
						|
  return (SHELL_SUCCESS);
 | 
						|
}
 | 
						|
 | 
						|
STATIC CONST SHELL_PARAM_ITEM  ParamListHii[] = {
 | 
						|
  { L"-s", TypeFlag  },
 | 
						|
  { L"-l", TypeValue },
 | 
						|
  { L"-f", TypeValue },
 | 
						|
  { L"-o", TypeValue },
 | 
						|
  { L"-i", TypeValue },
 | 
						|
  { NULL,  TypeMax   }
 | 
						|
};
 | 
						|
STATIC CONST SHELL_PARAM_ITEM  ParamListPreHii[] = {
 | 
						|
  { L"-c", TypeFlag  },
 | 
						|
  { L"-s", TypeFlag  },
 | 
						|
  { L"-v", TypeFlag  },
 | 
						|
  { L"-l", TypeValue },
 | 
						|
  { L"-f", TypeValue },
 | 
						|
  { NULL,  TypeMax   }
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
  Function for 'drvcfg' command.
 | 
						|
 | 
						|
  @param[in] ImageHandle  Handle to the Image (NULL if Internal).
 | 
						|
  @param[in] SystemTable  Pointer to the System Table (NULL if Internal).
 | 
						|
**/
 | 
						|
SHELL_STATUS
 | 
						|
EFIAPI
 | 
						|
ShellCommandRunDrvCfg (
 | 
						|
  IN EFI_HANDLE        ImageHandle,
 | 
						|
  IN EFI_SYSTEM_TABLE  *SystemTable
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS    Status;
 | 
						|
  LIST_ENTRY    *Package;
 | 
						|
  CHAR16        *ProblemParam;
 | 
						|
  SHELL_STATUS  ShellStatus;
 | 
						|
  CHAR8         *Language;
 | 
						|
  CONST CHAR16  *Lang;
 | 
						|
  CONST CHAR16  *HandleIndex1;
 | 
						|
  CONST CHAR16  *HandleIndex2;
 | 
						|
  CONST CHAR16  *HandleIndex3;
 | 
						|
  CONST CHAR16  *ForceTypeString;
 | 
						|
  BOOLEAN       Force;
 | 
						|
  BOOLEAN       Set;
 | 
						|
  BOOLEAN       Validate;
 | 
						|
  BOOLEAN       InFromFile;
 | 
						|
  BOOLEAN       OutToFile;
 | 
						|
  BOOLEAN       AllChildren;
 | 
						|
  BOOLEAN       UseHii;
 | 
						|
  UINT32        ForceType;
 | 
						|
  UINT64        Intermediate;
 | 
						|
  EFI_HANDLE    Handle1;
 | 
						|
  EFI_HANDLE    Handle2;
 | 
						|
  EFI_HANDLE    Handle3;
 | 
						|
  CONST CHAR16  *FileName;
 | 
						|
 | 
						|
  ShellStatus  = SHELL_SUCCESS;
 | 
						|
  Status       = EFI_SUCCESS;
 | 
						|
  Language     = NULL;
 | 
						|
  UseHii       = TRUE;
 | 
						|
  ProblemParam = NULL;
 | 
						|
 | 
						|
  //
 | 
						|
  // initialize the shell lib (we must be in non-auto-init...)
 | 
						|
  //
 | 
						|
  Status = ShellInitialize ();
 | 
						|
  ASSERT_EFI_ERROR (Status);
 | 
						|
 | 
						|
  Status = CommandInit ();
 | 
						|
  ASSERT_EFI_ERROR (Status);
 | 
						|
 | 
						|
  //
 | 
						|
  // parse the command line
 | 
						|
  //
 | 
						|
  Status = ShellCommandLineParse (ParamListHii, &Package, &ProblemParam, TRUE);
 | 
						|
  if (EFI_ERROR (Status) || (ShellCommandLineGetCount (Package) > 2)) {
 | 
						|
    UseHii = FALSE;
 | 
						|
    if (Package != NULL) {
 | 
						|
      ShellCommandLineFreeVarList (Package);
 | 
						|
    }
 | 
						|
 | 
						|
    SHELL_FREE_NON_NULL (ProblemParam);
 | 
						|
    Status = ShellCommandLineParse (ParamListPreHii, &Package, &ProblemParam, TRUE);
 | 
						|
    if (EFI_ERROR (Status)) {
 | 
						|
      if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) {
 | 
						|
        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"drvcfg", ProblemParam);
 | 
						|
        FreePool (ProblemParam);
 | 
						|
        ShellStatus = SHELL_INVALID_PARAMETER;
 | 
						|
        goto Done;
 | 
						|
      } else {
 | 
						|
        ASSERT (FALSE);
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  if (ShellStatus == SHELL_SUCCESS) {
 | 
						|
    if (ShellCommandLineGetCount (Package) > 4) {
 | 
						|
      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"drvcfg");
 | 
						|
      ShellStatus = SHELL_INVALID_PARAMETER;
 | 
						|
      goto Done;
 | 
						|
    }
 | 
						|
 | 
						|
    Lang = ShellCommandLineGetValue (Package, L"-l");
 | 
						|
    if (Lang != NULL) {
 | 
						|
      Language = AllocateZeroPool (StrSize (Lang));
 | 
						|
      AsciiSPrint (Language, StrSize (Lang), "%S", Lang);
 | 
						|
    } else if (ShellCommandLineGetFlag (Package, L"-l")) {
 | 
						|
      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"drvcfg", L"-l");
 | 
						|
      ShellStatus = SHELL_INVALID_PARAMETER;
 | 
						|
      goto Done;
 | 
						|
    }
 | 
						|
 | 
						|
    Set             = ShellCommandLineGetFlag (Package, L"-s");
 | 
						|
    Validate        = ShellCommandLineGetFlag (Package, L"-v");
 | 
						|
    InFromFile      = ShellCommandLineGetFlag (Package, L"-i");
 | 
						|
    OutToFile       = ShellCommandLineGetFlag (Package, L"-o");
 | 
						|
    AllChildren     = ShellCommandLineGetFlag (Package, L"-c");
 | 
						|
    Force           = ShellCommandLineGetFlag (Package, L"-f");
 | 
						|
    ForceTypeString = ShellCommandLineGetValue (Package, L"-f");
 | 
						|
 | 
						|
    if (OutToFile) {
 | 
						|
      FileName = ShellCommandLineGetValue (Package, L"-o");
 | 
						|
    } else if (InFromFile) {
 | 
						|
      FileName = ShellCommandLineGetValue (Package, L"-i");
 | 
						|
    } else {
 | 
						|
      FileName = NULL;
 | 
						|
    }
 | 
						|
 | 
						|
    if (InFromFile && EFI_ERROR (ShellFileExists (FileName))) {
 | 
						|
      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FIND_FAIL), gShellDriver1HiiHandle, L"drvcfg", FileName);
 | 
						|
      ShellStatus = SHELL_INVALID_PARAMETER;
 | 
						|
      goto Done;
 | 
						|
    }
 | 
						|
 | 
						|
    if (OutToFile && !EFI_ERROR (ShellFileExists (FileName))) {
 | 
						|
      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_EXIST), gShellDriver1HiiHandle, L"drvcfg", FileName);
 | 
						|
      ShellStatus = SHELL_INVALID_PARAMETER;
 | 
						|
      goto Done;
 | 
						|
    }
 | 
						|
 | 
						|
    if (Force && (ForceTypeString == NULL)) {
 | 
						|
      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"drvcfg", L"-f");
 | 
						|
      ShellStatus = SHELL_INVALID_PARAMETER;
 | 
						|
      goto Done;
 | 
						|
    }
 | 
						|
 | 
						|
    if (Force) {
 | 
						|
      Status = ShellConvertStringToUint64 (ForceTypeString, &Intermediate, FALSE, FALSE);
 | 
						|
      if (EFI_ERROR (Status)) {
 | 
						|
        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellDriver1HiiHandle, L"drvcfg", ForceTypeString, L"-f");
 | 
						|
        ShellStatus = SHELL_INVALID_PARAMETER;
 | 
						|
        goto Done;
 | 
						|
      }
 | 
						|
 | 
						|
      ForceType = (UINT32)Intermediate;
 | 
						|
    } else {
 | 
						|
      ForceType = 0;
 | 
						|
    }
 | 
						|
 | 
						|
    HandleIndex1 = ShellCommandLineGetRawValue (Package, 1);
 | 
						|
    Handle1      = NULL;
 | 
						|
    if ((HandleIndex1 != NULL) && !EFI_ERROR (ShellConvertStringToUint64 (HandleIndex1, &Intermediate, TRUE, FALSE))) {
 | 
						|
      Handle1 = ConvertHandleIndexToHandle ((UINTN)Intermediate);
 | 
						|
      if ((Handle1 == NULL) || ((UINT64)(UINTN)Intermediate != Intermediate)) {
 | 
						|
        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"drvcfg", HandleIndex1);
 | 
						|
        ShellStatus = SHELL_INVALID_PARAMETER;
 | 
						|
        goto Done;
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    HandleIndex2 = ShellCommandLineGetRawValue (Package, 2);
 | 
						|
    Handle2      = NULL;
 | 
						|
    if ((HandleIndex2 != NULL) && !EFI_ERROR (ShellConvertStringToUint64 (HandleIndex2, &Intermediate, TRUE, FALSE))) {
 | 
						|
      Handle2 = ConvertHandleIndexToHandle ((UINTN)Intermediate);
 | 
						|
      if ((Handle2 == NULL) || ((UINT64)(UINTN)Intermediate != Intermediate)) {
 | 
						|
        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"drvcfg", HandleIndex2);
 | 
						|
        ShellStatus = SHELL_INVALID_PARAMETER;
 | 
						|
        goto Done;
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    HandleIndex3 = ShellCommandLineGetRawValue (Package, 3);
 | 
						|
    Handle3      = NULL;
 | 
						|
    if ((HandleIndex3 != NULL) && !EFI_ERROR (ShellConvertStringToUint64 (HandleIndex3, &Intermediate, TRUE, FALSE))) {
 | 
						|
      Handle3 = ConvertHandleIndexToHandle ((UINTN)Intermediate);
 | 
						|
      if ((Handle3 == NULL) || ((UINT64)(UINTN)Intermediate != Intermediate)) {
 | 
						|
        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"drvcfg", HandleIndex3);
 | 
						|
        ShellStatus = SHELL_INVALID_PARAMETER;
 | 
						|
        goto Done;
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    if ((InFromFile || OutToFile) && (FileName == NULL)) {
 | 
						|
      if (FileName == NULL) {
 | 
						|
        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_VALUE), gShellDriver1HiiHandle, L"drvcfg", InFromFile ? L"-i" : L"-o");
 | 
						|
      } else {
 | 
						|
        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_HANDLE_REQ), gShellDriver1HiiHandle, L"drvcfg");
 | 
						|
      }
 | 
						|
 | 
						|
      ShellStatus = SHELL_INVALID_PARAMETER;
 | 
						|
      goto Done;
 | 
						|
    }
 | 
						|
 | 
						|
    if (!UseHii && (InFromFile || OutToFile)) {
 | 
						|
      if (InFromFile) {
 | 
						|
        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDriver1HiiHandle, L"drvcfg", L"-i");
 | 
						|
        ShellStatus = SHELL_INVALID_PARAMETER;
 | 
						|
        goto Done;
 | 
						|
      }
 | 
						|
 | 
						|
      if (OutToFile) {
 | 
						|
        ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_INV), gShellDriver1HiiHandle, L"drvcfg", L"-o");
 | 
						|
        ShellStatus = SHELL_INVALID_PARAMETER;
 | 
						|
        goto Done;
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    if (Validate && Force) {
 | 
						|
      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDriver1HiiHandle, L"drvcfg", L"-v", L"-f");
 | 
						|
      ShellStatus = SHELL_INVALID_PARAMETER;
 | 
						|
      goto Done;
 | 
						|
    }
 | 
						|
 | 
						|
    if (Validate && Set) {
 | 
						|
      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDriver1HiiHandle, L"drvcfg", L"-v", L"-s");
 | 
						|
      ShellStatus = SHELL_INVALID_PARAMETER;
 | 
						|
      goto Done;
 | 
						|
    }
 | 
						|
 | 
						|
    if (Set && Force) {
 | 
						|
      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDriver1HiiHandle, L"drvcfg", L"-s", L"-f");
 | 
						|
      ShellStatus = SHELL_INVALID_PARAMETER;
 | 
						|
      goto Done;
 | 
						|
    }
 | 
						|
 | 
						|
    if (OutToFile && InFromFile) {
 | 
						|
      ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PARAM_CONFLICT), gShellDriver1HiiHandle, L"drvcfg", L"-i", L"-o");
 | 
						|
      ShellStatus = SHELL_INVALID_PARAMETER;
 | 
						|
      goto Done;
 | 
						|
    }
 | 
						|
 | 
						|
    //
 | 
						|
    // We do HII first.
 | 
						|
    //
 | 
						|
    if (UseHii) {
 | 
						|
      if ((Handle1 != NULL) && EFI_ERROR (gBS->OpenProtocol (Handle1, &gEfiHiiConfigAccessProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {
 | 
						|
        //
 | 
						|
        // no HII on this handle.
 | 
						|
        //
 | 
						|
        ShellStatus = SHELL_UNSUPPORTED;
 | 
						|
      } else if (Validate) {
 | 
						|
      } else if (Force) {
 | 
						|
      } else if (Set) {
 | 
						|
      } else if (InFromFile) {
 | 
						|
        ShellStatus = ConfigFromFile (Handle1, FileName);
 | 
						|
        if ((Handle1 != NULL) && (ShellStatus == SHELL_SUCCESS)) {
 | 
						|
          goto Done;
 | 
						|
        }
 | 
						|
      } else if (OutToFile) {
 | 
						|
        ShellStatus = ConfigToFile (Handle1, FileName);
 | 
						|
        if ((Handle1 != NULL) && (ShellStatus == SHELL_SUCCESS)) {
 | 
						|
          goto Done;
 | 
						|
        }
 | 
						|
      } else if (HandleIndex1 == NULL) {
 | 
						|
        //
 | 
						|
        // display all that are configurable
 | 
						|
        //
 | 
						|
        ShellStatus = PrintConfigInfoOnAll (AllChildren, Language, UseHii);
 | 
						|
        goto Done;
 | 
						|
      } else {
 | 
						|
        if (!EFI_ERROR (gBS->OpenProtocol (Handle1, &gEfiHiiConfigAccessProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {
 | 
						|
          ShellPrintHiiEx (
 | 
						|
            -1,
 | 
						|
            -1,
 | 
						|
            NULL,
 | 
						|
            STRING_TOKEN (STR_DRVCFG_LINE_HII),
 | 
						|
            gShellDriver1HiiHandle,
 | 
						|
            ConvertHandleToHandleIndex (Handle1)
 | 
						|
            );
 | 
						|
          goto Done;
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    //
 | 
						|
    // We allways need to do this one since it does both by default.
 | 
						|
    //
 | 
						|
    if (!InFromFile && !OutToFile) {
 | 
						|
      ShellStatus = PreHiiDrvCfg (
 | 
						|
                      Language,
 | 
						|
                      Force,
 | 
						|
                      ForceType,
 | 
						|
                      AllChildren,
 | 
						|
                      Validate,
 | 
						|
                      Set,
 | 
						|
                      Handle1,
 | 
						|
                      Handle2,
 | 
						|
                      Handle3
 | 
						|
                      );
 | 
						|
    }
 | 
						|
 | 
						|
    if (ShellStatus == SHELL_UNSUPPORTED) {
 | 
						|
      ShellPrintHiiEx (
 | 
						|
        -1,
 | 
						|
        -1,
 | 
						|
        NULL,
 | 
						|
        STRING_TOKEN (STR_DRVCFG_NOT_SUPPORT),
 | 
						|
        gShellDriver1HiiHandle,
 | 
						|
        ConvertHandleToHandleIndex (Handle1)
 | 
						|
        );
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
Done:
 | 
						|
  ShellCommandLineFreeVarList (Package);
 | 
						|
  SHELL_FREE_NON_NULL (Language);
 | 
						|
  return (ShellStatus);
 | 
						|
}
 |