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...@intel.com>
Cc: Jaben Carsey <jaben.car...@intel.com>
Cc: Jiewen Yao <jiewen....@intel.com>
Cc: Michael D Kinney <michael.d.kin...@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

Reply via email to