4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Main file for bcfg shell Debug1 function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync which accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync http://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "UefiShellDebug1CommandsLib.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Guid/GlobalVariable.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/PrintLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/HandleParsingLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/DevicePathLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef enum {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BcfgTargetBootOrder = 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BcfgTargetDriverOrder = 1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BcfgTargetMax = 2
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} BCFG_OPERATION_TARGET;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef enum {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BcfgTypeDump = 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BcfgTypeAdd = 1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BcfgTypeAddp = 2,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BcfgTypeAddh = 3,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BcfgTypeRm = 4,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BcfgTypeMv = 5,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BcfgTypeOpt = 6,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BcfgTypeMax = 7
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} BCFG_OPERATION_TYPE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BCFG_OPERATION_TARGET Target;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BCFG_OPERATION_TYPE Type;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 Number1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 Number2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN HandleIndex;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *FileName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *Description;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 *Order;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CONST CHAR16 *OptData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} BGFG_OPERATION;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function will populate the device path protocol parameter based on TheHandle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] TheHandle Driver handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] FilePath On a sucessful return the device path to the handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The device path was sucessfully returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval other A error from gBS->HandleProtocol.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @sa HandleProtocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGetDevicePathForDriverHandleDebug1 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE TheHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT EFI_DEVICE_PATH_PROTOCOL **FilePath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *ImageDevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->OpenProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TheHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiLoadedImageProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID**)&LoadedImage,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_OPEN_PROTOCOL_GET_PROTOCOL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->OpenProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoadedImage->DeviceHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiDevicePathProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID**)&ImageDevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_OPEN_PROTOCOL_GET_PROTOCOL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// *DevPath = DuplicateDevicePath (ImageDevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// *FilePath = DuplicateDevicePath (LoadedImage->FilePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *FilePath = AppendDevicePath(ImageDevicePath,LoadedImage->FilePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->CloseProtocol(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoadedImage->DeviceHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiDevicePathProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->CloseProtocol(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TheHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiLoadedImageProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to add a option.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Position The position to add Target at.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] File The file to make the target.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Desc The description text.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CurrentOrder The pointer to the current order of items.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OrderCount The number if items in CurrentOrder.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Target The info on the option to add.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] UseHandle TRUE to use HandleNumber, FALSE to use File and Desc.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] UsePath TRUE to convert to devicepath.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] HandleNumber The handle number to add.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval SHELL_SUCCESS The operation was successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval SHELL_INVALID_PARAMETER A parameter was invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSHELL_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBcfgAddDebug1(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Position,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *File,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *Desc,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST UINT16 *CurrentOrder,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST UINTN OrderCount,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BCFG_OPERATION_TARGET Target,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BOOLEAN UseHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BOOLEAN UsePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST UINTN HandleNumber
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *FilePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *FileNode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// EFI_DEVICE_PATH_PROTOCOL *DevPath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *Str;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// CONST CHAR16 *StringWalker;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *TempByteBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *TempByteStart;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SHELL_FILE_INFO *Arg;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SHELL_FILE_INFO *FileList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 OptionStr[40];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN DescSize, FilePathSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN Found;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN TargetLocation;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE *Handles;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE CurHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN DriverBindingHandleCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN ParentControllerHandleCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN ChildControllerHandleCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_STATUS ShellStatus;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 *NewOrder;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!UseHandle) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (File == NULL || Desc == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (SHELL_INVALID_PARAMETER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HandleNumber == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (SHELL_INVALID_PARAMETER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Position > OrderCount) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Position = OrderCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Str = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FilePath = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileNode = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileList = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Handles = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TargetLocation = 0xFFFF;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (UseHandle) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurHandle = ConvertHandleIndexToHandle(HandleNumber);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurHandle == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"Handle Number");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Target == BcfgTargetBootOrder) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //Make sure that the handle should point to a real controller
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DriverBindingHandleCount,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PARSE_HANDLE_DATABASE_PARENTS (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &ParentControllerHandleCount,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ParseHandleDatabaseForChildControllers (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &ChildControllerHandleCount,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DriverBindingHandleCount > 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || ParentControllerHandleCount > 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || ChildControllerHandleCount > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FilePath = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->HandleProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiDevicePathProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID**)&FilePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_HANDLE), gShellDebug1HiiHandle, HandleNumber);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //Make sure that the handle should point to driver, not a controller.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DriverBindingHandleCount,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = PARSE_HANDLE_DATABASE_PARENTS (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &ParentControllerHandleCount,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ParseHandleDatabaseForChildControllers (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &ChildControllerHandleCount,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->HandleProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiDevicePathProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID**)&FilePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DriverBindingHandleCount > 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || ParentControllerHandleCount > 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || ChildControllerHandleCount > 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || !EFI_ERROR(Status) ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"Handle Number");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the DevicePath from the loaded image information.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = GetDevicePathForDriverHandleDebug1(CurHandle, &FilePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get file info
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellOpenFileMetaArg ((CHAR16*)File, EFI_FILE_MODE_READ, &FileList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FileList == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If filename matched nothing fail
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, File);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (FileList->Link.ForwardLink != FileList->Link.BackLink) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If filename expanded to multiple names, fail
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_FILE), gShellDebug1HiiHandle, File);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Arg = (EFI_SHELL_FILE_INFO*)GetFirstNode(&FileList->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Arg->Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_FILE_OPEN), gShellDebug1HiiHandle, File, Arg->Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Build FilePath to the filename
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // get the device path
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath = gEfiShellProtocol->GetDevicePathFromFilePath(Arg->FullName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DevicePath == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_FILE_DP), gShellDebug1HiiHandle, Arg->FullName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (UsePath) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevPath = DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsDevicePathEnd(DevPath)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((DevicePathType(DevPath) == MEDIA_DEVICE_PATH) &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (DevicePathSubType(DevPath) == MEDIA_HARDDRIVE_DP)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If we find it use it instead
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath = DevPath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevPath = NextDevicePathNode(DevPath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // append the file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for(StringWalker=Arg->FullName; *StringWalker != CHAR_NULL && *StringWalker != ':'; StringWalker++);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileNode = FileDevicePath(NULL, StringWalker+1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FilePath = AppendDevicePath(DevicePath, FileNode);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(FileNode);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FilePath = DuplicateDevicePath(DevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(DevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellStatus == SHELL_SUCCESS) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Find a free target ,a brute force implementation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Found = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (TargetLocation=0; TargetLocation < 0xFFFF; TargetLocation++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Found = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index=0; Index < OrderCount; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentOrder[Index] == TargetLocation) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Found = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Found) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TargetLocation == 0xFFFF) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_TARGET_NF), gShellDebug1HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_TARGET), gShellDebug1HiiHandle, TargetLocation);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellStatus == SHELL_SUCCESS) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add the option
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DescSize = StrSize(Desc);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FilePathSize = GetDevicePathSize (FilePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempByteBuffer = AllocateZeroPool(sizeof(UINT32) + sizeof(UINT16) + DescSize + FilePathSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TempByteBuffer != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempByteStart = TempByteBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *((UINT32 *) TempByteBuffer) = LOAD_OPTION_ACTIVE; // Attributes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempByteBuffer += sizeof (UINT32);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *((UINT16 *) TempByteBuffer) = (UINT16)FilePathSize; // FilePathListLength
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempByteBuffer += sizeof (UINT16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (TempByteBuffer, Desc, DescSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempByteBuffer += DescSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (TempByteBuffer, FilePath, FilePathSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint (OptionStr, sizeof(OptionStr), L"%s%04x", Target == BcfgTargetBootOrder?L"Boot":L"Driver", TargetLocation);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gRT->SetVariable (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OptionStr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiGlobalVariableGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sizeof(UINT32) + sizeof(UINT16) + DescSize + FilePathSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempByteStart
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(TempByteStart);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellDebug1HiiHandle, OptionStr, Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewOrder = AllocateZeroPool((OrderCount+1)*sizeof(NewOrder[0]));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(NewOrder != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem(NewOrder, CurrentOrder, (OrderCount)*sizeof(NewOrder[0]));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Insert target into order list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index=OrderCount; Index > Position; Index--) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewOrder[Index] = NewOrder[Index-1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewOrder[Position] = (UINT16) TargetLocation;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gRT->SetVariable (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Target == BcfgTargetBootOrder?L"BootOrder":L"DriverOrder",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiGlobalVariableGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (OrderCount+1) * sizeof(UINT16),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewOrder
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(NewOrder);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellDebug1HiiHandle, Target == BcfgTargetBootOrder?L"BootOrder":L"DriverOrder", Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Print (L"bcfg: Add %s as %x\n", OptionStr, Position);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//If always Free FilePath, will free devicepath in system when use "addh"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FilePath!=NULL && !UseHandle) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (FilePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Str != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(Str);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Handles != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Handles);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FileList != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellCloseFileMetaArg (&FileList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (ShellStatus);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Funciton to remove an item.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Target The target item to move.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CurrentOrder The pointer to the current order of items.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OrderCount The number if items in CurrentOrder.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Location The current location of the Target.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval SHELL_SUCCESS The operation was successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval SHELL_INVALID_PARAMETER A parameter was invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSHELL_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBcfgRemoveDebug1(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BCFG_OPERATION_TARGET Target,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST UINT16 *CurrentOrder,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST UINTN OrderCount,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST UINT16 Location
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 VariableName[12];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 *NewOrder;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN NewCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint(VariableName, sizeof(VariableName), L"%s%04x", Target == BcfgTargetBootOrder?L"Boot":L"Driver", CurrentOrder[Location]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gRT->SetVariable(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (EFI_GUID*)&gEfiGlobalVariableGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellDebug1HiiHandle, VariableName, Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (SHELL_INVALID_PARAMETER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewOrder = AllocateZeroPool(OrderCount*sizeof(CurrentOrder[0]));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewOrder != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewCount = OrderCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem(NewOrder, CurrentOrder, OrderCount*sizeof(CurrentOrder[0]));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem(NewOrder+Location, NewOrder+Location+1, (OrderCount - Location - 1)*sizeof(CurrentOrder[0]));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewCount--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gRT->SetVariable(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (EFI_GUID*)&gEfiGlobalVariableGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewCount*sizeof(NewOrder[0]),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewOrder);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(NewOrder);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellDebug1HiiHandle, Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder", Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (SHELL_INVALID_PARAMETER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (SHELL_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Funciton to move a item to another location.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Target The target item to move.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CurrentOrder The pointer to the current order of items.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OrderCount The number if items in CurrentOrder.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OldLocation The current location of the Target.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] NewLocation The desired location of the Target.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval SHELL_SUCCESS The operation was successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval SHELL_INVALID_PARAMETER A parameter was invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSHELL_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBcfgMoveDebug1(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BCFG_OPERATION_TARGET Target,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST UINT16 *CurrentOrder,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST UINTN OrderCount,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST UINT16 OldLocation,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST UINT16 NewLocation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 *NewOrder;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 Temp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewOrder = AllocateZeroPool(OrderCount*sizeof(CurrentOrder[0]));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(NewOrder != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Temp = CurrentOrder[OldLocation];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem(NewOrder, CurrentOrder, OrderCount*sizeof(CurrentOrder[0]));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem(NewOrder+OldLocation, NewOrder+OldLocation+1, (OrderCount - OldLocation - 1)*sizeof(CurrentOrder[0]));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem(NewOrder+NewLocation+1, NewOrder+NewLocation, (OrderCount - NewLocation - 1)*sizeof(CurrentOrder[0]));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewOrder[NewLocation] = Temp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gRT->SetVariable(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (EFI_GUID*)&gEfiGlobalVariableGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OrderCount*sizeof(CurrentOrder[0]),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewOrder);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(NewOrder);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellDebug1HiiHandle, Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder", Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (SHELL_INVALID_PARAMETER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (SHELL_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to add optional data to an option.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OptData The optional data to add.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Target The target of the operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval SHELL_SUCCESS The operation was succesful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSHELL_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBcfgAddOptDebug1(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *OptData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BCFG_OPERATION_TARGET Target
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(OptData != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return SHELL_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to dump the Bcfg information.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Op The operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OrderCount How many to dump.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CurrentOrder The pointer to the current order of items.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] VerboseOutput TRUE for extra output. FALSE otherwise.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval SHELL_SUCCESS The dump was successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval SHELL_INVALID_PARAMETER A parameter was invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSHELL_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBcfgDisplayDumpDebug1(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *Op,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST UINTN OrderCount,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST UINT16 *CurrentOrder,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BOOLEAN VerboseOutput
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN BufferSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 VariableName[12];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN LoopVar;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN LoopVar2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *DevPathString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *DevPath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OrderCount == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN(STR_BCFG_NONE), gShellDebug1HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (SHELL_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LoopVar = 0 ; LoopVar < OrderCount ; LoopVar++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint(VariableName, sizeof(VariableName), L"%s%04x", Op, CurrentOrder[LoopVar]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gRT->GetVariable(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (EFI_GUID*)&gEfiGlobalVariableGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status == EFI_BUFFER_TOO_SMALL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer = AllocateZeroPool(BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gRT->GetVariable(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (EFI_GUID*)&gEfiGlobalVariableGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status) || Buffer == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_READ_FAIL), gShellDebug1HiiHandle, VariableName, Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (SHELL_INVALID_PARAMETER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((*(UINT16*)(Buffer+4)) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevPath = AllocateZeroPool(*(UINT16*)(Buffer+4));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem(DevPath, Buffer+6+StrSize((CHAR16*)(Buffer+6)), *(UINT16*)(Buffer+4));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevPathString = gDevPathToText->ConvertDevicePathToText(DevPath, TRUE, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevPath = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevPathString = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STRING_TOKEN(STR_BCFG_LOAD_OPTIONS),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gShellDebug1HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LoopVar,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VariableName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (CHAR16*)(Buffer+6),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevPathString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (StrSize((CHAR16*)(Buffer+6)) + *(UINT16*)(Buffer+4) + 6) <= BufferSize?L'N':L'Y');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VerboseOutput) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LoopVar2 = (StrSize((CHAR16*)(Buffer+6)) + *(UINT16*)(Buffer+4) + 6);LoopVar2<BufferSize;LoopVar2++){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintEx(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"%02x",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer[LoopVar2]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintEx(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync -1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"\r\n");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Buffer != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DevPath != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(DevPath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DevPathString != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(DevPathString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (SHELL_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to initialize the BCFG operation structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Struct The stuct to initialize.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInitBcfgStructDebug1(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN BGFG_OPERATION *Struct
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Struct != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Struct->Target = BcfgTargetMax;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Struct->Type = BcfgTypeMax;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Struct->Number1 = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Struct->Number2 = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Struct->HandleIndex = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Struct->FileName = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Struct->Description = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Struct->Order = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Struct->OptData = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC CONST SHELL_PARAM_ITEM ParamList[] = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {L"-v", TypeFlag},
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {L"-opt", TypeMaxValue},
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {NULL, TypeMax}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function for 'bcfg' command.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ImageHandle Handle to the Image (NULL if Internal).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SystemTable Pointer to the System Table (NULL if Internal).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSHELL_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandRunBcfg (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_SYSTEM_TABLE *SystemTable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Package;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *ProblemParam;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_STATUS ShellStatus;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN ParamNumber;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CONST CHAR16 *CurrentParam;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BGFG_OPERATION CurrentOperation;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 Intermediate;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ProblemParam = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Package = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitBcfgStructDebug1(&CurrentOperation);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // initialize the shell lib (we must be in non-auto-init...)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellInitialize();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR(Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = CommandInit();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR(Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // parse the command line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, ProblemParam);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(ProblemParam);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Read in if we are doing -OPT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellCommandLineGetFlag(Package, L"-opt")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.OptData = ShellCommandLineGetValue(Package, L"-opt");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentOperation.OptData == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellDebug1HiiHandle, L"-opt");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Type = BcfgTypeOpt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // small block to read the target of the operation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((ShellCommandLineGetCount(Package) < 3 && CurrentOperation.Type != BcfgTypeOpt) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (ShellCommandLineGetCount(Package) < 2 && CurrentOperation.Type == BcfgTypeOpt)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)ShellCommandLineGetRawValue(Package, 1), L"driver") == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Target = BcfgTargetDriverOrder;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)ShellCommandLineGetRawValue(Package, 1), L"boot") == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Target = BcfgTargetBootOrder;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_DRIVER_BOOT), gShellDebug1HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Read in the boot or driver order environment variable (not needed for opt)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellStatus == SHELL_SUCCESS && CurrentOperation.Target < BcfgTargetMax && CurrentOperation.Type != BcfgTypeOpt) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gRT->GetVariable(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (EFI_GUID*)&gEfiGlobalVariableGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Length,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Order);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status == EFI_BUFFER_TOO_SMALL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Order = AllocateZeroPool(Length+(4*sizeof(CurrentOperation.Order[0])));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gRT->GetVariable(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (EFI_GUID*)&gEfiGlobalVariableGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Length,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Order);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // large block to read the type of operation and verify parameter types for the info.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellStatus == SHELL_SUCCESS && CurrentOperation.Target < BcfgTargetMax) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (ParamNumber = 2 ; ParamNumber < ShellCommandLineGetCount(Package) && ShellStatus == SHELL_SUCCESS; ParamNumber++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentParam = ShellCommandLineGetRawValue(Package, ParamNumber);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"dump") == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Type = BcfgTypeDump;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (ShellCommandLineGetFlag(Package, L"-v")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"-v (without dump)");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"add") == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((ParamNumber + 3) >= ShellCommandLineGetCount(Package)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Type = BcfgTypeAdd;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Number1 = (UINT16)Intermediate;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(CurrentOperation.FileName == NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.FileName = StrnCatGrow(&CurrentOperation.FileName , NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(CurrentOperation.Description == NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Description = StrnCatGrow(&CurrentOperation.Description, NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"addp") == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((ParamNumber + 3) >= ShellCommandLineGetCount(Package)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Type = BcfgTypeAddp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Number1 = (UINT16)Intermediate;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(CurrentOperation.FileName == NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.FileName = StrnCatGrow(&CurrentOperation.FileName , NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(CurrentOperation.Description == NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Description = StrnCatGrow(&CurrentOperation.Description, NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"addh") == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((ParamNumber + 3) >= ShellCommandLineGetCount(Package)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Type = BcfgTypeAddh;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Number1 = (UINT16)Intermediate;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.HandleIndex = (UINT16)Intermediate;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(CurrentOperation.Description == NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Description = StrnCatGrow(&CurrentOperation.Description, NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"rm") == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((ParamNumber + 1) >= ShellCommandLineGetCount(Package)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Type = BcfgTypeRm;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Number1 = (UINT16)Intermediate;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentOperation.Number1 > (Length / sizeof(CurrentOperation.Order[0]))){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellDebug1HiiHandle, Length / sizeof(CurrentOperation.Order[0]));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"mv") == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((ParamNumber + 2) >= ShellCommandLineGetCount(Package)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Type = BcfgTypeMv;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Number1 = (UINT16)Intermediate;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentOperation.Number1 > (Length / sizeof(CurrentOperation.Order[0]))){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellDebug1HiiHandle, Length / sizeof(CurrentOperation.Order[0]));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Number2 = (UINT16)Intermediate;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentOperation.Number2 == CurrentOperation.Number1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ||CurrentOperation.Number1 > (Length / sizeof(CurrentOperation.Order[0]))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ||CurrentOperation.Number2 > (Length / sizeof(CurrentOperation.Order[0]))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellDebug1HiiHandle, Length / sizeof(CurrentOperation.Order[0]));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = SHELL_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellStatus == SHELL_SUCCESS && CurrentOperation.Target < BcfgTargetMax && CurrentOperation.Type < BcfgTypeMax) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // we have all the info. Do the work
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (CurrentOperation.Type) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case BcfgTypeDump:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = BcfgDisplayDumpDebug1(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Target == BcfgTargetBootOrder?L"Boot":L"Driver",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length / sizeof(CurrentOperation.Order[0]),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Order,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellCommandLineGetFlag(Package, L"-v"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case BcfgTypeMv:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = BcfgMoveDebug1(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Target,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Order,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length / sizeof(CurrentOperation.Order[0]),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Number1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Number2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case BcfgTypeRm:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = BcfgRemoveDebug1(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Target,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Order,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length / sizeof(CurrentOperation.Order[0]),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Number1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case BcfgTypeAdd:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case BcfgTypeAddp:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case BcfgTypeAddh:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = BcfgAddDebug1(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Number1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.FileName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Description==NULL?L"":CurrentOperation.Description,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Order,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length / sizeof(CurrentOperation.Order[0]),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Target,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (BOOLEAN)(CurrentOperation.Type == BcfgTypeAddh),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (BOOLEAN)(CurrentOperation.Type == BcfgTypeAddp),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.HandleIndex);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case BcfgTypeOpt:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellStatus = BcfgAddOptDebug1(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.OptData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentOperation.Target);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Package != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellCommandLineFreeVarList (Package);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentOperation.FileName != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(CurrentOperation.FileName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentOperation.Description != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(CurrentOperation.Description);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentOperation.Order != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(CurrentOperation.Order);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (ShellStatus);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}