4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Provides interface to shell internal functions for shell commands.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2009 - 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 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/// The tag for use in identifying UNICODE files.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/// If the file is UNICODE, the first 16 bits of the file will equal this value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// STATIC local variables
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC SHELL_COMMAND_INTERNAL_LIST_ENTRY mCommandList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// global variables required by library class.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_UNICODE_COLLATION_PROTOCOL *gUnicodeCollation = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_DEVICE_PATH_TO_TEXT_PROTOCOL *gDevPathToText = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"Minimal",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"Scripting",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"Interactive"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to make sure that the global protocol pointers are valid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync must be called after constructor before accessing the pointers.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->LocateProtocol(&gEfiUnicodeCollation2ProtocolGuid, NULL, (VOID**)&gUnicodeCollation);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->LocateProtocol(&gEfiDevicePathToTextProtocolGuid, NULL, (VOID**)&gDevPathToText);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Constructor for the Shell Command library.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Initialize the library and determine if the underlying is a UEFI Shell 2.0 or an EFI shell.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param ImageHandle the image handle of the process
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param SystemTable the EFI System Table pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS the initialization was complete sucessfully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->LocateProtocol(&gEfiUnicodeCollation2ProtocolGuid, NULL, (VOID**)&gUnicodeCollation);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Destructor for the library. free any resources.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param ImageHandle the image handle of the process
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param SystemTable the EFI System Table pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_SUCCESS this function always returns success
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // enumerate throught the list and free all the memory
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node = (SHELL_COMMAND_INTERNAL_LIST_ENTRY *)GetFirstNode(&mCommandList.Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // enumerate through the init command list and free all memory
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node2 = (COMMAND_LIST *)GetFirstNode(&mAliasList.Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // enumerate throught the list and free all the memory
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node3 = (SCRIPT_FILE_LIST *)GetFirstNode(&mScriptList.Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // enumerate throught the mappings list and free all the memory
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (MapNode = (SHELL_MAP_LIST *)GetFirstNode(&gShellMapList.Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; MapNode = (SHELL_MAP_LIST *)GetFirstNode(&gShellMapList.Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(MapNode->CurrentDirectoryPath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Checks if a command is already on the list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CommandString The command string to check for on the list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // assert for NULL parameter
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check for the command
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( Node = (SHELL_COMMAND_INTERNAL_LIST_ENTRY *)GetFirstNode(&mCommandList.Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Node = (SHELL_COMMAND_INTERNAL_LIST_ENTRY *)GetNextNode(&mCommandList.Link, &Node->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get the help text for a command.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CommandString The command name.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL No help text was found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return String of help text. Caller reuiqred to free.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // assert for NULL parameter
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check for the command
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( Node = (SHELL_COMMAND_INTERNAL_LIST_ENTRY *)GetFirstNode(&mCommandList.Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Node = (SHELL_COMMAND_INTERNAL_LIST_ENTRY *)GetNextNode(&mCommandList.Link, &Node->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (HiiGetString(Node->HiiHandle, Node->ManFormatHelp, NULL));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Registers handlers of type SHELL_RUN_COMMAND and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_GET_MAN_FILENAME for each shell command.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the ShellSupportLevel is greater than the value of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PcdShellSupportLevel then return RETURN_UNSUPPORTED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Registers the handlers specified by GetHelpInfoHandler and CommandHandler
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync with the command specified by CommandString. If the command named by
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CommandString has already been registered, then return
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RETURN_ALREADY_STARTED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If there are not enough resources available to register the handlers then
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RETURN_OUT_OF_RESOURCES is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If CommandString is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If GetHelpInfoHandler is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If CommandHandler is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If ProfileName is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CommandString Pointer to the command name. This is the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync name to look for on the command line in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CommandHandler Pointer to a function that runs the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync specified command.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] GetManFileName Pointer to a function that provides man
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ShellMinSupportLevel minimum Shell Support Level which has this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ProfileName profile name to require for support of this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CanAffectLE indicates whether this command's return value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync can change the LASTERROR environment variable.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] HiiHandle Handle of this command's HII entry.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ManFormatHelp HII locator for the help text.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_SUCCESS The handlers were registered.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_OUT_OF_RESOURCES There are not enough resources available to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync register the shell command.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_UNSUPPORTED the ShellMinSupportLevel was higher than the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync currently allowed support level.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_ALREADY_STARTED The CommandString represents a command that
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is already registered. Only 1 handler set for
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync a given command is allowed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @sa SHELL_GET_MAN_FILENAME
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @sa SHELL_RUN_COMMAND
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // ASSERTs for NULL parameters
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check for shell support level
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (PcdGet8(PcdShellSupportLevel) < ShellMinSupportLevel) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check for already on the list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // allocate memory for new struct
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node = AllocateZeroPool(sizeof(SHELL_COMMAND_INTERNAL_LIST_ENTRY));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->CommandString = AllocateZeroPool(StrSize(CommandString));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // populate the new struct
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync && StrStr(mProfileList, ProfileName) == NULL) || mProfileList == NULL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT((mProfileList == NULL && mProfileListSize == 0) || (mProfileList != NULL));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If this is the first make a leading ';'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCatGrow(&mProfileList, &mProfileListSize, L";", 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCatGrow(&mProfileList, &mProfileListSize, ProfileName, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCatGrow(&mProfileList, &mProfileListSize, L";", 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // add the new struct to the list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to get the current Profile string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL There are no installed profiles.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return A semi-colon delimited list of profiles.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Checks if a command string has been registered for CommandString and if so it runs
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the previously registered handler for that command with the command line.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If CommandString is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Sections is specified, then each section name listed will be compared in a casesensitive
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync manner, to the section names described in Appendix B UEFI Shell 2.0 spec. If the section exists,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync it will be appended to the returned help text. If the section does not exist, no
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync information will be returned. If Sections is NULL, then all help text information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync available will be returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CommandString Pointer to the command name. This is the name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync found on the command line in the shell.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] RetVal Pointer to the return vaule from the command handler.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] CanAffectLE indicates whether this command's return value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync needs to be placed into LASTERROR environment variable.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_SUCCESS The handler was run.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_NOT_FOUND The CommandString did not match a registered
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync command name.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @sa SHELL_RUN_COMMAND
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // assert for NULL parameters
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check for the command
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( Node = (SHELL_COMMAND_INTERNAL_LIST_ENTRY *)GetFirstNode(&mCommandList.Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Node = (SHELL_COMMAND_INTERNAL_LIST_ENTRY *)GetNextNode(&mCommandList.Link, &Node->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Checks if a command string has been registered for CommandString and if so it
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returns the MAN filename specified for that command.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If CommandString is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CommandString Pointer to the command name. This is the name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync found on the command line in the shell.\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL the commandString was not a registered command.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return other the name of the MAN file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @sa SHELL_GET_MAN_FILENAME
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // assert for NULL parameters
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check for the command
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( Node = (SHELL_COMMAND_INTERNAL_LIST_ENTRY *)GetFirstNode(&mCommandList.Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Node = (SHELL_COMMAND_INTERNAL_LIST_ENTRY *)GetNextNode(&mCommandList.Link, &Node->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get the list of all available shell internal commands. This is a linked list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (via LIST_ENTRY structure). enumerate through it using the BaseLib linked
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync list functions. do not modify the values.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Sort TRUE to alphabetically sort the values first. FALSE otherwise.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return a Linked list of all available shell commands.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// if (!Sort) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// return ((COMMAND_LIST*)(&mCommandList));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Registers aliases to be set as part of the initialization of the shell application.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Command is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Alias is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Command Pointer to the Command
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Alias Pointer to Alias
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_SUCCESS The handlers were registered.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_OUT_OF_RESOURCES There are not enough resources available to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync register the shell command.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Asserts for NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // allocate memory for new struct
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->CommandString = AllocateZeroPool(StrSize(Command));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // populate the new struct
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // add the new struct to the list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get the list of all shell alias commands. This is a linked list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (via LIST_ENTRY structure). enumerate through it using the BaseLib linked
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync list functions. do not modify the values.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return a Linked list of all requested shell alias'.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Determine if a given alias is on the list of built in alias'.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Alias The alias to test for
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE The alias is a built in alias
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE The alias is not a built in alias
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // assert for NULL parameter
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check for the Alias
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( Node = (ALIAS_LIST *)GetFirstNode(&mAliasList.Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Node = (ALIAS_LIST *)GetNextNode(&mAliasList.Link, &Node->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to determine current state of ECHO. Echo determins if lines from scripts
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and ECHO commands are enabled.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE Echo is currently enabled
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE Echo is currently disabled
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to set current state of ECHO. Echo determins if lines from scripts
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and ECHO commands are enabled.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If State is TRUE, Echo will be enabled.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If State is FALSE, Echo will be disabled.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] State How to set echo.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Indicate that the current shell or script should exit.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ScriptOnly TRUE if exiting a script; FALSE otherwise.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ErrorCode The 64 bit error code to return.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Retrieve the Exit indicator.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE Exit was indicated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE Exis was not indicated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Retrieve the Exit code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If ShellCommandGetExit returns FALSE than the return from this is undefined.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return the value passed into RegisterExit.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Retrieve the Exit script indicator.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If ShellCommandGetExit returns FALSE than the return from this is undefined.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE ScriptOnly was indicated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE ScriptOnly was not indicated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to cleanup all memory from a SCRIPT_FILE structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Script The pointer to the structure to cleanup.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LoopVar = 0 ; LoopVar < Script->Argc ; LoopVar++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Script->CurrentCommand = (SCRIPT_COMMAND_LIST *)GetFirstNode(&Script->CommandList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to return a pointer to the currently running script file object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL A script file is not currently running.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return A pointer to the current script file object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync List = ((SCRIPT_FILE_LIST*)GetFirstNode(&mScriptList.Link));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to set a new script as the currently running one.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function will correctly stack and unstack nested scripts.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Script Pointer to new script information structure. if NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync will remove and de-allocate the top-most Script structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return A pointer to the current running script file after this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync change. NULL if removing the final script.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node = (SCRIPT_FILE_LIST *)GetFirstNode(&mScriptList.Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to generate the next default mapping name.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the return value is not NULL then it must be callee freed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Type What kind of mapping name to make.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL a memory allocation failed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return a new map name string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String = AllocateZeroPool(PcdGet8(PcdShellMapNameLength) * sizeof(String[0]));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PcdGet8(PcdShellMapNameLength) * sizeof(String[0]),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Type == MappingTypeFileSystem?mFsMaxCount++:mBlkMaxCount++);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to add a map node to the list of map items and update the "path" environment variable (optionally).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Path is TRUE (during initialization only), the path environment variable will also be updated to include
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default paths on the new map name...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Path should be FALSE when this function is called from the protocol SetMap function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Name The human readable mapped name.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DevicePath The Device Path for this map.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Flags The Flags attribute for this map item.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Path TRUE to update path, FALSE to skip this step (should only be TRUE during initialization).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The addition was sucessful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES A memory allocation failed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER A parameter was invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MapListNode = AllocateZeroPool(sizeof(SHELL_MAP_LIST));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MapListNode->MapName = AllocateZeroPool(StrSize(Name));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MapListNode->DevicePath = DuplicateDevicePath(DevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((MapListNode->MapName == NULL) || (MapListNode->DevicePath == NULL)){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertTailList(&gShellMapList.Link, &MapListNode->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (Path) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Since there was no error and Path was TRUE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Now add the correct path for that mapping
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT((NewPath == NULL && NewPathSize == 0) || (NewPath != NULL));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCatGrow(&NewPath, &NewPathSize, OriginalPath, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCatGrow(&NewPath, &NewPathSize, L"\\efi\\tools\\;", 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCatGrow(&NewPath, &NewPathSize, L"\\efi\\boot\\;", 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gEfiShellProtocol->SetEnv(L"path", NewPath, TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Creates the default map names for each device path in the system with
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync a protocol depending on the Type.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Creates the consistent map names for each device path in the system with
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync a protocol depending on the Type.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Note: This will reset all mappings in the system("map -r").
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Also sets up the default path environment variable if Type is FileSystem.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS All map names were created sucessfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND No protocols were found in the system.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return Error returned from gBS->LocateHandle().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @sa LocateHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Reset the static members back to zero
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // First empty out the existing list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( MapListNode = (SHELL_MAP_LIST *)GetFirstNode(&gShellMapList.Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; MapListNode = (SHELL_MAP_LIST *)GetFirstNode(&gShellMapList.Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } // for loop
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Find each handle with Simple File System
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HandleList = GetHandleListByProtocol(&gEfiSimpleFileSystemProtocolGuid);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Do a count of the handles
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Count = 0 ; HandleList[Count] != NULL ; Count++);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get all Device Paths
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePathList = AllocateZeroPool(sizeof(EFI_DEVICE_PATH_PROTOCOL*) * Count);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Count = 0 ; HandleList[Count] != NULL ; Count++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePathList[Count] = DevicePathFromHandle(HandleList[Count]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Sort all DevicePaths
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PerformQuickSort(DevicePathList, Count, sizeof(EFI_DEVICE_PATH_PROTOCOL*), DevicePathCompare);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellCommandConsistMappingInitialize(&ConsistMappingTable);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Assign new Mappings to all...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Count = 0 ; HandleList[Count] != NULL ; Count++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get default name first
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewDefaultName = ShellCommandCreateNewMappingName(MappingTypeFileSystem);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellCommandAddMapItemAndUpdatePath(NewDefaultName, DevicePathList[Count], 0, TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Now do consistent name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewConsistName = ShellCommandConsistMappingGenMappingName(DevicePathList[Count], ConsistMappingTable);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellCommandAddMapItemAndUpdatePath(NewConsistName, DevicePathList[Count], 0, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellCommandConsistMappingUnInitialize(ConsistMappingTable);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Find each handle with Block Io
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HandleList = GetHandleListByProtocol(&gEfiBlockIoProtocolGuid);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Count = 0 ; HandleList[Count] != NULL ; Count++);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get all Device Paths
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePathList = AllocateZeroPool(sizeof(EFI_DEVICE_PATH_PROTOCOL*) * Count);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Count = 0 ; HandleList[Count] != NULL ; Count++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePathList[Count] = DevicePathFromHandle(HandleList[Count]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Sort all DevicePaths
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PerformQuickSort(DevicePathList, Count, sizeof(EFI_DEVICE_PATH_PROTOCOL*), DevicePathCompare);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Assign new Mappings to all...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Count = 0 ; HandleList[Count] != NULL ; Count++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get default name first
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewDefaultName = ShellCommandCreateNewMappingName(MappingTypeBlockIo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellCommandAddMapItemAndUpdatePath(NewDefaultName, DevicePathList[Count], 0, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Converts a SHELL_FILE_HANDLE to an EFI_FILE_PROTOCOL*.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Handle The SHELL_FILE_HANDLE to convert.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return a EFI_FILE_PROTOCOL* representing the same file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Converts a EFI_FILE_PROTOCOL* to an SHELL_FILE_HANDLE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Handle The pointer to EFI_FILE_PROTOCOL to convert.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Path The path to the file for verification.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return A SHELL_FILE_HANDLE representing the same file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL There was not enough memory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer = AllocateZeroPool(sizeof(SHELL_COMMAND_FILE_HANDLE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer->Path = StrnCatGrow(&Buffer->Path, NULL, Path, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertHeadList(&mFileHandleList.Link, &NewNode->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Find the path that was logged with the specified SHELL_FILE_HANDLE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Handle The SHELL_FILE_HANDLE to query on.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return A pointer to the path for the file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Node = (BUFFER_LIST*)GetFirstNode(&mFileHandleList.Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Node = (BUFFER_LIST*)GetNextNode(&mFileHandleList.Link, &Node->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Node->Buffer) && (((SHELL_COMMAND_FILE_HANDLE *)Node->Buffer)->FileHandle == Handle)){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (((SHELL_COMMAND_FILE_HANDLE *)Node->Buffer)->Path);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Remove a SHELL_FILE_HANDLE from the list of SHELL_FILE_HANDLES.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Handle The SHELL_FILE_HANDLE to remove.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE The item was removed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE The item was not found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Node = (BUFFER_LIST*)GetFirstNode(&mFileHandleList.Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Node = (BUFFER_LIST*)GetNextNode(&mFileHandleList.Link, &Node->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Node->Buffer) && (((SHELL_COMMAND_FILE_HANDLE *)Node->Buffer)->FileHandle == Handle)){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(((SHELL_COMMAND_FILE_HANDLE *)Node->Buffer)->Path);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to determine if a SHELL_FILE_HANDLE is at the end of the file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This will NOT work on directories.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Handle is NULL, then ASSERT.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Handle the file handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE the position is at the end of the file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE the position is not at the end of the file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // ASSERT if Handle is NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Frees any BUFFER_LIST defined type.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] List The BUFFER_LIST object to free.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // enumerate through the buffer list and free all memory
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( BufferListEntry = ( BUFFER_LIST *)GetFirstNode(&List->Link)