From fba9b6ba24bbbed0666f4e184c95f6b15a581d49 Mon Sep 17 00:00:00 2001 From: Jaben Carsey Date: Wed, 10 Sep 2014 20:55:37 +0000 Subject: [PATCH] ShellPkg: Use the new library for "bcfg" command Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jaben Carsey Reviewed-by: Chris Phillips Reviewed-by: Erik Bjorge Reviewed by: Tapan Shah git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16093 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Library/UefiShellDebug1CommandsLib/Bcfg.c | 1445 ----------------- .../UefiShellDebug1CommandsLib.c | 15 +- .../UefiShellDebug1CommandsLib.inf | 2 +- .../UefiShellDebug1CommandsLib.uni | Bin 152430 -> 140296 bytes .../UefiShellInstall1CommandsLib/Bcfg.c | 1441 ---------------- .../UefiShellInstall1CommandsLib.c | 36 +- .../UefiShellInstall1CommandsLib.h | 59 - .../UefiShellInstall1CommandsLib.inf | 4 +- .../UefiShellInstall1CommandsLib.uni | Bin 17998 -> 0 bytes 9 files changed, 10 insertions(+), 2992 deletions(-) delete mode 100644 ShellPkg/Library/UefiShellDebug1CommandsLib/Bcfg.c delete mode 100644 ShellPkg/Library/UefiShellInstall1CommandsLib/Bcfg.c delete mode 100644 ShellPkg/Library/UefiShellInstall1CommandsLib/UefiShellInstall1CommandsLib.h delete mode 100644 ShellPkg/Library/UefiShellInstall1CommandsLib/UefiShellInstall1CommandsLib.uni diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/Bcfg.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/Bcfg.c deleted file mode 100644 index 93ef73d074..0000000000 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/Bcfg.c +++ /dev/null @@ -1,1445 +0,0 @@ -/** @file - Main file for bcfg shell Debug1 function. - - Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.
- This program and the accompanying materials - are licensed and made available under the terms and conditions of the BSD License - which accompanies this distribution. The full text of the license may be found at - http://opensource.org/licenses/bsd-license.php - - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "UefiShellDebug1CommandsLib.h" -#include -#include -#include -#include - -typedef enum { - BcfgTargetBootOrder = 0, - BcfgTargetDriverOrder = 1, - BcfgTargetMax = 2 -} BCFG_OPERATION_TARGET; - -typedef enum { - BcfgTypeDump = 0, - BcfgTypeAdd = 1, - BcfgTypeAddp = 2, - BcfgTypeAddh = 3, - BcfgTypeRm = 4, - BcfgTypeMv = 5, - BcfgTypeOpt = 6, - BcfgTypeMax = 7 -} BCFG_OPERATION_TYPE; - -typedef struct { - BCFG_OPERATION_TARGET Target; - BCFG_OPERATION_TYPE Type; - UINT16 Number1; - UINT16 Number2; - UINTN HandleIndex; - CHAR16 *FileName; - CHAR16 *Description; - UINT16 *Order; - CONST CHAR16 *OptData; -} BGFG_OPERATION; - -/** - Update the optional data for a boot or driver option. - - If optional data exists it will be changed. - - @param[in] Index The boot or driver option index update. - @param[in] DataSize The size in bytes of Data. - @param[in] Data The buffer for the optioanl data. - @param[in] Target The target of the operation. - - @retval EFI_SUCCESS The data was sucessfully updated. - @retval other A error occured. -**/ -EFI_STATUS -EFIAPI -UpdateOptionalDataDebug1( - UINT16 Index, - UINTN DataSize, - UINT8 *Data, - IN CONST BCFG_OPERATION_TARGET Target - ) -{ - EFI_STATUS Status; - CHAR16 VariableName[12]; - UINTN OriginalSize; - UINT8 *OriginalData; - UINTN NewSize; - UINT8 *NewData; - UINTN OriginalOptionDataSize; - - UnicodeSPrint(VariableName, sizeof(VariableName), L"%s%04x", Target == BcfgTargetBootOrder?L"Boot":L"Driver", Index); - - OriginalSize = 0; - OriginalData = NULL; - NewData = NULL; - NewSize = 0; - - Status = gRT->GetVariable( - VariableName, - (EFI_GUID*)&gEfiGlobalVariableGuid, - NULL, - &OriginalSize, - OriginalData); - if (Status == EFI_BUFFER_TOO_SMALL) { - OriginalData = AllocateZeroPool(OriginalSize); - if (OriginalData == NULL) { - return (EFI_OUT_OF_RESOURCES); - } - Status = gRT->GetVariable( - VariableName, - (EFI_GUID*)&gEfiGlobalVariableGuid, - NULL, - &OriginalSize, - OriginalData); - } - - if (!EFI_ERROR(Status)) { - // - // Allocate new struct and discard old optional data. - // - ASSERT (OriginalData != NULL); - OriginalOptionDataSize = sizeof(UINT32) + sizeof(UINT16) + StrSize(((CHAR16*)(OriginalData + sizeof(UINT32) + sizeof(UINT16)))); - OriginalOptionDataSize += (*(UINT16*)(OriginalData + sizeof(UINT32))); - OriginalOptionDataSize -= OriginalSize; - NewSize = OriginalSize - OriginalOptionDataSize + DataSize; - NewData = AllocateCopyPool(NewSize, OriginalData); - if (NewData == NULL) { - Status = EFI_OUT_OF_RESOURCES; - } else { - CopyMem(NewData + OriginalSize - OriginalOptionDataSize, Data, DataSize); - } - } - - if (!EFI_ERROR(Status)) { - // - // put the data back under the variable - // - Status = gRT->SetVariable( - VariableName, - (EFI_GUID*)&gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS, - NewSize, - NewData); - } - - SHELL_FREE_NON_NULL(OriginalData); - SHELL_FREE_NON_NULL(NewData); - return (Status); -} - -/** - This function will get a CRC for a boot option. - - @param[in, out] Crc The CRC value to return. - @param[in] BootIndex The boot option index to CRC. - - @retval EFI_SUCCESS The CRC was sucessfully returned. - @retval other A error occured. -**/ -EFI_STATUS -EFIAPI -GetBootOptionCrcDebug1( - UINT32 *Crc, - UINT16 BootIndex - ) -{ - CHAR16 VariableName[12]; - EFI_STATUS Status; - UINT8 *Buffer; - UINTN BufferSize; - - Buffer = NULL; - BufferSize = 0; - - // - // Get the data Buffer - // - UnicodeSPrint(VariableName, sizeof(VariableName), L"%Boot%04x", BootIndex); - Status = gRT->GetVariable( - VariableName, - (EFI_GUID*)&gEfiGlobalVariableGuid, - NULL, - &BufferSize, - NULL); - if (Status == EFI_BUFFER_TOO_SMALL) { - Buffer = AllocateZeroPool(BufferSize); - Status = gRT->GetVariable( - VariableName, - (EFI_GUID*)&gEfiGlobalVariableGuid, - NULL, - &BufferSize, - Buffer); - } - - // - // Get the CRC computed - // - if (!EFI_ERROR(Status)) { - Status = gBS->CalculateCrc32 (Buffer, BufferSize, Crc); - } - - SHELL_FREE_NON_NULL(Buffer); - return EFI_SUCCESS; -} - -/** - This function will populate the device path protocol parameter based on TheHandle. - - @param[in] TheHandle Driver handle. - @param[in, out] FilePath On a sucessful return the device path to the handle. - - @retval EFI_SUCCESS The device path was sucessfully returned. - @retval other A error from gBS->HandleProtocol. - - @sa HandleProtocol -**/ -EFI_STATUS -EFIAPI -GetDevicePathForDriverHandleDebug1 ( - IN EFI_HANDLE TheHandle, - IN OUT EFI_DEVICE_PATH_PROTOCOL **FilePath - ) -{ - EFI_STATUS Status; - EFI_LOADED_IMAGE_PROTOCOL *LoadedImage; - EFI_DEVICE_PATH_PROTOCOL *ImageDevicePath; - - Status = gBS->OpenProtocol ( - TheHandle, - &gEfiLoadedImageProtocolGuid, - (VOID**)&LoadedImage, - gImageHandle, - NULL, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (!EFI_ERROR (Status)) { - Status = gBS->OpenProtocol ( - LoadedImage->DeviceHandle, - &gEfiDevicePathProtocolGuid, - (VOID**)&ImageDevicePath, - gImageHandle, - NULL, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (!EFI_ERROR (Status)) { -// *DevPath = DuplicateDevicePath (ImageDevicePath); -// *FilePath = DuplicateDevicePath (LoadedImage->FilePath); - *FilePath = AppendDevicePath(ImageDevicePath,LoadedImage->FilePath); - gBS->CloseProtocol( - LoadedImage->DeviceHandle, - &gEfiDevicePathProtocolGuid, - gImageHandle, - NULL); - } - gBS->CloseProtocol( - TheHandle, - &gEfiLoadedImageProtocolGuid, - gImageHandle, - NULL); - } - return (Status); -} - -/** - Function to add a option. - - @param[in] Position The position to add Target at. - @param[in] File The file to make the target. - @param[in] Desc The description text. - @param[in] CurrentOrder The pointer to the current order of items. - @param[in] OrderCount The number if items in CurrentOrder. - @param[in] Target The info on the option to add. - @param[in] UseHandle TRUE to use HandleNumber, FALSE to use File and Desc. - @param[in] UsePath TRUE to convert to devicepath. - @param[in] HandleNumber The handle number to add. - - @retval SHELL_SUCCESS The operation was successful. - @retval SHELL_INVALID_PARAMETER A parameter was invalid. -**/ -SHELL_STATUS -EFIAPI -BcfgAddDebug1( - IN UINTN Position, - IN CONST CHAR16 *File, - IN CONST CHAR16 *Desc, - IN CONST UINT16 *CurrentOrder, - IN CONST UINTN OrderCount, - IN CONST BCFG_OPERATION_TARGET Target, - IN CONST BOOLEAN UseHandle, - IN CONST BOOLEAN UsePath, - IN CONST UINTN HandleNumber - ) -{ - EFI_STATUS Status; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - EFI_DEVICE_PATH_PROTOCOL *FilePath; - /* EFI_DEVICE_PATH_PROTOCOL *FileNode; */ - CHAR16 *Str; - UINT8 *TempByteBuffer; - UINT8 *TempByteStart; - EFI_SHELL_FILE_INFO *Arg; - EFI_SHELL_FILE_INFO *FileList; - CHAR16 OptionStr[40]; - UINTN DescSize, FilePathSize; - BOOLEAN Found; - UINTN TargetLocation; - UINTN Index; - EFI_HANDLE *Handles; - EFI_HANDLE CurHandle; - UINTN DriverBindingHandleCount; - UINTN ParentControllerHandleCount; - UINTN ChildControllerHandleCount; - SHELL_STATUS ShellStatus; - UINT16 *NewOrder; - - if (!UseHandle) { - if (File == NULL || Desc == NULL) { - return (SHELL_INVALID_PARAMETER); - } - } else { - if (HandleNumber == 0) { - return (SHELL_INVALID_PARAMETER); - } - } - - if (Position > OrderCount) { - Position = OrderCount; - } - - Str = NULL; - FilePath = NULL; - /* FileNode = NULL; */ - FileList = NULL; - Handles = NULL; - ShellStatus = SHELL_SUCCESS; - TargetLocation = 0xFFFF; - - if (UseHandle) { - CurHandle = ConvertHandleIndexToHandle(HandleNumber); - if (CurHandle == NULL) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"Handle Number"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - if (Target == BcfgTargetBootOrder) { - // - //Make sure that the handle should point to a real controller - // - Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS ( - CurHandle, - &DriverBindingHandleCount, - NULL); - - Status = PARSE_HANDLE_DATABASE_PARENTS ( - CurHandle, - &ParentControllerHandleCount, - NULL); - - Status = ParseHandleDatabaseForChildControllers ( - CurHandle, - &ChildControllerHandleCount, - NULL); - - if (DriverBindingHandleCount > 0 - || ParentControllerHandleCount > 0 - || ChildControllerHandleCount > 0) { - FilePath = NULL; - Status = gBS->HandleProtocol ( - CurHandle, - &gEfiDevicePathProtocolGuid, - (VOID**)&FilePath); - } - if (EFI_ERROR (Status)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_HANDLE), gShellDebug1HiiHandle, HandleNumber); - ShellStatus = SHELL_INVALID_PARAMETER; - } - } else { - // - //Make sure that the handle should point to driver, not a controller. - // - Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS ( - CurHandle, - &DriverBindingHandleCount, - NULL); - - Status = PARSE_HANDLE_DATABASE_PARENTS ( - CurHandle, - &ParentControllerHandleCount, - NULL); - - Status = ParseHandleDatabaseForChildControllers ( - CurHandle, - &ChildControllerHandleCount, - NULL); - - Status = gBS->HandleProtocol ( - CurHandle, - &gEfiDevicePathProtocolGuid, - (VOID**)&FilePath); - - if (DriverBindingHandleCount > 0 - || ParentControllerHandleCount > 0 - || ChildControllerHandleCount > 0 - || !EFI_ERROR(Status) ) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"Handle Number"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - // - // Get the DevicePath from the loaded image information. - // - Status = GetDevicePathForDriverHandleDebug1(CurHandle, &FilePath); - } - } - } - } else { - // - // Get file info - // - ShellOpenFileMetaArg ((CHAR16*)File, EFI_FILE_MODE_READ, &FileList); - - if (FileList == NULL) { - // - // If filename matched nothing fail - // - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellDebug1HiiHandle, File); - ShellStatus = SHELL_INVALID_PARAMETER; - } else if (FileList->Link.ForwardLink != FileList->Link.BackLink) { - // - // If filename expanded to multiple names, fail - // - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_FILE), gShellDebug1HiiHandle, File); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - Arg = (EFI_SHELL_FILE_INFO*)GetFirstNode(&FileList->Link); - if (EFI_ERROR(Arg->Status)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_FILE_OPEN), gShellDebug1HiiHandle, File, Arg->Status); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - // - // Build FilePath to the filename - // - - // - // get the device path - // - DevicePath = gEfiShellProtocol->GetDevicePathFromFilePath(Arg->FullName); - if (DevicePath == NULL) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_FILE_DP), gShellDebug1HiiHandle, Arg->FullName); - ShellStatus = SHELL_UNSUPPORTED; - } else { -/* - if (UsePath) { - DevPath = DevicePath; - while (!IsDevicePathEnd(DevPath)) { - if ((DevicePathType(DevPath) == MEDIA_DEVICE_PATH) && - (DevicePathSubType(DevPath) == MEDIA_HARDDRIVE_DP)) { - - // - // If we find it use it instead - // - DevicePath = DevPath; - break; - } - DevPath = NextDevicePathNode(DevPath); - } - // - // append the file - // - for(StringWalker=Arg->FullName; *StringWalker != CHAR_NULL && *StringWalker != ':'; StringWalker++); - FileNode = FileDevicePath(NULL, StringWalker+1); - FilePath = AppendDevicePath(DevicePath, FileNode); - FreePool(FileNode); - } else { -*/ - FilePath = DuplicateDevicePath(DevicePath); -/* - } -*/ - FreePool(DevicePath); - } - } - } - } - - - if (ShellStatus == SHELL_SUCCESS) { - // - // Find a free target ,a brute force implementation - // - Found = FALSE; - for (TargetLocation=0; TargetLocation < 0xFFFF; TargetLocation++) { - Found = TRUE; - for (Index=0; Index < OrderCount; Index++) { - if (CurrentOrder[Index] == TargetLocation) { - Found = FALSE; - break; - } - } - - if (Found) { - break; - } - } - - if (TargetLocation == 0xFFFF) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_TARGET_NF), gShellDebug1HiiHandle); - } else { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_TARGET), gShellDebug1HiiHandle, TargetLocation); - } - } - - if (ShellStatus == SHELL_SUCCESS) { - // - // Add the option - // - DescSize = StrSize(Desc); - FilePathSize = GetDevicePathSize (FilePath); - - TempByteBuffer = AllocateZeroPool(sizeof(UINT32) + sizeof(UINT16) + DescSize + FilePathSize); - if (TempByteBuffer != NULL) { - TempByteStart = TempByteBuffer; - *((UINT32 *) TempByteBuffer) = LOAD_OPTION_ACTIVE; // Attributes - TempByteBuffer += sizeof (UINT32); - - *((UINT16 *) TempByteBuffer) = (UINT16)FilePathSize; // FilePathListLength - TempByteBuffer += sizeof (UINT16); - - CopyMem (TempByteBuffer, Desc, DescSize); - TempByteBuffer += DescSize; - ASSERT (FilePath != NULL); - CopyMem (TempByteBuffer, FilePath, FilePathSize); - - UnicodeSPrint (OptionStr, sizeof(OptionStr), L"%s%04x", Target == BcfgTargetBootOrder?L"Boot":L"Driver", TargetLocation); - Status = gRT->SetVariable ( - OptionStr, - &gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS, - sizeof(UINT32) + sizeof(UINT16) + DescSize + FilePathSize, - TempByteStart - ); - - FreePool(TempByteStart); - } else { - Status = EFI_OUT_OF_RESOURCES; - } - - if (EFI_ERROR(Status)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellDebug1HiiHandle, OptionStr, Status); - } else { - NewOrder = AllocateZeroPool((OrderCount+1)*sizeof(NewOrder[0])); - ASSERT(NewOrder != NULL); - CopyMem(NewOrder, CurrentOrder, (OrderCount)*sizeof(NewOrder[0])); - - // - // Insert target into order list - // - for (Index=OrderCount; Index > Position; Index--) { - NewOrder[Index] = NewOrder[Index-1]; - } - - NewOrder[Position] = (UINT16) TargetLocation; - Status = gRT->SetVariable ( - Target == BcfgTargetBootOrder?L"BootOrder":L"DriverOrder", - &gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS, - (OrderCount+1) * sizeof(UINT16), - NewOrder - ); - - FreePool(NewOrder); - - if (EFI_ERROR(Status)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellDebug1HiiHandle, Target == BcfgTargetBootOrder?L"BootOrder":L"DriverOrder", Status); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - Print (L"bcfg: Add %s as %x\n", OptionStr, Position); - } - } - } - -// -//If always Free FilePath, will free devicepath in system when use "addh" -// - if (FilePath!=NULL && !UseHandle) { - FreePool (FilePath); - } - - if (Str != NULL) { - FreePool(Str); - } - - if (Handles != NULL) { - FreePool (Handles); - } - - if (FileList != NULL) { - ShellCloseFileMetaArg (&FileList); - } - - return (ShellStatus); -} - -/** - Funciton to remove an item. - - @param[in] Target The target item to move. - @param[in] CurrentOrder The pointer to the current order of items. - @param[in] OrderCount The number if items in CurrentOrder. - @param[in] Location The current location of the Target. - - @retval SHELL_SUCCESS The operation was successful. - @retval SHELL_INVALID_PARAMETER A parameter was invalid. -**/ -SHELL_STATUS -EFIAPI -BcfgRemoveDebug1( - IN CONST BCFG_OPERATION_TARGET Target, - IN CONST UINT16 *CurrentOrder, - IN CONST UINTN OrderCount, - IN CONST UINT16 Location - ) -{ - CHAR16 VariableName[12]; - UINT16 *NewOrder; - EFI_STATUS Status; - UINTN NewCount; - - UnicodeSPrint(VariableName, sizeof(VariableName), L"%s%04x", Target == BcfgTargetBootOrder?L"Boot":L"Driver", CurrentOrder[Location]); - Status = gRT->SetVariable( - VariableName, - (EFI_GUID*)&gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS, - 0, - NULL); - if (EFI_ERROR(Status)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellDebug1HiiHandle, VariableName, Status); - return (SHELL_INVALID_PARAMETER); - } - NewOrder = AllocateZeroPool(OrderCount*sizeof(CurrentOrder[0])); - if (NewOrder != NULL) { - NewCount = OrderCount; - CopyMem(NewOrder, CurrentOrder, OrderCount*sizeof(CurrentOrder[0])); - CopyMem(NewOrder+Location, NewOrder+Location+1, (OrderCount - Location - 1)*sizeof(CurrentOrder[0])); - NewCount--; - - Status = gRT->SetVariable( - Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder", - (EFI_GUID*)&gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS, - NewCount*sizeof(NewOrder[0]), - NewOrder); - FreePool(NewOrder); - } else { - Status = EFI_OUT_OF_RESOURCES; - } - if (EFI_ERROR(Status)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellDebug1HiiHandle, Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder", Status); - return (SHELL_INVALID_PARAMETER); - } - return (SHELL_SUCCESS); -} - -/** - Funciton to move a item to another location. - - @param[in] Target The target item to move. - @param[in] CurrentOrder The pointer to the current order of items. - @param[in] OrderCount The number if items in CurrentOrder. - @param[in] OldLocation The current location of the Target. - @param[in] NewLocation The desired location of the Target. - - @retval SHELL_SUCCESS The operation was successful. - @retval SHELL_INVALID_PARAMETER A parameter was invalid. -**/ -SHELL_STATUS -EFIAPI -BcfgMoveDebug1( - IN CONST BCFG_OPERATION_TARGET Target, - IN CONST UINT16 *CurrentOrder, - IN CONST UINTN OrderCount, - IN CONST UINT16 OldLocation, - IN UINT16 NewLocation - ) -{ - UINT16 *NewOrder; - EFI_STATUS Status; - UINT16 Temp; - - NewOrder = AllocateCopyPool(OrderCount*sizeof(CurrentOrder[0]), CurrentOrder); - if (NewOrder == NULL) { - return (SHELL_OUT_OF_RESOURCES); - } - - // - // correct the new location - // - if (NewLocation >= OrderCount) { - if (OrderCount > 0) { - NewLocation = (UINT16)OrderCount - 1; - } else { - NewLocation = 0; - } - } - - Temp = CurrentOrder[OldLocation]; - CopyMem(NewOrder+OldLocation, NewOrder+OldLocation+1, (OrderCount - OldLocation - 1)*sizeof(CurrentOrder[0])); - CopyMem(NewOrder+NewLocation+1, NewOrder+NewLocation, (OrderCount - NewLocation - 1)*sizeof(CurrentOrder[0])); - NewOrder[NewLocation] = Temp; - - Status = gRT->SetVariable( - Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder", - (EFI_GUID*)&gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS, - OrderCount*sizeof(CurrentOrder[0]), - NewOrder); - - FreePool(NewOrder); - - if (EFI_ERROR(Status)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellDebug1HiiHandle, Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder", Status); - return (SHELL_INVALID_PARAMETER); - } - return (SHELL_SUCCESS); -} - -/** - Function to add optional data to an option. - - @param[in] OptData The optional data to add. - @param[in] CurrentOrder The pointer to the current order of items. - @param[in] OrderCount The number if items in CurrentOrder. - @param[in] Target The target of the operation. - - @retval SHELL_SUCCESS The operation was succesful. -**/ -SHELL_STATUS -EFIAPI -BcfgAddOptDebug1( - IN CONST CHAR16 *OptData, - IN CONST UINT16 *CurrentOrder, - IN CONST UINTN OrderCount, - IN CONST BCFG_OPERATION_TARGET Target - ) -{ - EFI_KEY_OPTION NewKeyOption; - EFI_KEY_OPTION *KeyOptionBuffer; - SHELL_STATUS ShellStatus; - EFI_STATUS Status; - UINT16 OptionIndex; - UINT16 LoopCounter; - UINT64 Intermediate; - CONST CHAR16 *Temp; - CONST CHAR16 *Walker; - CHAR16 *FileName; - CHAR16 *Temp2; - CHAR16 *Data; - UINT16 KeyIndex; - CHAR16 VariableName[12]; - - SHELL_FILE_HANDLE FileHandle; - - Status = EFI_SUCCESS; - ShellStatus = SHELL_SUCCESS; - Walker = OptData; - FileName = NULL; - Data = NULL; - KeyOptionBuffer = NULL; - - ZeroMem(&NewKeyOption, sizeof(EFI_KEY_OPTION)); - - while(Walker[0] == L' ') { - Walker++; - } - - // - // Get the index of the variable we are changing. - // - Status = ShellConvertStringToUint64(Walker, &Intermediate, FALSE, TRUE); - if (EFI_ERROR(Status) || (((UINT16)Intermediate) != Intermediate) || StrStr(Walker, L" ") == NULL || ((UINT16)Intermediate) > ((UINT16)OrderCount)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"Option Index"); - ShellStatus = SHELL_INVALID_PARAMETER; - return (ShellStatus); - } - OptionIndex = (UINT16)Intermediate; - - Temp = StrStr(Walker, L" "); - if (Temp != NULL) { - Walker = Temp; - } - while(Walker[0] == L' ') { - Walker++; - } - - // - // determine whether we have file with data, quote delimited information, or a hot-key - // - if (Walker[0] == L'\"') { - // - // quoted filename or quoted information. - // - Temp = StrStr(Walker+1, L"\""); - if (Temp == NULL || StrLen(Temp) != 1) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, Walker); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - FileName = StrnCatGrow(&FileName, NULL, Walker+1, 0); - if (FileName == NULL) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellDebug1HiiHandle); - ShellStatus = SHELL_OUT_OF_RESOURCES; - return (ShellStatus); - } - Temp2 = StrStr(FileName, L"\""); - ASSERT(Temp2 != NULL); - Temp2[0] = CHAR_NULL; - Temp2++; - if (StrLen(Temp2)>0) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, Walker); - ShellStatus = SHELL_INVALID_PARAMETER; - } - if (EFI_ERROR(ShellFileExists(Walker))) { - // - // Not a file. must be misc information. - // - Data = FileName; - FileName = NULL; - } else { - FileName = StrnCatGrow(&FileName, NULL, Walker, 0); - } - } - } else { - // - // filename or hot key information. - // - if (StrStr(Walker, L" ") == NULL) { - // - // filename - // - if (EFI_ERROR(ShellFileExists(Walker))) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FIND_FAIL), gShellDebug1HiiHandle, Walker); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - FileName = StrnCatGrow(&FileName, NULL, Walker, 0); - } - } else { - if (Target != BcfgTargetBootOrder) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_BOOT_ONLY), gShellDebug1HiiHandle); - ShellStatus = SHELL_INVALID_PARAMETER; - } - - if (ShellStatus == SHELL_SUCCESS) { - // - // Get hot key information - // - Status = ShellConvertStringToUint64(Walker, &Intermediate, FALSE, TRUE); - if (EFI_ERROR(Status) || (((UINT32)Intermediate) != Intermediate) || StrStr(Walker, L" ") == NULL) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, Walker); - ShellStatus = SHELL_INVALID_PARAMETER; - } - NewKeyOption.KeyData.PackedValue = (UINT32)Intermediate; - Temp = StrStr(Walker, L" "); - if (Temp != NULL) { - Walker = Temp; - } - while(Walker[0] == L' ') { - Walker++; - } - } - - if (ShellStatus == SHELL_SUCCESS) { - // - // Now we know how many EFI_INPUT_KEY structs we need to attach to the end of the EFI_KEY_OPTION struct. - // Re-allocate with the added information. - // - KeyOptionBuffer = AllocateCopyPool(sizeof(EFI_KEY_OPTION) + (sizeof(EFI_KEY_DATA) * NewKeyOption.KeyData.Options.InputKeyCount), &NewKeyOption); - if (KeyOptionBuffer == NULL) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_MEM), gShellDebug1HiiHandle); - ShellStatus = SHELL_OUT_OF_RESOURCES; - } - } - for (LoopCounter = 0 ; ShellStatus == SHELL_SUCCESS && LoopCounter < NewKeyOption.KeyData.Options.InputKeyCount; LoopCounter++) { - // - // ScanCode - // - Status = ShellConvertStringToUint64(Walker, &Intermediate, FALSE, TRUE); - if (EFI_ERROR(Status) || (((UINT16)Intermediate) != Intermediate) || StrStr(Walker, L" ") == NULL) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, Walker); - ShellStatus = SHELL_INVALID_PARAMETER; - } - ((EFI_INPUT_KEY*)(((UINT8*)KeyOptionBuffer) + sizeof(EFI_KEY_OPTION)))[LoopCounter].ScanCode = (UINT16)Intermediate; - Temp = StrStr(Walker, L" "); - if (Temp != NULL) { - Walker = Temp; - } - while(Walker[0] == L' ') { - Walker++; - } - - // - // UnicodeChar - // - Status = ShellConvertStringToUint64(Walker, &Intermediate, FALSE, TRUE); - if (EFI_ERROR(Status) || (((UINT16)Intermediate) != Intermediate)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, Walker); - ShellStatus = SHELL_INVALID_PARAMETER; - } - ((EFI_INPUT_KEY*)(((UINT8*)KeyOptionBuffer) + sizeof(EFI_KEY_OPTION)))[LoopCounter].UnicodeChar = (UINT16)Intermediate; - Temp = StrStr(Walker, L" "); - if (Temp != NULL) { - Walker = Temp; - } - while(Walker[0] == L' ') { - Walker++; - } - } - - if (ShellStatus == SHELL_SUCCESS) { - // - // Now do the BootOption / BootOptionCrc - // - ASSERT (OptionIndex <= OrderCount); - KeyOptionBuffer->BootOption = CurrentOrder[OptionIndex]; - Status = GetBootOptionCrcDebug1(&(KeyOptionBuffer->BootOptionCrc), KeyOptionBuffer->BootOption); - if (EFI_ERROR(Status)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"Option Index"); - ShellStatus = SHELL_INVALID_PARAMETER; - } - } - - if (ShellStatus == SHELL_SUCCESS) { - for (Temp2 = NULL, KeyIndex = 0 ; KeyIndex < 0xFFFF ; KeyIndex++) { - UnicodeSPrint(VariableName, sizeof(VariableName), L"Key%04x", KeyIndex); - Status = gRT->GetVariable( - VariableName, - (EFI_GUID*)&gEfiGlobalVariableGuid, - NULL, - (UINTN*)&Intermediate, - NULL); - if (Status == EFI_NOT_FOUND) { - break; - } - } - Status = gRT->SetVariable( - VariableName, - (EFI_GUID*)&gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS, - sizeof(EFI_KEY_OPTION) + (sizeof(EFI_KEY_DATA) * NewKeyOption.KeyData.Options.InputKeyCount), - KeyOptionBuffer); - if (EFI_ERROR(Status)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellDebug1HiiHandle, VariableName, Status); - ShellStatus = SHELL_INVALID_PARAMETER; - } - ASSERT(FileName == NULL && Data == NULL); - } - } - } - - // - // Shouldn't be possible to have have both. Neither is ok though. - // - ASSERT(FileName == NULL || Data == NULL); - - if (ShellStatus == SHELL_SUCCESS && (FileName != NULL || Data != NULL)) { - if (FileName != NULL) { - // - // Open the file and populate the data buffer. - // - Status = ShellOpenFileByName( - FileName, - &FileHandle, - EFI_FILE_MODE_READ, - 0); - if (!EFI_ERROR(Status)) { - Status = ShellGetFileSize(FileHandle, &Intermediate); - } - Data = AllocateZeroPool((UINTN)Intermediate); - if (Data == NULL) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_MEM), gShellDebug1HiiHandle); - ShellStatus = SHELL_OUT_OF_RESOURCES; - } - if (!EFI_ERROR(Status)) { - Status = ShellReadFile(FileHandle, (UINTN *)&Intermediate, Data); - } - } else { - Intermediate = StrSize(Data); - } - - if (!EFI_ERROR(Status) && ShellStatus == SHELL_SUCCESS && Data != NULL) { - Status = UpdateOptionalDataDebug1(CurrentOrder[OptionIndex], (UINTN)Intermediate, (UINT8*)Data, Target); - if (EFI_ERROR(Status)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellDebug1HiiHandle, VariableName, Status); - ShellStatus = SHELL_INVALID_PARAMETER; - } - } - if (EFI_ERROR(Status) && ShellStatus == SHELL_SUCCESS) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellDebug1HiiHandle, VariableName, Status); - ShellStatus = SHELL_INVALID_PARAMETER; - } - } - - SHELL_FREE_NON_NULL(Data); - SHELL_FREE_NON_NULL(KeyOptionBuffer); - SHELL_FREE_NON_NULL(FileName); - return ShellStatus; -} - -/** - Function to dump the Bcfg information. - - @param[in] Op The operation. - @param[in] OrderCount How many to dump. - @param[in] CurrentOrder The pointer to the current order of items. - @param[in] VerboseOutput TRUE for extra output. FALSE otherwise. - - @retval SHELL_SUCCESS The dump was successful. - @retval SHELL_INVALID_PARAMETER A parameter was invalid. -**/ -SHELL_STATUS -EFIAPI -BcfgDisplayDumpDebug1( - IN CONST CHAR16 *Op, - IN CONST UINTN OrderCount, - IN CONST UINT16 *CurrentOrder, - IN CONST BOOLEAN VerboseOutput - ) -{ - EFI_STATUS Status; - UINT8 *Buffer; - UINTN BufferSize; - CHAR16 VariableName[12]; - UINTN LoopVar; - UINTN LoopVar2; - CHAR16 *DevPathString; - VOID *DevPath; - - if (OrderCount == 0) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN(STR_BCFG_NONE), gShellDebug1HiiHandle); - return (SHELL_SUCCESS); - } - - for (LoopVar = 0 ; LoopVar < OrderCount ; LoopVar++) { - Buffer = NULL; - BufferSize = 0; - UnicodeSPrint(VariableName, sizeof(VariableName), L"%s%04x", Op, CurrentOrder[LoopVar]); - - Status = gRT->GetVariable( - VariableName, - (EFI_GUID*)&gEfiGlobalVariableGuid, - NULL, - &BufferSize, - Buffer); - if (Status == EFI_BUFFER_TOO_SMALL) { - Buffer = AllocateZeroPool(BufferSize); - if (Buffer != NULL) { - Status = gRT->GetVariable( - VariableName, - (EFI_GUID*)&gEfiGlobalVariableGuid, - NULL, - &BufferSize, - Buffer); - } - } - - if (EFI_ERROR(Status) || Buffer == NULL) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_READ_FAIL), gShellDebug1HiiHandle, VariableName, Status); - return (SHELL_INVALID_PARAMETER); - } - - if ((*(UINT16*)(Buffer+4)) != 0) { - DevPath = AllocateZeroPool(*(UINT16*)(Buffer+4)); - if (DevPath != NULL) { - CopyMem(DevPath, Buffer+6+StrSize((CHAR16*)(Buffer+6)), *(UINT16*)(Buffer+4)); - DevPathString = ConvertDevicePathToText(DevPath, TRUE, FALSE); - } else { - DevPathString = NULL; - } - } else { - DevPath = NULL; - DevPathString = NULL; - } - ShellPrintHiiEx( - -1, - -1, - NULL, - STRING_TOKEN(STR_BCFG_LOAD_OPTIONS), - gShellDebug1HiiHandle, - LoopVar, - VariableName, - (CHAR16*)(Buffer+6), - DevPathString, - (StrSize((CHAR16*)(Buffer+6)) + *(UINT16*)(Buffer+4) + 6) <= BufferSize?L'N':L'Y'); - if (VerboseOutput) { - for (LoopVar2 = (StrSize((CHAR16*)(Buffer+6)) + *(UINT16*)(Buffer+4) + 6);LoopVar2Target = BcfgTargetMax; - Struct->Type = BcfgTypeMax; - Struct->Number1 = 0; - Struct->Number2 = 0; - Struct->HandleIndex = 0; - Struct->FileName = NULL; - Struct->Description = NULL; - Struct->Order = NULL; - Struct->OptData = NULL; -} - - -STATIC CONST SHELL_PARAM_ITEM ParamList[] = { - {L"-v", TypeFlag}, - {L"-opt", TypeMaxValue}, - {NULL, TypeMax} - }; - -/** - Function for 'bcfg' 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 -ShellCommandRunBcfg ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - EFI_STATUS Status; - LIST_ENTRY *Package; - CHAR16 *ProblemParam; - SHELL_STATUS ShellStatus; - UINTN ParamNumber; - CONST CHAR16 *CurrentParam; - BGFG_OPERATION CurrentOperation; - UINTN Length; - UINT64 Intermediate; - UINT16 Count; - - Length = 0; - ProblemParam = NULL; - Package = NULL; - ShellStatus = SHELL_SUCCESS; - - InitBcfgStructDebug1(&CurrentOperation); - - // - // initialize the shell lib (we must be in non-auto-init...) - // - Status = ShellInitialize(); - ASSERT_EFI_ERROR(Status); - - Status = CommandInit(); - ASSERT_EFI_ERROR(Status); - - // - // parse the command line - // - Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); - if (EFI_ERROR(Status)) { - if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, ProblemParam); - FreePool(ProblemParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - ASSERT(FALSE); - } - } else { - // - // Read in if we are doing -OPT - // - if (ShellCommandLineGetFlag(Package, L"-opt")) { - CurrentOperation.OptData = ShellCommandLineGetValue(Package, L"-opt"); - if (CurrentOperation.OptData == NULL) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellDebug1HiiHandle, L"-opt"); - ShellStatus = SHELL_INVALID_PARAMETER; - } - CurrentOperation.Type = BcfgTypeOpt; - } - - // - // small block to read the target of the operation - // - if ((ShellCommandLineGetCount(Package) < 3 && CurrentOperation.Type != BcfgTypeOpt) || - (ShellCommandLineGetCount(Package) < 2 && CurrentOperation.Type == BcfgTypeOpt) - ){ - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle); - ShellStatus = SHELL_INVALID_PARAMETER; - } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)ShellCommandLineGetRawValue(Package, 1), L"driver") == 0) { - CurrentOperation.Target = BcfgTargetDriverOrder; - } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)ShellCommandLineGetRawValue(Package, 1), L"boot") == 0) { - CurrentOperation.Target = BcfgTargetBootOrder; - } else { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_DRIVER_BOOT), gShellDebug1HiiHandle); - ShellStatus = SHELL_INVALID_PARAMETER; - } - - - // - // Read in the boot or driver order environment variable (not needed for opt) - // - if (ShellStatus == SHELL_SUCCESS && CurrentOperation.Target < BcfgTargetMax) { - Length = 0; - Status = gRT->GetVariable( - CurrentOperation.Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder", - (EFI_GUID*)&gEfiGlobalVariableGuid, - NULL, - &Length, - CurrentOperation.Order); - if (Status == EFI_BUFFER_TOO_SMALL) { - CurrentOperation.Order = AllocateZeroPool(Length+(4*sizeof(CurrentOperation.Order[0]))); - if (CurrentOperation.Order != NULL) { - Status = gRT->GetVariable( - CurrentOperation.Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder", - (EFI_GUID*)&gEfiGlobalVariableGuid, - NULL, - &Length, - CurrentOperation.Order); - } else { - ShellStatus = SHELL_OUT_OF_RESOURCES; - } - } - } - - Count = (UINT16) (Length / sizeof(CurrentOperation.Order[0])); - - // - // large block to read the type of operation and verify parameter types for the info. - // - if (ShellStatus == SHELL_SUCCESS && CurrentOperation.Target < BcfgTargetMax) { - for (ParamNumber = 2 ; ParamNumber < ShellCommandLineGetCount(Package) && ShellStatus == SHELL_SUCCESS; ParamNumber++) { - CurrentParam = ShellCommandLineGetRawValue(Package, ParamNumber); - if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"dump") == 0) { - CurrentOperation.Type = BcfgTypeDump; - } else if (ShellCommandLineGetFlag(Package, L"-v")) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, L"-v (without dump)"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"add") == 0) { - if ((ParamNumber + 3) >= ShellCommandLineGetCount(Package)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle); - ShellStatus = SHELL_INVALID_PARAMETER; - } - CurrentOperation.Type = BcfgTypeAdd; - CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber); - if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE); - CurrentOperation.Number1 = (UINT16)Intermediate; - ASSERT(CurrentOperation.FileName == NULL); - CurrentOperation.FileName = StrnCatGrow(&CurrentOperation.FileName , NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0); - ASSERT(CurrentOperation.Description == NULL); - CurrentOperation.Description = StrnCatGrow(&CurrentOperation.Description, NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0); - } - } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"addp") == 0) { - if ((ParamNumber + 3) >= ShellCommandLineGetCount(Package)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle); - ShellStatus = SHELL_INVALID_PARAMETER; - } - CurrentOperation.Type = BcfgTypeAddp; - CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber); - if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE); - CurrentOperation.Number1 = (UINT16)Intermediate; - ASSERT(CurrentOperation.FileName == NULL); - CurrentOperation.FileName = StrnCatGrow(&CurrentOperation.FileName , NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0); - ASSERT(CurrentOperation.Description == NULL); - CurrentOperation.Description = StrnCatGrow(&CurrentOperation.Description, NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0); - } - } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"addh") == 0) { - if ((ParamNumber + 3) >= ShellCommandLineGetCount(Package)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle); - ShellStatus = SHELL_INVALID_PARAMETER; - } - CurrentOperation.Type = BcfgTypeAddh; - CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber); - if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE); - CurrentOperation.Number1 = (UINT16)Intermediate; - CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber); - if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE); - CurrentOperation.HandleIndex = (UINT16)Intermediate; - ASSERT(CurrentOperation.Description == NULL); - CurrentOperation.Description = StrnCatGrow(&CurrentOperation.Description, NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0); - } - } - } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"rm") == 0) { - if ((ParamNumber + 1) >= ShellCommandLineGetCount(Package)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle); - ShellStatus = SHELL_INVALID_PARAMETER; - } - CurrentOperation.Type = BcfgTypeRm; - CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber); - if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE); - CurrentOperation.Number1 = (UINT16)Intermediate; - if (CurrentOperation.Number1 > Count){ - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellDebug1HiiHandle, Count); - ShellStatus = SHELL_INVALID_PARAMETER; - } - } - } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"mv") == 0) { - if ((ParamNumber + 2) >= ShellCommandLineGetCount(Package)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDebug1HiiHandle); - ShellStatus = SHELL_INVALID_PARAMETER; - } - CurrentOperation.Type = BcfgTypeMv; - CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber); - if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE); - CurrentOperation.Number1 = (UINT16)Intermediate; - if (CurrentOperation.Number1 > Count){ - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellDebug1HiiHandle, Count); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber); - if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE); - CurrentOperation.Number2 = (UINT16)Intermediate; - } - if (CurrentOperation.Number2 == CurrentOperation.Number1 - ||CurrentOperation.Number2 >= Count - ){ - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellDebug1HiiHandle, Count); - ShellStatus = SHELL_INVALID_PARAMETER; - } - } - } - } else { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, CurrentParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } - } - } - if (ShellStatus == SHELL_SUCCESS && CurrentOperation.Target < BcfgTargetMax && CurrentOperation.Type < BcfgTypeMax) { - // - // we have all the info. Do the work - // - switch (CurrentOperation.Type) { - case BcfgTypeDump: - ShellStatus = BcfgDisplayDumpDebug1( - CurrentOperation.Target == BcfgTargetBootOrder?L"Boot":L"Driver", - Count, - CurrentOperation.Order, - ShellCommandLineGetFlag(Package, L"-v")); - break; - case BcfgTypeMv: - ShellStatus = BcfgMoveDebug1( - CurrentOperation.Target, - CurrentOperation.Order, - Count, - CurrentOperation.Number1, - CurrentOperation.Number2); - break; - case BcfgTypeRm: - ShellStatus = BcfgRemoveDebug1( - CurrentOperation.Target, - CurrentOperation.Order, - Count, - CurrentOperation.Number1); - break; - case BcfgTypeAdd: - case BcfgTypeAddp: - case BcfgTypeAddh: - ShellStatus = BcfgAddDebug1( - CurrentOperation.Number1, - CurrentOperation.FileName, - CurrentOperation.Description==NULL?L"":CurrentOperation.Description, - CurrentOperation.Order, - Count, - CurrentOperation.Target, - (BOOLEAN)(CurrentOperation.Type == BcfgTypeAddh), - (BOOLEAN)(CurrentOperation.Type == BcfgTypeAddp), - CurrentOperation.HandleIndex); - break; - case BcfgTypeOpt: - ShellStatus = BcfgAddOptDebug1( - CurrentOperation.OptData, - CurrentOperation.Order, - Count, - CurrentOperation.Target); - break; - default: - ASSERT(FALSE); - } - } - } - - if (Package != NULL) { - ShellCommandLineFreeVarList (Package); - } - if (CurrentOperation.FileName != NULL) { - FreePool(CurrentOperation.FileName); - } - if (CurrentOperation.Description != NULL) { - FreePool(CurrentOperation.Description); - } - if (CurrentOperation.Order != NULL) { - FreePool(CurrentOperation.Order); - } - - return (ShellStatus); -} diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.c index c601abebcb..5f8f8a9dd9 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.c @@ -13,6 +13,7 @@ **/ #include "UefiShellDebug1CommandsLib.h" +#include STATIC CONST CHAR16 mFileName[] = L"Debug1Commands"; EFI_HANDLE gShellDebug1HiiHandle = NULL; @@ -84,18 +85,10 @@ UefiShellDebug1CommandsLibConstructor ( ShellCommandRegisterCommandName(L"edit", ShellCommandRunEdit , ShellCommandGetManFileNameDebug1, 0, L"Debug1", TRUE, gShellDebug1HiiHandle, STRING_TOKEN(STR_GET_HELP_EDIT) ); ShellCommandRegisterCommandName(L"hexedit", ShellCommandRunHexEdit , ShellCommandGetManFileNameDebug1, 0, L"Debug1", TRUE, gShellDebug1HiiHandle, STRING_TOKEN(STR_GET_HELP_HEXEDIT) ); - // - // check install profile bit of the profiles mask is set - // - if ((PcdGet8(PcdShellProfileMask) & BIT2) == 0) { - ShellCommandRegisterCommandName(L"bcfg", ShellCommandRunBcfg , ShellCommandGetManFileNameDebug1, 0, L"Debug1", TRUE, gShellDebug1HiiHandle, STRING_TOKEN(STR_GET_HELP_BCFG) ); - } - - - - ShellCommandRegisterAlias(L"dmem", L"mem"); + BcfgLibraryRegisterBcfgCommand(ImageHandle, SystemTable, L"Debug1"); + return (EFI_SUCCESS); } @@ -115,6 +108,8 @@ UefiShellDebug1CommandsLibDestructor ( if (gShellDebug1HiiHandle != NULL) { HiiRemovePackages(gShellDebug1HiiHandle); } + + BcfgLibraryUnregisterBcfgCommand(ImageHandle, SystemTable); return (EFI_SUCCESS); } diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.inf b/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.inf index 37f6f60aee..d1d732d50a 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.inf +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.inf @@ -36,7 +36,6 @@ Mm.c SetVar.c SerMode.c - Bcfg.c Pci.c Pci.h DmpStore.c @@ -115,6 +114,7 @@ UefiBootServicesTableLib SortLib PrintLib + BcfgCommandLib [Pcd] gEfiShellPkgTokenSpaceGuid.PcdShellProfileMask # ALWAYS_CONSUMED diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.uni b/ShellPkg/Library/UefiShellDebug1CommandsLib/UefiShellDebug1CommandsLib.uni index 76063e4a0e9bec75595f81eb673cb0a93405eb46..4fcfdeb1575b04aefb65f273b42154cdfc41a186 100644 GIT binary patch delta 24 gcmaF2jI-ke$A*}+%?X84o7(TVGj6}*&NPV|0Fu-S+yDRo delta 6794 zcmc&(U2Igx6`on*A57PO>t($*hP&RlK*M4$#*Ik~)Yt~1U>3syCB}iZy~b{Auf0nQ zL{x62NU16s5k_K^hf=2!ZK|{iqz_S4wS@;z+eAs>p^vGkTKbTNgojpbU()Z)+`D&n z*ET;vs#bfwckayj`ObIFoVotq?@I6dWa*{DBff2{i*08+*b#P+?PbrfIO`ENy8Y)? zJSHkv?2;WxUM4Qomx|%i>XJ3AiKW?E5iMU^Vy_do>YFg}=z`Bb8w!X&gv-TT**8L? zEWsw(FdJt{X0d)q+lg-r+rUoZ?`}3Aj%@cg(5x9XqZ`*5HpYhVcMnF7vr*Dr<=VU* z7Vm<^(Qj@QM{C->6Kd8F8^wx@T=gpV7mYx`xa1eP|6E0FuwW@1k3o2k2+g($%e!3s z+}9y)_Ouwl*h<(DQFSsXtlFvY5KF-kGBORLEPPYAYI6-k{jRn+>jbYp^A-p%&2Uban49|(#I zWlwo`!@>zRs4&QgKCjP9Ru8Lt=o8c4Cql0OyMS^h5YlMJ5w;itzE4C;BBJH>ulS!* zHg3zI!+JUWFYc>yA4OOcpNyzV`NUkux2g#64A^1WpNP1+c289xry;7JJ&P%)Ku!J3VjXNB;z_}yBqc8`P=693q_n5| zE){|_+rkE9bbxPKW`HUyR(SmKxf#B4wG(0EDMXp^v_Ql$*%{#ha7fWW^sV&Cl`A~O zN<`QZ;gV#5<#zDg(|HdyfbBz~oVi!MPU zEG2*c4_@yhc+BNUF8R?K-mnC`5m(y+a!Z02HxXNjm*&j%xR2Xe5GJwm?LHo=H>YGU ztc$B+q5R@49+EeIz-#35J9w$A6TB{*0B5HNNEJ0F$D0u;H|_c^abMUJZ0eo{@hM}G zKk~a{yk53n=H*MNu#kW$`Sxc#5Xv>3(l&{QlPJsN8Ztz7u0t4gvW%)YkmEh`Ic_E~ zrR@m5X&~O?*3fp~2&7#;*mEyX-%4>g@|0c?S73uZyf zQ>Isz*em6aKHz>icYznn_$6K`Yp(H{5cxtJ8N**HcT_b-aGz2s46no+Lq0?IqX&K} z3;e{x08ix3fJ{lmeoWPoA>{%(2#gWjF@$_v1;Po^6x>TIj>xj>K;qH|{4oVg1=VHR zhl!FPioEep?yn-e(+U|oy0T)Kr+zcViAbD)X0whvTFjU}im*RI=$D{EQ#o0?7nV-| z4c)vglJBB(f1rdC76_@Fm(~a`4VgZ=yd_fEQi;3KCD;N;U8wh7s$`vzNcVk2>q4m&I;*K1PGaf_8QsVOO3NzKvE0g` zbm__wfjekXvK2h0>2QiQEBA*LA*lk)M+xd^Xm5A+umqsZKp@eW#;CMaead|Y&FrS0 z!R$XwGl^r{Az&Pz6t)4)Nh*0-yvuk0dSw#MQkY$gjWoeHQFcN>py3!U zR^TRN?`j^Dcb0mJeG6Io^p~(yZKp-5O%ct1^~+b=dFkvFR1dKi?7+<6ZX85k04#Xq z?&MVDMiJEG=<;a&DOK2r=9G}MyPM%jGQxn`SJIF~sHpW!dDw`&`w91jp2ZR35Zd}~ zG@EqDvFw@J7KBz-#6gX+PF^R^T<6uv!sg0p-xo4rKUB~eECP1WW=VX}0dQn#e(6@t zsK@{PgqOYW40_=`XyE9aqm9)aa~f_9!5MudaB8Y{-h@++Q2J3Nq7}OSFBEA+Mo%OY z$yDkP@_S5Efpbi75{qI;=U7SyP5&r<>2%nLUpfYQm!(M2c17u^*IP0e=gSn{t>n}} z#FbVM{|PqTz3HuK67JAQ3ZUxsV`A(6;4JM?B$=2(hto+w|B})|$6VL;b@nQfL44E@ zQF)xdUpCijMpAjvJ&m(zSnQ>8TU7+^!w`9En)}4=vhv=>1?B28Js*E_Eio*R)Dy0z z>O{4Nl8MSB0r`j`>rje>e#w}^Z=`@+73W3&@5nkS=bnvRJ}eSb9nw+|DL1Ba?hJ2H z2jcxUe=*^~4#bNefA6m0tK?iO4hz?pdCKLP_juV8+iVSC94qNV89;&W#??Nk+fTys z+Z`zF@jHBZO!wdPTE@w0$71*7oWF&}RrV33^cmWCF8juLXsh!;ryAM@nDH>?RX4bF zv)~4une&u2$+Q3FWzD4Np)_owba#rCuEMk>P&IT50Tmj3M$gk8>Y*$koT*G3^=ckt z93_jzqvnw5uzk3Ja&p}?w7?j~=m ziNA5567F~N#e|#$H{VOJyEIRz+v+XIjmQ<{C~1SB2@u$Px*q%_dRs85SM9>xDx~TK z-a@9XFv?cGovreXI`pdd50hhED{M%Cr__Se80Af&bunpc zFWfU2Y6K~EqO9z~=Lp&dylcmG4?Z!VK>y^qTjR@$FPB%^c`e@UoB&iA8T&Q%yzw-z zmUr5r_3=%7P=2_He^vhYBH!TEdz$WPPRNVvc&LP4@+4VOetHd??fKih94~pCFjHBj db2DBo%a7i~+qJ3R@b$0E)be*{YCY$c{SOI+W{Cg* diff --git a/ShellPkg/Library/UefiShellInstall1CommandsLib/Bcfg.c b/ShellPkg/Library/UefiShellInstall1CommandsLib/Bcfg.c deleted file mode 100644 index bb81df59cc..0000000000 --- a/ShellPkg/Library/UefiShellInstall1CommandsLib/Bcfg.c +++ /dev/null @@ -1,1441 +0,0 @@ -/** @file - Main file for bcfg shell Install1 function. - - Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.
- This program and the accompanying materials - are licensed and made available under the terms and conditions of the BSD License - which accompanies this distribution. The full text of the license may be found at - http://opensource.org/licenses/bsd-license.php - - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "UefiShellInstall1CommandsLib.h" -#include -#include -#include -#include - -typedef enum { - BcfgTargetBootOrder = 0, - BcfgTargetDriverOrder = 1, - BcfgTargetMax = 2 -} BCFG_OPERATION_TARGET; - -typedef enum { - BcfgTypeDump = 0, - BcfgTypeAdd = 1, - BcfgTypeAddp = 2, - BcfgTypeAddh = 3, - BcfgTypeRm = 4, - BcfgTypeMv = 5, - BcfgTypeOpt = 6, - BcfgTypeMax = 7 -} BCFG_OPERATION_TYPE; - -typedef struct { - BCFG_OPERATION_TARGET Target; - BCFG_OPERATION_TYPE Type; - UINT16 Number1; - UINT16 Number2; - UINTN HandleIndex; - CHAR16 *FileName; - CHAR16 *Description; - UINT16 *Order; - CONST CHAR16 *OptData; -} BGFG_OPERATION; - -/** - Update the optional data for a boot or driver option. - - If optional data exists it will be changed. - - @param[in] Index The boot or driver option index update. - @param[in] DataSize The size in bytes of Data. - @param[in] Data The buffer for the optioanl data. - @param[in] Target The target of the operation. - - @retval EFI_SUCCESS The data was sucessfully updated. - @retval other A error occured. -**/ -EFI_STATUS -EFIAPI -UpdateOptionalData( - UINT16 Index, - UINTN DataSize, - UINT8 *Data, - IN CONST BCFG_OPERATION_TARGET Target - ) -{ - EFI_STATUS Status; - CHAR16 VariableName[12]; - UINTN OriginalSize; - UINT8 *OriginalData; - UINTN NewSize; - UINT8 *NewData; - UINTN OriginalOptionDataSize; - - UnicodeSPrint(VariableName, sizeof(VariableName), L"%s%04x", Target == BcfgTargetBootOrder?L"Boot":L"Driver", Index); - - OriginalSize = 0; - OriginalData = NULL; - NewData = NULL; - NewSize = 0; - - Status = gRT->GetVariable( - VariableName, - (EFI_GUID*)&gEfiGlobalVariableGuid, - NULL, - &OriginalSize, - OriginalData); - if (Status == EFI_BUFFER_TOO_SMALL) { - OriginalData = AllocateZeroPool(OriginalSize); - if (OriginalData == NULL) { - return (EFI_OUT_OF_RESOURCES); - } - Status = gRT->GetVariable( - VariableName, - (EFI_GUID*)&gEfiGlobalVariableGuid, - NULL, - &OriginalSize, - OriginalData); - } - - if (!EFI_ERROR(Status)) { - // - // Allocate new struct and discard old optional data. - // - ASSERT (OriginalData != NULL); - OriginalOptionDataSize = sizeof(UINT32) + sizeof(UINT16) + StrSize(((CHAR16*)(OriginalData + sizeof(UINT32) + sizeof(UINT16)))); - OriginalOptionDataSize += (*(UINT16*)(OriginalData + sizeof(UINT32))); - OriginalOptionDataSize -= OriginalSize; - NewSize = OriginalSize - OriginalOptionDataSize + DataSize; - NewData = AllocateCopyPool(NewSize, OriginalData); - if (NewData == NULL) { - Status = EFI_OUT_OF_RESOURCES; - } else { - CopyMem(NewData + OriginalSize - OriginalOptionDataSize, Data, DataSize); - } - } - - if (!EFI_ERROR(Status)) { - // - // put the data back under the variable - // - Status = gRT->SetVariable( - VariableName, - (EFI_GUID*)&gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS, - NewSize, - NewData); - } - - SHELL_FREE_NON_NULL(OriginalData); - SHELL_FREE_NON_NULL(NewData); - return (Status); -} - -/** - This function will get a CRC for a boot option. - - @param[in, out] Crc The CRC value to return. - @param[in] BootIndex The boot option index to CRC. - - @retval EFI_SUCCESS The CRC was sucessfully returned. - @retval other A error occured. -**/ -EFI_STATUS -EFIAPI -GetBootOptionCrc( - UINT32 *Crc, - UINT16 BootIndex - ) -{ - CHAR16 VariableName[12]; - EFI_STATUS Status; - UINT8 *Buffer; - UINTN BufferSize; - - Buffer = NULL; - BufferSize = 0; - - // - // Get the data Buffer - // - UnicodeSPrint(VariableName, sizeof(VariableName), L"%Boot%04x", BootIndex); - Status = gRT->GetVariable( - VariableName, - (EFI_GUID*)&gEfiGlobalVariableGuid, - NULL, - &BufferSize, - NULL); - if (Status == EFI_BUFFER_TOO_SMALL) { - Buffer = AllocateZeroPool(BufferSize); - Status = gRT->GetVariable( - VariableName, - (EFI_GUID*)&gEfiGlobalVariableGuid, - NULL, - &BufferSize, - Buffer); - } - - // - // Get the CRC computed - // - if (!EFI_ERROR(Status)) { - Status = gBS->CalculateCrc32 (Buffer, BufferSize, Crc); - } - - SHELL_FREE_NON_NULL(Buffer); - return EFI_SUCCESS; -} - -/** - This function will populate the device path protocol parameter based on TheHandle. - - @param[in] TheHandle Driver handle. - @param[in, out] FilePath On a sucessful return the device path to the handle. - - @retval EFI_SUCCESS The device path was sucessfully returned. - @retval other A error from gBS->HandleProtocol. - - @sa HandleProtocol -**/ -EFI_STATUS -EFIAPI -GetDevicePathForDriverHandleInstall1 ( - IN EFI_HANDLE TheHandle, - IN OUT EFI_DEVICE_PATH_PROTOCOL **FilePath - ) -{ - EFI_STATUS Status; - EFI_LOADED_IMAGE_PROTOCOL *LoadedImage; - EFI_DEVICE_PATH_PROTOCOL *ImageDevicePath; - - Status = gBS->OpenProtocol ( - TheHandle, - &gEfiLoadedImageProtocolGuid, - (VOID**)&LoadedImage, - gImageHandle, - NULL, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (!EFI_ERROR (Status)) { - Status = gBS->OpenProtocol ( - LoadedImage->DeviceHandle, - &gEfiDevicePathProtocolGuid, - (VOID**)&ImageDevicePath, - gImageHandle, - NULL, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (!EFI_ERROR (Status)) { -// *DevPath = DuplicateDevicePath (ImageDevicePath); -// *FilePath = DuplicateDevicePath (LoadedImage->FilePath); - *FilePath = AppendDevicePath(ImageDevicePath,LoadedImage->FilePath); - gBS->CloseProtocol( - LoadedImage->DeviceHandle, - &gEfiDevicePathProtocolGuid, - gImageHandle, - NULL); - } - gBS->CloseProtocol( - TheHandle, - &gEfiLoadedImageProtocolGuid, - gImageHandle, - NULL); - } - return (Status); -} - -/** - Function to add a option. - - @param[in] Position The position to add Target at. - @param[in] File The file to make the target. - @param[in] Desc The description text. - @param[in] CurrentOrder The pointer to the current order of items. - @param[in] OrderCount The number if items in CurrentOrder. - @param[in] Target The info on the option to add. - @param[in] UseHandle TRUE to use HandleNumber, FALSE to use File and Desc. - @param[in] UsePath TRUE to convert to devicepath. - @param[in] HandleNumber The handle number to add. - - @retval SHELL_SUCCESS The operation was successful. - @retval SHELL_INVALID_PARAMETER A parameter was invalid. -**/ -SHELL_STATUS -EFIAPI -BcfgAddInstall1( - IN UINTN Position, - IN CONST CHAR16 *File, - IN CONST CHAR16 *Desc, - IN CONST UINT16 *CurrentOrder, - IN CONST UINTN OrderCount, - IN CONST BCFG_OPERATION_TARGET Target, - IN CONST BOOLEAN UseHandle, - IN CONST BOOLEAN UsePath, - IN CONST UINTN HandleNumber - ) -{ - EFI_STATUS Status; - EFI_DEVICE_PATH_PROTOCOL *DevicePath; - EFI_DEVICE_PATH_PROTOCOL *FilePath; - CHAR16 *Str; - UINT8 *TempByteBuffer; - UINT8 *TempByteStart; - EFI_SHELL_FILE_INFO *Arg; - EFI_SHELL_FILE_INFO *FileList; - CHAR16 OptionStr[40]; - UINTN DescSize, FilePathSize; - BOOLEAN Found; - UINTN TargetLocation; - UINTN Index; - EFI_HANDLE *Handles; - EFI_HANDLE CurHandle; - UINTN DriverBindingHandleCount; - UINTN ParentControllerHandleCount; - UINTN ChildControllerHandleCount; - SHELL_STATUS ShellStatus; - UINT16 *NewOrder; - - if (!UseHandle) { - if (File == NULL || Desc == NULL) { - return (SHELL_INVALID_PARAMETER); - } - } else { - if (HandleNumber == 0) { - return (SHELL_INVALID_PARAMETER); - } - } - - if (Position > OrderCount) { - Position = OrderCount; - } - - Str = NULL; - FilePath = NULL; - FileList = NULL; - Handles = NULL; - ShellStatus = SHELL_SUCCESS; - TargetLocation = 0xFFFF; - - if (UseHandle) { - CurHandle = ConvertHandleIndexToHandle(HandleNumber); - if (CurHandle == NULL) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, L"Handle Number"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - if (Target == BcfgTargetBootOrder) { - // - //Make sure that the handle should point to a real controller - // - Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS ( - CurHandle, - &DriverBindingHandleCount, - NULL); - - Status = PARSE_HANDLE_DATABASE_PARENTS ( - CurHandle, - &ParentControllerHandleCount, - NULL); - - Status = ParseHandleDatabaseForChildControllers ( - CurHandle, - &ChildControllerHandleCount, - NULL); - - if (DriverBindingHandleCount > 0 - || ParentControllerHandleCount > 0 - || ChildControllerHandleCount > 0) { - FilePath = NULL; - Status = gBS->HandleProtocol ( - CurHandle, - &gEfiDevicePathProtocolGuid, - (VOID**)&FilePath); - } - if (EFI_ERROR (Status)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_HANDLE), gShellInstall1HiiHandle, HandleNumber); - ShellStatus = SHELL_INVALID_PARAMETER; - } - } else { - // - //Make sure that the handle should point to driver, not a controller. - // - Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS ( - CurHandle, - &DriverBindingHandleCount, - NULL); - - Status = PARSE_HANDLE_DATABASE_PARENTS ( - CurHandle, - &ParentControllerHandleCount, - NULL); - - Status = ParseHandleDatabaseForChildControllers ( - CurHandle, - &ChildControllerHandleCount, - NULL); - - Status = gBS->HandleProtocol ( - CurHandle, - &gEfiDevicePathProtocolGuid, - (VOID**)&FilePath); - - if (DriverBindingHandleCount > 0 - || ParentControllerHandleCount > 0 - || ChildControllerHandleCount > 0 - || !EFI_ERROR(Status) ) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, L"Handle Number"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - // - // Get the DevicePath from the loaded image information. - // - Status = GetDevicePathForDriverHandleInstall1(CurHandle, &FilePath); - } - } - } - } else { - // - // Get file info - // - ShellOpenFileMetaArg ((CHAR16*)File, EFI_FILE_MODE_READ, &FileList); - - if (FileList == NULL) { - // - // If filename matched nothing fail - // - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FILE_OPEN_FAIL), gShellInstall1HiiHandle, File); - ShellStatus = SHELL_INVALID_PARAMETER; - } else if (FileList->Link.ForwardLink != FileList->Link.BackLink) { - // - // If filename expanded to multiple names, fail - // - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_FILE), gShellInstall1HiiHandle, File); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - Arg = (EFI_SHELL_FILE_INFO*)GetFirstNode(&FileList->Link); - if (EFI_ERROR(Arg->Status)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_FILE_OPEN), gShellInstall1HiiHandle, File, Arg->Status); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - // - // Build FilePath to the filename - // - - // - // get the device path - // - DevicePath = gEfiShellProtocol->GetDevicePathFromFilePath(Arg->FullName); - if (DevicePath == NULL) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_FILE_DP), gShellInstall1HiiHandle, Arg->FullName); - ShellStatus = SHELL_UNSUPPORTED; - } else { -/* - if (UsePath) { - DevPath = DevicePath; - while (!IsDevicePathEnd(DevPath)) { - if ((DevicePathType(DevPath) == MEDIA_DEVICE_PATH) && - (DevicePathSubType(DevPath) == MEDIA_HARDDRIVE_DP)) { - - // - // If we find it use it instead - // - DevicePath = DevPath; - break; - } - DevPath = NextDevicePathNode(DevPath); - } - // - // append the file - // - for(StringWalker=Arg->FullName; *StringWalker != CHAR_NULL && *StringWalker != ':'; StringWalker++); - FileNode = FileDevicePath(NULL, StringWalker+1); - FilePath = AppendDevicePath(DevicePath, FileNode); - FreePool(FileNode); - } else { -*/ - FilePath = DuplicateDevicePath(DevicePath); -/* - } -*/ - FreePool(DevicePath); - } - } - } - } - - - if (ShellStatus == SHELL_SUCCESS) { - // - // Find a free target ,a brute force implementation - // - Found = FALSE; - for (TargetLocation=0; TargetLocation < 0xFFFF; TargetLocation++) { - Found = TRUE; - for (Index=0; Index < OrderCount; Index++) { - if (CurrentOrder[Index] == TargetLocation) { - Found = FALSE; - break; - } - } - - if (Found) { - break; - } - } - - if (TargetLocation == 0xFFFF) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_TARGET_NF), gShellInstall1HiiHandle); - } else { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_TARGET), gShellInstall1HiiHandle, TargetLocation); - } - } - - if (ShellStatus == SHELL_SUCCESS) { - // - // Add the option - // - DescSize = StrSize(Desc); - FilePathSize = GetDevicePathSize (FilePath); - - TempByteBuffer = AllocateZeroPool(sizeof(UINT32) + sizeof(UINT16) + DescSize + FilePathSize); - if (TempByteBuffer != NULL) { - TempByteStart = TempByteBuffer; - *((UINT32 *) TempByteBuffer) = LOAD_OPTION_ACTIVE; // Attributes - TempByteBuffer += sizeof (UINT32); - - *((UINT16 *) TempByteBuffer) = (UINT16)FilePathSize; // FilePathListLength - TempByteBuffer += sizeof (UINT16); - - CopyMem (TempByteBuffer, Desc, DescSize); - TempByteBuffer += DescSize; - ASSERT (FilePath != NULL); - CopyMem (TempByteBuffer, FilePath, FilePathSize); - - UnicodeSPrint (OptionStr, sizeof(OptionStr), L"%s%04x", Target == BcfgTargetBootOrder?L"Boot":L"Driver", TargetLocation); - Status = gRT->SetVariable ( - OptionStr, - &gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS, - sizeof(UINT32) + sizeof(UINT16) + DescSize + FilePathSize, - TempByteStart - ); - - FreePool(TempByteStart); - } else { - Status = EFI_OUT_OF_RESOURCES; - } - - if (EFI_ERROR(Status)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellInstall1HiiHandle, OptionStr, Status); - } else { - NewOrder = AllocateZeroPool((OrderCount+1)*sizeof(NewOrder[0])); - ASSERT(NewOrder != NULL); - CopyMem(NewOrder, CurrentOrder, (OrderCount)*sizeof(NewOrder[0])); - - // - // Insert target into order list - // - for (Index=OrderCount; Index > Position; Index--) { - NewOrder[Index] = NewOrder[Index-1]; - } - - NewOrder[Position] = (UINT16) TargetLocation; - Status = gRT->SetVariable ( - Target == BcfgTargetBootOrder?L"BootOrder":L"DriverOrder", - &gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS, - (OrderCount+1) * sizeof(UINT16), - NewOrder - ); - - FreePool(NewOrder); - - if (EFI_ERROR(Status)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellInstall1HiiHandle, Target == BcfgTargetBootOrder?L"BootOrder":L"DriverOrder", Status); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - Print (L"bcfg: Add %s as %x\n", OptionStr, Position); - } - } - } - -// -//If always Free FilePath, will free devicepath in system when use "addh" -// - if (FilePath!=NULL && !UseHandle) { - FreePool (FilePath); - } - - if (Str != NULL) { - FreePool(Str); - } - - if (Handles != NULL) { - FreePool (Handles); - } - - if (FileList != NULL) { - ShellCloseFileMetaArg (&FileList); - } - - return (ShellStatus); -} - -/** - Funciton to remove an item. - - @param[in] Target The target item to move. - @param[in] CurrentOrder The pointer to the current order of items. - @param[in] OrderCount The number if items in CurrentOrder. - @param[in] Location The current location of the Target. - - @retval SHELL_SUCCESS The operation was successful. - @retval SHELL_INVALID_PARAMETER A parameter was invalid. -**/ -SHELL_STATUS -EFIAPI -BcfgRemoveInstall1( - IN CONST BCFG_OPERATION_TARGET Target, - IN CONST UINT16 *CurrentOrder, - IN CONST UINTN OrderCount, - IN CONST UINT16 Location - ) -{ - CHAR16 VariableName[12]; - UINT16 *NewOrder; - EFI_STATUS Status; - UINTN NewCount; - - UnicodeSPrint(VariableName, sizeof(VariableName), L"%s%04x", Target == BcfgTargetBootOrder?L"Boot":L"Driver", CurrentOrder[Location]); - Status = gRT->SetVariable( - VariableName, - (EFI_GUID*)&gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS, - 0, - NULL); - if (EFI_ERROR(Status)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellInstall1HiiHandle, VariableName, Status); - return (SHELL_INVALID_PARAMETER); - } - NewOrder = AllocateZeroPool(OrderCount*sizeof(CurrentOrder[0])); - if (NewOrder != NULL) { - NewCount = OrderCount; - CopyMem(NewOrder, CurrentOrder, OrderCount*sizeof(CurrentOrder[0])); - CopyMem(NewOrder+Location, NewOrder+Location+1, (OrderCount - Location - 1)*sizeof(CurrentOrder[0])); - NewCount--; - - Status = gRT->SetVariable( - Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder", - (EFI_GUID*)&gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS, - NewCount*sizeof(NewOrder[0]), - NewOrder); - FreePool(NewOrder); - } else { - Status = EFI_OUT_OF_RESOURCES; - } - if (EFI_ERROR(Status)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellInstall1HiiHandle, Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder", Status); - return (SHELL_INVALID_PARAMETER); - } - return (SHELL_SUCCESS); -} - -/** - Funciton to move a item to another location. - - @param[in] Target The target item to move. - @param[in] CurrentOrder The pointer to the current order of items. - @param[in] OrderCount The number if items in CurrentOrder. - @param[in] OldLocation The current location of the Target. - @param[in] NewLocation The desired location of the Target. - - @retval SHELL_SUCCESS The operation was successful. - @retval SHELL_INVALID_PARAMETER A parameter was invalid. -**/ -SHELL_STATUS -EFIAPI -BcfgMoveInstall1( - IN CONST BCFG_OPERATION_TARGET Target, - IN CONST UINT16 *CurrentOrder, - IN CONST UINTN OrderCount, - IN CONST UINT16 OldLocation, - IN UINT16 NewLocation - ) -{ - UINT16 *NewOrder; - EFI_STATUS Status; - UINT16 Temp; - - NewOrder = AllocateCopyPool(OrderCount*sizeof(CurrentOrder[0]), CurrentOrder); - if (NewOrder == NULL) { - return (SHELL_OUT_OF_RESOURCES); - } - - // - // correct the new location - // - if (NewLocation >= OrderCount) { - if (OrderCount > 0) { - NewLocation = (UINT16)OrderCount - 1; - } else { - NewLocation = 0; - } - } - - Temp = CurrentOrder[OldLocation]; - CopyMem(NewOrder+OldLocation, NewOrder+OldLocation+1, (OrderCount - OldLocation - 1)*sizeof(CurrentOrder[0])); - CopyMem(NewOrder+NewLocation+1, NewOrder+NewLocation, (OrderCount - NewLocation - 1)*sizeof(CurrentOrder[0])); - NewOrder[NewLocation] = Temp; - - Status = gRT->SetVariable( - Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder", - (EFI_GUID*)&gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS, - OrderCount*sizeof(CurrentOrder[0]), - NewOrder); - - FreePool(NewOrder); - - if (EFI_ERROR(Status)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_WRITE_FAIL), gShellInstall1HiiHandle, Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder", Status); - return (SHELL_INVALID_PARAMETER); - } - return (SHELL_SUCCESS); -} - -/** - Function to add optional data to an option. - - @param[in] OptData The optional data to add. - @param[in] CurrentOrder The pointer to the current order of items. - @param[in] OrderCount The number if items in CurrentOrder. - @param[in] Target The target of the operation. - - @retval SHELL_SUCCESS The operation was succesful. -**/ -SHELL_STATUS -EFIAPI -BcfgAddOptInstall1( - IN CONST CHAR16 *OptData, - IN CONST UINT16 *CurrentOrder, - IN CONST UINTN OrderCount, - IN CONST BCFG_OPERATION_TARGET Target - ) -{ - EFI_KEY_OPTION NewKeyOption; - EFI_KEY_OPTION *KeyOptionBuffer; - SHELL_STATUS ShellStatus; - EFI_STATUS Status; - UINT16 OptionIndex; - UINT16 LoopCounter; - UINT64 Intermediate; - CONST CHAR16 *Temp; - CONST CHAR16 *Walker; - CHAR16 *FileName; - CHAR16 *Temp2; - CHAR16 *Data; - UINT16 KeyIndex; - CHAR16 VariableName[12]; - - SHELL_FILE_HANDLE FileHandle; - - Status = EFI_SUCCESS; - ShellStatus = SHELL_SUCCESS; - Walker = OptData; - FileName = NULL; - Data = NULL; - KeyOptionBuffer = NULL; - - ZeroMem(&NewKeyOption, sizeof(EFI_KEY_OPTION)); - - while(Walker[0] == L' ') { - Walker++; - } - - // - // Get the index of the variable we are changing. - // - Status = ShellConvertStringToUint64(Walker, &Intermediate, FALSE, TRUE); - if (EFI_ERROR(Status) || (((UINT16)Intermediate) != Intermediate) || StrStr(Walker, L" ") == NULL || ((UINT16)Intermediate) > ((UINT16)OrderCount)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, L"Option Index"); - ShellStatus = SHELL_INVALID_PARAMETER; - return (ShellStatus); - } - OptionIndex = (UINT16)Intermediate; - - Temp = StrStr(Walker, L" "); - if (Temp != NULL) { - Walker = Temp; - } - while(Walker[0] == L' ') { - Walker++; - } - - // - // determine whether we have file with data, quote delimited information, or a hot-key - // - if (Walker[0] == L'\"') { - // - // quoted filename or quoted information. - // - Temp = StrStr(Walker+1, L"\""); - if (Temp == NULL || StrLen(Temp) != 1) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, Walker); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - FileName = StrnCatGrow(&FileName, NULL, Walker+1, 0); - if (FileName == NULL) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_OUT_MEM), gShellInstall1HiiHandle); - ShellStatus = SHELL_OUT_OF_RESOURCES; - return (ShellStatus); - } - Temp2 = StrStr(FileName, L"\""); - ASSERT(Temp2 != NULL); - Temp2[0] = CHAR_NULL; - Temp2++; - if (StrLen(Temp2)>0) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, Walker); - ShellStatus = SHELL_INVALID_PARAMETER; - } - if (EFI_ERROR(ShellFileExists(Walker))) { - // - // Not a file. must be misc information. - // - Data = FileName; - FileName = NULL; - } else { - FileName = StrnCatGrow(&FileName, NULL, Walker, 0); - } - } - } else { - // - // filename or hot key information. - // - if (StrStr(Walker, L" ") == NULL) { - // - // filename - // - if (EFI_ERROR(ShellFileExists(Walker))) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_FIND_FAIL), gShellInstall1HiiHandle, Walker); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - FileName = StrnCatGrow(&FileName, NULL, Walker, 0); - } - } else { - if (Target != BcfgTargetBootOrder) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_BOOT_ONLY), gShellInstall1HiiHandle); - ShellStatus = SHELL_INVALID_PARAMETER; - } - - if (ShellStatus == SHELL_SUCCESS) { - // - // Get hot key information - // - Status = ShellConvertStringToUint64(Walker, &Intermediate, FALSE, TRUE); - if (EFI_ERROR(Status) || (((UINT32)Intermediate) != Intermediate) || StrStr(Walker, L" ") == NULL) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, Walker); - ShellStatus = SHELL_INVALID_PARAMETER; - } - NewKeyOption.KeyData.PackedValue = (UINT32)Intermediate; - Temp = StrStr(Walker, L" "); - if (Temp != NULL) { - Walker = Temp; - } - while(Walker[0] == L' ') { - Walker++; - } - } - - if (ShellStatus == SHELL_SUCCESS) { - // - // Now we know how many EFI_INPUT_KEY structs we need to attach to the end of the EFI_KEY_OPTION struct. - // Re-allocate with the added information. - // - KeyOptionBuffer = AllocateCopyPool(sizeof(EFI_KEY_OPTION) + (sizeof(EFI_INPUT_KEY) * NewKeyOption.KeyData.Options.InputKeyCount), &NewKeyOption); - if (KeyOptionBuffer == NULL) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_MEM), gShellInstall1HiiHandle); - ShellStatus = SHELL_OUT_OF_RESOURCES; - } - } - for (LoopCounter = 0 ; ShellStatus == SHELL_SUCCESS && LoopCounter < NewKeyOption.KeyData.Options.InputKeyCount; LoopCounter++) { - // - // ScanCode - // - Status = ShellConvertStringToUint64(Walker, &Intermediate, FALSE, TRUE); - if (EFI_ERROR(Status) || (((UINT16)Intermediate) != Intermediate) || StrStr(Walker, L" ") == NULL) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, Walker); - ShellStatus = SHELL_INVALID_PARAMETER; - } - ((EFI_INPUT_KEY*)(((UINT8*)KeyOptionBuffer) + sizeof(EFI_KEY_OPTION)))[LoopCounter].ScanCode = (UINT16)Intermediate; - Temp = StrStr(Walker, L" "); - if (Temp != NULL) { - Walker = Temp; - } - while(Walker[0] == L' ') { - Walker++; - } - - // - // UnicodeChar - // - Status = ShellConvertStringToUint64(Walker, &Intermediate, FALSE, TRUE); - if (EFI_ERROR(Status) || (((UINT16)Intermediate) != Intermediate)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, Walker); - ShellStatus = SHELL_INVALID_PARAMETER; - } - ((EFI_INPUT_KEY*)(((UINT8*)KeyOptionBuffer) + sizeof(EFI_KEY_OPTION)))[LoopCounter].UnicodeChar = (UINT16)Intermediate; - Temp = StrStr(Walker, L" "); - if (Temp != NULL) { - Walker = Temp; - } - while(Walker[0] == L' ') { - Walker++; - } - } - - if (ShellStatus == SHELL_SUCCESS) { - // - // Now do the BootOption / BootOptionCrc - // - ASSERT (OptionIndex <= OrderCount); - KeyOptionBuffer->BootOption = CurrentOrder[OptionIndex]; - Status = GetBootOptionCrc(&(KeyOptionBuffer->BootOptionCrc), KeyOptionBuffer->BootOption); - if (EFI_ERROR(Status)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, L"Option Index"); - ShellStatus = SHELL_INVALID_PARAMETER; - } - } - - if (ShellStatus == SHELL_SUCCESS) { - for (Temp2 = NULL, KeyIndex = 0 ; KeyIndex < 0xFFFF ; KeyIndex++) { - UnicodeSPrint(VariableName, sizeof(VariableName), L"Key%04x", KeyIndex); - Status = gRT->GetVariable( - VariableName, - (EFI_GUID*)&gEfiGlobalVariableGuid, - NULL, - (UINTN*)&Intermediate, - NULL); - if (Status == EFI_NOT_FOUND) { - break; - } - } - Status = gRT->SetVariable( - VariableName, - (EFI_GUID*)&gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE|EFI_VARIABLE_BOOTSERVICE_ACCESS|EFI_VARIABLE_RUNTIME_ACCESS, - sizeof(EFI_KEY_OPTION) + (sizeof(EFI_INPUT_KEY) * NewKeyOption.KeyData.Options.InputKeyCount), - KeyOptionBuffer); - if (EFI_ERROR(Status)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellInstall1HiiHandle, VariableName, Status); - ShellStatus = SHELL_INVALID_PARAMETER; - } - ASSERT(FileName == NULL && Data == NULL); - } - } - } - - // - // Shouldn't be possible to have have both. Neither is ok though. - // - ASSERT(FileName == NULL || Data == NULL); - - if (ShellStatus == SHELL_SUCCESS && (FileName != NULL || Data != NULL)) { - if (FileName != NULL) { - // - // Open the file and populate the data buffer. - // - Status = ShellOpenFileByName( - FileName, - &FileHandle, - EFI_FILE_MODE_READ, - 0); - if (!EFI_ERROR(Status)) { - Status = ShellGetFileSize(FileHandle, &Intermediate); - } - Data = AllocateZeroPool((UINTN)Intermediate); - if (Data == NULL) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_MEM), gShellInstall1HiiHandle); - ShellStatus = SHELL_OUT_OF_RESOURCES; - } - if (!EFI_ERROR(Status)) { - Status = ShellReadFile(FileHandle, (UINTN *)&Intermediate, Data); - } - } else { - Intermediate = StrSize(Data); - } - - if (!EFI_ERROR(Status) && ShellStatus == SHELL_SUCCESS && Data != NULL) { - Status = UpdateOptionalData(CurrentOrder[OptionIndex], (UINTN)Intermediate, (UINT8*)Data, Target); - if (EFI_ERROR(Status)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellInstall1HiiHandle, VariableName, Status); - ShellStatus = SHELL_INVALID_PARAMETER; - } - } - if (EFI_ERROR(Status) && ShellStatus == SHELL_SUCCESS) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_SET_VAR_FAIL), gShellInstall1HiiHandle, VariableName, Status); - ShellStatus = SHELL_INVALID_PARAMETER; - } - } - - SHELL_FREE_NON_NULL(Data); - SHELL_FREE_NON_NULL(KeyOptionBuffer); - SHELL_FREE_NON_NULL(FileName); - return ShellStatus; -} - -/** - Function to dump the Bcfg information. - - @param[in] Op The operation. - @param[in] OrderCount How many to dump. - @param[in] CurrentOrder The pointer to the current order of items. - @param[in] VerboseOutput TRUE for extra output. FALSE otherwise. - - @retval SHELL_SUCCESS The dump was successful. - @retval SHELL_INVALID_PARAMETER A parameter was invalid. -**/ -SHELL_STATUS -EFIAPI -BcfgDisplayDumpInstall1( - IN CONST CHAR16 *Op, - IN CONST UINTN OrderCount, - IN CONST UINT16 *CurrentOrder, - IN CONST BOOLEAN VerboseOutput - ) -{ - EFI_STATUS Status; - UINT8 *Buffer; - UINTN BufferSize; - CHAR16 VariableName[12]; - UINTN LoopVar; - UINTN LoopVar2; - CHAR16 *DevPathString; - VOID *DevPath; - - if (OrderCount == 0) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN(STR_BCFG_NONE), gShellInstall1HiiHandle); - return (SHELL_SUCCESS); - } - - for (LoopVar = 0 ; LoopVar < OrderCount ; LoopVar++) { - Buffer = NULL; - BufferSize = 0; - UnicodeSPrint(VariableName, sizeof(VariableName), L"%s%04x", Op, CurrentOrder[LoopVar]); - - Status = gRT->GetVariable( - VariableName, - (EFI_GUID*)&gEfiGlobalVariableGuid, - NULL, - &BufferSize, - Buffer); - if (Status == EFI_BUFFER_TOO_SMALL) { - Buffer = AllocateZeroPool(BufferSize); - Status = gRT->GetVariable( - VariableName, - (EFI_GUID*)&gEfiGlobalVariableGuid, - NULL, - &BufferSize, - Buffer); - } - - if (EFI_ERROR(Status) || Buffer == NULL) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_READ_FAIL), gShellInstall1HiiHandle, VariableName, Status); - return (SHELL_INVALID_PARAMETER); - } - - if ((*(UINT16*)(Buffer+4)) != 0) { - DevPath = AllocateZeroPool(*(UINT16*)(Buffer+4)); - if (DevPath == NULL) { - DevPathString = NULL; - } else { - CopyMem(DevPath, Buffer+6+StrSize((CHAR16*)(Buffer+6)), *(UINT16*)(Buffer+4)); - DevPathString = ConvertDevicePathToText(DevPath, TRUE, FALSE); - } - } else { - DevPath = NULL; - DevPathString = NULL; - } - ShellPrintHiiEx( - -1, - -1, - NULL, - STRING_TOKEN(STR_BCFG_LOAD_OPTIONS), - gShellInstall1HiiHandle, - LoopVar, - VariableName, - (CHAR16*)(Buffer+6), - DevPathString, - (StrSize((CHAR16*)(Buffer+6)) + *(UINT16*)(Buffer+4) + 6) <= BufferSize?L'N':L'Y'); - if (VerboseOutput) { - for (LoopVar2 = (StrSize((CHAR16*)(Buffer+6)) + *(UINT16*)(Buffer+4) + 6);LoopVar2Target = BcfgTargetMax; - Struct->Type = BcfgTypeMax; - Struct->Number1 = 0; - Struct->Number2 = 0; - Struct->HandleIndex = 0; - Struct->FileName = NULL; - Struct->Description = NULL; - Struct->Order = NULL; - Struct->OptData = NULL; -} - - -STATIC CONST SHELL_PARAM_ITEM ParamList[] = { - {L"-v", TypeFlag}, - {L"-opt", TypeMaxValue}, - {NULL, TypeMax} - }; - -/** - Function for 'bcfg' 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 -ShellCommandRunBcfgInstall ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - EFI_STATUS Status; - LIST_ENTRY *Package; - CHAR16 *ProblemParam; - SHELL_STATUS ShellStatus; - UINTN ParamNumber; - CONST CHAR16 *CurrentParam; - BGFG_OPERATION CurrentOperation; - UINTN Length; - UINT64 Intermediate; - UINT16 Count; - - Length = 0; - ProblemParam = NULL; - Package = NULL; - ShellStatus = SHELL_SUCCESS; - - InitBcfgStructInstall1(&CurrentOperation); - - // - // initialize the shell lib (we must be in non-auto-init...) - // - Status = ShellInitialize(); - ASSERT_EFI_ERROR(Status); - - Status = CommandInit(); - ASSERT_EFI_ERROR(Status); - - // - // parse the command line - // - Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); - if (EFI_ERROR(Status)) { - if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, ProblemParam); - FreePool(ProblemParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - ASSERT(FALSE); - } - } else { - // - // Read in if we are doing -OPT - // - if (ShellCommandLineGetFlag(Package, L"-opt")) { - CurrentOperation.OptData = ShellCommandLineGetValue(Package, L"-opt"); - if (CurrentOperation.OptData == NULL) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM_VAL), gShellInstall1HiiHandle, L"-opt"); - ShellStatus = SHELL_INVALID_PARAMETER; - } - CurrentOperation.Type = BcfgTypeOpt; - } - - // - // small block to read the target of the operation - // - if ((ShellCommandLineGetCount(Package) < 3 && CurrentOperation.Type != BcfgTypeOpt) || - (ShellCommandLineGetCount(Package) < 2 && CurrentOperation.Type == BcfgTypeOpt) - ){ - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellInstall1HiiHandle); - ShellStatus = SHELL_INVALID_PARAMETER; - } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)ShellCommandLineGetRawValue(Package, 1), L"driver") == 0) { - CurrentOperation.Target = BcfgTargetDriverOrder; - } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)ShellCommandLineGetRawValue(Package, 1), L"boot") == 0) { - CurrentOperation.Target = BcfgTargetBootOrder; - } else { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_NO_DRIVER_BOOT), gShellInstall1HiiHandle); - ShellStatus = SHELL_INVALID_PARAMETER; - } - - - // - // Read in the boot or driver order environment variable (not needed for opt) - // - if (ShellStatus == SHELL_SUCCESS && CurrentOperation.Target < BcfgTargetMax) { - Length = 0; - Status = gRT->GetVariable( - CurrentOperation.Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder", - (EFI_GUID*)&gEfiGlobalVariableGuid, - NULL, - &Length, - CurrentOperation.Order); - if (Status == EFI_BUFFER_TOO_SMALL) { - CurrentOperation.Order = AllocateZeroPool(Length+(4*sizeof(CurrentOperation.Order[0]))); - if (CurrentOperation.Order == NULL) { - ShellStatus = SHELL_OUT_OF_RESOURCES; - } else { - Status = gRT->GetVariable( - CurrentOperation.Target == BcfgTargetBootOrder?(CHAR16*)L"BootOrder":(CHAR16*)L"DriverOrder", - (EFI_GUID*)&gEfiGlobalVariableGuid, - NULL, - &Length, - CurrentOperation.Order); - } - } - } - - Count = (UINT16) (Length / sizeof(CurrentOperation.Order[0])); - - // - // large block to read the type of operation and verify parameter types for the info. - // - if (ShellStatus == SHELL_SUCCESS && CurrentOperation.Target < BcfgTargetMax) { - for (ParamNumber = 2 ; ParamNumber < ShellCommandLineGetCount(Package) && ShellStatus == SHELL_SUCCESS; ParamNumber++) { - CurrentParam = ShellCommandLineGetRawValue(Package, ParamNumber); - if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"dump") == 0) { - CurrentOperation.Type = BcfgTypeDump; - } else if (ShellCommandLineGetFlag(Package, L"-v")) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, L"-v (without dump)"); - ShellStatus = SHELL_INVALID_PARAMETER; - } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"add") == 0) { - if ((ParamNumber + 3) >= ShellCommandLineGetCount(Package)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellInstall1HiiHandle); - ShellStatus = SHELL_INVALID_PARAMETER; - } - CurrentOperation.Type = BcfgTypeAdd; - CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber); - if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, CurrentParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE); - CurrentOperation.Number1 = (UINT16)Intermediate; - ASSERT(CurrentOperation.FileName == NULL); - CurrentOperation.FileName = StrnCatGrow(&CurrentOperation.FileName , NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0); - ASSERT(CurrentOperation.Description == NULL); - CurrentOperation.Description = StrnCatGrow(&CurrentOperation.Description, NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0); - } - } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"addp") == 0) { - if ((ParamNumber + 3) >= ShellCommandLineGetCount(Package)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellInstall1HiiHandle); - ShellStatus = SHELL_INVALID_PARAMETER; - } - CurrentOperation.Type = BcfgTypeAddp; - CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber); - if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, CurrentParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE); - CurrentOperation.Number1 = (UINT16)Intermediate; - ASSERT(CurrentOperation.FileName == NULL); - CurrentOperation.FileName = StrnCatGrow(&CurrentOperation.FileName , NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0); - ASSERT(CurrentOperation.Description == NULL); - CurrentOperation.Description = StrnCatGrow(&CurrentOperation.Description, NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0); - } - } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"addh") == 0) { - if ((ParamNumber + 3) >= ShellCommandLineGetCount(Package)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellInstall1HiiHandle); - ShellStatus = SHELL_INVALID_PARAMETER; - } - CurrentOperation.Type = BcfgTypeAddh; - CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber); - if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, CurrentParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE); - CurrentOperation.Number1 = (UINT16)Intermediate; - CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber); - if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, CurrentParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE); - CurrentOperation.HandleIndex = (UINT16)Intermediate; - ASSERT(CurrentOperation.Description == NULL); - CurrentOperation.Description = StrnCatGrow(&CurrentOperation.Description, NULL, ShellCommandLineGetRawValue(Package, ++ParamNumber), 0); - } - } - } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"rm") == 0) { - if ((ParamNumber + 1) >= ShellCommandLineGetCount(Package)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellInstall1HiiHandle); - ShellStatus = SHELL_INVALID_PARAMETER; - } - CurrentOperation.Type = BcfgTypeRm; - CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber); - if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, CurrentParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE); - CurrentOperation.Number1 = (UINT16)Intermediate; - if (CurrentOperation.Number1 > Count){ - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellInstall1HiiHandle, Count); - ShellStatus = SHELL_INVALID_PARAMETER; - } - } - } else if (gUnicodeCollation->StriColl(gUnicodeCollation, (CHAR16*)CurrentParam, L"mv") == 0) { - if ((ParamNumber + 2) >= ShellCommandLineGetCount(Package)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellInstall1HiiHandle); - ShellStatus = SHELL_INVALID_PARAMETER; - } - CurrentOperation.Type = BcfgTypeMv; - CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber); - if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, CurrentParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE); - CurrentOperation.Number1 = (UINT16)Intermediate; - if (CurrentOperation.Number1 > Count){ - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellInstall1HiiHandle, Count); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - CurrentParam = ShellCommandLineGetRawValue(Package, ++ParamNumber); - if (CurrentParam == NULL || !ShellIsHexOrDecimalNumber(CurrentParam, TRUE, FALSE)) { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, CurrentParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } else { - Status = ShellConvertStringToUint64(CurrentParam, &Intermediate, TRUE, FALSE); - CurrentOperation.Number2 = (UINT16)Intermediate; - } - if (CurrentOperation.Number2 == CurrentOperation.Number1 - ||CurrentOperation.Number2 >= Count - ){ - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_BCFG_NUMB_RANGE), gShellInstall1HiiHandle, Count); - ShellStatus = SHELL_INVALID_PARAMETER; - } - } - } - } else { - ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellInstall1HiiHandle, CurrentParam); - ShellStatus = SHELL_INVALID_PARAMETER; - } - } - } - if (ShellStatus == SHELL_SUCCESS && CurrentOperation.Target < BcfgTargetMax && CurrentOperation.Type < BcfgTypeMax) { - // - // we have all the info. Do the work - // - switch (CurrentOperation.Type) { - case BcfgTypeDump: - ShellStatus = BcfgDisplayDumpInstall1( - CurrentOperation.Target == BcfgTargetBootOrder?L"Boot":L"Driver", - Count, - CurrentOperation.Order, - ShellCommandLineGetFlag(Package, L"-v")); - break; - case BcfgTypeMv: - ShellStatus = BcfgMoveInstall1( - CurrentOperation.Target, - CurrentOperation.Order, - Count, - CurrentOperation.Number1, - CurrentOperation.Number2); - break; - case BcfgTypeRm: - ShellStatus = BcfgRemoveInstall1( - CurrentOperation.Target, - CurrentOperation.Order, - Count, - CurrentOperation.Number1); - break; - case BcfgTypeAdd: - case BcfgTypeAddp: - case BcfgTypeAddh: - ShellStatus = BcfgAddInstall1( - CurrentOperation.Number1, - CurrentOperation.FileName, - CurrentOperation.Description==NULL?L"":CurrentOperation.Description, - CurrentOperation.Order, - Count, - CurrentOperation.Target, - (BOOLEAN)(CurrentOperation.Type == BcfgTypeAddh), - (BOOLEAN)(CurrentOperation.Type == BcfgTypeAddp), - CurrentOperation.HandleIndex); - break; - case BcfgTypeOpt: - ShellStatus = BcfgAddOptInstall1( - CurrentOperation.OptData, - CurrentOperation.Order, - Count, - CurrentOperation.Target); - break; - default: - ASSERT(FALSE); - } - } - } - - if (Package != NULL) { - ShellCommandLineFreeVarList (Package); - } - if (CurrentOperation.FileName != NULL) { - FreePool(CurrentOperation.FileName); - } - if (CurrentOperation.Description != NULL) { - FreePool(CurrentOperation.Description); - } - if (CurrentOperation.Order != NULL) { - FreePool(CurrentOperation.Order); - } - - return (ShellStatus); -} diff --git a/ShellPkg/Library/UefiShellInstall1CommandsLib/UefiShellInstall1CommandsLib.c b/ShellPkg/Library/UefiShellInstall1CommandsLib/UefiShellInstall1CommandsLib.c index b7f0878b73..e26a86283e 100644 --- a/ShellPkg/Library/UefiShellInstall1CommandsLib/UefiShellInstall1CommandsLib.c +++ b/ShellPkg/Library/UefiShellInstall1CommandsLib/UefiShellInstall1CommandsLib.c @@ -12,24 +12,7 @@ **/ -#include "UefiShellInstall1CommandsLib.h" - -STATIC CONST CHAR16 mFileName[] = L"ShellCommands"; -EFI_HANDLE gShellInstall1HiiHandle = NULL; - -/** - Function to get the filename with help context if HII will not be used. - - @return The filename with help text in it. -**/ -CONST CHAR16* -EFIAPI -ShellCommandGetManFileNameInstall1 ( - VOID - ) -{ - return (mFileName); -} +#include /** Constructor for the Shell Level 1 Commands library. @@ -56,17 +39,7 @@ ShellInstall1CommandsLibConstructor ( return (EFI_SUCCESS); } - gShellInstall1HiiHandle = HiiAddPackages (&gShellInstall1HiiGuid, gImageHandle, UefiShellInstall1CommandsLibStrings, NULL); - if (gShellInstall1HiiHandle == NULL) { - return (EFI_DEVICE_ERROR); - } - - // - // install our shell command handlers that are always installed - // - ShellCommandRegisterCommandName(L"bcfg", ShellCommandRunBcfgInstall , ShellCommandGetManFileNameInstall1, 0, L"Install", FALSE, gShellInstall1HiiHandle, STRING_TOKEN(STR_GET_HELP_BCFG)); - - return (EFI_SUCCESS); + return (BcfgLibraryRegisterBcfgCommand(ImageHandle, SystemTable, L"Install1")); } /** @@ -82,8 +55,5 @@ ShellInstall1CommandsLibDestructor ( IN EFI_SYSTEM_TABLE *SystemTable ) { - if (gShellInstall1HiiHandle != NULL) { - HiiRemovePackages(gShellInstall1HiiHandle); - } - return (EFI_SUCCESS); + return (BcfgLibraryUnregisterBcfgCommand(ImageHandle, SystemTable)); } diff --git a/ShellPkg/Library/UefiShellInstall1CommandsLib/UefiShellInstall1CommandsLib.h b/ShellPkg/Library/UefiShellInstall1CommandsLib/UefiShellInstall1CommandsLib.h deleted file mode 100644 index 8b47a29a86..0000000000 --- a/ShellPkg/Library/UefiShellInstall1CommandsLib/UefiShellInstall1CommandsLib.h +++ /dev/null @@ -1,59 +0,0 @@ -/** @file - Main file for NULL named library for install 1 shell command functions. - - Copyright (c) 2010 - 2013, Intel Corporation. All rights reserved.
- This program and the accompanying materials - are licensed and made available under the terms and conditions of the BSD License - which accompanies this distribution. The full text of the license may be found at - http://opensource.org/licenses/bsd-license.php - - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _UEFI_SHELL_INSTALL1_COMMANDS_LIB_H_ -#define _UEFI_SHELL_INSTALL1_COMMANDS_LIB_H_ - -#include -#include - -#include - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -extern EFI_HANDLE gShellInstall1HiiHandle; - -/** - Function for 'bcfg' 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 -ShellCommandRunBcfgInstall ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ); - -#endif - diff --git a/ShellPkg/Library/UefiShellInstall1CommandsLib/UefiShellInstall1CommandsLib.inf b/ShellPkg/Library/UefiShellInstall1CommandsLib/UefiShellInstall1CommandsLib.inf index 5188a00384..ed207f9bf9 100644 --- a/ShellPkg/Library/UefiShellInstall1CommandsLib/UefiShellInstall1CommandsLib.inf +++ b/ShellPkg/Library/UefiShellInstall1CommandsLib/UefiShellInstall1CommandsLib.inf @@ -24,9 +24,6 @@ [Sources.common] UefiShellInstall1CommandsLib.c - UefiShellInstall1CommandsLib.h - UefiShellInstall1CommandsLib.uni - Bcfg.c [Packages] MdePkg/MdePkg.dec @@ -45,6 +42,7 @@ UefiBootServicesTableLib SortLib PrintLib + BcfgCommandLib [Pcd] gEfiShellPkgTokenSpaceGuid.PcdShellProfileMask # ALWAYS_CONSUMED diff --git a/ShellPkg/Library/UefiShellInstall1CommandsLib/UefiShellInstall1CommandsLib.uni b/ShellPkg/Library/UefiShellInstall1CommandsLib/UefiShellInstall1CommandsLib.uni deleted file mode 100644 index 7da7b0cbb2be2582b5943e8bc0bf07c28da5c11f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17998 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 HunYfxN7I8f -- 2.39.2