public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Brian J. Johnson" <bjohnson@sgi.com>
To: "Kinney, Michael D" <michael.d.kinney@intel.com>,
	"Ni, Ruiyu" <ruiyu.ni@intel.com>,
	"Carsey, Jaben" <jaben.carsey@intel.com>,
	"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Cc: "Yao, Jiewen" <jiewen.yao@intel.com>
Subject: Re: [PATCH 2/5] MdePkg: Include Shell/ShellDynamicCommand/ShellParameters definitions
Date: Tue, 18 Oct 2016 10:19:46 -0500	[thread overview]
Message-ID: <6d469184-8202-d258-3ec2-c0b153355165@sgi.com> (raw)
In-Reply-To: <E92EE9817A31E24EB0585FDF735412F564825F40@ORSMSX113.amr.corp.intel.com>

Yes, git automatically detects copying and moving files, as long as both 
halves of the action (remove + add) are in the same commit.  There's a 
nice explanation here:

https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository#_git_mv

Brian

On 10/18/2016 12:59 AM, Kinney, Michael D wrote:
> Use 'git mv' command.
>
> Mike
>
>> -----Original Message-----
>> From: Ni, Ruiyu
>> Sent: Tuesday, October 18, 2016 1:57 PM
>> To: Carsey, Jaben <jaben.carsey@intel.com>; edk2-devel@lists.01.org
>> Cc: Kinney, Michael D <michael.d.kinney@intel.com>; Yao, Jiewen
>> <jiewen.yao@intel.com>
>> Subject: RE: [edk2] [PATCH 2/5] MdePkg: Include
>> Shell/ShellDynamicCommand/ShellParameters definitions
>>
>> I don't want to lose the file history either.
>> I thought git can auto-detect the copy/move of files. I will investigate further.
>>
>> Thanks/Ray
>>
>>> -----Original Message-----
>>> From: Carsey, Jaben
>>> Sent: Tuesday, October 18, 2016 2:02 AM
>>> To: Ni, Ruiyu <ruiyu.ni@intel.com>; edk2-devel@lists.01.org
>>> Cc: Kinney, Michael D <michael.d.kinney@intel.com>; Yao, Jiewen
>>> <jiewen.yao@intel.com>; Carsey, Jaben <jaben.carsey@intel.com>
>>> Subject: RE: [edk2] [PATCH 2/5] MdePkg: Include
>>> Shell/ShellDynamicCommand/ShellParameters definitions
>>>
>>> Can we do a GIT move operation and then merge the content from
>>> ShellBase.h please?  I do not want to lose the file history information.
>>>
>>> When we move by "delete" then "add" we lose everything for no reason.
>>>
>>> -Jaben
>>>
>>>> -----Original Message-----
>>>> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
>>>> Ruiyu Ni
>>>> Sent: Friday, October 14, 2016 2:44 AM
>>>> To: edk2-devel@lists.01.org
>>>> Cc: Carsey, Jaben <jaben.carsey@intel.com>; Kinney, Michael D
>>>> <michael.d.kinney@intel.com>; Yao, Jiewen <jiewen.yao@intel.com>
>>>> Subject: [edk2] [PATCH 2/5] MdePkg: Include
>>>> Shell/ShellDynamicCommand/ShellParameters definitions
>>>> Importance: High
>>>>
>>>> Copy Shell/ShellDynamicCommand/ShellParameters definitions from
>>>> ShellPkg to MdePkg.
>>>> Content of ShellBase.h is moved to Protocol/Shell.h.
>>>>
>>>> The following patches will update ShellPkg to reference all protocol
>>>> definition to MdePkg.
>>>>
>>>> Contributed-under: TianoCore Contribution Agreement 1.0
>>>> Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com>
>>>> Cc: Jaben Carsey <jaben.carsey@intel.com>
>>>> Cc: Jiewen Yao <jiewen.yao@intel.com>
>>>> Cc: Michael D Kinney <michael.d.kinney@intel.com>
>>>> ---
>>>>  MdePkg/Include/Protocol/Shell.h               | 1268
>>>> +++++++++++++++++++++++++
>>>>  MdePkg/Include/Protocol/ShellDynamicCommand.h |   85 ++
>>>>  MdePkg/Include/Protocol/ShellParameters.h     |   60 ++
>>>>  MdePkg/MdePkg.dec                             |   15 +
>>>>  4 files changed, 1428 insertions(+)
>>>>  create mode 100644 MdePkg/Include/Protocol/Shell.h
>>>>  create mode 100644 MdePkg/Include/Protocol/ShellDynamicCommand.h
>>>>  create mode 100644 MdePkg/Include/Protocol/ShellParameters.h
>>>>
>>>> diff --git a/MdePkg/Include/Protocol/Shell.h
>>>> b/MdePkg/Include/Protocol/Shell.h
>>>> new file mode 100644
>>>> index 0000000..cc1fbdc
>>>> --- /dev/null
>>>> +++ b/MdePkg/Include/Protocol/Shell.h
>>>> @@ -0,0 +1,1268 @@
>>>> +/** @file
>>>> +  EFI Shell protocol as defined in the UEFI Shell 2.0 specification including
>>>> errata.
>>>> +
>>>> +  (C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR>
>>>> +  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
>>>> +  This program and the accompanying materials
>>>> +  are licensed and made available under the terms and conditions of the
>>> BSD
>>>> License
>>>> +  which accompanies this distribution.  The full text of the license may be
>>>> found at
>>>> +  http://opensource.org/licenses/bsd-license.php
>>>> +
>>>> +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>>>> BASIS,
>>>> +  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>>>> EXPRESS OR IMPLIED.
>>>> +
>>>> +**/
>>>> +
>>>> +#ifndef __EFI_SHELL_PROTOCOL__
>>>> +#define __EFI_SHELL_PROTOCOL__
>>>> +
>>>> +#include <Guid/FileInfo.h>
>>>> +
>>>> +#define EFI_SHELL_PROTOCOL_GUID \
>>>> +  { \
>>>> +  0x6302d008, 0x7f9b, 0x4f30, { 0x87, 0xac, 0x60, 0xc9, 0xfe, 0xf5, 0xda,
>>> 0x4e
>>>> } \
>>>> +  }
>>>> +typedef VOID *SHELL_FILE_HANDLE;
>>>> +
>>>> +typedef enum {
>>>> +  ///
>>>> +  /// The operation completed successfully.
>>>> +  ///
>>>> +  SHELL_SUCCESS               = 0,
>>>> +
>>>> +  ///
>>>> +  /// The image failed to load.
>>>> +  ///
>>>> +  SHELL_LOAD_ERROR            = 1,
>>>> +
>>>> +  ///
>>>> +  /// The parameter was incorrect.
>>>> +  ///
>>>> +  SHELL_INVALID_PARAMETER     = 2,
>>>> +
>>>> +  ///
>>>> +  /// The operation is not supported.
>>>> +  ///
>>>> +  SHELL_UNSUPPORTED           = 3,
>>>> +
>>>> +  ///
>>>> +  /// The buffer was not the proper size for the request.
>>>> +  ///
>>>> +  SHELL_BAD_BUFFER_SIZE       = 4,
>>>> +
>>>> +  ///
>>>> +  /// The buffer was not large enough to hold the requested data.
>>>> +  /// The required buffer size is returned in the appropriate
>>>> +  /// parameter when this error occurs.
>>>> +  ///
>>>> +  SHELL_BUFFER_TOO_SMALL      = 5,
>>>> +
>>>> +  ///
>>>> +  /// There is no data pending upon return.
>>>> +  ///
>>>> +  SHELL_NOT_READY             = 6,
>>>> +
>>>> +  ///
>>>> +  /// The physical device reported an error while attempting the
>>>> +  /// operation.
>>>> +  ///
>>>> +  SHELL_DEVICE_ERROR          = 7,
>>>> +
>>>> +  ///
>>>> +  /// The device cannot be written to.
>>>> +  ///
>>>> +  SHELL_WRITE_PROTECTED       = 8,
>>>> +
>>>> +  ///
>>>> +  /// The resource has run out.
>>>> +  ///
>>>> +  SHELL_OUT_OF_RESOURCES      = 9,
>>>> +
>>>> +  ///
>>>> +  /// An inconsistency was detected on the file system causing the
>>>> +  /// operation to fail.
>>>> +  ///
>>>> +  SHELL_VOLUME_CORRUPTED      = 10,
>>>> +
>>>> +  ///
>>>> +  /// There is no more space on the file system.
>>>> +  ///
>>>> +  SHELL_VOLUME_FULL           = 11,
>>>> +
>>>> +  ///
>>>> +  /// The device does not contain any medium to perform the
>>>> +  /// operation.
>>>> +  ///
>>>> +  SHELL_NO_MEDIA              = 12,
>>>> +
>>>> +  ///
>>>> +  /// The medium in the device has changed since the last
>>>> +  /// access.
>>>> +  ///
>>>> +  SHELL_MEDIA_CHANGED         = 13,
>>>> +
>>>> +  ///
>>>> +  /// The item was not found.
>>>> +  ///
>>>> +  SHELL_NOT_FOUND             = 14,
>>>> +
>>>> +  ///
>>>> +  /// Access was denied.
>>>> +  ///
>>>> +  SHELL_ACCESS_DENIED         = 15,
>>>> +
>>>> +  // note the skipping of 16 and 17
>>>> +
>>>> +  ///
>>>> +  /// A timeout time expired.
>>>> +  ///
>>>> +  SHELL_TIMEOUT               = 18,
>>>> +
>>>> +  ///
>>>> +  /// The protocol has not been started.
>>>> +  ///
>>>> +  SHELL_NOT_STARTED           = 19,
>>>> +
>>>> +  ///
>>>> +  /// The protocol has already been started.
>>>> +  ///
>>>> +  SHELL_ALREADY_STARTED       = 20,
>>>> +
>>>> +  ///
>>>> +  /// The operation was aborted.
>>>> +  ///
>>>> +  SHELL_ABORTED               = 21,
>>>> +
>>>> +  // note the skipping of 22, 23, and 24
>>>> +
>>>> +  ///
>>>> +  /// A function encountered an internal version that was
>>>> +  /// incompatible with a version requested by the caller.
>>>> +  ///
>>>> +  SHELL_INCOMPATIBLE_VERSION  = 25,
>>>> +
>>>> +  ///
>>>> +  /// The function was not performed due to a security violation.
>>>> +  ///
>>>> +  SHELL_SECURITY_VIOLATION    = 26,
>>>> +
>>>> +  ///
>>>> +  /// The function was performed and resulted in an unequal
>>>> +  /// comparison..
>>>> +  ///
>>>> +  SHELL_NOT_EQUAL             = 27
>>>> +} SHELL_STATUS;
>>>> +
>>>> +
>>>> +// replaced EFI_LIST_ENTRY with LIST_ENTRY for simplicity.
>>>> +// they are identical outside of the name.
>>>> +typedef struct {
>>>> +  LIST_ENTRY        Link;       ///< Linked list members.
>>>> +  EFI_STATUS        Status;     ///< Status of opening the file.  Valid only if
>>>> Handle != NULL.
>>>> +  CONST CHAR16      *FullName;  ///< Fully qualified filename.
>>>> +  CONST CHAR16      *FileName;  ///< name of this file.
>>>> +  SHELL_FILE_HANDLE Handle;     ///< Handle for interacting with the
>>> opened
>>>> file or NULL if closed.
>>>> +  EFI_FILE_INFO     *Info;      ///< Pointer to the FileInfo struct for this
>> file or
>>>> NULL.
>>>> +} EFI_SHELL_FILE_INFO;
>>>> +
>>>> +/**
>>>> +  Returns whether any script files are currently being processed.
>>>> +
>>>> +  @retval TRUE                 There is at least one script file active.
>>>> +  @retval FALSE                No script files are active now.
>>>> +
>>>> +**/
>>>> +typedef
>>>> +BOOLEAN
>>>> +(EFIAPI *EFI_SHELL_BATCH_IS_ACTIVE) (
>>>> +  VOID
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Closes the file handle.
>>>> +
>>>> +  This function closes a specified file handle. All 'dirty' cached file data is
>>>> +  flushed to the device, and the file is closed. In all cases, the handle is
>>>> +  closed.
>>>> +
>>>> +  @param[in] FileHandle         The file handle to be closed.
>>>> +
>>>> +  @retval EFI_SUCCESS           The file closed sucessfully.
>>>> +**/
>>>> +typedef
>>>> +EFI_STATUS
>>>> +(EFIAPI *EFI_SHELL_CLOSE_FILE)(
>>>> +  IN SHELL_FILE_HANDLE FileHandle
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Creates a file or directory by name.
>>>> +
>>>> +  This function creates an empty new file or directory with the specified
>>>> attributes and
>>>> +  returns the new file's handle. If the file already exists and is read-only,
>>>> then
>>>> +  EFI_INVALID_PARAMETER will be returned.
>>>> +
>>>> +  If the file already existed, it is truncated and its attributes updated. If
>> the
>>>> file is
>>>> +  created successfully, the FileHandle is the file's handle, else, the
>>> FileHandle
>>>> is NULL.
>>>> +
>>>> +  If the file name begins with >v, then the file handle which is returned
>>>> refers to the
>>>> +  shell environment variable with the specified name. If the shell
>>>> environment variable
>>>> +  already exists and is non-volatile then EFI_INVALID_PARAMETER is
>>>> returned.
>>>> +
>>>> +  @param[in] FileName           Pointer to NULL-terminated file path.
>>>> +  @param[in] FileAttribs        The new file's attrbiutes.  The different
>>>> attributes are
>>>> +                                described in EFI_FILE_PROTOCOL.Open().
>>>> +  @param[out] FileHandle        On return, points to the created file handle
>>> or
>>>> directory's handle.
>>>> +
>>>> +  @retval EFI_SUCCESS           The file was opened.  FileHandle points to the
>>>> new file's handle.
>>>> +  @retval EFI_INVALID_PARAMETER One of the parameters has an invalid
>>>> value.
>>>> +  @retval EFI_UNSUPPORTED       The file path could not be opened.
>>>> +  @retval EFI_NOT_FOUND         The specified file could not be found on
>>> the
>>>> device, or could not
>>>> +                                file the file system on the device.
>>>> +  @retval EFI_NO_MEDIA          The device has no medium.
>>>> +  @retval EFI_MEDIA_CHANGED     The device has a different medium in it
>>>> or the medium is no
>>>> +                                longer supported.
>>>> +  @retval EFI_DEVICE_ERROR      The device reported an error or can't get
>>>> the file path according
>>>> +                                the DirName.
>>>> +  @retval EFI_VOLUME_CORRUPTED  The file system structures are
>>>> corrupted.
>>>> +  @retval EFI_WRITE_PROTECTED   An attempt was made to create a file,
>>> or
>>>> open a file for write
>>>> +                                when the media is write-protected.
>>>> +  @retval EFI_ACCESS_DENIED     The service denied access to the file.
>>>> +  @retval EFI_OUT_OF_RESOURCES  Not enough resources were available
>>>> to open the file.
>>>> +  @retval EFI_VOLUME_FULL       The volume is full.
>>>> +**/
>>>> +typedef
>>>> +EFI_STATUS
>>>> +(EFIAPI *EFI_SHELL_CREATE_FILE)(
>>>> +  IN CONST CHAR16               *FileName,
>>>> +  IN UINT64                     FileAttribs,
>>>> +  OUT SHELL_FILE_HANDLE         *FileHandle
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Deletes the file specified by the file handle.
>>>> +
>>>> +  This function closes and deletes a file. In all cases, the file handle is
>> closed.
>>>> If the file
>>>> +  cannot be deleted, the warning code EFI_WARN_DELETE_FAILURE is
>>>> returned, but the
>>>> +  handle is still closed.
>>>> +
>>>> +  @param[in] FileHandle           The file handle to delete.
>>>> +
>>>> +  @retval EFI_SUCCESS             The file was closed and deleted and the
>>> handle
>>>> was closed.
>>>> +  @retval EFI_WARN_DELETE_FAILURE The handle was closed but the file
>>>> was not deleted.
>>>> +**/
>>>> +typedef
>>>> +EFI_STATUS
>>>> +(EFIAPI *EFI_SHELL_DELETE_FILE)(
>>>> +  IN SHELL_FILE_HANDLE FileHandle
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Deletes the file specified by the file name.
>>>> +
>>>> +  This function deletes a file.
>>>> +
>>>> +  @param[in] FileName             Points to the NULL-terminated file name.
>>>> +
>>>> +  @retval EFI_SUCCESS             The file was deleted.
>>>> +  @retval EFI_WARN_DELETE_FAILURE The handle was closed but the file
>>>> was not deleted.
>>>> +**/
>>>> +typedef
>>>> +EFI_STATUS
>>>> +(EFIAPI *EFI_SHELL_DELETE_FILE_BY_NAME)(
>>>> +  IN CONST CHAR16 *FileName
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Disables the page break output mode.
>>>> +**/
>>>> +typedef
>>>> +VOID
>>>> +(EFIAPI *EFI_SHELL_DISABLE_PAGE_BREAK) (
>>>> +  VOID
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Enables the page break output mode.
>>>> +**/
>>>> +typedef
>>>> +VOID
>>>> +(EFIAPI *EFI_SHELL_ENABLE_PAGE_BREAK) (
>>>> +  VOID
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Execute the command line.
>>>> +
>>>> +  This function creates a nested instance of the shell and executes the
>>>> specified
>>>> +  command (CommandLine) with the specified environment
>>> (Environment).
>>>> Upon return,
>>>> +  the status code returned by the specified command is placed in
>>>> StatusCode.
>>>> +
>>>> +  If Environment is NULL, then the current environment is used and all
>>>> changes made
>>>> +  by the commands executed will be reflected in the current environment.
>>> If
>>>> the
>>>> +  Environment is non-NULL, then the changes made will be discarded.
>>>> +
>>>> +  The CommandLine is executed from the current working directory on the
>>>> current
>>>> +  device.
>>>> +
>>>> +  @param[in] ParentImageHandle  A handle of the image that is executing
>>>> the specified
>>>> +                                command line.
>>>> +  @param[in] CommandLine        Points to the NULL-terminated UCS-2
>>>> encoded string
>>>> +                                containing the command line. If NULL then the
>> command-
>>>> +                                line will be empty.
>>>> +  @param[in] Environment        Points to a NULL-terminated array of
>>>> environment
>>>> +                                variables with the format 'x=y', where x is the
>>>> +                                environment variable name and y is the value. If
>> this
>>>> +                                is NULL, then the current shell environment is
>> used.
>>>> +  @param[out] ErrorCode         Points to the status code returned by the
>>>> command.
>>>> +
>>>> +  @retval EFI_SUCCESS           The command executed successfully. The
>>>> status code
>>>> +                                returned by the command is pointed to by
>> StatusCode.
>>>> +  @retval EFI_INVALID_PARAMETER The parameters are invalid.
>>>> +  @retval EFI_OUT_OF_RESOURCES  Out of resources.
>>>> +  @retval EFI_UNSUPPORTED       Nested shell invocations are not allowed.
>>>> +**/
>>>> +typedef
>>>> +EFI_STATUS
>>>> +(EFIAPI *EFI_SHELL_EXECUTE) (
>>>> +  IN EFI_HANDLE                 *ParentImageHandle,
>>>> +  IN CHAR16                     *CommandLine OPTIONAL,
>>>> +  IN CHAR16                     **Environment OPTIONAL,
>>>> +  OUT EFI_STATUS                *StatusCode OPTIONAL
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Find files that match a specified pattern.
>>>> +
>>>> +  This function searches for all files and directories that match the specified
>>>> +  FilePattern. The FilePattern can contain wild-card characters. The
>>> resulting
>>>> file
>>>> +  information is placed in the file list FileList.
>>>> +
>>>> +  The files in the file list are not opened. The OpenMode field is set to 0
>>> and
>>>> the FileInfo
>>>> +  field is set to NULL.
>>>> +
>>>> +  @param[in] FilePattern        Points to a NULL-terminated shell file path,
>>>> including wildcards.
>>>> +  @param[out] FileList          On return, points to the start of a file list
>>>> containing the names
>>>> +                                of all matching files or else points to NULL if
>> no matching
>>>> files
>>>> +                                were found.
>>>> +
>>>> +  @retval EFI_SUCCESS           Files found.
>>>> +  @retval EFI_NOT_FOUND         No files found.
>>>> +  @retval EFI_NO_MEDIA          The device has no media.
>>>> +  @retval EFI_DEVICE_ERROR      The device reported an error.
>>>> +  @retval EFI_VOLUME_CORRUPTED  The file system structures are
>>>> corrupted.
>>>> +**/
>>>> +typedef
>>>> +EFI_STATUS
>>>> +(EFIAPI *EFI_SHELL_FIND_FILES)(
>>>> +  IN CONST CHAR16               *FilePattern,
>>>> +  OUT EFI_SHELL_FILE_INFO       **FileList
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Find all files in a specified directory.
>>>> +
>>>> +  @param[in] FileDirHandle      Handle of the directory to search.
>>>> +  @param[out] FileList          On return, points to the list of files in the
>>>> directory
>>>> +                                or NULL if there are no files in the directory.
>>>> +
>>>> +  @retval EFI_SUCCESS           File information was returned successfully.
>>>> +  @retval EFI_VOLUME_CORRUPTED  The file system structures have
>>> been
>>>> corrupted.
>>>> +  @retval EFI_DEVICE_ERROR      The device reported an error.
>>>> +  @retval EFI_NO_MEDIA          The device media is not present.
>>>> +**/
>>>> +typedef
>>>> +EFI_STATUS
>>>> +(EFIAPI *EFI_SHELL_FIND_FILES_IN_DIR)(
>>>> +IN SHELL_FILE_HANDLE            FileDirHandle,
>>>> +OUT EFI_SHELL_FILE_INFO         **FileList
>>>> +);
>>>> +
>>>> +/**
>>>> +  Flushes data back to a device.
>>>> +
>>>> +  This function flushes all modified data associated with a file to a device.
>>>> +
>>>> +  @param[in] FileHandle         The handle of the file to flush.
>>>> +
>>>> +  @retval EFI_SUCCESS           The data was flushed.
>>>> +  @retval EFI_NO_MEDIA          The device has no medium.
>>>> +  @retval EFI_DEVICE_ERROR      The device reported an error.
>>>> +  @retval EFI_VOLUME_CORRUPTED  The file system structures are
>>>> corrupted.
>>>> +  @retval EFI_WRITE_PROTECTED   The file or medium is write-protected.
>>>> +  @retval EFI_ACCESS_DENIED     The file was opened read-only.
>>>> +  @retval EFI_VOLUME_FULL       The volume is full.
>>>> +**/
>>>> +typedef
>>>> +EFI_STATUS
>>>> +(EFIAPI *EFI_SHELL_FLUSH_FILE)(
>>>> +  IN SHELL_FILE_HANDLE FileHandle
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Frees the file list.
>>>> +
>>>> +  This function cleans up the file list and any related data structures. It has
>>> no
>>>> +  impact on the files themselves.
>>>> +
>>>> +  @param[in] FileList           The file list to free. Type EFI_SHELL_FILE_INFO
>> is
>>>> +                                defined in OpenFileList().
>>>> +
>>>> +  @retval EFI_SUCCESS           Free the file list successfully.
>>>> +**/
>>>> +typedef
>>>> +EFI_STATUS
>>>> +(EFIAPI *EFI_SHELL_FREE_FILE_LIST) (
>>>> +  IN EFI_SHELL_FILE_INFO **FileList
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Returns the current directory on the specified device.
>>>> +
>>>> +  If FileSystemMapping is NULL, it returns the current working directory. If
>>>> the
>>>> +  FileSystemMapping is not NULL, it returns the current directory
>>> associated
>>>> with the
>>>> +  FileSystemMapping. In both cases, the returned name includes the file
>>>> system
>>>> +  mapping (i.e. fs0:\current-dir).
>>>> +
>>>> +  Note that the current directory string should exclude the tailing backslash
>>>> character.
>>>> +
>>>> +  @param[in] FileSystemMapping  A pointer to the file system mapping. If
>>>> NULL,
>>>> +                                then the current working directory is returned.
>>>> +
>>>> +  @retval !=NULL                The current directory.
>>>> +  @retval NULL                  Current directory does not exist.
>>>> +**/
>>>> +typedef
>>>> +CONST CHAR16 *
>>>> +(EFIAPI *EFI_SHELL_GET_CUR_DIR) (
>>>> +  IN CONST CHAR16 *FileSystemMapping OPTIONAL
>>>> +  );
>>>> +
>>>> +typedef UINT32 EFI_SHELL_DEVICE_NAME_FLAGS;
>>>> +#define EFI_DEVICE_NAME_USE_COMPONENT_NAME  0x00000001
>>>> +#define EFI_DEVICE_NAME_USE_DEVICE_PATH     0x00000002
>>>> +
>>>> +/**
>>>> +  Gets the name of the device specified by the device handle.
>>>> +
>>>> +  This function gets the user-readable name of the device specified by the
>>>> device
>>>> +  handle. If no user-readable name could be generated, then
>>>> *BestDeviceName will be
>>>> +  NULL and EFI_NOT_FOUND will be returned.
>>>> +
>>>> +  If EFI_DEVICE_NAME_USE_COMPONENT_NAME is set, then the
>>> function
>>>> will return the
>>>> +  device's name using the EFI_COMPONENT_NAME2_PROTOCOL, if
>>> present
>>>> on
>>>> +  DeviceHandle.
>>>> +
>>>> +  If EFI_DEVICE_NAME_USE_DEVICE_PATH is set, then the function will
>>>> return the
>>>> +  device's name using the EFI_DEVICE_PATH_PROTOCOL, if present on
>>>> DeviceHandle.
>>>> +  If both EFI_DEVICE_NAME_USE_COMPONENT_NAME and
>>>> +  EFI_DEVICE_NAME_USE_DEVICE_PATH are set, then
>>>> +  EFI_DEVICE_NAME_USE_COMPONENT_NAME will have higher priority.
>>>> +
>>>> +  @param[in] DeviceHandle       The handle of the device.
>>>> +  @param[in] Flags              Determines the possible sources of component
>>>> names.
>>>> +  @param[in] Language           A pointer to the language specified for the
>>>> device
>>>> +                                name, in the same format as described in the
>> UEFI
>>>> +                                specification, Appendix M.
>>>> +  @param[out] BestDeviceName    On return, points to the callee-
>>> allocated
>>>> NULL-
>>>> +                                terminated name of the device. If no device name
>>>> +                                could be found, points to NULL. The name must be
>>>> +                                freed by the caller...
>>>> +
>>>> +  @retval EFI_SUCCESS           Get the name successfully.
>>>> +  @retval EFI_NOT_FOUND         Fail to get the device name.
>>>> +**/
>>>> +typedef
>>>> +EFI_STATUS
>>>> +(EFIAPI *EFI_SHELL_GET_DEVICE_NAME) (
>>>> +  IN EFI_HANDLE                   DeviceHandle,
>>>> +  IN EFI_SHELL_DEVICE_NAME_FLAGS  Flags,
>>>> +  IN CHAR8                        *Language,
>>>> +  OUT CHAR16                      **BestDeviceName
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Gets the device path from the mapping.
>>>> +
>>>> +  This function gets the device path associated with a mapping.
>>>> +
>>>> +  @param[in] Mapping                A pointer to the mapping
>>>> +
>>>> +  @retval !=NULL                Pointer to the device path that corresponds to
>>> the
>>>> +                                device mapping. The returned pointer does not
>> need
>>>> +                                to be freed.
>>>> +  @retval NULL                  There is no device path associated with the
>>>> +                                specified mapping.
>>>> +**/
>>>> +typedef
>>>> +CONST EFI_DEVICE_PATH_PROTOCOL *
>>>> +(EFIAPI *EFI_SHELL_GET_DEVICE_PATH_FROM_MAP) (
>>>> +  IN CONST CHAR16 *Mapping
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Converts a file system style name to a device path.
>>>> +
>>>> +  This function converts a file system style name to a device path, by
>>>> replacing any
>>>> +  mapping references to the associated device path.
>>>> +
>>>> +  @param[in] Path               The pointer to the path.
>>>> +
>>>> +  @return                       The pointer of the file path. The file path is
>> callee
>>>> +                                allocated and should be freed by the caller.
>>>> +**/
>>>> +typedef
>>>> +EFI_DEVICE_PATH_PROTOCOL *
>>>> +(EFIAPI *EFI_SHELL_GET_DEVICE_PATH_FROM_FILE_PATH) (
>>>> +  IN CONST CHAR16 *Path
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Gets either a single or list of environment variables.
>>>> +
>>>> +  If name is not NULL then this function returns the current value of the
>>>> specified
>>>> +  environment variable.
>>>> +
>>>> +  If Name is NULL than a list of all environment variable names is returned.
>>>> Each a
>>>> +  NULL terminated string with a double NULL terminating the list.
>>>> +
>>>> +  @param[in] Name               A pointer to the environment variable name.
>>> If
>>>> +                                Name is NULL, then the function will return all
>>>> +                                of the defined shell environment variables.  In
>>>> +                                the case where multiple environment variables
>> are
>>>> +                                being returned, each variable will be terminated
>> by
>>>> +                                a NULL, and the list will be terminated by a
>> double
>>>> +                                NULL.
>>>> +
>>>> +  @return                       A pointer to the returned string.
>>>> +                                The returned pointer does not need to be freed
>> by the
>>>> caller.
>>>> +
>>>> +  @retval NULL                  The environment variable doesn't exist or there
>>> are
>>>> +                                no environment variables.
>>>> +**/
>>>> +typedef
>>>> +CONST CHAR16 *
>>>> +(EFIAPI *EFI_SHELL_GET_ENV) (
>>>> +  IN CONST CHAR16 *Name OPTIONAL
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Gets the environment variable and Attributes, or list of environment
>>>> variables.  Can be
>>>> +  used instead of GetEnv().
>>>> +
>>>> +  This function returns the current value of the specified environment
>>>> variable and
>>>> +  the Attributes. If no variable name was specified, then all of the known
>>>> +  variables will be returned.
>>>> +
>>>> +  @param[in] Name               A pointer to the environment variable name. If
>>>> Name is NULL,
>>>> +                                then the function will return all of the defined
>> shell
>>>> +                                environment variables. In the case where
>> multiple
>>>> environment
>>>> +                                variables are being returned, each variable will
>> be
>>>> terminated
>>>> +                                by a NULL, and the list will be terminated by a
>> double
>>> NULL.
>>>> +  @param[out] Attributes        If not NULL, a pointer to the returned
>>>> attributes bitmask for
>>>> +                                the environment variable. In the case where Name
>> is
>>> NULL,
>>>> and
>>>> +                                multiple environment variables are being
>> returned,
>>>> Attributes
>>>> +                                is undefined.
>>>> +
>>>> +  @retval NULL                  The environment variable doesn't exist.
>>>> +  @return                       The environment variable's value. The returned
>>>> pointer does not
>>>> +                                need to be freed by the caller.
>>>> +**/
>>>> +typedef
>>>> +CONST CHAR16 *
>>>> +(EFIAPI *EFI_SHELL_GET_ENV_EX) (
>>>> +  IN  CONST CHAR16 *Name,
>>>> +  OUT       UINT32 *Attributes OPTIONAL
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Gets the file information from an open file handle.
>>>> +
>>>> +  This function allocates a buffer to store the file's information. It's the
>>>> caller's
>>>> +  responsibility to free the buffer.
>>>> +
>>>> +  @param[in] FileHandle         A File Handle.
>>>> +
>>>> +  @retval NULL                  Cannot get the file info.
>>>> +  @return                       A pointer to a buffer with file information.
>>>> +**/
>>>> +typedef
>>>> +EFI_FILE_INFO *
>>>> +(EFIAPI *EFI_SHELL_GET_FILE_INFO)(
>>>> +  IN SHELL_FILE_HANDLE FileHandle
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Converts a device path to a file system-style path.
>>>> +
>>>> +  This function converts a device path to a file system path by replacing
>>> part,
>>>> or all, of
>>>> +  the device path with the file-system mapping. If there are more than
>>> one
>>>> application
>>>> +  file system mappings, the one that most closely matches Path will be
>>> used.
>>>> +
>>>> +  @param[in] Path               The pointer to the device path.
>>>> +
>>>> +  @return                       The pointer of the NULL-terminated file path.
>> The
>>> path
>>>> +                                is callee-allocated and should be freed by the
>> caller.
>>>> +**/
>>>> +typedef
>>>> +CHAR16 *
>>>> +(EFIAPI *EFI_SHELL_GET_FILE_PATH_FROM_DEVICE_PATH) (
>>>> +  IN CONST EFI_DEVICE_PATH_PROTOCOL *Path
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Gets a file's current position.
>>>> +
>>>> +  This function returns the current file position for the file handle. For
>>>> directories, the
>>>> +  current file position has no meaning outside of the file system driver and
>>>> as such, the
>>>> +  operation is not supported.
>>>> +
>>>> +  @param[in] FileHandle         The file handle on which to get the current
>>>> position.
>>>> +  @param[out] Position          Byte position from the start of the file.
>>>> +
>>>> +  @retval EFI_SUCCESS           Data was accessed.
>>>> +  @retval EFI_UNSUPPORTED       The request is not valid on open
>>>> directories.
>>>> +**/
>>>> +typedef
>>>> +EFI_STATUS
>>>> +(EFIAPI *EFI_SHELL_GET_FILE_POSITION)(
>>>> +  IN SHELL_FILE_HANDLE FileHandle,
>>>> +  OUT UINT64 *Position
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Gets the size of a file.
>>>> +
>>>> +  This function returns the size of the file specified by FileHandle.
>>>> +
>>>> +  @param[in] FileHandle         The handle of the file.
>>>> +  @param[out] Size              The size of this file.
>>>> +
>>>> +  @retval EFI_SUCCESS           Get the file's size.
>>>> +  @retval EFI_DEVICE_ERROR      Can't access the file.
>>>> +**/
>>>> +typedef
>>>> +EFI_STATUS
>>>> +(EFIAPI *EFI_SHELL_GET_FILE_SIZE)(
>>>> +  IN SHELL_FILE_HANDLE FileHandle,
>>>> +  OUT UINT64 *Size
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Get the GUID value from a human readable name.
>>>> +
>>>> +  If GuidName is a known GUID name, then update Guid to have the
>>> correct
>>>> value for
>>>> +  that GUID.
>>>> +
>>>> +  This function is only available when the major and minor versions in the
>>>> +  EfiShellProtocol are greater than or equal to 2 and 1, respectively.
>>>> +
>>>> +  @param[in]  GuidName   A pointer to the localized name for the GUID
>>>> being queried.
>>>> +  @param[out] Guid       A pointer to the GUID structure to be filled in.
>>>> +
>>>> +  @retval EFI_SUCCESS             The operation was successful.
>>>> +  @retval EFI_INVALID_PARAMETER   Guid was NULL.
>>>> +  @retval EFI_INVALID_PARAMETER   GuidName was NULL.
>>>> +  @retval EFI_NOT_FOUND           GuidName is not a known GUID Name.
>>>> +**/
>>>> +typedef
>>>> +EFI_STATUS
>>>> +(EFIAPI *EFI_SHELL_GET_GUID_FROM_NAME)(
>>>> +  IN  CONST CHAR16   *GuidName,
>>>> +  OUT       EFI_GUID *Guid
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Get the human readable name for a GUID from the value.
>>>> +
>>>> +  If Guid is assigned a name, then update *GuidName to point to the
>>> name.
>>>> The callee
>>>> +  should not modify the value.
>>>> +
>>>> +  This function is only available when the major and minor versions in the
>>>> +  EfiShellProtocol are greater than or equal to 2 and 1, respectively.
>>>> +
>>>> +  @param[in]  Guid       A pointer to the GUID being queried.
>>>> +  @param[out] GuidName   A pointer to a pointer the localized to name
>>> for
>>>> the GUID being requested
>>>> +
>>>> +  @retval EFI_SUCCESS             The operation was successful.
>>>> +  @retval EFI_INVALID_PARAMETER   Guid was NULL.
>>>> +  @retval EFI_INVALID_PARAMETER   GuidName was NULL.
>>>> +  @retval EFI_NOT_FOUND           Guid is not assigned a name.
>>>> +**/
>>>> +typedef
>>>> +EFI_STATUS
>>>> +(EFIAPI *EFI_SHELL_GET_GUID_NAME)(
>>>> +  IN  CONST EFI_GUID *Guid,
>>>> +  OUT CONST CHAR16   **GuidName
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Return help information about a specific command.
>>>> +
>>>> +  This function returns the help information for the specified command.
>>> The
>>>> help text
>>>> +  can be internal to the shell or can be from a UEFI Shell manual page.
>>>> +
>>>> +  If Sections is specified, then each section name listed will be compared in
>>> a
>>>> casesensitive
>>>> +  manner, to the section names described in Appendix B. If the section
>>>> exists,
>>>> +  it will be appended to the returned help text. If the section does not
>>> exist,
>>>> no
>>>> +  information will be returned. If Sections is NULL, then all help text
>>>> information
>>>> +  available will be returned.
>>>> +
>>>> +  @param[in] Command            Points to the NULL-terminated UEFI Shell
>>>> command name.
>>>> +  @param[in] Sections           Points to the NULL-terminated comma-
>>>> delimited
>>>> +                                section names to return. If NULL, then all
>>>> +                                sections will be returned.
>>>> +  @param[out] HelpText          On return, points to a callee-allocated buffer
>>>> +                                containing all specified help text.
>>>> +
>>>> +  @retval EFI_SUCCESS           The help text was returned.
>>>> +  @retval EFI_OUT_OF_RESOURCES  The necessary buffer could not be
>>>> allocated to hold the
>>>> +                                returned help text.
>>>> +  @retval EFI_INVALID_PARAMETER HelpText is NULL.
>>>> +  @retval EFI_NOT_FOUND         There is no help text available for
>>>> Command.
>>>> +**/
>>>> +typedef
>>>> +EFI_STATUS
>>>> +(EFIAPI *EFI_SHELL_GET_HELP_TEXT) (
>>>> +  IN CONST CHAR16 *Command,
>>>> +  IN CONST CHAR16 *Sections OPTIONAL,
>>>> +  OUT CHAR16 **HelpText
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Gets the mapping(s) that most closely matches the device path.
>>>> +
>>>> +  This function gets the mapping which corresponds to the device path
>>>> *DevicePath. If
>>>> +  there is no exact match, then the mapping which most closely matches
>>>> *DevicePath
>>>> +  is returned, and *DevicePath is updated to point to the remaining
>>> portion
>>>> of the
>>>> +  device path. If there is an exact match, the mapping is returned and
>>>> *DevicePath
>>>> +  points to the end-of-device-path node.
>>>> +
>>>> +  If there are multiple map names they will be semi-colon seperated in the
>>>> +  NULL-terminated string.
>>>> +
>>>> +  @param[in, out] DevicePath     On entry, points to a device path pointer.
>>>> On
>>>> +                                 exit, updates the pointer to point to the
>>>> +                                 portion of the device path after the mapping.
>>>> +
>>>> +  @retval NULL                  No mapping was found.
>>>> +  @retval !=NULL                Pointer to NULL-terminated mapping. The buffer
>>>> +                                is callee allocated and should be freed by the
>> caller.
>>>> +**/
>>>> +typedef
>>>> +CONST CHAR16 *
>>>> +(EFIAPI *EFI_SHELL_GET_MAP_FROM_DEVICE_PATH) (
>>>> +  IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Gets the enable status of the page break output mode.
>>>> +
>>>> +  User can use this function to determine current page break mode.
>>>> +
>>>> +  @retval TRUE                  The page break output mode is enabled.
>>>> +  @retval FALSE                 The page break output mode is disabled.
>>>> +**/
>>>> +typedef
>>>> +BOOLEAN
>>>> +(EFIAPI *EFI_SHELL_GET_PAGE_BREAK) (
>>>> +  VOID
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Judges whether the active shell is the root shell.
>>>> +
>>>> +  This function makes the user to know that whether the active Shell is the
>>>> root shell.
>>>> +
>>>> +  @retval TRUE                  The active Shell is the root Shell.
>>>> +  @retval FALSE                 The active Shell is NOT the root Shell.
>>>> +**/
>>>> +typedef
>>>> +BOOLEAN
>>>> +(EFIAPI *EFI_SHELL_IS_ROOT_SHELL) (
>>>> +VOID
>>>> +);
>>>> +
>>>> +/**
>>>> +  Opens a file or a directory by file name.
>>>> +
>>>> +  This function opens the specified file in the specified OpenMode and
>>>> returns a file
>>>> +  handle.
>>>> +  If the file name begins with '>v', then the file handle which is returned
>>>> refers to the
>>>> +  shell environment variable with the specified name. If the shell
>>>> environment variable
>>>> +  exists, is non-volatile and the OpenMode indicates
>>>> EFI_FILE_MODE_WRITE, then
>>>> +  EFI_INVALID_PARAMETER is returned.
>>>> +
>>>> +  If the file name is '>i', then the file handle which is returned refers to the
>>>> standard
>>>> +  input. If the OpenMode indicates EFI_FILE_MODE_WRITE, then
>>>> EFI_INVALID_PARAMETER
>>>> +  is returned.
>>>> +
>>>> +  If the file name is '>o', then the file handle which is returned refers to
>>> the
>>>> standard
>>>> +  output. If the OpenMode indicates EFI_FILE_MODE_READ, then
>>>> EFI_INVALID_PARAMETER
>>>> +  is returned.
>>>> +
>>>> +  If the file name is '>e', then the file handle which is returned refers to
>>> the
>>>> standard
>>>> +  error. If the OpenMode indicates EFI_FILE_MODE_READ, then
>>>> EFI_INVALID_PARAMETER
>>>> +  is returned.
>>>> +
>>>> +  If the file name is 'NUL', then the file handle that is returned refers to the
>>>> standard NUL
>>>> +  file. If the OpenMode indicates EFI_FILE_MODE_READ, then
>>>> EFI_INVALID_PARAMETER is
>>>> +  returned.
>>>> +
>>>> +  If return EFI_SUCCESS, the FileHandle is the opened file's handle, else,
>>> the
>>>> +  FileHandle is NULL.
>>>> +
>>>> +  @param[in] FileName           Points to the NULL-terminated UCS-2
>>> encoded
>>>> file name.
>>>> +  @param[out] FileHandle        On return, points to the file handle.
>>>> +  @param[in] OpenMode           File open mode. Either
>>>> EFI_FILE_MODE_READ or
>>>> +                                EFI_FILE_MODE_WRITE from section 12.4 of the
>> UEFI
>>>> +                                Specification.
>>>> +  @retval EFI_SUCCESS           The file was opened. FileHandle has the
>>>> opened file's handle.
>>>> +  @retval EFI_INVALID_PARAMETER One of the parameters has an invalid
>>>> value. FileHandle is NULL.
>>>> +  @retval EFI_UNSUPPORTED       Could not open the file path. FileHandle
>>> is
>>>> NULL.
>>>> +  @retval EFI_NOT_FOUND         The specified file could not be found on
>>> the
>>>> device or the file
>>>> +                                system could not be found on the device.
>> FileHandle is
>>>> NULL.
>>>> +  @retval EFI_NO_MEDIA          The device has no medium. FileHandle is
>>>> NULL.
>>>> +  @retval EFI_MEDIA_CHANGED     The device has a different medium in it
>>>> or the medium is no
>>>> +                                longer supported. FileHandle is NULL.
>>>> +  @retval EFI_DEVICE_ERROR      The device reported an error or can't get
>>>> the file path according
>>>> +                                the FileName. FileHandle is NULL.
>>>> +  @retval EFI_VOLUME_CORRUPTED  The file system structures are
>>>> corrupted. FileHandle is NULL.
>>>> +  @retval EFI_WRITE_PROTECTED   An attempt was made to create a file,
>>> or
>>>> open a file for write
>>>> +                                when the media is write-protected. FileHandle is
>> NULL.
>>>> +  @retval EFI_ACCESS_DENIED     The service denied access to the file.
>>>> FileHandle is NULL.
>>>> +  @retval EFI_OUT_OF_RESOURCES  Not enough resources were available
>>>> to open the file. FileHandle
>>>> +                                is NULL.
>>>> +  @retval EFI_VOLUME_FULL       The volume is full. FileHandle is NULL.
>>>> +**/
>>>> +typedef
>>>> +EFI_STATUS
>>>> +(EFIAPI *EFI_SHELL_OPEN_FILE_BY_NAME) (
>>>> +  IN CONST CHAR16 *FileName,
>>>> +  OUT SHELL_FILE_HANDLE *FileHandle,
>>>> +  IN UINT64 OpenMode
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Opens the files that match the path specified.
>>>> +
>>>> +  This function opens all of the files specified by Path. Wildcards are
>>>> processed
>>>> +  according to the rules specified in UEFI Shell 2.0 spec section 3.7.1. Each
>>>> +  matching file has an EFI_SHELL_FILE_INFO structure created in a linked
>>> list.
>>>> +
>>>> +  @param[in] Path                A pointer to the path string.
>>>> +  @param[in] OpenMode            Specifies the mode used to open each file,
>>>> EFI_FILE_MODE_READ or
>>>> +                                 EFI_FILE_MODE_WRITE.
>>>> +  @param[in, out] FileList       Points to the start of a list of files opened.
>>>> +
>>>> +  @retval EFI_SUCCESS           Create the file list successfully.
>>>> +  @return                       Can't create the file list.
>>>> +**/
>>>> +typedef
>>>> +EFI_STATUS
>>>> +(EFIAPI *EFI_SHELL_OPEN_FILE_LIST) (
>>>> +  IN CHAR16 *Path,
>>>> +  IN UINT64 OpenMode,
>>>> +  IN OUT EFI_SHELL_FILE_INFO **FileList
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Opens the root directory of a device.
>>>> +
>>>> +  This function opens the root directory of a device and returns a file
>>> handle
>>>> to it.
>>>> +
>>>> +  @param[in] DevicePath         Points to the device path corresponding to
>>> the
>>>> device where the
>>>> +                                EFI_SIMPLE_FILE_SYSTEM_PROTOCOL is installed.
>>>> +  @param[out] FileHandle        On exit, points to the file handle
>>>> corresponding to the root directory on the
>>>> +                                device.
>>>> +
>>>> +  @retval EFI_SUCCESS           Root opened successfully.
>>>> +  @retval EFI_NOT_FOUND         EFI_SIMPLE_FILE_SYSTEM could not be
>>>> found or the root directory
>>>> +                                could not be opened.
>>>> +  @retval EFI_VOLUME_CORRUPTED  The data structures in the volume
>>>> were corrupted.
>>>> +  @retval EFI_DEVICE_ERROR      The device had an error.
>>>> +**/
>>>> +typedef
>>>> +EFI_STATUS
>>>> +(EFIAPI *EFI_SHELL_OPEN_ROOT)(
>>>> +  IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
>>>> +  OUT SHELL_FILE_HANDLE *FileHandle
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Opens the root directory of a device on a handle.
>>>> +
>>>> +  This function opens the root directory of a device and returns a file
>>> handle
>>>> to it.
>>>> +
>>>> +  @param[in] DeviceHandle       The handle of the device that contains the
>>>> volume.
>>>> +  @param[out] FileHandle        On exit, points to the file handle
>>>> corresponding to the root directory on the
>>>> +                                device.
>>>> +
>>>> +  @retval EFI_SUCCESS           Root opened successfully.
>>>> +  @retval EFI_NOT_FOUND         EFI_SIMPLE_FILE_SYSTEM could not be
>>>> found or the root directory
>>>> +                                could not be opened.
>>>> +  @retval EFI_VOLUME_CORRUPTED  The data structures in the volume
>>>> were corrupted.
>>>> +  @retval EFI_DEVICE_ERROR      The device had an error.
>>>> +**/
>>>> +typedef
>>>> +EFI_STATUS
>>>> +(EFIAPI *EFI_SHELL_OPEN_ROOT_BY_HANDLE)(
>>>> +  IN EFI_HANDLE DeviceHandle,
>>>> +  OUT SHELL_FILE_HANDLE *FileHandle
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Reads data from the file.
>>>> +
>>>> +  If FileHandle is not a directory, the function reads the requested number
>>>> of bytes
>>>> +  from the file at the file's current position and returns them in Buffer. If
>>> the
>>>> read goes
>>>> +  beyond the end of the file, the read length is truncated to the end of the
>>>> file. The file's
>>>> +  current position is increased by the number of bytes returned.
>>>> +  If FileHandle is a directory, then an error is returned.
>>>> +
>>>> +  @param[in] FileHandle          The opened file handle for read.
>>>> +  @param[in] ReadSize            On input, the size of Buffer, in bytes. On
>>>> output, the amount of data read.
>>>> +  @param[in, out] Buffer         The buffer in which data is read.
>>>> +
>>>> +  @retval EFI_SUCCESS           Data was read.
>>>> +  @retval EFI_NO_MEDIA          The device has no media.
>>>> +  @retval EFI_DEVICE_ERROR      The device reported an error.
>>>> +  @retval EFI_VOLUME_CORRUPTED  The file system structures are
>>>> corrupted.
>>>> +  @retval EFI_BUFFER_TO_SMALL   Buffer is too small. ReadSize contains
>>>> required size.
>>>> +**/
>>>> +typedef
>>>> +EFI_STATUS
>>>> +(EFIAPI *EFI_SHELL_READ_FILE) (
>>>> +  IN SHELL_FILE_HANDLE FileHandle,
>>>> +  IN OUT UINTN *ReadSize,
>>>> +  IN OUT VOID *Buffer
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Register a GUID and a localized human readable name for it.
>>>> +
>>>> +  If Guid is not assigned a name, then assign GuidName to Guid.  This list of
>>>> GUID
>>>> +  names must be used whenever a shell command outputs GUID
>>>> information.
>>>> +
>>>> +  This function is only available when the major and minor versions in the
>>>> +  EfiShellProtocol are greater than or equal to 2 and 1, respectively.
>>>> +
>>>> +  @param[in] Guid       A pointer to the GUID being registered.
>>>> +  @param[in] GuidName   A pointer to the localized name for the GUID
>>>> being registered.
>>>> +
>>>> +  @retval EFI_SUCCESS             The operation was successful.
>>>> +  @retval EFI_INVALID_PARAMETER   Guid was NULL.
>>>> +  @retval EFI_INVALID_PARAMETER   GuidName was NULL.
>>>> +  @retval EFI_ACCESS_DENIED       Guid already is assigned a name.
>>>> +**/
>>>> +typedef
>>>> +EFI_STATUS
>>>> +(EFIAPI *EFI_SHELL_REGISTER_GUID_NAME)(
>>>> +  IN CONST EFI_GUID *Guid,
>>>> +  IN CONST CHAR16   *GuidName
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Deletes the duplicate file names files in the given file list.
>>>> +
>>>> +  @param[in] FileList           A pointer to the first entry in the file list.
>>>> +
>>>> +  @retval EFI_SUCCESS           Always success.
>>>> +**/
>>>> +typedef
>>>> +EFI_STATUS
>>>> +(EFIAPI *EFI_SHELL_REMOVE_DUP_IN_FILE_LIST) (
>>>> +  IN EFI_SHELL_FILE_INFO **FileList
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Changes a shell command alias.
>>>> +
>>>> +  This function creates an alias for a shell command.
>>>> +
>>>> +  @param[in] Command            Points to the NULL-terminated shell
>>>> command or existing alias.
>>>> +  @param[in] Alias              Points to the NULL-terminated alias for the
>> shell
>>>> command. If this is NULL, and
>>>> +                                Command refers to an alias, that alias will be
>> deleted.
>>>> +  @param[in] Replace            If TRUE and the alias already exists, then the
>>>> existing alias will be replaced. If
>>>> +                                FALSE and the alias already exists, then the
>> existing alias is
>>>> unchanged and
>>>> +                                EFI_ACCESS_DENIED is returned.
>>>> +  @param[in] Volatile           if TRUE the Alias being set will be stored in a
>>>> volatile fashion.  if FALSE the
>>>> +                                Alias being set will be stored in a non-volatile
>> fashion.
>>>> +
>>>> +  @retval EFI_SUCCESS           Alias created or deleted successfully.
>>>> +  @retval EFI_ACCESS_DENIED     The alias is a built-in alias or already
>>> existed
>>>> and Replace was set to
>>>> +                                FALSE.
>>>> +**/
>>>> +typedef
>>>> +EFI_STATUS
>>>> +(EFIAPI *EFI_SHELL_SET_ALIAS)(
>>>> +  IN CONST CHAR16 *Command,
>>>> +  IN CONST CHAR16 *Alias,
>>>> +  IN BOOLEAN Replace,
>>>> +  IN BOOLEAN Volatile
>>>> +  );
>>>> +
>>>> +/**
>>>> +  This function returns the command associated with a alias or a list of all
>>>> +  alias'.
>>>> +
>>>> +  @param[in] Alias              Points to the NULL-terminated shell alias.
>>>> +                                If this parameter is NULL, then all
>>>> +                                aliases will be returned in ReturnedData.
>>>> +  @param[out] Volatile          Upon return of a single command if TRUE
>>>> indicates
>>>> +                                this is stored in a volatile fashion.  FALSE
>> otherwise.
>>>> +  @return                      	If Alias is not NULL, it will return a
>> pointer to
>>>> +                                the NULL-terminated command for that alias.
>>>> +                                If Alias is NULL, ReturnedData points to a ';'
>>>> +                                delimited list of alias (e.g.
>>>> +                                ReturnedData = "dir;del;copy;mfp") that is NULL-
>>>> terminated.
>>>> +  @retval NULL                  An error ocurred.
>>>> +  @retval NULL                  Alias was not a valid Alias.
>>>> +**/
>>>> +typedef
>>>> +CONST CHAR16 *
>>>> +(EFIAPI *EFI_SHELL_GET_ALIAS)(
>>>> +  IN  CONST CHAR16 *Alias,
>>>> +  OUT BOOLEAN      *Volatile OPTIONAL
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Changes the current directory on the specified device.
>>>> +
>>>> +  If the FileSystem is NULL, and the directory Dir does not contain a file
>>>> system's
>>>> +  mapped name, this function changes the current working directory. If
>>>> FileSystem is
>>>> +  NULL and the directory Dir contains a mapped name, then the current
>>> file
>>>> system and
>>>> +  the current directory on that file system are changed.
>>>> +
>>>> +  If FileSystem is not NULL, and Dir is NULL, then this changes the current
>>>> working file
>>>> +  system.
>>>> +
>>>> +  If FileSystem is not NULL and Dir is not NULL, then this function changes
>>>> the current
>>>> +  directory on the specified file system.
>>>> +
>>>> +  If the current working directory or the current working file system is
>>>> changed then the
>>>> +  %cwd% environment variable will be updated.
>>>> +
>>>> +  @param[in] FileSystem         A pointer to the file system's mapped name.
>>> If
>>>> NULL, then the current working
>>>> +                                directory is changed.
>>>> +  @param[in] Dir                Points to the NULL-terminated directory on the
>>>> device specified by FileSystem.
>>>> +
>>>> +  @retval NULL                  Current directory does not exist.
>>>> +  @return                       The current directory.
>>>> +**/
>>>> +typedef
>>>> +EFI_STATUS
>>>> +(EFIAPI *EFI_SHELL_SET_CUR_DIR) (
>>>> +  IN CONST CHAR16 *FileSystem OPTIONAL,
>>>> +  IN CONST CHAR16 *Dir
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Sets the environment variable.
>>>> +
>>>> +  This function changes the current value of the specified environment
>>>> variable. If the
>>>> +  environment variable exists and the Value is an empty string, then the
>>>> environment
>>>> +  variable is deleted. If the environment variable exists and the Value is
>>> not
>>>> an empty
>>>> +  string, then the value of the environment variable is changed. If the
>>>> environment
>>>> +  variable does not exist and the Value is an empty string, there is no
>>> action.
>>>> If the
>>>> +  environment variable does not exist and the Value is a non-empty string,
>>>> then the
>>>> +  environment variable is created and assigned the specified value.
>>>> +
>>>> +  For a description of volatile and non-volatile environment variables, see
>>>> UEFI Shell
>>>> +  2.0 specification section 3.6.1.
>>>> +
>>>> +  @param[in] Name               Points to the NULL-terminated environment
>>>> variable name.
>>>> +  @param[in] Value              Points to the NULL-terminated environment
>>>> variable value. If the value is an
>>>> +                                empty string then the environment variable is
>> deleted.
>>>> +  @param[in] Volatile           Indicates whether the variable is non-volatile
>>>> (FALSE) or volatile (TRUE).
>>>> +
>>>> +  @retval EFI_SUCCESS           The environment variable was successfully
>>>> updated.
>>>> +**/
>>>> +typedef
>>>> +EFI_STATUS
>>>> +(EFIAPI *EFI_SHELL_SET_ENV) (
>>>> +  IN CONST CHAR16 *Name,
>>>> +  IN CONST CHAR16 *Value,
>>>> +  IN BOOLEAN Volatile
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Sets the file information to an opened file handle.
>>>> +
>>>> +  This function changes file information.  All file information in the
>>>> EFI_FILE_INFO
>>>> +  struct will be updated to the passed in data.
>>>> +
>>>> +  @param[in] FileHandle         A file handle.
>>>> +  @param[in] FileInfo           Points to new file information.
>>>> +
>>>> +  @retval EFI_SUCCESS           The information was set.
>>>> +  @retval EFI_NO_MEDIA          The device has no medium.
>>>> +  @retval EFI_DEVICE_ERROR      The device reported an error.
>>>> +  @retval EFI_VOLUME_CORRUPTED  The file system structures are
>>>> corrupted.
>>>> +  @retval EFI_WRITE_PROTECTED   The file or medium is write-protected.
>>>> +  @retval EFI_ACCESS_DENIED     The file was opened read-only.
>>>> +  @retval EFI_VOLUME_FULL       The volume is full.
>>>> +  @retval EFI_BAD_BUFFER_SIZE   BufferSize is smaller than the size of
>>>> EFI_FILE_INFO.
>>>> +**/
>>>> +typedef
>>>> +EFI_STATUS
>>>> +(EFIAPI *EFI_SHELL_SET_FILE_INFO)(
>>>> +  IN SHELL_FILE_HANDLE FileHandle,
>>>> +  IN CONST EFI_FILE_INFO *FileInfo
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Sets a file's current position.
>>>> +
>>>> +  This function sets the current file position for the handle to the position
>>>> supplied. With
>>>> +  the exception of seeking to position 0xFFFFFFFFFFFFFFFF, only absolute
>>>> positioning is
>>>> +  supported, and seeking past the end of the file is allowed (a subsequent
>>>> write would
>>>> +  grow the file). Seeking to position 0xFFFFFFFFFFFFFFFF causes the
>>> current
>>>> position
>>>> +  to be set to the end of the file.
>>>> +
>>>> +  @param[in] FileHandle         The file handle on which requested position
>>>> will be set.
>>>> +  @param[in] Position           Byte position from the start of the file.
>>>> +
>>>> +  @retval EFI_SUCCESS           Data was written.
>>>> +  @retval EFI_UNSUPPORTED       The seek request for nonzero is not valid
>>>> on open directories.
>>>> +**/
>>>> +typedef
>>>> +EFI_STATUS
>>>> +(EFIAPI *EFI_SHELL_SET_FILE_POSITION)(
>>>> +  IN SHELL_FILE_HANDLE FileHandle,
>>>> +  IN UINT64 Position
>>>> +  );
>>>> +
>>>> +/**
>>>> +  This function creates a mapping for a device path.
>>>> +
>>>> +  @param[in] DevicePath         Points to the device path. If this is NULL and
>>>> Mapping points to a valid mapping,
>>>> +                                then the mapping will be deleted.
>>>> +  @param[in] Mapping            Points to the NULL-terminated mapping for
>>> the
>>>> device path.
>>>> +
>>>> +  @retval EFI_SUCCESS           Mapping created or deleted successfully.
>>>> +  @retval EFI_NO_MAPPING        There is no handle that corresponds
>>> exactly
>>>> to DevicePath. See the
>>>> +                                boot service function LocateDevicePath().
>>>> +  @retval EFI_ACCESS_DENIED     The mapping is a built-in alias.
>>>> +**/
>>>> +typedef
>>>> +EFI_STATUS
>>>> +(EFIAPI *EFI_SHELL_SET_MAP)(
>>>> +  IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath,
>>>> +  IN CONST CHAR16 *Mapping
>>>> +  );
>>>> +
>>>> +/**
>>>> +  Writes data to the file.
>>>> +
>>>> +  This function writes the specified number of bytes to the file at the
>>> current
>>>> file position.
>>>> +  The current file position is advanced the actual number of bytes written,
>>>> which is
>>>> +  returned in BufferSize. Partial writes only occur when there has been a
>>>> data error
>>>> +  during the write attempt (such as "volume space full"). The file
>>>> automatically grows to
>>>> +  hold the data, if required.
>>>> +
>>>> +  Direct writes to opened directories are not supported.
>>>> +
>>>> +  @param[in] FileHandle              The opened file handle for writing.
>>>> +  @param[in, out] BufferSize         On input, size of Buffer.
>>>> +  @param[in] Buffer                  The buffer in which data to write.
>>>> +
>>>> +  @retval EFI_SUCCESS               Data was written.
>>>> +  @retval EFI_UNSUPPORTED           Writes to open directory are not
>>>> supported.
>>>> +  @retval EFI_NO_MEDIA              The device has no media.
>>>> +  @retval EFI_DEVICE_ERROR          The device reported an error.
>>>> +  @retval EFI_VOLUME_CORRUPTED      The file system structures are
>>>> corrupted.
>>>> +  @retval EFI_WRITE_PROTECTED       The device is write-protected.
>>>> +  @retval EFI_ACCESS_DENIED         The file was open for read only.
>>>> +  @retval EFI_VOLUME_FULL           The volume is full.
>>>> +**/
>>>> +typedef
>>>> +EFI_STATUS
>>>> +(EFIAPI *EFI_SHELL_WRITE_FILE)(
>>>> +  IN SHELL_FILE_HANDLE          FileHandle,
>>>> +  IN OUT UINTN                  *BufferSize,
>>>> +  IN VOID                       *Buffer
>>>> +  );
>>>> +
>>>> +//
>>>> +// EFI_SHELL_PROTOCOL has been updated since UEFI Shell Spec 2.0
>>>> +// Usage of this protocol will require version checking before attempting
>>>> +// to use any new members.  There is no need to check the version for
>>>> +// members that existed in UEFI Shell Spec 2.0.
>>>> +//
>>>> +// Update below for any future UEFI Shell spec changes to this protocol.
>>>> +//
>>>> +// Check EFI_SHELL_PROTOCOL MajorVersion and MinorVersion:
>>>> +// if ((2 == gEfiShellProtocol->MajorVersion) &&
>>>> +//     (0 == gEfiShellProtocol->MinorVersion)) {
>>>> +//   //
>>>> +//   // Cannot call:
>>>> +//   // RegisterGuidName - UEFI Shell 2.1
>>>> +//   // GetGuidName      - UEFI Shell 2.1
>>>> +//   // GetGuidFromName  - UEFI Shell 2.1
>>>> +//   // GetEnvEx         - UEFI Shell 2.1
>>>> +//   //
>>>> +// } else {
>>>> +//   //
>>>> +//   // Can use all members
>>>> +//   //
>>>> +// }
>>>> +//
>>>> +typedef struct _EFI_SHELL_PROTOCOL {
>>>> +  EFI_SHELL_EXECUTE                         Execute;
>>>> +  EFI_SHELL_GET_ENV                         GetEnv;
>>>> +  EFI_SHELL_SET_ENV                         SetEnv;
>>>> +  EFI_SHELL_GET_ALIAS                       GetAlias;
>>>> +  EFI_SHELL_SET_ALIAS                       SetAlias;
>>>> +  EFI_SHELL_GET_HELP_TEXT                   GetHelpText;
>>>> +  EFI_SHELL_GET_DEVICE_PATH_FROM_MAP
>>> GetDevicePathFromMap;
>>>> +  EFI_SHELL_GET_MAP_FROM_DEVICE_PATH
>>> GetMapFromDevicePath;
>>>> +  EFI_SHELL_GET_DEVICE_PATH_FROM_FILE_PATH
>>>> GetDevicePathFromFilePath;
>>>> +  EFI_SHELL_GET_FILE_PATH_FROM_DEVICE_PATH
>>>> GetFilePathFromDevicePath;
>>>> +  EFI_SHELL_SET_MAP                         SetMap;
>>>> +  EFI_SHELL_GET_CUR_DIR                     GetCurDir;
>>>> +  EFI_SHELL_SET_CUR_DIR                     SetCurDir;
>>>> +  EFI_SHELL_OPEN_FILE_LIST                  OpenFileList;
>>>> +  EFI_SHELL_FREE_FILE_LIST                  FreeFileList;
>>>> +  EFI_SHELL_REMOVE_DUP_IN_FILE_LIST         RemoveDupInFileList;
>>>> +  EFI_SHELL_BATCH_IS_ACTIVE                 BatchIsActive;
>>>> +  EFI_SHELL_IS_ROOT_SHELL                   IsRootShell;
>>>> +  EFI_SHELL_ENABLE_PAGE_BREAK               EnablePageBreak;
>>>> +  EFI_SHELL_DISABLE_PAGE_BREAK              DisablePageBreak;
>>>> +  EFI_SHELL_GET_PAGE_BREAK                  GetPageBreak;
>>>> +  EFI_SHELL_GET_DEVICE_NAME                 GetDeviceName;
>>>> +  EFI_SHELL_GET_FILE_INFO                   GetFileInfo;
>>>> +  EFI_SHELL_SET_FILE_INFO                   SetFileInfo;
>>>> +  EFI_SHELL_OPEN_FILE_BY_NAME               OpenFileByName;
>>>> +  EFI_SHELL_CLOSE_FILE                      CloseFile;
>>>> +  EFI_SHELL_CREATE_FILE                     CreateFile;
>>>> +  EFI_SHELL_READ_FILE                       ReadFile;
>>>> +  EFI_SHELL_WRITE_FILE                      WriteFile;
>>>> +  EFI_SHELL_DELETE_FILE                     DeleteFile;
>>>> +  EFI_SHELL_DELETE_FILE_BY_NAME             DeleteFileByName;
>>>> +  EFI_SHELL_GET_FILE_POSITION               GetFilePosition;
>>>> +  EFI_SHELL_SET_FILE_POSITION               SetFilePosition;
>>>> +  EFI_SHELL_FLUSH_FILE                      FlushFile;
>>>> +  EFI_SHELL_FIND_FILES                      FindFiles;
>>>> +  EFI_SHELL_FIND_FILES_IN_DIR               FindFilesInDir;
>>>> +  EFI_SHELL_GET_FILE_SIZE                   GetFileSize;
>>>> +  EFI_SHELL_OPEN_ROOT                       OpenRoot;
>>>> +  EFI_SHELL_OPEN_ROOT_BY_HANDLE             OpenRootByHandle;
>>>> +  EFI_EVENT                                 ExecutionBreak;
>>>> +  UINT32                                    MajorVersion;
>>>> +  UINT32                                    MinorVersion;
>>>> +  // Added for Shell 2.1
>>>> +  EFI_SHELL_REGISTER_GUID_NAME              RegisterGuidName;
>>>> +  EFI_SHELL_GET_GUID_NAME                   GetGuidName;
>>>> +  EFI_SHELL_GET_GUID_FROM_NAME              GetGuidFromName;
>>>> +  EFI_SHELL_GET_ENV_EX                      GetEnvEx;
>>>> +} EFI_SHELL_PROTOCOL;
>>>> +
>>>> +extern EFI_GUID gEfiShellProtocolGuid;
>>>> +
>>>> +enum ShellVersion {
>>>> +  SHELL_MAJOR_VERSION = 2,
>>>> +  SHELL_MINOR_VERSION = 1
>>>> +};
>>>> +
>>>> +#endif
>>>> diff --git a/MdePkg/Include/Protocol/ShellDynamicCommand.h
>>>> b/MdePkg/Include/Protocol/ShellDynamicCommand.h
>>>> new file mode 100644
>>>> index 0000000..793b4fd
>>>> --- /dev/null
>>>> +++ b/MdePkg/Include/Protocol/ShellDynamicCommand.h
>>>> @@ -0,0 +1,85 @@
>>>> +/** @file
>>>> +  EFI Shell Dynamic Command registration protocol
>>>> +
>>>> +  (C) Copyright 2012-2014 Hewlett-Packard Development Company,
>>>> L.P.<BR>
>>>> +  Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
>>>> +  This program and the accompanying materials
>>>> +  are licensed and made available under the terms and conditions of the
>>> BSD
>>>> License
>>>> +  which accompanies this distribution.  The full text of the license may be
>>>> found at
>>>> +  http://opensource.org/licenses/bsd-license.php
>>>> +
>>>> +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>>>> BASIS,
>>>> +  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>>>> EXPRESS OR IMPLIED.
>>>> +
>>>> +**/
>>>> +
>>>> +#ifndef __EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL__
>>>> +#define __EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL__
>>>> +
>>>> +#include <Protocol/Shell.h>
>>>> +#include <Protocol/ShellParameters.h>
>>>> +
>>>> +// {3C7200E9-005F-4EA4-87DE-A3DFAC8A27C3}
>>>> +#define EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL_GUID \
>>>> +  { \
>>>> +  0x3c7200e9, 0x005f, 0x4ea4, { 0x87, 0xde, 0xa3, 0xdf, 0xac, 0x8a, 0x27,
>>> 0xc3
>>>> } \
>>>> +  }
>>>> +
>>>> +
>>>> +//
>>>> +// Define for forward reference.
>>>> +//
>>>> +typedef struct _EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL
>>>> EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL;
>>>> +
>>>> +
>>>> +/**
>>>> +  This is the shell command handler function pointer callback type.  This
>>>> +  function handles the command when it is invoked in the shell.
>>>> +
>>>> +  @param[in] This                   The instance of the
>>>> EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL.
>>>> +  @param[in] SystemTable            The pointer to the system table.
>>>> +  @param[in] ShellParameters        The parameters associated with the
>>>> command.
>>>> +  @param[in] Shell                  The instance of the shell protocol used in
>> the
>>>> context
>>>> +                                    of processing this command.
>>>> +
>>>> +  @return EFI_SUCCESS               the operation was sucessful
>>>> +  @return other                     the operation failed.
>>>> +**/
>>>> +typedef
>>>> +SHELL_STATUS
>>>> +(EFIAPI * SHELL_COMMAND_HANDLER)(
>>>> +  IN EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL    *This,
>>>> +  IN EFI_SYSTEM_TABLE                      *SystemTable,
>>>> +  IN EFI_SHELL_PARAMETERS_PROTOCOL         *ShellParameters,
>>>> +  IN EFI_SHELL_PROTOCOL                    *Shell
>>>> +  );
>>>> +
>>>> +/**
>>>> +  This is the command help handler function pointer callback type.  This
>>>> +  function is responsible for displaying help information for the associated
>>>> +  command.
>>>> +
>>>> +  @param[in] This                   The instance of the
>>>> EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL.
>>>> +  @param[in] Language               The pointer to the language string to use.
>>>> +
>>>> +  @return string                    Pool allocated help string, must be freed by
>>> caller
>>>> +**/
>>>> +typedef
>>>> +CHAR16*
>>>> +(EFIAPI * SHELL_COMMAND_GETHELP)(
>>>> +  IN EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL    *This,
>>>> +  IN CONST CHAR8                           *Language
>>>> +  );
>>>> +
>>>> +/// EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL protocol structure.
>>>> +struct _EFI_SHELL_DYNAMIC_COMMAND_PROTOCOL {
>>>> +
>>>> +  CONST CHAR16           *CommandName;
>>>> +  SHELL_COMMAND_HANDLER  Handler;
>>>> +  SHELL_COMMAND_GETHELP  GetHelp;
>>>> +
>>>> +};
>>>> +
>>>> +extern EFI_GUID gEfiShellDynamicCommandProtocolGuid;
>>>> +
>>>> +#endif
>>>> diff --git a/MdePkg/Include/Protocol/ShellParameters.h
>>>> b/MdePkg/Include/Protocol/ShellParameters.h
>>>> new file mode 100644
>>>> index 0000000..68ca9ed
>>>> --- /dev/null
>>>> +++ b/MdePkg/Include/Protocol/ShellParameters.h
>>>> @@ -0,0 +1,60 @@
>>>> +/** @file
>>>> +  EFI Shell protocol as defined in the UEFI Shell 2.0 specification.
>>>> +
>>>> +  Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
>>>> +  This program and the accompanying materials
>>>> +  are licensed and made available under the terms and conditions of the
>>> BSD
>>>> License
>>>> +  which accompanies this distribution.  The full text of the license may be
>>>> found at
>>>> +  http://opensource.org/licenses/bsd-license.php
>>>> +
>>>> +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
>>>> BASIS,
>>>> +  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
>>>> EXPRESS OR IMPLIED.
>>>> +
>>>> +**/
>>>> +
>>>> +#ifndef __EFI_SHELL_PARAMETERS_PROTOCOL__
>>>> +#define __EFI_SHELL_PARAMETERS_PROTOCOL__
>>>> +
>>>> +#include <Protocol/Shell.h>
>>>> +
>>>> +#define EFI_SHELL_PARAMETERS_PROTOCOL_GUID \
>>>> +  { \
>>>> +  0x752f3136, 0x4e16, 0x4fdc, { 0xa2, 0x2a, 0xe5, 0xf4, 0x68, 0x12, 0xf4,
>>> 0xca
>>>> } \
>>>> +  }
>>>> +
>>>> +typedef struct _EFI_SHELL_PARAMETERS_PROTOCOL {
>>>> +  ///
>>>> +  /// Points to an Argc-element array of points to NULL-terminated strings
>>>> containing
>>>> +  /// the command-line parameters. The first entry in the array is always
>>> the
>>>> full file
>>>> +  /// path of the executable. Any quotation marks that were used to
>>>> preserve
>>>> +  /// whitespace have been removed.
>>>> +  ///
>>>> +  CHAR16 **Argv;
>>>> +
>>>> +  ///
>>>> +  /// The number of elements in the Argv array.
>>>> +  ///
>>>> +  UINTN Argc;
>>>> +
>>>> +  ///
>>>> +  /// The file handle for the standard input for this executable. This may be
>>>> different
>>>> +  /// from the ConInHandle in EFI_SYSTEM_TABLE.
>>>> +  ///
>>>> +  SHELL_FILE_HANDLE StdIn;
>>>> +
>>>> +  ///
>>>> +  /// The file handle for the standard output for this executable. This may
>>> be
>>>> different
>>>> +  /// from the ConOutHandle in EFI_SYSTEM_TABLE.
>>>> +  ///
>>>> +  SHELL_FILE_HANDLE StdOut;
>>>> +
>>>> +  ///
>>>> +  /// The file handle for the standard error output for this executable. This
>>>> may be
>>>> +  /// different from the StdErrHandle in EFI_SYSTEM_TABLE.
>>>> +  ///
>>>> +  SHELL_FILE_HANDLE StdErr;
>>>> +} EFI_SHELL_PARAMETERS_PROTOCOL;
>>>> +
>>>> +extern EFI_GUID gEfiShellParametersProtocolGuid;
>>>> +
>>>> +#endif
>>>> diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec
>>>> index f1e5151..3e08bed 100644
>>>> --- a/MdePkg/MdePkg.dec
>>>> +++ b/MdePkg/MdePkg.dec
>>>> @@ -1645,6 +1645,21 @@ [Protocols]
>>>>    ## Include/Protocol/EraseBlock.h
>>>>    gEfiEraseBlockProtocolGuid           = { 0x95a9a93e, 0xa86e, 0x4926, {0xaa,
>>>> 0xef, 0x99, 0x18, 0xe7, 0x72, 0xd9, 0x87 }}
>>>>
>>>> +  #
>>>> +  # Protocols defined in Shell2.0
>>>> +  #
>>>> +  ## Include/Protocol/Shell.h
>>>> +  gEfiShellProtocolGuid                = { 0x6302d008, 0x7f9b, 0x4f30, {0x87,
>> 0xac,
>>>> 0x60, 0xc9, 0xfe, 0xf5, 0xda, 0x4e }}
>>>> +
>>>> +  ## Include/Protocol/ShellParameters.h
>>>> +  gEfiShellParametersProtocolGuid      = { 0x752f3136, 0x4e16, 0x4fdc, {0xa2,
>>>> 0x2a, 0xe5, 0xf4, 0x68, 0x12, 0xf4, 0xca }}
>>>> +
>>>> +  #
>>>> +  # Protocols defined in Shell2.1
>>>> +  #
>>>> +  ## Include/Protocol/ShellDynamicCommand.h
>>>> +  gEfiShellDynamicCommandProtocolGuid  = { 0x3c7200e9, 0x005f, 0x4ea4,
>>>> {0x87, 0xde, 0xa3, 0xdf, 0xac, 0x8a, 0x27, 0xc3 }}
>>>> +
>>>>  #
>>>>  # [Error.gEfiMdePkgTokenSpaceGuid]
>>>>  #   0x80000001 | Invalid value provided.
>>>> --
>>>> 2.9.0.windows.1
>>>>
>>>> _______________________________________________
>>>> edk2-devel mailing list
>>>> edk2-devel@lists.01.org
>>>> https://lists.01.org/mailman/listinfo/edk2-devel
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel
>


-- 

   My statements are my own, are not authorized by SGI, and do not
   necessarily represent SGI’s positions.


  reply	other threads:[~2016-10-18 15:19 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-10-14  9:44 [PATCH 0/5] Move Shell protocol definitions to MdePkg Ruiyu Ni
2016-10-14  9:44 ` [PATCH 1/5] ShellPkg: Move SHELL_FREE_NON_NULL from ShellBase.h to ShellLib.h Ruiyu Ni
2016-10-14 16:22   ` Tim Lewis
2016-10-17 16:25   ` Carsey, Jaben
2016-10-14  9:44 ` [PATCH 2/5] MdePkg: Include Shell/ShellDynamicCommand/ShellParameters definitions Ruiyu Ni
2016-10-17 18:02   ` Carsey, Jaben
2016-10-18  5:56     ` Ni, Ruiyu
2016-10-18  5:59       ` Kinney, Michael D
2016-10-18 15:19         ` Brian J. Johnson [this message]
2016-10-14  9:44 ` [PATCH 3/5] ArmPkg/LinuxLoader: Reference Shell protocols in MdePkg Ruiyu Ni
2016-10-14 19:55   ` Leif Lindholm
2016-10-14  9:44 ` [PATCH 4/5] EmbeddedPkg/FdtPlatformDxe: " Ruiyu Ni
2016-10-14 19:55   ` Leif Lindholm
2016-10-14  9:44 ` [PATCH 5/5] ShellPkg: Remove Shell/ShellDynamicCommand/ShellParameter definitions Ruiyu Ni
2016-10-14 13:08 ` [PATCH 0/5] Move Shell protocol definitions to MdePkg Yao, Jiewen
2016-10-14 13:13   ` Yao, Jiewen
2016-10-14 16:21     ` Tim Lewis
2016-10-15 13:29       ` Yao, Jiewen
2016-10-17 16:30         ` Carsey, Jaben

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=6d469184-8202-d258-3ec2-c0b153355165@sgi.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox