4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Provides interface to shell internal functions for shell commands.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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 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 "UefiShellCommandLib.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncenum {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gUnicodeFileTag = 0xFEFF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// STATIC local variables
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC SHELL_COMMAND_INTERNAL_LIST_ENTRY mCommandList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC SCRIPT_FILE_LIST mScriptList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC ALIAS_LIST mAliasList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC BOOLEAN mEchoState;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC BOOLEAN mExitRequested;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINT64 mExitCode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC BOOLEAN mExitScript;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC CHAR16 *mProfileList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINTN mProfileListSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINTN mFsMaxCount = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC UINTN mBlkMaxCount = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSTATIC BUFFER_LIST mFileHandleList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// global variables required by library class.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_UNICODE_COLLATION_PROTOCOL *gUnicodeCollation = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_DEVICE_PATH_TO_TEXT_PROTOCOL *gDevPathToText = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSHELL_MAP_LIST gShellMapList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSHELL_MAP_LIST *gShellCurDir = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCONST CHAR16* SupportLevel[] = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"Minimal",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"Scripting",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"Basic",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"Interactive"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to make sure that the global protocol pointers are valid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync must be called after constructor before accessing the pointers.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCommandInit(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gUnicodeCollation == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->LocateProtocol(&gEfiUnicodeCollation2ProtocolGuid, NULL, (VOID**)&gUnicodeCollation);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_DEVICE_ERROR);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gDevPathToText == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->LocateProtocol(&gEfiDevicePathToTextProtocolGuid, NULL, (VOID**)&gDevPathToText);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_DEVICE_ERROR);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Constructor for the Shell Command 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**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRETURN_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandLibConstructor (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_SYSTEM_TABLE *SystemTable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializeListHead(&gShellMapList.Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializeListHead(&mCommandList.Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializeListHead(&mAliasList.Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializeListHead(&mScriptList.Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializeListHead(&mFileHandleList.Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mEchoState = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mExitRequested = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mExitScript = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mProfileListSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mProfileList = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gUnicodeCollation == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->LocateProtocol(&gEfiUnicodeCollation2ProtocolGuid, NULL, (VOID**)&gUnicodeCollation);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_DEVICE_ERROR);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (RETURN_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Destructor for the library. free any resources.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param ImageHandle the image handle of the process
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param SystemTable the EFI System Table pointer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval RETURN_SUCCESS this function always returns success
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRETURN_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandLibDestructor (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_SYSTEM_TABLE *SystemTable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_COMMAND_INTERNAL_LIST_ENTRY *Node;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync COMMAND_LIST *Node2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SCRIPT_FILE_LIST *Node3;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_MAP_LIST *MapNode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // enumerate throught the list and free all the memory
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsListEmpty (&mCommandList.Link)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node = (SHELL_COMMAND_INTERNAL_LIST_ENTRY *)GetFirstNode(&mCommandList.Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList(&Node->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(Node->CommandString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(Node);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG_CODE(Node = NULL;);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // enumerate through the init command list and free all memory
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsListEmpty (&mAliasList.Link)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node2 = (COMMAND_LIST *)GetFirstNode(&mAliasList.Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList(&Node2->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(Node2->CommandString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(Node2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG_CODE(Node2 = NULL;);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // enumerate throught the list and free all the memory
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsListEmpty (&mScriptList.Link)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node3 = (SCRIPT_FILE_LIST *)GetFirstNode(&mScriptList.Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList(&Node3->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeleteScriptFileStruct(Node3->Data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(Node3);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // enumerate throught the mappings list and free all the memory
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!IsListEmpty(&gShellMapList.Link)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (MapNode = (SHELL_MAP_LIST *)GetFirstNode(&gShellMapList.Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; !IsListEmpty (&gShellMapList.Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; MapNode = (SHELL_MAP_LIST *)GetFirstNode(&gShellMapList.Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(MapNode != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList(&MapNode->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(MapNode->DevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(MapNode->MapName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(MapNode->CurrentDirectoryPath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(MapNode);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!IsListEmpty(&mFileHandleList.Link)){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreeBufferList(&mFileHandleList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mProfileList != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(mProfileList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gUnicodeCollation = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gDevPathToText = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gShellCurDir = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (RETURN_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Checks if a command is already on the list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CommandString The command string to check for on the list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandIsCommandOnList (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *CommandString
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_COMMAND_INTERNAL_LIST_ENTRY *Node;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // assert for NULL parameter
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(CommandString != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check for the command
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( Node = (SHELL_COMMAND_INTERNAL_LIST_ENTRY *)GetFirstNode(&mCommandList.Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; !IsNull(&mCommandList.Link, &Node->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Node = (SHELL_COMMAND_INTERNAL_LIST_ENTRY *)GetNextNode(&mCommandList.Link, &Node->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Node->CommandString != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gUnicodeCollation->StriColl(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gUnicodeCollation,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (CHAR16*)CommandString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->CommandString) == 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get the help text for a command.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CommandString The command name.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL No help text was found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return String of help text. Caller reuiqred to free.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCHAR16*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandGetCommandHelp (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *CommandString
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_COMMAND_INTERNAL_LIST_ENTRY *Node;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // assert for NULL parameter
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(CommandString != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check for the command
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( Node = (SHELL_COMMAND_INTERNAL_LIST_ENTRY *)GetFirstNode(&mCommandList.Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; !IsNull(&mCommandList.Link, &Node->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Node = (SHELL_COMMAND_INTERNAL_LIST_ENTRY *)GetNextNode(&mCommandList.Link, &Node->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Node->CommandString != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gUnicodeCollation->StriColl(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gUnicodeCollation,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (CHAR16*)CommandString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->CommandString) == 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (HiiGetString(Node->HiiHandle, Node->ManFormatHelp, NULL));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Registers handlers of type SHELL_RUN_COMMAND and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_GET_MAN_FILENAME for each shell command.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the ShellSupportLevel is greater than the value of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PcdShellSupportLevel then return RETURN_UNSUPPORTED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If there are not enough resources available to register the handlers then
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RETURN_OUT_OF_RESOURCES is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CommandString Pointer to the command name. This is the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync name to look for on the command line in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the shell.
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 filename.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ShellMinSupportLevel minimum Shell Support Level which has this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ProfileName profile name to require for support of this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync function.
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
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**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRETURN_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandRegisterCommandName (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *CommandString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN SHELL_RUN_COMMAND CommandHandler,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN SHELL_GET_MAN_FILENAME GetManFileName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 ShellMinSupportLevel,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *ProfileName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BOOLEAN CanAffectLE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_HANDLE HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_STRING_ID ManFormatHelp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_COMMAND_INTERNAL_LIST_ENTRY *Node;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // ASSERTs for NULL parameters
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(CommandString != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(GetManFileName != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(CommandHandler != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(ProfileName != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check for shell support level
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (PcdGet8(PcdShellSupportLevel) < ShellMinSupportLevel) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (RETURN_UNSUPPORTED);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check for already on the list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellCommandIsCommandOnList(CommandString)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (RETURN_ALREADY_STARTED);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // allocate memory for new struct
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node = AllocateZeroPool(sizeof(SHELL_COMMAND_INTERNAL_LIST_ENTRY));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Node != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->CommandString = AllocateZeroPool(StrSize(CommandString));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Node->CommandString != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // populate the new struct
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy(Node->CommandString, CommandString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->GetManFileName = GetManFileName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->CommandHandler = CommandHandler;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->LastError = CanAffectLE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->HiiHandle = HiiHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->ManFormatHelp = ManFormatHelp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( StrLen(ProfileName)>0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync && ((mProfileList != NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync && StrStr(mProfileList, ProfileName) == NULL) || mProfileList == NULL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT((mProfileList == NULL && mProfileListSize == 0) || (mProfileList != NULL));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mProfileList == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If this is the first make a leading ';'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCatGrow(&mProfileList, &mProfileListSize, L";", 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCatGrow(&mProfileList, &mProfileListSize, ProfileName, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCatGrow(&mProfileList, &mProfileListSize, L";", 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // add the new struct to the list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertTailList (&mCommandList.Link, &Node->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (RETURN_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to get the current Profile string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL There are no installed profiles.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return A semi-colon delimited list of profiles.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCONST CHAR16 *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandGetProfileList (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (mProfileList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If CommandString is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] CanAffectLE indicates whether this command's return value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync needs to be placed into LASTERROR environment variable.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRETURN_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandRunCommandHandler (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *CommandString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT SHELL_STATUS *RetVal,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT BOOLEAN *CanAffectLE OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_COMMAND_INTERNAL_LIST_ENTRY *Node;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // assert for NULL parameters
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(CommandString != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check for the command
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( Node = (SHELL_COMMAND_INTERNAL_LIST_ENTRY *)GetFirstNode(&mCommandList.Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; !IsNull(&mCommandList.Link, &Node->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Node = (SHELL_COMMAND_INTERNAL_LIST_ENTRY *)GetNextNode(&mCommandList.Link, &Node->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Node->CommandString != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gUnicodeCollation->StriColl(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gUnicodeCollation,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (CHAR16*)CommandString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->CommandString) == 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CanAffectLE != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *CanAffectLE = Node->LastError;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (RetVal != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *RetVal = Node->CommandHandler(NULL, gST);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->CommandHandler(NULL, gST);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (RETURN_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (RETURN_NOT_FOUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If CommandString is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CommandString Pointer to the command name. This is the name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync found on the command line in the shell.\
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCONST CHAR16*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandGetManFileNameHandler (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *CommandString
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_COMMAND_INTERNAL_LIST_ENTRY *Node;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // assert for NULL parameters
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(CommandString != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check for the command
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( Node = (SHELL_COMMAND_INTERNAL_LIST_ENTRY *)GetFirstNode(&mCommandList.Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; !IsNull(&mCommandList.Link, &Node->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Node = (SHELL_COMMAND_INTERNAL_LIST_ENTRY *)GetNextNode(&mCommandList.Link, &Node->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Node->CommandString != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gUnicodeCollation->StriColl(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gUnicodeCollation,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (CHAR16*)CommandString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->CommandString) == 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Node->GetManFileName());
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Sort TRUE to alphabetically sort the values first. FALSE otherwise.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return a Linked list of all available shell commands.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCONST COMMAND_LIST*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandGetCommandList (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BOOLEAN Sort
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// if (!Sort) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// return ((COMMAND_LIST*)(&mCommandList));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ((COMMAND_LIST*)(&mCommandList));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Registers aliases to be set as part of the initialization of the shell application.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Command is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Alias is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Command Pointer to the Command
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Alias Pointer to Alias
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncRETURN_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandRegisterAlias (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *Command,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *Alias
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ALIAS_LIST *Node;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Asserts for NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Command != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Alias != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // allocate memory for new struct
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node = AllocateZeroPool(sizeof(ALIAS_LIST));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Node != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->CommandString = AllocateZeroPool(StrSize(Command));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Alias = AllocateZeroPool(StrSize(Alias));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Node->CommandString != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Node->Alias != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // populate the new struct
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy(Node->CommandString, Command);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy(Node->Alias , Alias );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // add the new struct to the list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertTailList (&mAliasList.Link, &Node->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (RETURN_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return a Linked list of all requested shell alias'.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCONST ALIAS_LIST*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandGetInitAliasList (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (&mAliasList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Determine if a given alias is on the list of built in alias'.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Alias The alias to test for
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE The alias is a built in alias
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE The alias is not a built in alias
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandIsOnAliasList(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *Alias
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ALIAS_LIST *Node;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // assert for NULL parameter
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Alias != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // check for the Alias
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( Node = (ALIAS_LIST *)GetFirstNode(&mAliasList.Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; !IsNull(&mAliasList.Link, &Node->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Node = (ALIAS_LIST *)GetNextNode(&mAliasList.Link, &Node->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Node->CommandString != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Node->Alias != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gUnicodeCollation->StriColl(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gUnicodeCollation,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (CHAR16*)Alias,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->CommandString) == 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (gUnicodeCollation->StriColl(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gUnicodeCollation,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (CHAR16*)Alias,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Alias) == 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to determine current state of ECHO. Echo determins if lines from scripts
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and ECHO commands are enabled.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE Echo is currently enabled
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE Echo is currently disabled
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandGetEchoState(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (mEchoState);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to set current state of ECHO. Echo determins if lines from scripts
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and ECHO commands are enabled.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If State is TRUE, Echo will be enabled.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If State is FALSE, Echo will be disabled.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] State How to set echo.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandSetEchoState(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN BOOLEAN State
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mEchoState = State;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Indicate that the current shell or script should exit.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ScriptOnly TRUE if exiting a script; FALSE otherwise.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ErrorCode The 64 bit error code to return.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandRegisterExit (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN BOOLEAN ScriptOnly,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST UINT64 ErrorCode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mExitRequested = (BOOLEAN)(!mExitRequested);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (mExitRequested) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mExitScript = ScriptOnly;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mExitScript = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mExitCode = ErrorCode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Retrieve the Exit indicator.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE Exit was indicated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE Exis was not indicated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandGetExit (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (mExitRequested);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Retrieve the Exit code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If ShellCommandGetExit returns FALSE than the return from this is undefined.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return the value passed into RegisterExit.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT64
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandGetExitCode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (mExitCode);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Retrieve the Exit script indicator.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If ShellCommandGetExit returns FALSE than the return from this is undefined.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE ScriptOnly was indicated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE ScriptOnly was not indicated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandGetScriptExit (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (mExitScript);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to cleanup all memory from a SCRIPT_FILE structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Script The pointer to the structure to cleanup.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDeleteScriptFileStruct (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN SCRIPT_FILE *Script
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 LoopVar;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Script == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (LoopVar = 0 ; LoopVar < Script->Argc ; LoopVar++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(Script->Argv[LoopVar]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Script->Argv != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(Script->Argv);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Script->CurrentCommand = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsListEmpty (&Script->CommandList)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Script->CurrentCommand = (SCRIPT_COMMAND_LIST *)GetFirstNode(&Script->CommandList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Script->CurrentCommand != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList(&Script->CurrentCommand->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Script->CurrentCommand->Cl != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(Script->CurrentCommand->Cl);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Script->CurrentCommand->Data != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(Script->CurrentCommand->Data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(Script->CurrentCommand);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(Script->ScriptName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(Script);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to return a pointer to the currently running script file object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL A script file is not currently running.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return A pointer to the current script file object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSCRIPT_FILE*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandGetCurrentScriptFile (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SCRIPT_FILE_LIST *List;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsListEmpty (&mScriptList.Link)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync List = ((SCRIPT_FILE_LIST*)GetFirstNode(&mScriptList.Link));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (List->Data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to set a new script as the currently running one.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function will correctly stack and unstack nested scripts.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Script Pointer to new script information structure. if NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync will remove and de-allocate the top-most Script structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return A pointer to the current running script file after this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync change. NULL if removing the final script.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSCRIPT_FILE*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandSetNewScript (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN SCRIPT_FILE *Script OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SCRIPT_FILE_LIST *Node;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Script == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsListEmpty (&mScriptList.Link)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node = (SCRIPT_FILE_LIST *)GetFirstNode(&mScriptList.Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList(&Node->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeleteScriptFileStruct(Node->Data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(Node);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node = AllocateZeroPool(sizeof(SCRIPT_FILE_LIST));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Node == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Data = Script;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertHeadList(&mScriptList.Link, &Node->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (ShellCommandGetCurrentScriptFile());
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to generate the next default mapping name.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the return value is not NULL then it must be callee freed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Type What kind of mapping name to make.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL a memory allocation failed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return a new map name string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCHAR16*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandCreateNewMappingName(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST SHELL_MAPPING_TYPE Type
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *String;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Type < MappingTypeMax);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String = AllocateZeroPool(PcdGet8(PcdShellMapNameLength) * sizeof(String[0]));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PcdGet8(PcdShellMapNameLength) * sizeof(String[0]),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Type == MappingTypeFileSystem?L"FS%d:":L"BLK%d:",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Type == MappingTypeFileSystem?mFsMaxCount++:mBlkMaxCount++);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (String);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to add a map node to the list of map items and update the "path" environment variable (optionally).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Path should be FALSE when this function is called from the protocol SetMap function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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
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**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandAddMapItemAndUpdatePath(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *Name,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST UINT64 Flags,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BOOLEAN Path
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_MAP_LIST *MapListNode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CONST CHAR16 *OriginalPath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *NewPath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN NewPathSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPathSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPath = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OriginalPath = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MapListNode = AllocateZeroPool(sizeof(SHELL_MAP_LIST));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MapListNode == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MapListNode->Flags = Flags;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MapListNode->MapName = AllocateZeroPool(StrSize(Name));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MapListNode->DevicePath = DuplicateDevicePath(DevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((MapListNode->MapName == NULL) || (MapListNode->DevicePath == NULL)){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy(MapListNode->MapName, Name);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertTailList(&gShellMapList.Link, &MapListNode->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MapListNode != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MapListNode->DevicePath != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(MapListNode->DevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MapListNode->MapName != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(MapListNode->MapName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(MapListNode);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (Path) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Since there was no error and Path was TRUE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Now add the correct path for that mapping
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OriginalPath = gEfiShellProtocol->GetEnv(L"path");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT((NewPath == NULL && NewPathSize == 0) || (NewPath != NULL));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OriginalPath != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCatGrow(&NewPath, &NewPathSize, OriginalPath, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCatGrow(&NewPath, &NewPathSize, L".\\", 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCatGrow(&NewPath, &NewPathSize, L";", 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCatGrow(&NewPath, &NewPathSize, Name, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCatGrow(&NewPath, &NewPathSize, L"\\efi\\tools\\;", 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCatGrow(&NewPath, &NewPathSize, Name, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCatGrow(&NewPath, &NewPathSize, L"\\efi\\boot\\;", 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCatGrow(&NewPath, &NewPathSize, Name, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCatGrow(&NewPath, &NewPathSize, L"\\", 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gEfiShellProtocol->SetEnv(L"path", NewPath, TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR(Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(NewPath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Creates the default map names for each device path in the system with
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync a protocol depending on the Type.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Creates the consistent map names for each device path in the system with
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync a protocol depending on the Type.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Note: This will reset all mappings in the system("map -r").
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Also sets up the default path environment variable if Type is FileSystem.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @sa LocateHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellCommandCreateInitialMappingsAndPaths(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE *HandleList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Count;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL **DevicePathList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *NewDefaultName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *NewConsistName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL **ConsistMappingTable;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_MAP_LIST *MapListNode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HandleList = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Reset the static members back to zero
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mFsMaxCount = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mBlkMaxCount = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellProtocol->SetEnv(L"path", L"", TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // First empty out the existing list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!IsListEmpty(&gShellMapList.Link)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( MapListNode = (SHELL_MAP_LIST *)GetFirstNode(&gShellMapList.Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; !IsListEmpty(&gShellMapList.Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; MapListNode = (SHELL_MAP_LIST *)GetFirstNode(&gShellMapList.Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList(&MapListNode->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(MapListNode);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } // for loop
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Find each handle with Simple File System
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HandleList = GetHandleListByProtocol(&gEfiSimpleFileSystemProtocolGuid);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HandleList != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Do a count of the handles
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Count = 0 ; HandleList[Count] != NULL ; Count++);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get all Device Paths
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePathList = AllocateZeroPool(sizeof(EFI_DEVICE_PATH_PROTOCOL*) * Count);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(DevicePathList != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Count = 0 ; HandleList[Count] != NULL ; Count++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePathList[Count] = DevicePathFromHandle(HandleList[Count]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Sort all DevicePaths
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PerformQuickSort(DevicePathList, Count, sizeof(EFI_DEVICE_PATH_PROTOCOL*), DevicePathCompare);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellCommandConsistMappingInitialize(&ConsistMappingTable);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Assign new Mappings to all...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Count = 0 ; HandleList[Count] != NULL ; Count++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get default name first
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewDefaultName = ShellCommandCreateNewMappingName(MappingTypeFileSystem);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(NewDefaultName != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellCommandAddMapItemAndUpdatePath(NewDefaultName, DevicePathList[Count], 0, TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR(Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(NewDefaultName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Now do consistent name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewConsistName = ShellCommandConsistMappingGenMappingName(DevicePathList[Count], ConsistMappingTable);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewConsistName != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellCommandAddMapItemAndUpdatePath(NewConsistName, DevicePathList[Count], 0, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR(Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(NewConsistName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellCommandConsistMappingUnInitialize(ConsistMappingTable);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(HandleList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(DevicePathList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HandleList = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count = (UINTN)-1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Find each handle with Block Io
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HandleList = GetHandleListByProtocol(&gEfiBlockIoProtocolGuid);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (HandleList != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Count = 0 ; HandleList[Count] != NULL ; Count++);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get all Device Paths
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePathList = AllocateZeroPool(sizeof(EFI_DEVICE_PATH_PROTOCOL*) * Count);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(DevicePathList != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Count = 0 ; HandleList[Count] != NULL ; Count++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePathList[Count] = DevicePathFromHandle(HandleList[Count]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Sort all DevicePaths
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PerformQuickSort(DevicePathList, Count, sizeof(EFI_DEVICE_PATH_PROTOCOL*), DevicePathCompare);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Assign new Mappings to all...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Count = 0 ; HandleList[Count] != NULL ; Count++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get default name first
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewDefaultName = ShellCommandCreateNewMappingName(MappingTypeBlockIo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(NewDefaultName != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellCommandAddMapItemAndUpdatePath(NewDefaultName, DevicePathList[Count], 0, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR(Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(NewDefaultName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(HandleList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(DevicePathList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (Count == (UINTN)-1) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_NOT_FOUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Converts a SHELL_FILE_HANDLE to an EFI_FILE_PROTOCOL*.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Handle The SHELL_FILE_HANDLE to convert.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return a EFI_FILE_PROTOCOL* representing the same file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_FILE_PROTOCOL*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncConvertShellHandleToEfiFileProtocol(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST SHELL_FILE_HANDLE Handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ((EFI_FILE_PROTOCOL*)(Handle));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Converts a EFI_FILE_PROTOCOL* to an SHELL_FILE_HANDLE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Handle The pointer to EFI_FILE_PROTOCOL to convert.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Path The path to the file for verification.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return A SHELL_FILE_HANDLE representing the same file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL There was not enough memory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSHELL_FILE_HANDLE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncConvertEfiFileProtocolToShellHandle(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_FILE_PROTOCOL *Handle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *Path
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_COMMAND_FILE_HANDLE *Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BUFFER_LIST *NewNode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Path != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer = AllocateZeroPool(sizeof(SHELL_COMMAND_FILE_HANDLE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Buffer == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewNode = AllocateZeroPool(sizeof(BUFFER_LIST));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewNode == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer->FileHandle = (EFI_FILE_PROTOCOL*)Handle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer->Path = StrnCatGrow(&Buffer->Path, NULL, Path, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Buffer->Path == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewNode->Buffer = Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertHeadList(&mFileHandleList.Link, &NewNode->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ((SHELL_FILE_HANDLE)(Handle));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Find the path that was logged with the specified SHELL_FILE_HANDLE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Handle The SHELL_FILE_HANDLE to query on.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return A pointer to the path for the file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCONST CHAR16*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellFileHandleGetPath(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST SHELL_FILE_HANDLE Handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BUFFER_LIST *Node;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Node = (BUFFER_LIST*)GetFirstNode(&mFileHandleList.Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; !IsNull(&mFileHandleList.Link, &Node->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Node = (BUFFER_LIST*)GetNextNode(&mFileHandleList.Link, &Node->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Node->Buffer) && (((SHELL_COMMAND_FILE_HANDLE *)Node->Buffer)->FileHandle == Handle)){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (((SHELL_COMMAND_FILE_HANDLE *)Node->Buffer)->Path);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Remove a SHELL_FILE_HANDLE from the list of SHELL_FILE_HANDLES.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Handle The SHELL_FILE_HANDLE to remove.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE The item was removed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE The item was not found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellFileHandleRemove(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST SHELL_FILE_HANDLE Handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BUFFER_LIST *Node;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Node = (BUFFER_LIST*)GetFirstNode(&mFileHandleList.Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; !IsNull(&mFileHandleList.Link, &Node->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Node = (BUFFER_LIST*)GetNextNode(&mFileHandleList.Link, &Node->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Node->Buffer) && (((SHELL_COMMAND_FILE_HANDLE *)Node->Buffer)->FileHandle == Handle)){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList(&Node->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(((SHELL_COMMAND_FILE_HANDLE *)Node->Buffer)->Path);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(Node->Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(Node);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Function to determine if a SHELL_FILE_HANDLE is at the end of the file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This will NOT work on directories.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Handle is NULL, then ASSERT.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Handle the file handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
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**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncShellFileHandleEof(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN SHELL_FILE_HANDLE Handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_INFO *Info;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 Pos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN RetVal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // ASSERT if Handle is NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Handle != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellProtocol->GetFilePosition(Handle, &Pos);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Info = gEfiShellProtocol->GetFileInfo (Handle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(Info != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiShellProtocol->SetFilePosition(Handle, Pos);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Info == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Pos == Info->FileSize) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RetVal = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RetVal = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Info);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (RetVal);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Frees any BUFFER_LIST defined type.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] List The BUFFER_LIST object to free.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFreeBufferList (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN BUFFER_LIST *List
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BUFFER_LIST *BufferListEntry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (List == NULL){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // enumerate through the buffer list and free all memory
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( BufferListEntry = ( BUFFER_LIST *)GetFirstNode(&List->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; !IsListEmpty (&List->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; BufferListEntry = (BUFFER_LIST *)GetFirstNode(&List->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList(&BufferListEntry->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(BufferListEntry->Buffer != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BufferListEntry->Buffer != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(BufferListEntry->Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(BufferListEntry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync