4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Provides interface to shell functionality for shell commands and applications.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync which accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync http://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "UefiShellLib.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <ShellBase.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/SortLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define FIND_XXXXX_FILE_BUFFER_SIZE (SIZE_OF_EFI_FILE_INFO + MAX_FILE_NAME_LEN)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// globals...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSHELL_PARAM_ITEM EmptyParamList[] = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {NULL, TypeMax}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSHELL_PARAM_ITEM SfoParamList[] = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {L"-sfo", TypeFlag},
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {NULL, TypeMax}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_SHELL_ENVIRONMENT2 *mEfiShellEnvironment2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_SHELL_INTERFACE *mEfiShellInterface;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_SHELL_PROTOCOL *gEfiShellProtocol;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_SHELL_PARAMETERS_PROTOCOL *gEfiShellParametersProtocol;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_HANDLE mEfiShellEnvironment2Handle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFILE_HANDLE_FUNCTION_MAP FileFunctionMap;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Check if a Unicode character is a hexadecimal character.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This internal function checks if a Unicode character is a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync numeric character. The valid hexadecimal characters are
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L'0' to L'9', L'a' to L'f', or L'A' to L'F'.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Char The character to check against.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE If the Char is a hexadecmial character.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE If the Char is not a hexadecmial character.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellIsHexaDecimalDigitCharacter (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 Char
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (BOOLEAN) ((Char >= L'0' && Char <= L'9') || (Char >= L'A' && Char <= L'F') || (Char >= L'a' && Char <= L'f'));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Check if a Unicode character is a decimal character.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This internal function checks if a Unicode character is a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync decimal character. The valid characters are
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L'0' to L'9'.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Char The character to check against.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE If the Char is a hexadecmial character.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE If the Char is not a hexadecmial character.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellIsDecimalDigitCharacter (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 Char
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (BOOLEAN) (Char >= L'0' && Char <= L'9');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Helper function to find ShellEnvironment2 for constructor.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ImageHandle A copy of the calling image's handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Memory allocation failed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellFindSE2 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE ImageHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE *Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN BufferSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN HandleIndex;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->OpenProtocol(ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiShellEnvironment2Guid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **)&mEfiShellEnvironment2,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_OPEN_PROTOCOL_GET_PROTOCOL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // look for the mEfiShellEnvironment2 protocol at a higher level
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status) || !(CompareGuid (&mEfiShellEnvironment2->SESGuid, &gEfiShellEnvironment2ExtGuid))){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // figure out how big of a buffer we need.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->LocateHandle (ByProtocol,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiShellEnvironment2Guid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL, // ignored for ByProtocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // maybe it's not there???
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status == EFI_BUFFER_TOO_SMALL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer = (EFI_HANDLE*)AllocateZeroPool(BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Buffer == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_OUT_OF_RESOURCES);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->LocateHandle (ByProtocol,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiShellEnvironment2Guid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL, // ignored for ByProtocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status) && Buffer != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // now parse the list of returned handles
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (HandleIndex = 0; HandleIndex < (BufferSize/sizeof(Buffer[0])); HandleIndex++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->OpenProtocol(Buffer[HandleIndex],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiShellEnvironment2Guid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **)&mEfiShellEnvironment2,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_OPEN_PROTOCOL_GET_PROTOCOL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CompareGuid (&mEfiShellEnvironment2->SESGuid, &gEfiShellEnvironment2ExtGuid)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mEfiShellEnvironment2Handle = Buffer[HandleIndex];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Buffer != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to do most of the work of the constructor. Allows for calling
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync multiple times without complete re-initialization.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ImageHandle A copy of the ImageHandle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SystemTable A pointer to the SystemTable for the application.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operationw as successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellLibConstructorWorker (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_SYSTEM_TABLE *SystemTable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // UEFI 2.0 shell interfaces (used preferentially)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->OpenProtocol(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiShellProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **)&gEfiShellProtocol,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_OPEN_PROTOCOL_GET_PROTOCOL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Search for the shell protocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->LocateProtocol(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiShellProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **)&gEfiShellProtocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellProtocol = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->OpenProtocol(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiShellParametersProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **)&gEfiShellParametersProtocol,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_OPEN_PROTOCOL_GET_PROTOCOL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellParametersProtocol = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gEfiShellParametersProtocol == NULL || gEfiShellProtocol == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Moved to seperate function due to complexity
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellFindSE2(ImageHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG((DEBUG_ERROR, "Status: 0x%08x\r\n", Status));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mEfiShellEnvironment2 = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->OpenProtocol(ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiShellInterfaceGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **)&mEfiShellInterface,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_OPEN_PROTOCOL_GET_PROTOCOL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mEfiShellInterface = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // only success getting 2 of either the old or new, but no 1/2 and 1/2
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((mEfiShellEnvironment2 != NULL && mEfiShellInterface != NULL) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (gEfiShellProtocol != NULL && gEfiShellParametersProtocol != NULL) ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gEfiShellProtocol != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileFunctionMap.GetFileInfo = gEfiShellProtocol->GetFileInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileFunctionMap.SetFileInfo = gEfiShellProtocol->SetFileInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileFunctionMap.ReadFile = gEfiShellProtocol->ReadFile;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileFunctionMap.WriteFile = gEfiShellProtocol->WriteFile;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileFunctionMap.CloseFile = gEfiShellProtocol->CloseFile;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileFunctionMap.DeleteFile = gEfiShellProtocol->DeleteFile;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileFunctionMap.GetFilePosition = gEfiShellProtocol->GetFilePosition;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileFunctionMap.SetFilePosition = gEfiShellProtocol->SetFilePosition;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileFunctionMap.FlushFile = gEfiShellProtocol->FlushFile;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileFunctionMap.GetFileSize = gEfiShellProtocol->GetFileSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileFunctionMap.GetFileInfo = (EFI_SHELL_GET_FILE_INFO)FileHandleGetInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileFunctionMap.SetFileInfo = (EFI_SHELL_SET_FILE_INFO)FileHandleSetInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileFunctionMap.ReadFile = (EFI_SHELL_READ_FILE)FileHandleRead;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileFunctionMap.WriteFile = (EFI_SHELL_WRITE_FILE)FileHandleWrite;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileFunctionMap.CloseFile = (EFI_SHELL_CLOSE_FILE)FileHandleClose;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileFunctionMap.DeleteFile = (EFI_SHELL_DELETE_FILE)FileHandleDelete;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileFunctionMap.GetFilePosition = (EFI_SHELL_GET_FILE_POSITION)FileHandleGetPosition;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileFunctionMap.SetFilePosition = (EFI_SHELL_SET_FILE_POSITION)FileHandleSetPosition;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileFunctionMap.FlushFile = (EFI_SHELL_FLUSH_FILE)FileHandleFlush;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileFunctionMap.GetFileSize = (EFI_SHELL_GET_FILE_SIZE)FileHandleGetSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_NOT_FOUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Constructor for the Shell library.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Initialize the library and determine if the underlying is a UEFI Shell 2.0 or an EFI shell.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param ImageHandle the image handle of the process
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param SystemTable the EFI System Table pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS the initialization was complete sucessfully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return others an error ocurred during initialization
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellLibConstructor (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_SYSTEM_TABLE *SystemTable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mEfiShellEnvironment2 = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellProtocol = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellParametersProtocol = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mEfiShellInterface = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mEfiShellEnvironment2Handle = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // verify that auto initialize is not set false
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (PcdGetBool(PcdShellLibAutoInitialize) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (ShellLibConstructorWorker(ImageHandle, SystemTable));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Destructor for the library. free any resources.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ImageHandle A copy of the ImageHandle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SystemTable A pointer to the SystemTable for the application.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation was successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return An error from the CloseProtocol function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellLibDestructor (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_SYSTEM_TABLE *SystemTable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mEfiShellEnvironment2 != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->CloseProtocol(mEfiShellEnvironment2Handle==NULL?ImageHandle:mEfiShellEnvironment2Handle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiShellEnvironment2Guid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mEfiShellEnvironment2 = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mEfiShellInterface != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->CloseProtocol(ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiShellInterfaceGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mEfiShellInterface = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gEfiShellProtocol != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->CloseProtocol(ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiShellProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellProtocol = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gEfiShellParametersProtocol != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->CloseProtocol(ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiShellParametersProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellParametersProtocol = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mEfiShellEnvironment2Handle = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function causes the shell library to initialize itself. If the shell library
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is already initialized it will de-initialize all the current protocol poitners and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync re-populate them again.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync When the library is used with PcdShellLibAutoInitialize set to true this function
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync will return EFI_SUCCESS and perform no actions.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function is intended for internal access for shell commands only.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS the initialization was complete sucessfully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellInitialize (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // if auto initialize is not false then skip
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (PcdGetBool(PcdShellLibAutoInitialize) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // deinit the current stuff
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR(ShellLibDestructor(gImageHandle, gST));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // init the new stuff
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (ShellLibConstructorWorker(gImageHandle, gST));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function will retrieve the information about the file for the handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync specified and store it in allocated pool memory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function allocates a buffer to store the file's information. It is the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync caller's responsibility to free the buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FileHandle The file handle of the file for which information is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync being requested.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL information could not be retrieved.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return the information about the file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_FILE_INFO*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellGetFileInfo (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN SHELL_FILE_HANDLE FileHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FileFunctionMap.GetFileInfo(FileHandle));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function sets the information about the file for the opened handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync specified.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] FileHandle The file handle of the file for which information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is being set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] FileInfo The information to set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The information was set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER A parameter was out of range or invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED The FileHandle does not support FileInfo.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NO_MEDIA The device has no medium.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR The device reported an error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_WRITE_PROTECTED The file or medium is write protected.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ACCESS_DENIED The file was opened read only.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_VOLUME_FULL The volume is full.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellSetFileInfo (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN SHELL_FILE_HANDLE FileHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_INFO *FileInfo
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FileFunctionMap.SetFileInfo(FileHandle, FileInfo));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function will open a file or directory referenced by DevicePath.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function opens a file with the open mode according to the file path. The
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Attributes is valid only for EFI_FILE_MODE_CREATE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FilePath on input the device path to the file. On output
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the remaining device path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DeviceHandle pointer to the system device handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FileHandle pointer to the file handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param OpenMode the mode to open the file with.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Attributes the file's file attributes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The information was set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED Could not open the file path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND The specified file could not be found on the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync device or the file system could not be found on
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NO_MEDIA The device has no medium.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_MEDIA_CHANGED The device has a different medium in it or the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync medium is no longer supported.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR The device reported an error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_WRITE_PROTECTED The file or medium is write protected.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ACCESS_DENIED The file was opened read only.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Not enough resources were available to open the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_VOLUME_FULL The volume is full.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellOpenFileByDevicePath(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT EFI_DEVICE_PATH_PROTOCOL **FilePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_HANDLE *DeviceHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT SHELL_FILE_HANDLE *FileHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 OpenMode,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Attributes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *FileName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *EfiSimpleFileSystemProtocol;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_PROTOCOL *Handle1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_PROTOCOL *Handle2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FilePath == NULL || FileHandle == NULL || DeviceHandle == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_INVALID_PARAMETER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // which shell interface should we use
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gEfiShellProtocol != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // use UEFI Shell 2.0 method.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileName = gEfiShellProtocol->GetFilePathFromDevicePath(*FilePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FileName == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_INVALID_PARAMETER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellOpenFileByName(FileName, FileHandle, OpenMode, Attributes);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(FileName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // use old shell method.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->LocateDevicePath (&gEfiSimpleFileSystemProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FilePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->OpenProtocol(*DeviceHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiSimpleFileSystemProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID**)&EfiSimpleFileSystemProtocol,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_OPEN_PROTOCOL_GET_PROTOCOL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EfiSimpleFileSystemProtocol->OpenVolume(EfiSimpleFileSystemProtocol, &Handle1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileHandle = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // go down directories one node at a time.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsDevicePathEnd (*FilePath)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // For file system access each node should be a file path component
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DevicePathType (*FilePath) != MEDIA_DEVICE_PATH ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePathSubType (*FilePath) != MEDIA_FILEPATH_DP
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileHandle = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_INVALID_PARAMETER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Open this file path node
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Handle2 = Handle1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Handle1 = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Try to test opening an existing file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Handle2->Open (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Handle2,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Handle1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((FILEPATH_DEVICE_PATH*)*FilePath)->PathName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpenMode &~EFI_FILE_MODE_CREATE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // see if the error was that it needs to be created
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((EFI_ERROR (Status)) && (OpenMode != (OpenMode &~EFI_FILE_MODE_CREATE))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Handle2->Open (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Handle2,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Handle1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((FILEPATH_DEVICE_PATH*)*FilePath)->PathName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpenMode,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Attributes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Close the last node
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Handle2->Close (Handle2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the next node
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *FilePath = NextDevicePathNode (*FilePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This is a weak spot since if the undefined SHELL_FILE_HANDLE format changes this must change also!
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *FileHandle = (VOID*)Handle1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function will open a file or directory referenced by filename.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If return is EFI_SUCCESS, the Filehandle is the opened file's handle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync otherwise, the Filehandle is NULL. The Attributes is valid only for
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_MODE_CREATE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if FileName is NULL then ASSERT()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FileName pointer to file name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FileHandle pointer to the file handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param OpenMode the mode to open the file with.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Attributes the file's file attributes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The information was set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED Could not open the file path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND The specified file could not be found on the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync device or the file system could not be found
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync on the device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NO_MEDIA The device has no medium.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_MEDIA_CHANGED The device has a different medium in it or the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync medium is no longer supported.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR The device reported an error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_WRITE_PROTECTED The file or medium is write protected.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ACCESS_DENIED The file was opened read only.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Not enough resources were available to open the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_VOLUME_FULL The volume is full.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellOpenFileByName(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *FileName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT SHELL_FILE_HANDLE *FileHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 OpenMode,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Attributes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE DeviceHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *FilePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_INFO *FileInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // ASSERT if FileName is NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(FileName != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FileName == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_INVALID_PARAMETER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gEfiShellProtocol != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((OpenMode & EFI_FILE_MODE_CREATE) == EFI_FILE_MODE_CREATE && (Attributes & EFI_FILE_DIRECTORY) == EFI_FILE_DIRECTORY) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ShellCreateDirectory(FileName, FileHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Use UEFI Shell 2.0 method
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gEfiShellProtocol->OpenFileByName(FileName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpenMode);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrCmp(FileName, L"NUL") != 0 && !EFI_ERROR(Status) && ((OpenMode & EFI_FILE_MODE_CREATE) != 0)){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInfo = FileFunctionMap.GetFileInfo(*FileHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(FileInfo != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInfo->Attribute = Attributes;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = FileFunctionMap.SetFileInfo(*FileHandle, FileInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(FileInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Using EFI Shell version
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // this means convert name to path and call that function
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // since this will use EFI method again that will open it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(mEfiShellEnvironment2 != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FilePath = mEfiShellEnvironment2->NameToPath ((CHAR16*)FileName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FilePath != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (ShellOpenFileByDevicePath(&FilePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DeviceHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpenMode,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Attributes));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_DEVICE_ERROR);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function create a directory
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If return is EFI_SUCCESS, the Filehandle is the opened directory's handle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync otherwise, the Filehandle is NULL. If the directory already existed, this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync function opens the existing directory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DirectoryName pointer to directory name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FileHandle pointer to the file handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The information was set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER One of the parameters has an invalid value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED Could not open the file path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND The specified file could not be found on the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync device or the file system could not be found
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync on the device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NO_MEDIA The device has no medium.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_MEDIA_CHANGED The device has a different medium in it or the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync medium is no longer supported.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR The device reported an error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_WRITE_PROTECTED The file or medium is write protected.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ACCESS_DENIED The file was opened read only.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Not enough resources were available to open the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_VOLUME_FULL The volume is full.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @sa ShellOpenFileByName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCreateDirectory(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *DirectoryName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT SHELL_FILE_HANDLE *FileHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gEfiShellProtocol != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Use UEFI Shell 2.0 method
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (gEfiShellProtocol->CreateFile(DirectoryName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_DIRECTORY,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (ShellOpenFileByName(DirectoryName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_DIRECTORY
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function reads information from an opened file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If FileHandle is not a directory, the function reads the requested number of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bytes from the file at the file's current position and returns them in Buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the read goes beyond the end of the file, the read length is truncated to the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync end of the file. The file's current position is increased by the number of bytes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returned. If FileHandle is a directory, the function reads the directory entry
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync at the file's current position and returns the entry in Buffer. If the Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is not large enough to hold the current directory entry, then
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_BUFFER_TOO_SMALL is returned and the current file position is not updated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferSize is set to be the size of the buffer needed to read the entry. On
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync success, the current position is updated to the next directory entry. If there
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are no more directory entries, the read returns a zero-length buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_INFO is the structure returned as the directory entry.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FileHandle the opened file handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param BufferSize on input the size of buffer in bytes. on return
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the number of bytes written.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Buffer the buffer to put read data into.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Data was read.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NO_MEDIA The device has no media.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR The device reported an error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_BUFFER_TO_SMALL Buffer is too small. ReadSize contains required
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync size.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellReadFile(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN SHELL_FILE_HANDLE FileHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FileFunctionMap.ReadFile(FileHandle, BufferSize, Buffer));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Write data to a file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function writes the specified number of bytes to the file at the current
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync file position. The current file position is advanced the actual number of bytes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync written, which is returned in BufferSize. Partial writes only occur when there
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync has been a data error during the write attempt (such as "volume space full").
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The file is automatically grown to hold the data if required. Direct writes to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync opened directories are not supported.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FileHandle The opened file for writing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param BufferSize on input the number of bytes in Buffer. On output
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the number of bytes written.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Buffer the buffer containing data to write is stored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Data was written.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED Writes to an open directory are not supported.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NO_MEDIA The device has no media.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR The device reported an error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_WRITE_PROTECTED The device is write-protected.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ACCESS_DENIED The file was open for read only.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_VOLUME_FULL The volume is full.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellWriteFile(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN SHELL_FILE_HANDLE FileHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FileFunctionMap.WriteFile(FileHandle, BufferSize, Buffer));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Close an open file handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function closes a specified file handle. All "dirty" cached file data is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync flushed to the device, and the file is closed. In all cases the handle is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync closed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync@param FileHandle the file handle to close.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync@retval EFI_SUCCESS the file handle was closed sucessfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCloseFile (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN SHELL_FILE_HANDLE *FileHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FileFunctionMap.CloseFile(*FileHandle));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Delete a file and close the handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function closes and deletes a file. In all cases the file handle is closed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the file cannot be deleted, the warning code EFI_WARN_DELETE_FAILURE is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returned, but the handle is still closed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FileHandle the file handle to delete
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS the file was closed sucessfully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_WARN_DELETE_FAILURE the handle was closed, but the file was not
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync deleted
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval INVALID_PARAMETER One of the parameters has an invalid value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellDeleteFile (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN SHELL_FILE_HANDLE *FileHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FileFunctionMap.DeleteFile(*FileHandle));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Set the current position in a file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function sets the current file position for the handle to the position
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync supplied. With the exception of seeking to position 0xFFFFFFFFFFFFFFFF, only
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync absolute positioning is supported, and seeking past the end of the file is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync allowed (a subsequent write would grow the file). Seeking to position
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xFFFFFFFFFFFFFFFF causes the current position to be set to the end of the file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If FileHandle is a directory, the only position that may be set is zero. This
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync has the effect of starting the read process of the directory entries over.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FileHandle The file handle on which the position is being set
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Position Byte position from begining of file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Operation completed sucessfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED the seek request for non-zero is not valid on
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync directories.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval INVALID_PARAMETER One of the parameters has an invalid value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellSetFilePosition (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN SHELL_FILE_HANDLE FileHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Position
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FileFunctionMap.SetFilePosition(FileHandle, Position));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Gets a file's current position
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function retrieves the current file position for the file handle. For
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync directories, the current file position has no meaning outside of the file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync system driver and as such the operation is not supported. An error is returned
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if FileHandle is a directory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FileHandle The open file handle on which to get the position.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Position Byte position from begining of file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS the operation completed sucessfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval INVALID_PARAMETER One of the parameters has an invalid value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED the request is not valid on directories.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellGetFilePosition (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN SHELL_FILE_HANDLE FileHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT64 *Position
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FileFunctionMap.GetFilePosition(FileHandle, Position));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Flushes data on a file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function flushes all modified data associated with a file to a device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FileHandle The file handle on which to flush data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The data was flushed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NO_MEDIA The device has no media.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR The device reported an error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_WRITE_PROTECTED The file or medium is write protected.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ACCESS_DENIED The file was opened for read only.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellFlushFile (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN SHELL_FILE_HANDLE FileHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FileFunctionMap.FlushFile(FileHandle));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Retrieve first entry from a directory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function takes an open directory handle and gets information from the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync first entry in the directory. A buffer is allocated to contain
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the information and a pointer to the buffer is returned in *Buffer. The
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync caller can use ShellFindNextFile() to get subsequent directory entries.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The buffer will be freed by ShellFindNextFile() when the last directory
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync entry is read. Otherwise, the caller must free the buffer, using FreePool,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync when finished with it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DirHandle The file handle of the directory to search.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Buffer The pointer to the buffer for the file's information.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Found the first file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND Cannot find the directory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NO_MEDIA The device has no media.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR The device reported an error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return Others status of ShellGetFileInfo, ShellSetFilePosition,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync or ShellReadFile
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellFindFirstFile (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN SHELL_FILE_HANDLE DirHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_FILE_INFO **Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // pass to file handle lib
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FileHandleFindFirstFile(DirHandle, Buffer));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** Retrieve next entries from a directory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync To use this function, the caller must first call the ShellFindFirstFile()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync function to get the first directory entry. Subsequent directory entries are
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync retrieved by using the ShellFindNextFile() function. This function can
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync be called several times to get each entry from the directory. If the call of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellFindNextFile() retrieved the last directory entry, the next call of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync this function will set *NoFile to TRUE and free the buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DirHandle The file handle of the directory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Buffer The pointer to buffer for file's information.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] NoFile The pointer to boolean when last file is found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Found the next file, or reached last file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NO_MEDIA The device has no media.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR The device reported an error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellFindNextFile(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN SHELL_FILE_HANDLE DirHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_FILE_INFO *Buffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT BOOLEAN *NoFile
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // pass to file handle lib
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FileHandleFindNextFile(DirHandle, Buffer, NoFile));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Retrieve the size of a file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if FileHandle is NULL then ASSERT()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Size is NULL then ASSERT()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function extracts the file size info from the FileHandle's EFI_FILE_INFO
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FileHandle file handle from which size is retrieved
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Size pointer to size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS operation was completed sucessfully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR cannot access the file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellGetFileSize (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN SHELL_FILE_HANDLE FileHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT64 *Size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FileFunctionMap.GetFileSize(FileHandle, Size));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Retrieves the status of the break execution flag
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync this function is useful to check whether the application is being asked to halt by the shell.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE the execution break is enabled
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE the execution break is not enabled
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellGetExecutionBreakFlag(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check for UEFI Shell 2.0 protocols
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gEfiShellProtocol != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // We are using UEFI Shell 2.0; see if the event has been triggered
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gBS->CheckEvent(gEfiShellProtocol->ExecutionBreak) != EFI_SUCCESS) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // using EFI Shell; call the function to check
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mEfiShellEnvironment2 != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (mEfiShellEnvironment2->GetExecutionBreak());
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return the value of an environment variable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync this function gets the value of the environment variable set by the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellSetEnvironmentVariable function
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param EnvKey The key name of the environment variable.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL the named environment variable does not exist.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return != NULL pointer to the value of the environment variable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCONST CHAR16*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellGetEnvironmentVariable (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *EnvKey
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check for UEFI Shell 2.0 protocols
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gEfiShellProtocol != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (gEfiShellProtocol->GetEnv(EnvKey));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check for EFI shell
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mEfiShellEnvironment2 != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (mEfiShellEnvironment2->GetEnv((CHAR16*)EnvKey));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync set the value of an environment variable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThis function changes the current value of the specified environment variable. If the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncenvironment variable exists and the Value is an empty string, then the environment
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvariable is deleted. If the environment variable exists and the Value is not an empty
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstring, then the value of the environment variable is changed. If the environment
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvariable does not exist and the Value is an empty string, there is no action. If the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncenvironment variable does not exist and the Value is a non-empty string, then the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncenvironment variable is created and assigned the specified value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This is not supported pre-UEFI Shell 2.0.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param EnvKey The key name of the environment variable.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param EnvVal The Value of the environment variable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Volatile Indicates whether the variable is non-volatile (FALSE) or volatile (TRUE).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS the operation was completed sucessfully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED This operation is not allowed in pre UEFI 2.0 Shell environments
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellSetEnvironmentVariable (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *EnvKey,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *EnvVal,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN BOOLEAN Volatile
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check for UEFI Shell 2.0 protocols
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gEfiShellProtocol != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (gEfiShellProtocol->SetEnv(EnvKey, EnvVal, Volatile));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This feature does not exist under EFI shell
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_UNSUPPORTED);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cause the shell to parse and execute a command line.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function creates a nested instance of the shell and executes the specified
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync command (CommandLine) with the specified environment (Environment). Upon return,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the status code returned by the specified command is placed in StatusCode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Environment is NULL, then the current environment is used and all changes made
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync by the commands executed will be reflected in the current environment. If the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Environment is non-NULL, then the changes made will be discarded.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The CommandLine is executed from the current working directory on the current
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The EnvironmentVariables and Status parameters are ignored in a pre-UEFI Shell 2.0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync environment. The values pointed to by the parameters will be unchanged by the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellExecute() function. The Output parameter has no effect in a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UEFI Shell 2.0 environment.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ParentHandle The parent image starting the operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CommandLine The pointer to a NULL terminated command line.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Output True to display debug output. False to hide it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] EnvironmentVariables Optional pointer to array of environment variables
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync in the form "x=y". If NULL, the current set is used.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Status The status of the run command line.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation completed sucessfully. Status
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync contains the status code returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER A parameter contains an invalid value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Out of resources.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED The operation is not allowed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellExecute (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE *ParentHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 *CommandLine OPTIONAL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN BOOLEAN Output OPTIONAL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 **EnvironmentVariables OPTIONAL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_STATUS *Status OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check for UEFI Shell 2.0 protocols
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gEfiShellProtocol != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Call UEFI Shell 2.0 version (not using Output parameter)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (gEfiShellProtocol->Execute(ParentHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CommandLine,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EnvironmentVariables,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check for EFI shell
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mEfiShellEnvironment2 != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Call EFI Shell version (not using EnvironmentVariables or Status parameters)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Due to oddity in the EFI shell we want to dereference the ParentHandle here
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (mEfiShellEnvironment2->Execute(*ParentHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CommandLine,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Output));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_UNSUPPORTED);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Retreives the current directory path
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the DeviceName is NULL, it returns the current device's current directory
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync name. If the DeviceName is not NULL, it returns the current directory name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync on specified drive.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DeviceName the name of the drive to get directory on
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL the directory does not exist
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return != NULL the directory
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCONST CHAR16*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellGetCurrentDir (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 * CONST DeviceName OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check for UEFI Shell 2.0 protocols
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gEfiShellProtocol != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (gEfiShellProtocol->GetCurDir(DeviceName));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check for EFI shell
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mEfiShellEnvironment2 != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (mEfiShellEnvironment2->CurDir(DeviceName));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sets (enabled or disabled) the page break mode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync when page break mode is enabled the screen will stop scrolling
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and wait for operator input before scrolling a subsequent screen.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CurrentState TRUE to enable and FALSE to disable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellSetPageBreakMode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN BOOLEAN CurrentState
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check for enabling
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentState != 0x00) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check for UEFI Shell 2.0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gEfiShellProtocol != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Enable with UEFI 2.0 Shell
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellProtocol->EnablePageBreak();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check for EFI shell
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mEfiShellEnvironment2 != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Enable with EFI Shell
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mEfiShellEnvironment2->EnablePageBreak (DEFAULT_INIT_ROW, DEFAULT_AUTO_LF);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check for UEFI Shell 2.0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gEfiShellProtocol != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Disable with UEFI 2.0 Shell
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellProtocol->DisablePageBreak();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check for EFI shell
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mEfiShellEnvironment2 != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Disable with EFI Shell
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mEfiShellEnvironment2->DisablePageBreak ();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// version of EFI_SHELL_FILE_INFO struct, except has no CONST pointers.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// This allows for the struct to be populated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync///
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *FullName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *FileName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FILE_HANDLE Handle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_INFO *Info;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} EFI_SHELL_FILE_INFO_NO_CONST;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Converts a EFI shell list of structures to the coresponding UEFI Shell 2.0 type of list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if OldStyleFileList is NULL then ASSERT()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync this function will convert a SHELL_FILE_ARG based list into a callee allocated
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SHELL_FILE_INFO based list. it is up to the caller to free the memory via
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the ShellCloseFileMetaArg function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] FileList the EFI shell list type
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] ListHead the list to add to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval the resultant head of the double linked new format list;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLIST_ENTRY*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInternalShellConvertFileListType (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN LIST_ENTRY *FileList,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT LIST_ENTRY *ListHead
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FILE_ARG *OldInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SHELL_FILE_INFO_NO_CONST *NewInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // ASSERTs
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(FileList != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(ListHead != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // enumerate through each member of the old list and copy
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Link = FileList->ForwardLink; Link != FileList; Link = Link->ForwardLink) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OldInfo = CR (Link, SHELL_FILE_ARG, Link, SHELL_FILE_ARG_SIGNATURE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(OldInfo != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Skip ones that failed to open...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OldInfo->Status != EFI_SUCCESS) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // make sure the old list was valid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(OldInfo->Info != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(OldInfo->FullName != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(OldInfo->FileName != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // allocate a new EFI_SHELL_FILE_INFO object
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewInfo = AllocateZeroPool(sizeof(EFI_SHELL_FILE_INFO));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewInfo == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellCloseFileMetaArg((EFI_SHELL_FILE_INFO**)(&ListHead));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ListHead = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // copy the simple items
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewInfo->Handle = OldInfo->Handle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewInfo->Status = OldInfo->Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // old shell checks for 0 not NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OldInfo->Handle = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // allocate new space to copy strings and structure
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewInfo->FullName = AllocateZeroPool(StrSize(OldInfo->FullName));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewInfo->FileName = AllocateZeroPool(StrSize(OldInfo->FileName));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewInfo->Info = AllocateZeroPool((UINTN)OldInfo->Info->Size);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // make sure all the memory allocations were sucessful
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NULL == NewInfo->FullName || NewInfo->FileName == NULL || NewInfo->Info == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellCloseFileMetaArg((EFI_SHELL_FILE_INFO**)(&ListHead));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ListHead = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Copt the strings and structure
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy(NewInfo->FullName, OldInfo->FullName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy(NewInfo->FileName, OldInfo->FileName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->CopyMem (NewInfo->Info, OldInfo->Info, (UINTN)OldInfo->Info->Size);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // add that to the list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertTailList(ListHead, &NewInfo->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (ListHead);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Opens a group of files based on a path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function uses the Arg to open all the matching files. Each matched
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync file has a SHELL_FILE_ARG structure to record the file information. These
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync structures are placed on the list ListHead. Users can get the SHELL_FILE_ARG
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync structures from ListHead to access each file. This function supports wildcards
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and will process '?' and '*' as such. the list must be freed with a call to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellCloseFileMetaArg().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If you are NOT appending to an existing list *ListHead must be NULL. If
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *ListHead is NULL then it must be callee freed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Arg pointer to path string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param OpenMode mode to open files with
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param ListHead head of linked list of results
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS the operation was sucessful and the list head
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync contains the list of opened files
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return != EFI_SUCCESS the operation failed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @sa InternalShellConvertFileListType
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellOpenFileMetaArg (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 *Arg,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 OpenMode,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT EFI_SHELL_FILE_INFO **ListHead
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY mOldStyleFileList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // ASSERT that Arg and ListHead are not NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Arg != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(ListHead != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check for UEFI Shell 2.0 protocols
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gEfiShellProtocol != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*ListHead == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *ListHead = (EFI_SHELL_FILE_INFO*)AllocateZeroPool(sizeof(EFI_SHELL_FILE_INFO));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*ListHead == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_OUT_OF_RESOURCES);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializeListHead(&((*ListHead)->Link));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gEfiShellProtocol->OpenFileList(Arg,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpenMode,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ListHead);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellProtocol->RemoveDupInFileList(ListHead);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gEfiShellProtocol->RemoveDupInFileList(ListHead);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*ListHead != NULL && IsListEmpty(&(*ListHead)->Link)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(*ListHead);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *ListHead = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_NOT_FOUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check for EFI shell
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mEfiShellEnvironment2 != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // make sure the list head is initialized
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializeListHead(&mOldStyleFileList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the EFI Shell list of files
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = mEfiShellEnvironment2->FileMetaArg(Arg, &mOldStyleFileList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *ListHead = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*ListHead == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *ListHead = (EFI_SHELL_FILE_INFO *)AllocateZeroPool(sizeof(EFI_SHELL_FILE_INFO));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*ListHead == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_OUT_OF_RESOURCES);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializeListHead(&((*ListHead)->Link));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert that to equivalent of UEFI Shell 2.0 structure
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InternalShellConvertFileListType(&mOldStyleFileList, &(*ListHead)->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free the EFI Shell version that was converted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mEfiShellEnvironment2->FreeFileList(&mOldStyleFileList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((*ListHead)->Link.ForwardLink == (*ListHead)->Link.BackLink && (*ListHead)->Link.BackLink == &((*ListHead)->Link)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(*ListHead);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *ListHead = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_UNSUPPORTED);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Free the linked list returned from ShellOpenFileMetaArg.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ListHead is NULL then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param ListHead the pointer to free.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS the operation was sucessful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCloseFileMetaArg (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT EFI_SHELL_FILE_INFO **ListHead
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Node;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // ASSERT that ListHead is not NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(ListHead != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check for UEFI Shell 2.0 protocols
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gEfiShellProtocol != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (gEfiShellProtocol->FreeFileList(ListHead));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (mEfiShellEnvironment2 != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Since this is EFI Shell version we need to free our internally made copy
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // of the list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( Node = GetFirstNode(&(*ListHead)->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; *ListHead != NULL && !IsListEmpty(&(*ListHead)->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Node = GetFirstNode(&(*ListHead)->Link)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList(Node);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((EFI_FILE_PROTOCOL*)((EFI_SHELL_FILE_INFO_NO_CONST*)Node)->Handle)->Close(((EFI_SHELL_FILE_INFO_NO_CONST*)Node)->Handle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(((EFI_SHELL_FILE_INFO_NO_CONST*)Node)->FullName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(((EFI_SHELL_FILE_INFO_NO_CONST*)Node)->FileName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(((EFI_SHELL_FILE_INFO_NO_CONST*)Node)->Info);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool((EFI_SHELL_FILE_INFO_NO_CONST*)Node);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_UNSUPPORTED);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Find a file by searching the CWD and then the path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If FileName is NULL then ASSERT.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the return value is not NULL then the memory must be caller freed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FileName Filename string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL the file was not found
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return !NULL the full path to the file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCHAR16 *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellFindFilePath (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *FileName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CONST CHAR16 *Path;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FILE_HANDLE Handle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *RetVal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TestPath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CONST CHAR16 *Walker;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TempChar;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RetVal = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // First make sure its not an absolute path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellOpenFileByName(FileName, &Handle, EFI_FILE_MODE_READ, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR(Status)){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FileHandleIsDirectory(Handle) != EFI_SUCCESS) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(RetVal == NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RetVal = StrnCatGrow(&RetVal, NULL, FileName, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellCloseFile(&Handle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (RetVal);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellCloseFile(&Handle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Path = ShellGetEnvironmentVariable(L"cwd");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Path != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = StrSize(Path);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size += StrSize(FileName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TestPath = AllocateZeroPool(Size);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TestPath == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy(TestPath, Path);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat(TestPath, FileName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellOpenFileByName(TestPath, &Handle, EFI_FILE_MODE_READ, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR(Status)){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FileHandleIsDirectory(Handle) != EFI_SUCCESS) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(RetVal == NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RetVal = StrnCatGrow(&RetVal, NULL, TestPath, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellCloseFile(&Handle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(TestPath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (RetVal);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellCloseFile(&Handle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(TestPath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Path = ShellGetEnvironmentVariable(L"path");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Path != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = StrSize(Path)+sizeof(CHAR16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size += StrSize(FileName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TestPath = AllocateZeroPool(Size);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TestPath == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Walker = (CHAR16*)Path;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem(TestPath, Walker, StrSize(Walker));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TestPath != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempChar = StrStr(TestPath, L";");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TempChar != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *TempChar = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TestPath[StrLen(TestPath)-1] != L'\\') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat(TestPath, L"\\");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FileName[0] == L'\\') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileName++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat(TestPath, FileName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrStr(Walker, L";") != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Walker = StrStr(Walker, L";") + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Walker = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellOpenFileByName(TestPath, &Handle, EFI_FILE_MODE_READ, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR(Status)){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FileHandleIsDirectory(Handle) != EFI_SUCCESS) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(RetVal == NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RetVal = StrnCatGrow(&RetVal, NULL, TestPath, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellCloseFile(&Handle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellCloseFile(&Handle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (Walker != NULL && Walker[0] != CHAR_NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(TestPath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (RetVal);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Find a file by searching the CWD and then the path with a variable set of file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync extensions. If the file is not found it will append each extension in the list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync in the order provided and return the first one that is successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If FileName is NULL, then ASSERT.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If FileExtension is NULL, then behavior is identical to ShellFindFilePath.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the return value is not NULL then the memory must be caller freed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] FileName Filename string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] FileExtension Semi-colon delimeted list of possible extensions.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL The file was not found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval !NULL The path to the file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCHAR16 *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellFindFilePathEx (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *FileName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *FileExtension
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TestPath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *RetVal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CONST CHAR16 *ExtensionWalker;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TempChar;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TempChar2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(FileName != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FileExtension == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (ShellFindFilePath(FileName));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RetVal = ShellFindFilePath(FileName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (RetVal != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (RetVal);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = StrSize(FileName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size += StrSize(FileExtension);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TestPath = AllocateZeroPool(Size);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TestPath == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (ExtensionWalker = FileExtension, TempChar2 = (CHAR16*)FileExtension; TempChar2 != NULL ; ExtensionWalker = TempChar2 + 1){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy(TestPath, FileName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ExtensionWalker != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat(TestPath, ExtensionWalker);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempChar = StrStr(TestPath, L";");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TempChar != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *TempChar = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RetVal = ShellFindFilePath(TestPath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (RetVal != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(ExtensionWalker != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempChar2 = StrStr(ExtensionWalker, L";");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(TestPath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (RetVal);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY Link;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *Name;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_PARAM_TYPE Type;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *Value;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN OriginalPosition;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} SHELL_PARAM_PACKAGE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Checks the list of valid arguments and returns TRUE if the item was found. If the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return value is TRUE then the type parameter is set also.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if CheckList is NULL then ASSERT();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Name is NULL then ASSERT();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Type is NULL then ASSERT();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Name pointer to Name of parameter found
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CheckList List to check against
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Type pointer to type of parameter if it was found
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE the Parameter was found. Type is valid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE the Parameter was not found. Type is not valid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInternalIsOnCheckList (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *Name,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST SHELL_PARAM_ITEM *CheckList,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT SHELL_PARAM_TYPE *Type
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_PARAM_ITEM *TempListItem;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TempString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // ASSERT that all 3 pointer parameters aren't NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(CheckList != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Type != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Name != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // question mark and page break mode are always supported
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((StrCmp(Name, L"-?") == 0) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (StrCmp(Name, L"-b") == 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Type = TypeFlag;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Enumerate through the list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (TempListItem = (SHELL_PARAM_ITEM*)CheckList ; TempListItem->Name != NULL ; TempListItem++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the Type is TypeStart only check the first characters of the passed in param
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If it matches set the type and return TRUE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TempListItem->Type == TypeStart) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrnCmp(Name, TempListItem->Name, StrLen(TempListItem->Name)) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Type = TempListItem->Type;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString = StrnCatGrow(&TempString, NULL, Name, StrLen(TempListItem->Name));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TempString != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringNoCaseCompare(&TempString, &TempListItem->Name) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Type = TempListItem->Type;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(TempString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(TempString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (StringNoCaseCompare(&Name, &TempListItem->Name) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Type = TempListItem->Type;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Checks the string for indicators of "flag" status. this is a leading '/', '-', or '+'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Name pointer to Name of parameter found
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] AlwaysAllowNumbers TRUE to allow numbers, FALSE to not.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE the Parameter is a flag.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE the Parameter not a flag.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInternalIsFlag (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *Name,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN BOOLEAN AlwaysAllowNumbers
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // ASSERT that Name isn't NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Name != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If we accept numbers then dont return TRUE. (they will be values)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (((Name[0] == L'-' || Name[0] == L'+') && ShellIsHexaDecimalDigitCharacter(Name[1])) && AlwaysAllowNumbers) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the Name has a /, +, or - as the first character return TRUE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Name[0] == L'/') ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (Name[0] == L'-') ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (Name[0] == L'+')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Checks the command line arguments passed against the list of valid ones.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If no initialization is required, then return RETURN_SUCCESS.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CheckList pointer to list of parameters to check
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] CheckPackage pointer to pointer to list checked values
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] ProblemParam optional pointer to pointer to unicode string for
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the paramater that caused failure. If used then the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync caller is responsible for freeing the memory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] AutoPageBreak will automatically set PageBreakEnabled for "b" parameter
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Argv pointer to array of parameters
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Argc Count of parameters in Argv
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] AlwaysAllowNumbers TRUE to allow numbers always, FALSE otherwise.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation completed sucessfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES A memory allocation failed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER A parameter was invalid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_VOLUME_CORRUPTED the command line was corrupt. an argument was
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync duplicated. the duplicated command line argument
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync was returned in ProblemParam if provided.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND a argument required a value that was missing.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the invalid command line argument was returned in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ProblemParam if provided.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInternalCommandLineParse (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST SHELL_PARAM_ITEM *CheckList,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT LIST_ENTRY **CheckPackage,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT CHAR16 **ProblemParam OPTIONAL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN BOOLEAN AutoPageBreak,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 **Argv,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Argc,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN BOOLEAN AlwaysAllowNumbers
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN LoopCounter;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_PARAM_TYPE CurrentItemType;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_PARAM_PACKAGE *CurrentItemPackage;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN GetItemValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN ValueSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Count;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CONST CHAR16 *TempPointer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentItemPackage = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetItemValue = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ValueSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If there is only 1 item we dont need to do anything
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Argc < 1) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *CheckPackage = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // ASSERTs
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(CheckList != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Argv != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // initialize the linked list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *CheckPackage = (LIST_ENTRY*)AllocateZeroPool(sizeof(LIST_ENTRY));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*CheckPackage == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_OUT_OF_RESOURCES);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializeListHead(*CheckPackage);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // loop through each of the arguments
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LoopCounter = 0 ; LoopCounter < Argc ; ++LoopCounter) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Argv[LoopCounter] == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // do nothing for NULL argv
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (InternalIsOnCheckList(Argv[LoopCounter], CheckList, &CurrentItemType)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // We might have leftover if last parameter didnt have optional value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (GetItemValue != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetItemValue = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertHeadList(*CheckPackage, &CurrentItemPackage->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // this is a flag
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentItemPackage = AllocateZeroPool(sizeof(SHELL_PARAM_PACKAGE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentItemPackage == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellCommandLineFreeVarList(*CheckPackage);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *CheckPackage = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_OUT_OF_RESOURCES);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentItemPackage->Name = AllocateZeroPool(StrSize(Argv[LoopCounter]));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentItemPackage->Name == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellCommandLineFreeVarList(*CheckPackage);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *CheckPackage = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_OUT_OF_RESOURCES);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy(CurrentItemPackage->Name, Argv[LoopCounter]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentItemPackage->Type = CurrentItemType;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentItemPackage->OriginalPosition = (UINTN)(-1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentItemPackage->Value = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Does this flag require a value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (CurrentItemPackage->Type) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // possibly trigger the next loop(s) to populate the value of this item
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case TypeValue:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetItemValue = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ValueSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case TypeDoubleValue:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetItemValue = 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ValueSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case TypeMaxValue:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetItemValue = (UINTN)(-1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ValueSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // this item has no value expected; we are done
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertHeadList(*CheckPackage, &CurrentItemPackage->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(GetItemValue == 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (GetItemValue != 0 && !InternalIsFlag(Argv[LoopCounter], AlwaysAllowNumbers)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(CurrentItemPackage != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // get the item VALUE for a previous flag
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentItemPackage->Value = ReallocatePool(ValueSize, ValueSize + StrSize(Argv[LoopCounter]) + sizeof(CHAR16), CurrentItemPackage->Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(CurrentItemPackage->Value != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ValueSize == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy(CurrentItemPackage->Value, Argv[LoopCounter]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat(CurrentItemPackage->Value, L" ");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat(CurrentItemPackage->Value, Argv[LoopCounter]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ValueSize += StrSize(Argv[LoopCounter]) + sizeof(CHAR16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetItemValue--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (GetItemValue == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertHeadList(*CheckPackage, &CurrentItemPackage->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (!InternalIsFlag(Argv[LoopCounter], AlwaysAllowNumbers) ){ //|| ProblemParam == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // add this one as a non-flag
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempPointer = Argv[LoopCounter];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((*TempPointer == L'^' && *(TempPointer+1) == L'-')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || (*TempPointer == L'^' && *(TempPointer+1) == L'/')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || (*TempPointer == L'^' && *(TempPointer+1) == L'+')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempPointer++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentItemPackage = AllocateZeroPool(sizeof(SHELL_PARAM_PACKAGE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentItemPackage == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellCommandLineFreeVarList(*CheckPackage);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *CheckPackage = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_OUT_OF_RESOURCES);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentItemPackage->Name = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentItemPackage->Type = TypePosition;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentItemPackage->Value = AllocateZeroPool(StrSize(TempPointer));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentItemPackage->Value == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellCommandLineFreeVarList(*CheckPackage);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *CheckPackage = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_OUT_OF_RESOURCES);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy(CurrentItemPackage->Value, TempPointer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentItemPackage->OriginalPosition = Count++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertHeadList(*CheckPackage, &CurrentItemPackage->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // this was a non-recognised flag... error!
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ProblemParam != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *ProblemParam = AllocateZeroPool(StrSize(Argv[LoopCounter]));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*ProblemParam != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy(*ProblemParam, Argv[LoopCounter]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellCommandLineFreeVarList(*CheckPackage);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *CheckPackage = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_VOLUME_CORRUPTED);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (GetItemValue != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GetItemValue = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertHeadList(*CheckPackage, &CurrentItemPackage->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // support for AutoPageBreak
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AutoPageBreak && ShellCommandLineGetFlag(*CheckPackage, L"-b")) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellSetPageBreakMode(TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Checks the command line arguments passed against the list of valid ones.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Optionally removes NULL values first.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If no initialization is required, then return RETURN_SUCCESS.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CheckList The pointer to list of parameters to check.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] CheckPackage The package of checked values.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] ProblemParam Optional pointer to pointer to unicode string for
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the paramater that caused failure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] AutoPageBreak Will automatically set PageBreakEnabled.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] AlwaysAllowNumbers Will never fail for number based flags.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation completed sucessfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES A memory allocation failed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER A parameter was invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_VOLUME_CORRUPTED The command line was corrupt.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR The commands contained 2 opposing arguments. One
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync of the command line arguments was returned in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ProblemParam if provided.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND A argument required a value that was missing.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The invalid command line argument was returned in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ProblemParam if provided.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandLineParseEx (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST SHELL_PARAM_ITEM *CheckList,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT LIST_ENTRY **CheckPackage,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT CHAR16 **ProblemParam OPTIONAL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN BOOLEAN AutoPageBreak,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN BOOLEAN AlwaysAllowNumbers
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // ASSERT that CheckList and CheckPackage aren't NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(CheckList != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(CheckPackage != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check for UEFI Shell 2.0 protocols
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gEfiShellParametersProtocol != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (InternalCommandLineParse(CheckList,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckPackage,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ProblemParam,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AutoPageBreak,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (CONST CHAR16**) gEfiShellParametersProtocol->Argv,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellParametersProtocol->Argc,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AlwaysAllowNumbers));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // ASSERT That EFI Shell is not required
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (mEfiShellInterface != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (InternalCommandLineParse(CheckList,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CheckPackage,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ProblemParam,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AutoPageBreak,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (CONST CHAR16**) mEfiShellInterface->Argv,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mEfiShellInterface->Argc,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AlwaysAllowNumbers));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Frees shell variable list that was returned from ShellCommandLineParse.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function will free all the memory that was used for the CheckPackage
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync list of postprocessed shell arguments.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync this function has no return value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if CheckPackage is NULL, then return
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CheckPackage the list to de-allocate
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync **/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandLineFreeVarList (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN LIST_ENTRY *CheckPackage
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Node;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check for CheckPackage == NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CheckPackage == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // for each node in the list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( Node = GetFirstNode(CheckPackage)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; !IsListEmpty(CheckPackage)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Node = GetFirstNode(CheckPackage)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Remove it from the list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList(Node);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // if it has a name free the name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (((SHELL_PARAM_PACKAGE*)Node)->Name != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(((SHELL_PARAM_PACKAGE*)Node)->Name);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // if it has a value free the value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (((SHELL_PARAM_PACKAGE*)Node)->Value != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(((SHELL_PARAM_PACKAGE*)Node)->Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // free the node structure
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool((SHELL_PARAM_PACKAGE*)Node);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // free the list head node
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(CheckPackage);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Checks for presence of a flag parameter
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync flag arguments are in the form of "-<Key>" or "/<Key>", but do not have a value following the key
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if CheckPackage is NULL then return FALSE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if KeyString is NULL then ASSERT()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param CheckPackage The package of parsed command line arguments
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param KeyString the Key of the command line argument to check for
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE the flag is on the command line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE the flag is not on the command line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync **/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandLineGetFlag (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST LIST_ENTRY * CONST CheckPackage,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 * CONST KeyString
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Node;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TempString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // return FALSE for no package or KeyString is NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CheckPackage == NULL || KeyString == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // enumerate through the list of parametrs
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( Node = GetFirstNode(CheckPackage)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; !IsNull (CheckPackage, Node)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Node = GetNextNode(CheckPackage, Node)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the Name matches, return TRUE (and there may be NULL name)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (((SHELL_PARAM_PACKAGE*)Node)->Name != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If Type is TypeStart then only compare the begining of the strings
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (((SHELL_PARAM_PACKAGE*)Node)->Type == TypeStart) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrnCmp(KeyString, ((SHELL_PARAM_PACKAGE*)Node)->Name, StrLen(KeyString)) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString = StrnCatGrow(&TempString, NULL, KeyString, StrLen(((SHELL_PARAM_PACKAGE*)Node)->Name));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TempString != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringNoCaseCompare(&KeyString, &((SHELL_PARAM_PACKAGE*)Node)->Name) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(TempString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(TempString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (StringNoCaseCompare(&KeyString, &((SHELL_PARAM_PACKAGE*)Node)->Name) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Returns value from command line argument.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value parameters are in the form of "-<Key> value" or "/<Key> value".
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If CheckPackage is NULL, then return NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CheckPackage The package of parsed command line arguments.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] KeyString The Key of the command line argument to check for.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL The flag is not on the command line.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval !=NULL The pointer to unicode string of the value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCONST CHAR16*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandLineGetValue (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST LIST_ENTRY *CheckPackage,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 *KeyString
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Node;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TempString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // return NULL for no package or KeyString is NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CheckPackage == NULL || KeyString == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // enumerate through the list of parametrs
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( Node = GetFirstNode(CheckPackage)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; !IsNull (CheckPackage, Node)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Node = GetNextNode(CheckPackage, Node)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the Name matches, return TRUE (and there may be NULL name)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (((SHELL_PARAM_PACKAGE*)Node)->Name != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If Type is TypeStart then only compare the begining of the strings
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (((SHELL_PARAM_PACKAGE*)Node)->Type == TypeStart) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrnCmp(KeyString, ((SHELL_PARAM_PACKAGE*)Node)->Name, StrLen(KeyString)) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (((SHELL_PARAM_PACKAGE*)Node)->Name + StrLen(KeyString));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempString = StrnCatGrow(&TempString, NULL, KeyString, StrLen(((SHELL_PARAM_PACKAGE*)Node)->Name));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TempString != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringNoCaseCompare(&KeyString, &((SHELL_PARAM_PACKAGE*)Node)->Name) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(TempString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (((SHELL_PARAM_PACKAGE*)Node)->Name + StrLen(KeyString));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(TempString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (StringNoCaseCompare(&KeyString, &((SHELL_PARAM_PACKAGE*)Node)->Name) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (((SHELL_PARAM_PACKAGE*)Node)->Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Returns raw value from command line argument.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Raw value parameters are in the form of "value" in a specific position in the list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If CheckPackage is NULL, then return NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CheckPackage The package of parsed command line arguments.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Position The position of the value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL The flag is not on the command line.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval !=NULL The pointer to unicode string of the value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync **/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCONST CHAR16*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandLineGetRawValue (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST LIST_ENTRY * CONST CheckPackage,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Position
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Node;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check for CheckPackage == NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CheckPackage == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // enumerate through the list of parametrs
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( Node = GetFirstNode(CheckPackage)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; !IsNull (CheckPackage, Node)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Node = GetNextNode(CheckPackage, Node)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the position matches, return the value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (((SHELL_PARAM_PACKAGE*)Node)->OriginalPosition == Position) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (((SHELL_PARAM_PACKAGE*)Node)->Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returns the number of command line value parameters that were parsed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync this will not include flags.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CheckPackage The package of parsed command line arguments.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval (UINTN)-1 No parsing has ocurred
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return other The number of value parameters found
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINTN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandLineGetCount(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST LIST_ENTRY *CheckPackage
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Node1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Count;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CheckPackage == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( Node1 = GetFirstNode(CheckPackage), Count = 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; !IsNull (CheckPackage, Node1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Node1 = GetNextNode(CheckPackage, Node1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (((SHELL_PARAM_PACKAGE*)Node1)->Name == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Count);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Determins if a parameter is duplicated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Param is not NULL then it will point to a callee allocated string buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync with the parameter value if a duplicate is found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If CheckPackage is NULL, then ASSERT.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CheckPackage The package of parsed command line arguments.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Param Upon finding one, a pointer to the duplicated parameter.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS No parameters were duplicated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR A duplicate was found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync **/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandLineCheckDuplicate (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST LIST_ENTRY *CheckPackage,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT CHAR16 **Param
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Node1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Node2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(CheckPackage != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( Node1 = GetFirstNode(CheckPackage)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; !IsNull (CheckPackage, Node1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Node1 = GetNextNode(CheckPackage, Node1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( Node2 = GetNextNode(CheckPackage, Node1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; !IsNull (CheckPackage, Node2)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Node2 = GetNextNode(CheckPackage, Node2)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((((SHELL_PARAM_PACKAGE*)Node1)->Name != NULL) && (((SHELL_PARAM_PACKAGE*)Node2)->Name != NULL) && StrCmp(((SHELL_PARAM_PACKAGE*)Node1)->Name, ((SHELL_PARAM_PACKAGE*)Node2)->Name) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Param != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Param = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Param = StrnCatGrow(Param, NULL, ((SHELL_PARAM_PACKAGE*)Node1)->Name, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_DEVICE_ERROR);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This is a find and replace function. Upon successful return the NewString is a copy of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SourceString with each instance of FindTarget replaced with ReplaceWith.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If SourceString and NewString overlap the behavior is undefined.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the string would grow bigger than NewSize it will halt and return error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SourceString The string with source buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] NewString The string with resultant buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] NewSize The size in bytes of NewString.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] FindTarget The string to look for.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ReplaceWith The string to replace FindTarget with.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] SkipPreCarrot If TRUE will skip a FindTarget that has a '^'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync immediately before it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ParameterReplacing If TRUE will add "" around items with spaces.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER SourceString was NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER NewString was NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER FindTarget was NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER ReplaceWith was NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER FindTarget had length < 1.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER SourceString had length < 1.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_BUFFER_TOO_SMALL NewSize was less than the minimum size to hold
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the new string (truncation occurred).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The string was successfully copied with replacement.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCopySearchAndReplace(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 CONST *SourceString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT CHAR16 *NewString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN NewSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *FindTarget,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *ReplaceWith,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BOOLEAN SkipPreCarrot,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BOOLEAN ParameterReplacing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *Replace;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( (SourceString == NULL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || (NewString == NULL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || (FindTarget == NULL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || (ReplaceWith == NULL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || (StrLen(FindTarget) < 1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || (StrLen(SourceString) < 1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_INVALID_PARAMETER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Replace = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrStr(ReplaceWith, L" ") == NULL || !ParameterReplacing) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Replace = StrnCatGrow(&Replace, NULL, ReplaceWith, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Replace = AllocateZeroPool(StrSize(ReplaceWith) + 2*sizeof(CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Replace != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint(Replace, StrSize(ReplaceWith) + 2*sizeof(CHAR16), L"\"%s\"", ReplaceWith);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Replace == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_OUT_OF_RESOURCES);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewString = SetMem16(NewString, NewSize, CHAR_NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*SourceString != CHAR_NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // if we find the FindTarget and either Skip == FALSE or Skip and we
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // dont have a carrot do a replace...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrnCmp(SourceString, FindTarget, StrLen(FindTarget)) == 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync && ((SkipPreCarrot && *(SourceString-1) != L'^') || !SkipPreCarrot)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SourceString += StrLen(FindTarget);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = StrSize(NewString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Size + (StrLen(Replace)*sizeof(CHAR16))) > NewSize) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(Replace);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_BUFFER_TOO_SMALL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat(NewString, Replace);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = StrSize(NewString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Size + sizeof(CHAR16) > NewSize) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(Replace);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_BUFFER_TOO_SMALL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCat(NewString, SourceString, 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SourceString++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(Replace);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Internal worker function to output a string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function will output a string to the correct StdOut.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] String The string to print out.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation was sucessful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval !EFI_SUCCESS The operation failed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInternalPrintTo (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *String
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = StrSize(String) - sizeof(CHAR16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Size == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gEfiShellParametersProtocol != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (gEfiShellProtocol->WriteFile(gEfiShellParametersProtocol->StdOut, &Size, (VOID*)String));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mEfiShellInterface != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Divide in half for old shell. Must be string length not size.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size /= 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (mEfiShellInterface->StdOut->Write(mEfiShellInterface->StdOut, &Size, (VOID*)String));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_UNSUPPORTED);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Print at a specific location on the screen.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function will move the cursor to a given screen location and print the specified string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If -1 is specified for either the Row or Col the current screen location for BOTH
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync will be used.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if either Row or Col is out of range for the current console, then ASSERT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Format is NULL, then ASSERT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync In addition to the standard %-based flags as supported by UefiLib Print() this supports
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the following additional flags:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync %N - Set output attribute to normal
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync %H - Set output attribute to highlight
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync %E - Set output attribute to error
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync %B - Set output attribute to blue color
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync %V - Set output attribute to green color
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Note: The background color is controlled by the shell command cls.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Col the column to print at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Row the row to print at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Format the format string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Marker the marker for the variable argument list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return EFI_SUCCESS The operation was successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return EFI_DEVICE_ERROR The console device reported an error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInternalShellPrintWorker(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN INT32 Col OPTIONAL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN INT32 Row OPTIONAL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *Format,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VA_LIST Marker
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *ResumeLocation;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *FormatWalker;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN OriginalAttribute;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *mPostReplaceFormat;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *mPostReplaceFormat2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPostReplaceFormat = AllocateZeroPool (PcdGet16 (PcdShellPrintBufferSize));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mPostReplaceFormat2 = AllocateZeroPool (PcdGet16 (PcdShellPrintBufferSize));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mPostReplaceFormat == NULL || mPostReplaceFormat2 == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(mPostReplaceFormat);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(mPostReplaceFormat2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_OUT_OF_RESOURCES);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OriginalAttribute = gST->ConOut->Mode->Attribute;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Back and forth each time fixing up 1 of our flags...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellCopySearchAndReplace(Format, mPostReplaceFormat, PcdGet16 (PcdShellPrintBufferSize), L"%N", L"%%N", FALSE, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR(Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellCopySearchAndReplace(mPostReplaceFormat, mPostReplaceFormat2, PcdGet16 (PcdShellPrintBufferSize), L"%E", L"%%E", FALSE, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR(Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellCopySearchAndReplace(mPostReplaceFormat2, mPostReplaceFormat, PcdGet16 (PcdShellPrintBufferSize), L"%H", L"%%H", FALSE, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR(Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellCopySearchAndReplace(mPostReplaceFormat, mPostReplaceFormat2, PcdGet16 (PcdShellPrintBufferSize), L"%B", L"%%B", FALSE, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR(Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellCopySearchAndReplace(mPostReplaceFormat2, mPostReplaceFormat, PcdGet16 (PcdShellPrintBufferSize), L"%V", L"%%V", FALSE, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR(Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Use the last buffer from replacing to print from...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeVSPrint (mPostReplaceFormat2, PcdGet16 (PcdShellPrintBufferSize), mPostReplaceFormat, Marker);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Col != -1 && Row != -1) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gST->ConOut->SetCursorPosition(gST->ConOut, Col, Row);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FormatWalker = mPostReplaceFormat2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*FormatWalker != CHAR_NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Find the next attribute change request
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ResumeLocation = StrStr(FormatWalker, L"%");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ResumeLocation != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *ResumeLocation = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // print the current FormatWalker string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrLen(FormatWalker)>0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = InternalPrintTo(FormatWalker);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // update the attribute
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ResumeLocation != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*(ResumeLocation-1) == L'^') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Print a simple '%' symbol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = InternalPrintTo(L"%");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ResumeLocation = ResumeLocation - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (*(ResumeLocation+1)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case (L'N'):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute(gST->ConOut, OriginalAttribute);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case (L'E'):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute(gST->ConOut, EFI_TEXT_ATTR(EFI_YELLOW, ((OriginalAttribute&(BIT4|BIT5|BIT6))>>4)));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case (L'H'):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute(gST->ConOut, EFI_TEXT_ATTR(EFI_WHITE, ((OriginalAttribute&(BIT4|BIT5|BIT6))>>4)));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case (L'B'):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute(gST->ConOut, EFI_TEXT_ATTR(EFI_BLUE, ((OriginalAttribute&(BIT4|BIT5|BIT6))>>4)));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case (L'V'):
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute(gST->ConOut, EFI_TEXT_ATTR(EFI_GREEN, ((OriginalAttribute&(BIT4|BIT5|BIT6))>>4)));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Print a simple '%' symbol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = InternalPrintTo(L"%");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ResumeLocation = ResumeLocation - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // reset to normal now...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // update FormatWalker to Resume + 2 (skip the % and the indicator)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FormatWalker = ResumeLocation + 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetAttribute(gST->ConOut, OriginalAttribute);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(mPostReplaceFormat);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(mPostReplaceFormat2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Print at a specific location on the screen.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function will move the cursor to a given screen location and print the specified string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If -1 is specified for either the Row or Col the current screen location for BOTH
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync will be used.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If either Row or Col is out of range for the current console, then ASSERT.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Format is NULL, then ASSERT.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync In addition to the standard %-based flags as supported by UefiLib Print() this supports
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the following additional flags:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync %N - Set output attribute to normal
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync %H - Set output attribute to highlight
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync %E - Set output attribute to error
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync %B - Set output attribute to blue color
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync %V - Set output attribute to green color
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Note: The background color is controlled by the shell command cls.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Col the column to print at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Row the row to print at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Format the format string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ... The variable argument list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return EFI_SUCCESS The printing was successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return EFI_DEVICE_ERROR The console device reported an error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellPrintEx(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN INT32 Col OPTIONAL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN INT32 Row OPTIONAL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *Format,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VA_LIST Marker;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS RetVal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Format == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_INVALID_PARAMETER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VA_START (Marker, Format);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RetVal = InternalShellPrintWorker(Col, Row, Format, Marker);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VA_END(Marker);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return(RetVal);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Print at a specific location on the screen.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function will move the cursor to a given screen location and print the specified string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If -1 is specified for either the Row or Col the current screen location for BOTH
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync will be used.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If either Row or Col is out of range for the current console, then ASSERT.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Format is NULL, then ASSERT.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync In addition to the standard %-based flags as supported by UefiLib Print() this supports
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the following additional flags:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync %N - Set output attribute to normal.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync %H - Set output attribute to highlight.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync %E - Set output attribute to error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync %B - Set output attribute to blue color.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync %V - Set output attribute to green color.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Note: The background color is controlled by the shell command cls.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Col The column to print at.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Row The row to print at.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Language The language of the string to retrieve. If this parameter
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is NULL, then the current platform language is used.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] HiiFormatStringId The format string Id for getting from Hii.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] HiiFormatHandle The format string Handle for getting from Hii.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ... The variable argument list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return EFI_SUCCESS The printing was successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return EFI_DEVICE_ERROR The console device reported an error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellPrintHiiEx(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN INT32 Col OPTIONAL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN INT32 Row OPTIONAL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR8 *Language OPTIONAL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_STRING_ID HiiFormatStringId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_HANDLE HiiFormatHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VA_LIST Marker;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *HiiFormatString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS RetVal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VA_START (Marker, HiiFormatHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiFormatString = HiiGetString(HiiFormatHandle, HiiFormatStringId, Language);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(HiiFormatString != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RetVal = InternalShellPrintWorker(Col, Row, HiiFormatString, Marker);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(HiiFormatString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VA_END(Marker);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (RetVal);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to determine if a given filename represents a file or a directory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DirName Path to directory to test.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The Path represents a directory
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND The Path does not represent a directory
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES A memory allocation failed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The path failed to open
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellIsDirectory(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *DirName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FILE_HANDLE Handle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TempLocation;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TempLocation2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(DirName != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Handle = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempLocation = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellOpenFileByName(DirName, &Handle, EFI_FILE_MODE_READ, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // try good logic first.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gEfiShellProtocol != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempLocation = StrnCatGrow(&TempLocation, NULL, DirName, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TempLocation == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellCloseFile(&Handle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_OUT_OF_RESOURCES);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempLocation2 = StrStr(TempLocation, L":");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TempLocation2 != NULL && StrLen(StrStr(TempLocation, L":")) == 2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *(TempLocation2+1) = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gEfiShellProtocol->GetDevicePathFromMap(TempLocation) != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(TempLocation);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(TempLocation);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // probably a map name?!?!!?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempLocation = StrStr(DirName, L"\\");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TempLocation != NULL && *(TempLocation+1) == CHAR_NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FileHandleIsDirectory(Handle) == EFI_SUCCESS) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellCloseFile(&Handle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellCloseFile(&Handle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_NOT_FOUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to determine if a given filename represents a file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Name Path to file to test.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The Path represents a file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND The Path does not represent a file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval other The path failed to open.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellIsFile(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *Name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FILE_HANDLE Handle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Name != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Handle = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellOpenFileByName(Name, &Handle, EFI_FILE_MODE_READ, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FileHandleIsDirectory(Handle) != EFI_SUCCESS) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellCloseFile(&Handle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellCloseFile(&Handle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_NOT_FOUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to determine if a given filename represents a file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This will search the CWD and then the Path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Name is NULL, then ASSERT.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Name Path to file to test.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The Path represents a file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND The Path does not represent a file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval other The path failed to open.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellIsFileInPath(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *Name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *NewName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR(ShellIsFile(Name))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewName = ShellFindFilePath(Name);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewName == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_NOT_FOUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellIsFile(NewName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(NewName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to determine whether a string is decimal or hex representation of a number
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and return the number converted from the string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] String String representation of a number
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return the number
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval (UINTN)(-1) An error ocurred.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINTN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellStrToUintn(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *String
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 RetVal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN Hex;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Hex = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!InternalShellIsHexOrDecimalNumber(String, Hex, TRUE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Hex = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR(ShellConvertStringToUint64(String, &RetVal, Hex, TRUE))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ((UINTN)RetVal);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ((UINTN)(-1));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Safely append with automatic string resizing given length of Destination and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync desired length of copy from Source.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync append the first D characters of Source to the end of Destination, where D is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the lesser of Count and the StrLen() of Source. If appending those D characters
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync will fit within Destination (whose Size is given as CurrentSize) and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync still leave room for a NULL terminator, then those characters are appended,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync starting at the original terminating NULL of Destination, and a new terminating
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL is appended.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If appending D characters onto Destination will result in a overflow of the size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync given in CurrentSize the string will be grown such that the copy can be performed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and CurrentSize will be updated to the new size.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Source is NULL, there is nothing to append, just return the current buffer in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Destination.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Destination is NULL, then ASSERT()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if Destination's current length (including NULL terminator) is already more then
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentSize, then ASSERT()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Destination The String to append onto
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] CurrentSize on call the number of bytes in Destination. On
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return possibly the new size (still in bytes). if NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync then allocate whatever is needed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Source The String to append from
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Count Maximum number of characters to append. if 0 then
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync all are appended.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return Destination return the resultant string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCHAR16*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncStrnCatGrow (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT CHAR16 **Destination,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *CurrentSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *Source,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Count
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN DestinationStartSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN NewSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // ASSERTs
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Destination != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If there's nothing to do then just return Destination
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Source == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (*Destination);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // allow for un-initialized pointers, based on size being 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentSize != NULL && *CurrentSize == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Destination = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // allow for NULL pointers address as Destination
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*Destination != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(CurrentSize != 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DestinationStartSize = StrSize(*Destination);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(DestinationStartSize <= *CurrentSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DestinationStartSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// ASSERT(*CurrentSize == 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Append all of Source?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Count == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count = StrLen(Source);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Test and grow if required
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentSize != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewSize = *CurrentSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (NewSize < (DestinationStartSize + (Count*sizeof(CHAR16)))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewSize += 2 * Count * sizeof(CHAR16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Destination = ReallocatePool(*CurrentSize, NewSize, *Destination);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *CurrentSize = NewSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Destination = AllocateZeroPool((Count+1)*sizeof(CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Now use standard StrnCat on a big enough buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*Destination == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return StrnCat(*Destination, Source, Count);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Prompt the user and return the resultant answer to the requestor.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function will display the requested question on the shell prompt and then
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync wait for an apropriate answer to be input from the console.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if the SHELL_PROMPT_REQUEST_TYPE is SHELL_PROMPT_REQUEST_TYPE_YESNO, ShellPromptResponseTypeQuitContinue
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync or SHELL_PROMPT_REQUEST_TYPE_YESNOCANCEL then *Response is of type SHELL_PROMPT_RESPONSE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if the SHELL_PROMPT_REQUEST_TYPE is ShellPromptResponseTypeFreeform then *Response is of type
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16*.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync In either case *Response must be callee freed if Response was not NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Type What type of question is asked. This is used to filter the input
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to prevent invalid answers to question.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Prompt Pointer to string prompt to use to request input.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Response Pointer to Response which will be populated upon return.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation was sucessful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED The operation is not supported as requested.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER A parameter was invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return other The operation failed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellPromptForResponse (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN SHELL_PROMPT_REQUEST_TYPE Type,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 *Prompt OPTIONAL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT VOID **Response OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_INPUT_KEY Key;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN EventIndex;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_PROMPT_RESPONSE *Resp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Resp = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Type != ShellPromptResponseTypeFreeform) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Resp = (SHELL_PROMPT_RESPONSE*)AllocateZeroPool(sizeof(SHELL_PROMPT_RESPONSE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Resp == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_OUT_OF_RESOURCES);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch(Type) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case ShellPromptResponseTypeQuitContinue:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Prompt != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintEx(-1, -1, L"%s", Prompt);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // wait for valid response
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &EventIndex);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR(Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintEx(-1, -1, L"%c", Key.UnicodeChar);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Key.UnicodeChar == L'Q' || Key.UnicodeChar ==L'q') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Resp = ShellPromptResponseQuit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Resp = ShellPromptResponseContinue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case ShellPromptResponseTypeYesNoCancel:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Prompt != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintEx(-1, -1, L"%s", Prompt);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // wait for valid response
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Resp = ShellPromptResponseMax;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*Resp == ShellPromptResponseMax) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &EventIndex);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR(Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintEx(-1, -1, L"%c", Key.UnicodeChar);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Key.UnicodeChar) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case L'Y':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case L'y':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Resp = ShellPromptResponseYes;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case L'N':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case L'n':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Resp = ShellPromptResponseNo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case L'C':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case L'c':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Resp = ShellPromptResponseCancel;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break; case ShellPromptResponseTypeYesNoAllCancel:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Prompt != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintEx(-1, -1, L"%s", Prompt);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // wait for valid response
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Resp = ShellPromptResponseMax;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*Resp == ShellPromptResponseMax) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &EventIndex);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR(Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintEx(-1, -1, L"%c", Key.UnicodeChar);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Key.UnicodeChar) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case L'Y':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case L'y':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Resp = ShellPromptResponseYes;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case L'N':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case L'n':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Resp = ShellPromptResponseNo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case L'A':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case L'a':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Resp = ShellPromptResponseAll;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case L'C':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case L'c':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Resp = ShellPromptResponseCancel;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case ShellPromptResponseTypeEnterContinue:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case ShellPromptResponseTypeAnyKeyContinue:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Prompt != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintEx(-1, -1, L"%s", Prompt);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // wait for valid response
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Resp = ShellPromptResponseMax;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*Resp == ShellPromptResponseMax) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &EventIndex);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Type == ShellPromptResponseTypeEnterContinue) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR(Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintEx(-1, -1, L"%c", Key.UnicodeChar);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Resp = ShellPromptResponseContinue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Type == ShellPromptResponseTypeAnyKeyContinue) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR(Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Resp = ShellPromptResponseContinue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case ShellPromptResponseTypeYesNo:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Prompt != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintEx(-1, -1, L"%s", Prompt);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // wait for valid response
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Resp = ShellPromptResponseMax;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*Resp == ShellPromptResponseMax) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &EventIndex);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR(Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintEx(-1, -1, L"%c", Key.UnicodeChar);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Key.UnicodeChar) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case L'Y':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case L'y':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Resp = ShellPromptResponseYes;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case L'N':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case L'n':
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Resp = ShellPromptResponseNo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case ShellPromptResponseTypeFreeform:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Prompt != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintEx(-1, -1, L"%s", Prompt);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while(1) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &EventIndex);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR(Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintEx(-1, -1, L"%c", Key.UnicodeChar);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT((Buffer == NULL && Size == 0) || (Buffer != NULL));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCatGrow(&Buffer, &Size, &Key.UnicodeChar, 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This is the location to add new prompt types.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Response != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Resp != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Response = Resp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (Buffer != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Response = Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Resp != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(Resp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Buffer != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintEx(-1, -1, L"\r\n");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Prompt the user and return the resultant answer to the requestor.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function is the same as ShellPromptForResponse, except that the prompt is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync automatically pulled from HII.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Type What type of question is asked. This is used to filter the input
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to prevent invalid answers to question.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] HiiFormatStringId The format string Id for getting from Hii.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] HiiFormatHandle The format string Handle for getting from Hii.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Response Pointer to Response which will be populated upon return.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS the operation was sucessful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return other the operation failed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @sa ShellPromptForResponse
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellPromptForResponseHii (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN SHELL_PROMPT_REQUEST_TYPE Type,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_STRING_ID HiiFormatStringId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_HANDLE HiiFormatHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT VOID **Response
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *Prompt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Prompt = HiiGetString(HiiFormatHandle, HiiFormatStringId, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellPromptForResponse(Type, Prompt, Response);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(Prompt);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to determin if an entire string is a valid number.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Hex it must be preceeded with a 0x or has ForceHex, set TRUE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] String The string to evaluate.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ForceHex TRUE - always assume hex.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] StopAtSpace TRUE to halt upon finding a space, FALSE to keep going.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE It is all numeric (dec/hex) characters.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE There is a non-numeric character.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInternalShellIsHexOrDecimalNumber (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *String,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BOOLEAN ForceHex,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BOOLEAN StopAtSpace
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN Hex;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // chop off a single negative sign
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String != NULL && *String == L'-') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // chop leading zeroes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while(String != NULL && *String == L'0'){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // allow '0x' or '0X', but not 'x' or 'X'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String != NULL && (*String == L'x' || *String == L'X')) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*(String-1) != L'0') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // we got an x without a preceeding 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Hex = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (ForceHex) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Hex = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Hex = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // loop through the remaining characters and use the lib function
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( ; String != NULL && *String != CHAR_NULL && !(StopAtSpace && *String == L' ') ; String++){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Hex) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!ShellIsHexaDecimalDigitCharacter(*String)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!ShellIsDecimalDigitCharacter(*String)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to determine if a given filename exists.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Name Path to test.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The Path represents a file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND The Path does not represent a file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval other The path failed to open.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellFileExists(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *Name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SHELL_FILE_INFO *List;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Name != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync List = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellOpenFileMetaArg((CHAR16*)Name, EFI_FILE_MODE_READ, &List);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellCloseFileMetaArg(&List);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Convert a Unicode character to upper case only if
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync it maps to a valid small-case ASCII character.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This internal function only deal with Unicode character
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync which maps to a valid small-case ASCII character, i.e.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L'a' to L'z'. For other Unicode character, the input character
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is returned directly.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Char The character to convert.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval LowerCharacter If the Char is with range L'a' to L'z'.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Unchanged Otherwise.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCHAR16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInternalShellCharToUpper (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 Char
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Char >= L'a' && Char <= L'z') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (CHAR16) (Char - (L'a' - L'A'));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Char;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Convert a Unicode character to numerical value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This internal function only deal with Unicode character
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync which maps to a valid hexadecimal ASII character, i.e.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L'0' to L'9', L'a' to L'f' or L'A' to L'F'. For other
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Unicode character, the value returned does not make sense.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Char The character to convert.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The numerical value converted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINTN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInternalShellHexCharToUintn (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 Char
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellIsDecimalDigitCharacter (Char)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Char - L'0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (UINTN) (10 + InternalShellCharToUpper (Char) - L'A');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Convert a Null-terminated Unicode hexadecimal string to a value of type UINT64.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function returns a value of type UINTN by interpreting the contents
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync of the Unicode string specified by String as a hexadecimal number.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The format of the input Unicode string String is:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync [spaces][zeros][x][hexadecimal digits].
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If "x" appears in the input string, it must be prefixed with at least one 0.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The function will ignore the pad space, which includes spaces or tab characters,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync before [zeros], [x] or [hexadecimal digit]. The running zero before [x] or
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync [hexadecimal digit] will be ignored. Then, the decoding starts after [x] or the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync first valid hexadecimal digit. Then, the function stops at the first character that is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync a not a valid hexadecimal character or NULL, whichever one comes first.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If String has only pad spaces, then zero is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If String has no leading pad spaces, leading zeros or valid hexadecimal digits,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync then zero is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] String A pointer to a Null-terminated Unicode string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Value Upon a successful return the value of the conversion.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] StopAtSpace FALSE to skip spaces.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The conversion was successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER A parameter was NULL or invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR An overflow occured.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInternalShellStrHexToUint64 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *String,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT64 *Value,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BOOLEAN StopAtSpace
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 Result;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String == NULL || StrSize(String) == 0 || Value == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_INVALID_PARAMETER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Ignore the pad spaces (space or tab)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while ((*String == L' ') || (*String == L'\t')) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Ignore leading Zeros after the spaces
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*String == L'0') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (InternalShellCharToUpper (*String) == L'X') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*(String - 1) != L'0') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Skip the 'X'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Skip spaces if requested
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (StopAtSpace && *String == L' ') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (ShellIsHexaDecimalDigitCharacter (*String)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the Hex Number represented by String overflows according
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // to the range defined by UINTN, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!(Result <= (RShiftU64((((UINT64) ~0) - InternalShellHexCharToUintn (*String)), 4)))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// if (!(Result <= ((((UINT64) ~0) - InternalShellHexCharToUintn (*String)) >> 4))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_DEVICE_ERROR);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result = (LShiftU64(Result, 4));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result += InternalShellHexCharToUintn (*String);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Skip spaces if requested
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (StopAtSpace && *String == L' ') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Value = Result;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Convert a Null-terminated Unicode decimal string to a value of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync type UINT64.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function returns a value of type UINT64 by interpreting the contents
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync of the Unicode string specified by String as a decimal number. The format
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync of the input Unicode string String is:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync [spaces] [decimal digits].
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The valid decimal digit character is in the range [0-9]. The
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync function will ignore the pad space, which includes spaces or
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync tab characters, before [decimal digits]. The running zero in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync beginning of [decimal digits] will be ignored. Then, the function
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync stops at the first character that is a not a valid decimal character
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync or a Null-terminator, whichever one comes first.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If String has only pad spaces, then 0 is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If String has no pad spaces or valid decimal digits,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync then 0 is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] String A pointer to a Null-terminated Unicode string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Value Upon a successful return the value of the conversion.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] StopAtSpace FALSE to skip spaces.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The conversion was successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER A parameter was NULL or invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR An overflow occured.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncInternalShellStrDecimalToUint64 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *String,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT64 *Value,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BOOLEAN StopAtSpace
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 Result;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String == NULL || StrSize (String) == 0 || Value == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_INVALID_PARAMETER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Ignore the pad spaces (space or tab)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while ((*String == L' ') || (*String == L'\t')) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Ignore leading Zeros after the spaces
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*String == L'0') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Skip spaces if requested
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (StopAtSpace && *String == L' ') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (ShellIsDecimalDigitCharacter (*String)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the number represented by String overflows according
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // to the range defined by UINT64, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!(Result <= (DivU64x32((((UINT64) ~0) - (*String - L'0')),10)))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_DEVICE_ERROR);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result = MultU64x32(Result, 10) + (*String - L'0');
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Stop at spaces if requested
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StopAtSpace && *String == L' ') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Value = Result;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to verify and convert a string to its numerical value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Hex it must be preceeded with a 0x, 0X, or has ForceHex set TRUE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] String The string to evaluate.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Value Upon a successful return the value of the conversion.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ForceHex TRUE - always assume hex.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] StopAtSpace FALSE to skip spaces.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The conversion was successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER String contained an invalid character.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND String was a number, but Value was NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellConvertStringToUint64(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *String,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT64 *Value,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BOOLEAN ForceHex,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BOOLEAN StopAtSpace
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 RetVal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CONST CHAR16 *Walker;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN Hex;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Hex = ForceHex;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!InternalShellIsHexOrDecimalNumber(String, Hex, StopAtSpace)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!Hex) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Hex = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!InternalShellIsHexOrDecimalNumber(String, Hex, StopAtSpace)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_INVALID_PARAMETER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_INVALID_PARAMETER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Chop off leading spaces
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Walker = String; Walker != NULL && *Walker != CHAR_NULL && *Walker == L' '; Walker++);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // make sure we have something left that is numeric.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Walker == NULL || *Walker == CHAR_NULL || !InternalShellIsHexOrDecimalNumber(Walker, Hex, StopAtSpace)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_INVALID_PARAMETER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // do the conversion.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Hex || StrnCmp(Walker, L"0x", 2) == 0 || StrnCmp(Walker, L"0X", 2) == 0){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = InternalShellStrHexToUint64(Walker, &RetVal, StopAtSpace);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = InternalShellStrDecimalToUint64(Walker, &RetVal, StopAtSpace);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value == NULL && !EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_NOT_FOUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Value = RetVal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to determin if an entire string is a valid number.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Hex it must be preceeded with a 0x or has ForceHex, set TRUE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] String The string to evaluate.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ForceHex TRUE - always assume hex.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] StopAtSpace TRUE to halt upon finding a space, FALSE to keep going.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE It is all numeric (dec/hex) characters.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE There is a non-numeric character.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellIsHexOrDecimalNumber (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *String,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BOOLEAN ForceHex,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BOOLEAN StopAtSpace
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellConvertStringToUint64(String, NULL, ForceHex, StopAtSpace) == EFI_NOT_FOUND) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to read a single line from a SHELL_FILE_HANDLE. The \n is not included in the returned
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync buffer. The returned buffer must be callee freed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the position upon start is 0, then the Ascii Boolean will be set. This should be
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync maintained and not changed for all operations with the same file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Handle SHELL_FILE_HANDLE to read from.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Ascii Boolean value for indicating whether the file is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ascii (TRUE) or UCS2 (FALSE).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The line of text from the file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL There was not enough memory available.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @sa ShellFileHandleReadLine
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCHAR16*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellFileHandleReturnLine(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN SHELL_FILE_HANDLE Handle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT BOOLEAN *Ascii
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *RetVal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RetVal = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellFileHandleReadLine(Handle, RetVal, &Size, FALSE, Ascii);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status == EFI_BUFFER_TOO_SMALL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RetVal = AllocateZeroPool(Size);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (RetVal == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellFileHandleReadLine(Handle, RetVal, &Size, FALSE, Ascii);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status) && (RetVal != NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(RetVal);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RetVal = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (RetVal);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to read a single line (up to but not including the \n) from a SHELL_FILE_HANDLE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the position upon start is 0, then the Ascii Boolean will be set. This should be
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync maintained and not changed for all operations with the same file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Handle SHELL_FILE_HANDLE to read from.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Buffer The pointer to buffer to read into.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Size The pointer to number of bytes in Buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Truncate If the buffer is large enough, this has no effect.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the buffer is is too small and Truncate is TRUE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the line will be truncated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the buffer is is too small and Truncate is FALSE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync then no read will occur.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Ascii Boolean value for indicating whether the file is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ascii (TRUE) or UCS2 (FALSE).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation was successful. The line is stored in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Handle was NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Size was NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_BUFFER_TOO_SMALL Size was not large enough to store the line.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size was updated to the minimum space required.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellFileHandleReadLine(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN SHELL_FILE_HANDLE Handle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT CHAR16 *Buffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *Size,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN BOOLEAN Truncate,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT BOOLEAN *Ascii
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 CharBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN CharSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN CountSoFar;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 OriginalFilePosition;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Handle == NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ||Size == NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_INVALID_PARAMETER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Buffer == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(*Size == 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Buffer = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellProtocol->GetFilePosition(Handle, &OriginalFilePosition);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OriginalFilePosition == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CharSize = sizeof(CHAR16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gEfiShellProtocol->ReadFile(Handle, &CharSize, &CharBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR(Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CharBuffer == gUnicodeFileTag) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Ascii = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Ascii = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellProtocol->SetFilePosition(Handle, OriginalFilePosition);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (CountSoFar = 0;;CountSoFar++){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CharBuffer = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*Ascii) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CharSize = sizeof(CHAR8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CharSize = sizeof(CHAR16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gEfiShellProtocol->ReadFile(Handle, &CharSize, &CharBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( EFI_ERROR(Status)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || CharSize == 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || (CharBuffer == L'\n' && !(*Ascii))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync || (CharBuffer == '\n' && *Ascii)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // if we have space save it...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((CountSoFar+1)*sizeof(CHAR16) < *Size){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Buffer != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((CHAR16*)Buffer)[CountSoFar] = CharBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((CHAR16*)Buffer)[CountSoFar+1] = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // if we ran out of space tell when...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((CountSoFar+1)*sizeof(CHAR16) > *Size){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Size = (CountSoFar+1)*sizeof(CHAR16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!Truncate) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellProtocol->SetFilePosition(Handle, OriginalFilePosition);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG((DEBUG_WARN, "The line was truncated in ShellFileHandleReadLine"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_BUFFER_TOO_SMALL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while(Buffer[StrLen(Buffer)-1] == L'\r') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer[StrLen(Buffer)-1] = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}