Skip to content

Latest commit

 

History

History
1021 lines (721 loc) · 35.9 KB

PITCHME.md

File metadata and controls

1021 lines (721 loc) · 35.9 KB

---?image=assets/images/gitpitch-audience.jpg @title[Platform Build Lab]




UEFI & EDK II Training

UEFI Shell Application


tianocore.org Note: PITCHME.md for UEFI / EDK II Training UEFI Shell Application

Copyright (c) 2019, Intel Corporation. All rights reserved.

Redistribution and use in source (original document form) and 'compiled' forms (converted to PDF, epub, HTML and other formats) with or without modification, are permitted provided that the following conditions are met:

  1. Redistributions of source code (original document form) must retain the above copyright notice, this list of conditions and the following disclaimer as the first lines of this file unmodified.

  2. Redistributions in compiled form (transformed to other DTDs, converted to PDF, epub, HTML and other formats) must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

THIS DOCUMENTATION IS PROVIDED BY TIANOCORE PROJECT "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TIANOCORE PROJECT BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


@title[Lesson Objective]

<p align="center"Lesson Objective



@fa[certificate gp-bullet-green]  Explain UEFI, the shell, and how they work together
@fa[certificate gp-bullet-cyan]  Define the shell components
@fa[certificate gp-bullet-yellow]  Use the shell API in a UEFI application
@fa[certificate gp-bullet-magenta]  UEFI Shell command Library
@fa[certificate gp-bullet-ltgreen]  UEFI Shell scripts

---?image=assets/images/binary-strings-black2.jpg @title[UEFI Shell Overview Section]




     UEFI Shell Overview

         Components of the UEFI Shell

---?image=/assets/images/slides/Slide4.JPG

@title[What is a UEFI Shell?]

What is a UEFI Shell?

Note:

Where the Shell sits between the Platform H/w and the OS after all console / devices initialized

What is a UEFI Shell? UEFI Application Standardized Command Line Interface for pre-OS Sits directly on UEFI firmware (CIRCLE) Optimized for small footprint Supports rich pre-OS applications Standard scripting & API

Versus EFI Shell UEFI App Same characteristics No specification

USE THESE AS BULLETS

+++?image=/assets/images/slides/Slide5.JPG

@title[What is a UEFI Shell? 02]

What is a UEFI Shell?

Note:

+++?image=/assets/images/slides/Slide6.JPG

@title[What is a UEFI Shell? 03]

What is a UEFI Shell?

Note:

+++?image=/assets/images/slides/Slide7.JPG

@title[What is a UEFI Shell? 04]

What is a UEFI Shell?

Note:

+++?image=/assets/images/slides/Slide8.JPG

@title[What is a UEFI Shell? 05]

What is a UEFI Shell?

@snap[north-east span-40 fragment] @css[ text-yellow](
 ) ItsAn @snapend

@snap[east span-30 fragment] @css[ text-white](

 Extensive & Standardize Pre-OS UEFI Application
) @snapend

Note:

Where the Shell sits between the Platform H/w and the OS after all console / devices initialized

What is a UEFI Shell? UEFI Application Standardized Command Line Interface for pre-OS Sits directly on UEFI firmware (CIRCLE) Optimized for small footprint Supports rich pre-OS applications Standard scripting & API

Versus EFI Shell UEFI App Same characteristics No specification

USE THESE AS BULLETS

---?image=/assets/images/slides/Slide9_1.JPG @title[What is a UEFI Shell?]

UEFI Shell Specification V. 2.2

http://www.uefi.org/specsandtesttools









UEFI Shell v2.0 specification first released 2008 – Latest V2.2 Jan 2016

Note:


@title[UEFI Shell Elements]

UEFI Shell Elements

@snap[west span-45 fragment] @box[bg-royal text-white waved ](Small Size Profiles ) @snapend

@snap[east span-45 fragment] @box[bg-gold2 text-white waved ](Shell Commands ) @snapend

@snap[south-west span-45 fragment] @box[bg-purple-pp text-white waved ](New Shell API
 

) @snapend

@snap[south-east span-45 fragment] @box[bg-green-pp text-white waved ](Enhanced Scripting
) @snapend

Note:

1)Small Size Profiles Took the UEFI Shell that Intel has been working on as a starting point 4 areas for size

Levels of support Different levels of support for different usage scenarios and space constraints: Level 0: No Command-line Interface (CLI). No shell commands. Only shell API. Level 1: Adds basic scripting support Level 2: Adds basic commands (cd, cp, mv) Level 3: Adds interactive CLI Shell support level can be detected using an environment variable. Beyond level 3, additional command “profiles” are defined for debug, networking and driver support

  1. Shell Commands

Standardized existing usage Updated for UEFI 2.1+ Standardized argument usage and output Example some of the grep commands are standardized

  1. New Shell API Smaller executable size – put common functionally back into the shell Expose previously hidden shell capabilities – the shell does some really cool things – Example to change the current directory (CD) it did not exposes this and no one else could take advantage of this unless they were linked right into it

Execution break support – control “C”

  1. Enhanced Scripting Compatible with existing scripts Added input redirection & piping Enhanced if command example added capability to use shell without a HD or RAM Drive present. – may not have a HD for Manufacturing May not have a Hard drive input output to environment variables

UEFI Advantages = UEFI Shell Advantages

  • Flat memory model

  • Robust, extensible architecture

  • File system, Network, Keyboard, Mouse

  • UEFI Works = UEFI Shell Works

  • No additional requirements to run

  • Write Once/Run Anywhere For Pre-OS

  • With standard API/commands = applications from different ISVs work on any platform (Ex: UEFI SCT)


@title[Small Size Profiles]

@snap[midpoint span-65 ] @box[bg-royal text-white waved ](Small Size Profiles ) @snapend

Note:

Small Size Profiles

Took the UEFI Shell that Intel has been working on as a starting point 4 areas for size

Levels of support Different levels of support for different usage scenarios and space constraints:

Level 0: No Command-line Interface (CLI). No shell commands. Only shell API.

Level 1: Adds basic scripting support

Level 2: Adds basic commands (cd, cp, mv)

Level 3: Adds interactive CLI

Shell support level can be detected using an environment variable.

Beyond level 3, additional command “profiles” are defined for debug, networking and driver support


@title[Small Size Profiles detail]

Small Size Profiles

Level / Profile 

Commands 

Level 0  Shell API Only  

Level 1 

Basic scripting support  

Level 2 

File Support, cmds(cd, cp, mv)  

Level 3 

Adds interactive CLI + Profiles 

UEFI Debug Profile 

bcfg, comp, dblk, dmem, dmpstore, echo, edit,  

UEFI Network Profile 

ipconfig, ping  

UEFI Driver Profile 

drvdiag, openinfo, reconnect, load, unload 

@snap[south-west fragment ] @box[bg-purple-pp text-white rounded ](Choose the shell that best matches your product needs ) @snapend

Note:

Small Size Profiles

Different levels; defining a platform confined in a space – go with a smaller profile.

Took the same shell commands that have always been there and standardized them

Some were never used so were deprecated

Level 0: provide shell API and that is about it

Level 1: Provide basic scripting support – but not any command line interface so if you want any support then you need to provide the disk itself

Level 2: basic file manipulation commands

Level 3:CLI

Grouped the rest into 3 groups

  • UEFI Debug
  • Network
  • Driver
  • also install

KEY POINT: Choose the shell that best matches your product needs


@title[Shell Commands]

@snap[midpoint span-65 ] @box[bg-gold2 text-white waved ](Shell Commands ) @snapend

Note:

Shell Commands

---?image=/assets/images/slides/Slide25.JPG @title[Shell Commands detail]

Shell Commands

Note:

Shell Commands

List of all shell commands from the shell prompt by doing help -b

Only the commands built with the currenet shell being executed will also be listed in the Help list


@title[New Shell API]

@snap[midpoint span-65 ] @box[bg-purple-pp text-white waved ](New Shell API
 
) @snapend

Note:

New Shell API

  • Application interface

@title[New Shell API detail]

New Shell API

   `EFI_SHELL_PROTOCOL`   

Group 

Functions 

File Manipulation   `OpenFileByName(), WriteFile(),` etc. . .  

Mapping, Alias & Environmental Variables 

`GetMapFromDevicePath(), GetFilePathFromDevicePath()`, etc . . . 

Launch Application or Script 

`Execute(), BatchIsActive(), IsRootShell()`,etc . . .  

Miscellaneous  

`GetPageBreak(), EnablePageBreak()` ,etc . . .  

@snap[south-west fragment ] @box[bg-purple-pp text-white rounded ](EFI_SHELL_PROTOCOL is installed on each application image handle ) @snapend

Note:

New Shell API

This just to give an idea of the over all groups

KEY POINT: EFI_SHELL_PROTOCOL is installed on each application image handle

CreateFile, DeleteFile, ReadFile, WriteFile, DeleteFileByName, CloseFile, FindFiles, FindFilesInDir, GetFilePosition, SetFilePosition, GetFileInfo, SetFileInfo, FreeFileList, OpenFileByName, OpenFileList, OpenRoot, OpenRootByHandle, GetFileSize, RemoveDupInFileList

GetMapFromDevicePath, GetFilePathFromDevicePath, GetDevicePathFromFilePath, GetDevicePathFromMap, SetMap, SetAlias, GetEnv, SetEnv, GetCurDir, SetCurDir

Execute, BatchIsActive, IsRootShell

GetPageBreak, EnablePageBreak, DisablePageBreak, GetHelpText, GetDeviceName

Mapping – FS0 instead of full

---?image=/assets/images/slides/Slide31.JPG

@title[ShellPkg Main Libraries]

ShellPkg Main Libraries

Note:

There are three main libraries used by almost all shell commands

  • ShellLib

    • Used by both commands and applications. Provides easy access to Shell Protocols, File I/O, and printing to the user.
  • HandleParsingLib

    • Used by both commands and applications. Provides easy access for manipulating handles. This means things like conversion the handle to and from the handle index; the index is the 2 digit hex identifier of the handle seen by the user sorting of handles to determine parent controllers, child controllers, or which driver controls a given controller
  • ShellCommandLib

    • fully usable only when linked within the shell binary and therefore only by internal shell commands. This provides extra features for internal commands.

+++?image=/assets/images/slides/Slide32.JPG

@title[ShellPkg Main Libraries 02]

ShellPkg Main Libraries

Note:

+++?image=/assets/images/slides/Slide33.JPG

@title[ShellPkg Main Libraries 03]

ShellPkg Main Libraries

Note:

There are three main libraries used by almost all shell commands

  • ShellLib

    • Used by both commands and applications. Provides easy access to Shell Protocols, File I/O, and printing to the user.
  • HandleParsingLib

    • Used by both commands and applications. Provides easy access for manipulating handles. This means things like conversion the handle to and from the handle index; the index is the 2 digit hex identifier of the handle seen by the user sorting of handles to determine parent controllers, child controllers, or which driver controls a given controller
  • ShellCommandLib

    • fully usable only when linked within the shell binary and therefore only by internal shell commands. This provides extra features for internal commands.

@title[EDK II ShellPkg]

EDK II ShellPkg

@snap[north-west span-45 fragment] @css[text-yellow](

 ) @box[bg-royal text-white rounded ](Support binary portability ) @snapend

@snap[north-east span-45 fragment] @css[text-yellow](

 ) @box[bg-green-pp text-white rounded ](Shell protocols
 
) @snapend

@snap[south span-55 fragment] @box[bg-purple-pp text-white rounded ](Shell parameters 
#include <Library/ShellLib.h>
gEfiShellParametersProtocol
gEfiShellProtocol
)

@snapend

Note:

  • EDK II native library for shell applications
  • Supports binary portability between EFI Shell 1.0 and UEFI 2.0 shell
  • Shell protocols: Calls into UEFI (default) or EFI for functionality
  • Shell parameters
    • Handles parameter parsing for flag, value, and position command-line parameters
    • EDK II UEFI Shell 2.0 Library globals in Shell applications
      • #Include <Library/ShellLib.h>
      • gEfiShellParametersProtocol
      • gEfiShellProtocol

@title[Shell Call example]

Shell Call Example

// use UEFI shell 2.x interface
//
 if (gEfiShellParametersProtocol != NULL) {
        Argc = gEfiShellParametersProtocol->Argc;
        Argv = gEfiShellParametersProtocol->Argv;
//Create the file with Argv[1] with 
//                 read/write/create
       Status = gEfiShellProtocol->OpenFileByName
          (Argv[1], &Handle, 
           EFI_FILE_MODE_READ | 
           EFI_FILE_MODE_WRITE | 
           EFI_FILE_MODE_CREATE);

// . . .
// Write the buffer data to the file
	Status = gEfiShellProtocol->WriteFile( Handle,     
           (UINTN *)&BufferSize, (void *)Buffer);

@[4-5](Parameters Argc and Argv from the command line passed to YOUR shell application) @[6-8](Create the file with Argv string using the Shell Open File by name function) @[15-17](After your application is finished with it's task, write the contains using the Shell handle)

Note:


@title[Enhanced Scripting]

@snap[midpoint span-65 ] @box[bg-green-pp text-white waved ](Enhanced Scripting ) @snapend

Note:


@title[Enhanced Scripting details]

Shell Enhanced Scripting


@fa[circle gp-bullet-magenta]  Contains .nsh extention
@fa[circle gp-bullet-gold]  "`Startup.nsh`" runs first
@fa[circle gp-bullet-cyan]  Supports:
                    Command-line arguments
                    Standard script commands
                    Input & output redirection & pipes

Note:

  • Text files with .nsh extension are shell scripts

  • Supports command-line arguments using positional parameters %0 - %9 and shift.

  • Supports standard script commands

    • if/else/endif
    • goto
    • for/endfor
    • echo
    • exit
  • Supports input & output redirection & pipes.

  • Can also redirect to/from environment variables!

  • Startup.nsh – First Shell script can be on any FS system. the first script run by the UEFI Shell and it can be run from any removable device


@title[Shell Scripts (Benefits)]

Shell Scripts (Benefits)

@snap[north-west span-25 ]

shell1 @snapend

@snap[north-east span-70 ]



Preform basic flow control       @snapend

@snap[east span-25 fragment ] shell2 @snapend

@snap[west span-70 fragment ]       Allows branching / looping    @snapend

@snap[south-west span-25 fragment ] shell3 @snapend

@snap[south-east span-70 fragment ] Users can control input, output and script nesting


@snapend

Note:

The UEFI Shell can execute commands from a file, which is called a batch script file (.nsh files).

Benefits: These files allow users to simplify routine or repetitive tasks.

  • Perform basic flow control.
  • Allow branching and looping in a script.
  • Allow users to control input and output and call other batch programs (known as script nesting).

@title[Script Detects Shell Capabilities]

Script that Detects Shell Capabilities


```shell # check if Shell supports level 3 commands # Exit on error if %uefishellsupport% ult 3 then echo Must support UEFI Shell, Level 3 exit /b 2 endif

check that Shell supports Debug1 profile.

if profiles(Debug1)then echo UEFI Shell supports Debug1 profile endif


@[2-4](Check if Shell supports level 3 commands - That means a Command Line Interface (CLI)
@[9-10](Check that Shell supports Debug1 profile.)



Note:

Walk through the code
- "ult" is <u>u</u>nsigned <u>l</u>ess <u>t</u>han)

---
@title[UEFI Shell Script Example]
<br>
<p align="center"><span class="gold" >UEFI Shell Script Example</span></p>
<br>
<span style="font-size:0.7em"><font color="yellow">Script1.nsh</font></span>
```shell
# Simple UEFI Shell script file
echo  -off
script2.nsh
if exist %cwd%Mytime.log then
     type Mytime.log
endif
echo "%HThank you.” “%VByeBye:) %N"

Script2.nsh ```shell # Show nested scripts time > Mytime.log for %a run (3 1 -1) echo %a counting down endfor ```

Note: walk through the script calling the second script

  • if
  • for loop
    • %a counting down...

---?image=/assets/images/slides/Slide47.JPG @title[Documentation for EDK II ShellPkg]

Documentation for EDK II ShellPkg




@fa[book gp-bullet-ltgreen]  Documenation Link:
    wiki Shell Package

Note:

UEFI Shell Documentation updated in the Engineering Resources section


@title[UEFI Shell 2.2 Vs. EFI Shell 1.0]

UEFI Shell 2.2   Vs.   EFI Shell 1.0


@fa[circle gp-bullet-ltgreen]  UEFI Shell 2.x      - EFI_SHELL_PARAMETERS_PROTOCOL
@fa[circle gp-bullet-yellow]  EFI Shell 1.0        - EFI_SHELL_INTERFACE
```C // #include //GUID protocol for EFI Shell 1.0 #include //GUID protocol for UEFI Shell 2.x

// . . .

EFI_SHELL_PARAMETERS_PROTOCOL *mEfiShellParametersProtocol; EFI_SHELL_INTERFACE *mEfiShellInterface; //


<span style="font-size:0.6em">&nbsp;&nbsp;See example C file: <a href="https://github.com/tianocore-training/UEFI_Shell_App_pres/tree/master/Sample/MyShellApp/MyShellApp.c">MyShellApp.c </a></span>

Note:

Protocol GUID will be for either Shell 1.0 or Shell 2.0

This slide shows how to access UEFI Shell 2.0 Versus EFI Shell 1.0
There are 2 different GUIDs 

Simply try to open one GUID verse the other to see which Shell is currently in use.

Notice the lower case "g" is for global - this notation is used throughout EDK II code

Lower case "m" means global for "my" Application, driver, etc


+++?code=Sample/MyShellApp/MyShellApp.c&lang=c++&title=UEFI Shell 2.2 Vs. EFI Shell 1.0

@[69-79](Check input parameters from command line using UEFI Shell 2.2 - notice <b>gEfiShellParametersProtocolGuid</b>)
@[81-82](Protocol GUID was found, so assign Argc & Argv from Shell 2.2 protocol)
@[85-92](Else, check if EFI Shell 1.0 - notice <b>gEfiShellInterfaceGuid</b> , Lower case "g")
@[96-97](Protocol GUID was found, so assign Argc & Argv from Shell 1.0 protocol)
@[99-100](Else, Error out of application  )

Note:

This slide shows how to access UEFI Shell 2.0 Versus EFI Shell 1.0
There are 2 different GUIDs 
Simply try to open one GUID verse the other to see which Shell is currently in use.

Notice the lower case "g" is for global - this notation is used throughout EDK II code

Lower case "m" means global for "my" Application, driver, etc





---?image=/assets/images/slides/Slide52.JPG
@title[Legacy vs. UEFI ]

### <p align="right"><span class="gold" >Legacy vs. UEFI</span></p>

Note:
The UEFI SHELL is an UEFI application that allows you to interface with the UEFI environment prior to the time the OS is loaded. Once the OS starts loading, the UEFI environment is no longer accessible through the Shell. 
The UEFI Shell supports a command line interface similar to DOS or Unix.  In fact a lot of the same commands exist in the UEFI shell that are in DOS and forms of Linux.



---?image=/assets/images/slides/Slide54.JPG
@title[Shell Usage ]
### <p align="right"><span class="gold" >Shell Usage</span></p>

Note:
The shell is where preboot programs  will execute.  For example, manufacturing test applications with the rich pre boot environment there is no need to run / execute an operating system
Typical environment that an EFI application might need to execute pre-operating system functions:

- Execute preboot programs
- update programs
- disk utilities
- tests(hwd and soft)
- operating system installation – Configuration utility of a Driver
- Diagnostics
- Platform Testing & Driver Diagnostics

- Move files around between different devices (hard disk, CD/DVD, USB flash drives, …)
- The shell is where files can be moved around just as in DOS or Unix.

- Load a preboot UEFI driver in the system (.efi)
- The shell is where preboot EFI drivers are loaded in the system such as a lan stack tcpip drivers, update old drivers in flash, new drivers for plugin cards etc.
 

- LAN stack & TCP/IP drivers
- Update old drivers in flash
- New drivers for plug-in cards

---?image=/assets/images/slides/Slide56.JPG
@title[Accessing the Shell]
### <p align="right"><span class="gold" >Accessing the Shell</span></p>

Note:
Boot UEFI Shell from FAT/FAT32 partition:
1.  Special boot file located under /EFI/boot/ directory:
    - BOOTia32.efi (IA32) or BOOTx64.efi (x64) or other NON IA



---?image=/assets/images/slides/Slide58.JPG
<!-- .slide: data-transition="none" -->	 
@title[UEFI File System & Device Path]
<br>
<p align="right"><span class="gold" >UEFI File System & Device Path</span></p>


Note:
Can manipulate only UEFI system partitions (FAT/FAT32) where boot loader and UEFI applications are located:

An example of the EFI File system is best seen using the MAP Command that will display the mappings in nvram between block devices .  
The EFI shell is replacing what is to the left of the “:” with the device path to the right of the “:”


- Blkxx designates a raw block device 
- Such as a disk controller, floppy controller etc.
- FSy designates that a block device has a fat file system on that device.
- The Map command displays all the raw block devices in the system and the FAT file systems mounted and usable.
- After the colon is the device path or physical location of where that device or file system is located.


- Lets try the Map Command on your classroom systems.


+++?image=/assets/images/slides/Slide60.JPG
<!-- .slide: data-background-transition="none" -->
<!-- .slide: data-transition="none" -->	 
@title[UEFI File System & Device Path 02]
<br>
<p align="right"><span class="gold" >UEFI File System & Device Path</span></p>

Note:


+++?image=/assets/images/slides/Slide61.JPG
<!-- .slide: data-background-transition="none" -->
<!-- .slide: data-transition="none" -->	 
@title[UEFI File System & Device Path 03]
<br>
<p align="right"><span class="gold" >UEFI File System & Device Path</span></p>

Note:

+++?image=/assets/images/slides/Slide62.JPG
<!-- .slide: data-background-transition="none" -->
<!-- .slide: data-transition="none" -->	 
@title[UEFI File System & Device Path 04]
<br>
<p align="right"><span class="gold" >UEFI File System & Device Path</span></p>

Note:

+++?image=/assets/images/slides/Slide63.JPG
<!-- .slide: data-background-transition="none" -->
<!-- .slide: data-transition="none" -->	 
@title[UEFI File System & Device Path 05]
<br>
<p align="right"><span class="gold" >UEFI File System & Device Path</span></p>

Note:

+++?image=/assets/images/slides/Slide64.JPG
<!-- .slide: data-background-transition="none" -->
<!-- .slide: data-transition="none" -->	 
@title[UEFI File System & Device Path 06]
<br>
<p align="right"><span class="gold" >UEFI File System & Device Path</span></p>

Note:

+++?image=/assets/images/slides/Slide65.JPG
<!-- .slide: data-background-transition="none" -->
<!-- .slide: data-transition="none" -->	 
@title[UEFI File System & Device Path 07]
<br>
<p align="right"><span class="gold" >UEFI File System & Device Path</span></p>

Note:


+++?image=/assets/images/slides/Slide66.JPG
<!-- .slide: data-background-transition="none" -->
<!-- .slide: data-transition="none" -->	 
@title[UEFI File System & Device Path 08]
<br>
<p align="right"><span class="gold" >UEFI File System & Device Path</span></p>

Note:
Can manipulate only UEFI system partitions (FAT/FAT32) where boot loader and UEFI applications are located:

An example of the EFI File system is best seen using the MAP Command that will display the mappings in nvram between block devices .  
The EFI shell is replacing what is to the left of the “:” with the device path to the right of the “:”


- Blkxx designates a raw block device 
- Such as a disk controller, floppy controller etc.
- FSy designates that a block device has a fat file system on that device.
- The Map command displays all the raw block devices in the system and the FAT file systems mounted and usable.
- After the colon is the device path or physical location of where that device or file system is located.


- Lets try the Map Command on your classroom systems.


---  
@title[Summary]
<BR>
### <p align="center"><span class="gold"   >Summary </span></p><br>
<br>
 @fa[certificate gp-bullet-green]<span style="font-size:0.9em">&nbsp;&nbsp;Explain UEFI, the shell, and how they work together </span><br>
 @fa[certificate gp-bullet-cyan]<span style="font-size:0.9em">&nbsp;&nbsp;Define the shell components</span><br>
 @fa[certificate gp-bullet-yellow]<span style="font-size:0.9em">&nbsp;&nbsp;Use the shell  API  in a UEFI application</span> <br>
 @fa[certificate gp-bullet-magenta]<span style="font-size:0.9em">&nbsp;&nbsp;UEFI Shell command Library</span> <br>
 @fa[certificate gp-bullet-ltgreen]<span style="font-size:0.9em">&nbsp;&nbsp;UEFI Shell scripts</span> 

 

---?image=assets/images/gitpitch-audience.jpg
@title[Questions]
<br>
![Questions](/assets/images/questions.JPG =10x) 
---
@title[return to main]
<p align="center"><span class="gold"   >@size[1.2em](<b>Return to Main Training Page</b>)</span></p>
<br>
<br>
<br>
<br>
<br>
<p align="center"><span style="font-size:0.9em">Return to Training Table of contents for next presentation <a href="https://github.com/tianocore-training/Tianocore_Training_Contents/wiki#schedule--outline">link</a></span></p>

@snap[north span-30 ]
<br>
<br>
<br>
<a href="https://github.com/tianocore-training/Tianocore_Training_Contents/wiki#schedule--outline">
![trainingLogo](/assets/images/returnTrainingLogo.png)</a>
@snapend


---?image=assets/images/gitpitch-audience.jpg
@title[Logo Slide]
<br><br><br>
![Logo Slide](/assets/images/TianocoreLogo.png =10x)


---
@title[Acknowledgements]
#### <p align="center"><span class="gold"   >Acknowledgements</span></p>

```c++
/**
Redistribution and use in source (original document form) and 'compiled' forms (converted
to PDF, epub, HTML and other formats) with or without modification, are permitted provided
that the following conditions are met:

Redistributions of source code (original document form) must retain the above copyright 
notice, this list of conditions and the following disclaimer as the first lines of this 
file unmodified.

Redistributions in compiled form (transformed to other DTDs, converted to PDF, epub, HTML
and other formats) must reproduce the above copyright notice, this list of conditions and 
the following disclaimer in the documentation and/or other materials provided with the 
distribution.

THIS DOCUMENTATION IS PROVIDED BY TIANOCORE PROJECT "AS IS" AND ANY EXPRESS OR IMPLIED 
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL TIANOCORE PROJECT BE 
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
ARISING IN ANY WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY 
OF SUCH DAMAGE.

Copyright (c) 2019, Intel Corporation. All rights reserved.
**/