This schema defines the UEFI/PI Distribution Package
                description (PKG) file. It describes the content of:
             1) Package descriptions with definitions and
                headers.
             2) Modules in either source or binary format. (Note
                that Binary format is for FFS leaf section file types only, complete FFS files
                cannot be distributed using this distribution format.) 
             3) The distribution of custom tools used to modify
                the binary images to create UEFI/PI compliant images. 
             4) Finally, it can be used to distribute other
                miscellaneous content that is not specific to UEFI/PI images. 
             The Package Surface Area describes the content of
                packages, while the Module Surface Area provides information relevant to source
                and/or binary distributions. 
        
        
            
                
                    
                         This header contains (legal) information
                            usually required for distributing both binary and/or source code.
                        
                    
                
                
                    
                         The list of packages in this
                            distribution. 
                         Packages are groups of files and/or
                            modules that are similar in nature.
                         Packages are uniquely identified by a
                            package GUID and a package version. 
                         A package can declare public mappings of
                            C names to GUID values. 
                         A package can provide header files for
                            library classes and/or other industry standard definitions. 
                         A package can also declare public
                            mappings of platform configuration database (PCD) "knobs" to
                            control features and operation of modules within a platform. 
                         Finally, a package lists the library
                            instances and/or modules that are provided in a distribution package.
                        
                    
                
                
                    
                         The listing of UEFI/PI compliant modules
                            in this distribution that are NOT part of a Package. Every module that
                            is provided as part of a package needs to be described in a
                            PackageSurfaceArea.Modules section. 
                         The ModuleSurfaceArea section describes
                            how each module in a distribution is coded, or, in the case of a binary
                            module distribution, how it was built. 
                         UEFI/PI compliant libraries and modules
                            are uniquely identified by the Module's GUID and version number. 
                         This section will typically be used for
                            modules that don't require any additional files that would be included
                            in a package. For example, the Enhanced FAT driver binary does not need
                            to have a package description, as no additional files are provided.
                        
                    
                
                
                    
                         This section is for distributing vendor
                            specific executable tools, tool source code and/or configuration files.
                            These tools are primarily for manipulating code and/or binary images. 
                         Tools in this section
                            can:
                         1) Parse build meta-data files to create
                            source code files and build scripts. 
                         2) Modify image files to conform to
                            UEFI/PI specifications. 
                         3) Generate binary files from certain
                            types of text/unicode files. 
                         4) Generate PCI Option Roms or Firmware
                            Device images. 
                         5) Implement external
                            encoding/decoding/signature/GUIDed tools. 
                         6) Distribution Package
                            create/install/remove tools. 
                    
                
                
                    
                         The list of miscellaneous files in this
                            distribution. Any files that are not listed in either the Package,
                            Module or Tools sections can be listed here. This section can be used to
                            distribute specifications for packages and modules that are not
                            "industry standards" such as a specification for a chipset or
                            a video device. 
                    
                
                
                    
                         The UserExtensions section is used to
                            disseminate processing instructions that may be custom to the content
                            provided by the distribution. This section contains information that is
                            common to all aspects of this disribution. 
                    
                
            
        
    
    
    
        
             This section defines the content of the UEIF/PI
                compliant Distribution Package Header. This is the only required element of a
                UEFI/PI compliant distribution package. 
        
        
            
                
                    
                         This is the User Interface Name for this
                            Distribution Package. 
                         Each Distribution Package is uniquely
                            identified by it's GUID and Version number. 
                    
                    
                        
                            
                                
                                    
                                         The reference name of
                                            the Distribution Package file. This single word name can
                                            be used by tools as a keyword or for directory and/or
                                            file creation. 
                                         White space and special
                                            characters (dash and underscore characters may be used)
                                            are not permitted in this name. 
                                    
                                
                            
                        
                    
                
                
                    
                         This 128-bit GUID and the Version
                            attribute uniquely identify this Distribution Package. 
                         Backward compatible releases of a
                            distribution package need only change the version number, while
                            non-backward compatible changes require the GUID to change (resetting
                            the version number to 1.0 is optional.) 
                    
                    
                        
                            
                                
                                    
                                         This value, along with
                                            the GUID, is used to uniquely identify this object. The
                                            higher the number, the more recent the content.
                                        
                                    
                                
                            
                        
                    
                
                
                    
                         A string identifying who created this
                            distribution package. 
                    
                
                
                    
                         The date and time this distribution was
                            created. The format is: YYYY-MM-DDThh:mm:ss, for example:
                            2001-01-31T13:30:00 (note the T character separator between the calendar
                            date and the time. 
                    
                
                
                    
                         The copyright for this file that is
                            generated by the creator of the distribution. If a derivative work is
                            generated from an existing distribution, then the existing copyright
                            must be maintained, and additional copyrights may be appended to the end
                            of this element. It may also be the primary copyright for all code
                            provided in the Distribution Package. 
                    
                
                
                    
                         A license that describes any
                            restrictions on the use of this distribution. If a derivative work is
                            allowed by the original license and a derivative work is generated from
                            an existing distribution, then the existing license must be maintained,
                            and additional licenses may be appended to the end of this element. It
                            may also be the primary license for all code provided in the
                            distribution file. Alternatively, this may point to a filename that
                            contains the License. The file (included in the content zip file) will
                            be stored in the same location as the distribution package's .pkg file.
                        
                    
                
                
                    
                         A one line description of the
                            Distribution Package. 
                    
                
                
                    
                         A complete description of the
                            Distribution Package. This description may include the release name of
                            the file, the version of the file, and a complete description of the
                            file contents and/or features including a description of the updates
                            since the previous file release. 
                    
                
                
                    
                         The packaging utilities will use this
                            MD5 sum value of the included ZIP file containing files and/or code. If
                            this element is not present, then installation tools should assume that
                            the content is correct, or that other methods may be needed to verify
                            content. 
                    
                
                
                    
                         This version of this XML Schema is 1.1 
                         Changes to 1.1 from 1.0 
                         #1 Updated to present date and new
                            version which is important to reflect the present state of the
                            matter
                         #2 Added definition/enumeration of
                            UNDEFIND type 2 is important since there is a large body of legacy code
                            for which the GUID’s and other code/data objects were not decorated with
                            their usage. This document will allow for importing today’s source
                            artifacts and producing decorations using the ‘Undefined’ versus having
                            an error
                        #3 Allow for inclusion of ARM and future
                            architecture types
                    
                
            
            
                
                     If set to true, all content within this
                        Distribution Package should NOT be modified. The default permits
                        modification of all content. 
                
            
            
                
                     If set to true, then the content can be
                        repackaged into another distribution package. The default prohibits
                        repackaging the Distribution content. 
                
            
        
    
    
    
        
             A package is a collection of related objects -
                Includes, Libraries and Modules. 
             Each package is uniquely identified by it's GUID and
                Version number. Backward compatible releases of a package need only change the
                version number, while non-backward compatible changes require the GUID to change
                (resetting the version number to 1.0 is optional.) 
        
        
            
                
                    
                        
                            
                                
                                     This is the User Interface
                                        Name for this package. 
                                
                                
                                    
                                        
                                            
                                                
                                                   This is a
                                                  single word BaseName of the package. This BaseName
                                                  can be used by tools as a keyword and for
                                                  directory/file creation. 
                                                
                                            
                                        
                                    
                                
                            
                            
                                
                                     This GUID and the Version
                                        attribute uniquely identify a given package.
                                    
                                
                                
                                    
                                        
                                            
                                                
                                                   This value,
                                                  along with the GUID, is used to uniquely identify
                                                  this object. 
                                                   Backward
                                                  compatible changes must make sure this number is
                                                  incremented from the most recent version.
                                                  Non-backward compatible changes require a new
                                                  GUID, and the version can be reset.
                                                  
                                                
                                            
                                        
                                    
                                
                            
                            
                                
                                     If the package requires a
                                        different copyright than the distribution package, this
                                        element can list one or more copyright lines.
                                    
                                
                            
                            
                                
                                     If the package requires
                                        licenses that are different from the distribution package
                                        license, this element can contain one or more license text
                                        paragraphs (or license filenames.) 
                                
                            
                            
                                
                                     A one line description of
                                        this package. 
                                
                            
                            
                                
                                     A complete description of a
                                        package. This description may include the release name of
                                        the package, the version of the package, and a complete
                                        description of the package contents and/or features
                                        including a description of the updates since the previous
                                        package’s release. 
                                
                            
                            
                                
                                     This element is the location
                                        (in the ZIP file) for the root directory of a package.
                                    
                                
                            
                        
                    
                
                
                
                    
                         The term cloned is used here to indicate
                            that this package as been copied and modified to a completely different
                            package. An example might be for a new generation of chipsets that have
                            few or no elements in common with the original. 
                    
                    
                        
                            
                                
                                     This GUID and the Version
                                        attribute uniquely identify the Package that this Package
                                        was copied from. 
                                
                                
                                    
                                        
                                            
                                                
                                                   This value,
                                                  along with the GUID, is used to uniquely identify
                                                  the package that this package was cloned from.
                                                  
                                                
                                            
                                        
                                    
                                
                            
                        
                    
                
                
                
                    
                         Library Classes are public interfaces
                            that can be used by modules. One or more library instances can implement
                            a library class, however only one library instance can be linked to an
                            individual module. This provides the platform integrator with the
                            flexibility of choosing one library instance's implementation over a
                            different library instance. 
                    
                    
                        
                            
                                
                                    
                                        
                                            
                                                 The header file
                                                  provides definitions and function prototypes for a
                                                  library class. Modules can be coded against these
                                                  functions, using the definitions in this header,
                                                  without concerning themselves about the libraries'
                                                  implementation details. This is a PackagePath
                                                  relative path and filename for the include file.
                                                
                                            
                                        
                                        
                                            
                                                
                                                  
                                                  
                                                   This GUID and
                                                  the Version attribute uniquely identify the
                                                  Recommended Library Instance. 
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                   This value,
                                                  along with the GUID, is used to uniquely identify
                                                  this object. If this value is not specified, then
                                                  any version of the library instance is
                                                  recommended. 
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                
                                            
                                        
                                        
                                    
                                    
                                        
                                             The single word name
                                                of the Library Class that module developers will use
                                                to identify a library class dependency.
                                            
                                        
                                    
                                    
                                
                            
                        
                    
                
                
                
                    
                         This section is used to list header
                            files for industry standards not under the auspices of UEFI.org. For
                            example, headers that contain definitions and data structures for the
                            USB specifications. 
                    
                    
                        
                            
                                
                                    
                                        
                                            
                                                 The package
                                                  relative path and filename (in the content zip
                                                  file) of the industry standard include file.
                                                
                                            
                                        
                                        
                                    
                                
                            
                        
                    
                
                
                
                    
                         All top level header files that are
                            included by a package that are not listed above. They cannot
                            be:
                         1) Local to a module (module specific.) 
                         2) An industry standard header. 
                         3) A library class header.
                        
                    
                    
                        
                            
                                
                                    
                                        
                                            
                                                 This is the
                                                  Package relative path and filename location within
                                                  the content ZIP file. 
                                            
                                            
                                                
                                                  
                                                  
                                                  
                                                
                                            
                                        
                                        
                                    
                                
                            
                        
                    
                
                
                
                    
                        
                            
                                
                                     This section lists the
                                        Module Surface Area for all modules provided with this
                                        package. 
                                
                            
                        
                    
                
                
                
                    
                         This section defines the mapping of GUID
                            C names to GUID values as a Registry Format GUID. 
                         Modules that use these GUIDs must
                            specify their dependency on this package. 
                    
                    
                        
                            
                                
                                     Individual GUID Declarations
                                    
                                
                                
                                    
                                        
                                        
                                        
                                    
                                    
                                    
                                    
                                
                            
                        
                    
                
                
                
                    
                         This section defines the mapping of
                            Protocol C names to GUID values as a Registry Format GUID. 
                         Modules that use these Protocols must
                            specify their dependency on this package. 
                    
                    
                        
                            
                                
                                     Individual Protocol
                                        Declarations 
                                
                                
                                    
                                        
                                        
                                        
                                    
                                    
                                    
                                
                            
                        
                    
                
                
                
                    
                         This section defines the mapping of Ppi
                            C names to GUID values as a Registry Format GUID. 
                         Modules that use these Ppis must specify
                            their dependency on this package. 
                    
                    
                        
                            
                                
                                     Individual PPI Declarations
                                    
                                
                                
                                    
                                        
                                        
                                        
                                    
                                    
                                    
                                
                            
                        
                    
                
                
                
                    
                         This section is used to declare platform
                            configuration knobs that are defined by this package. 
                         Modules that use these PCD values must
                            specify their dependency on this package. 
                    
                    
                        
                            
                                
                                    
                                        
                                            
                                                 Specifies the C
                                                  name of the Token Space GUID of which this PCD
                                                  Entry is a member. This C name should also be
                                                  listed in the GUIDs section, (specified above,)
                                                  where the C name is assigned to a GUID value.
                                                
                                            
                                        
                                        
                                            
                                                 Specifies the
                                                  32-bit token value for this PCD Entry. The Token
                                                  number must be unique to the Token Space that
                                                  declares the PCD. 
                                                 The minLength of
                                                  3 is required to handle the "0x" prefix to the hex
                                                  number. 
                                            
                                            
                                                
                                                  
                                                  
                                                
                                            
                                        
                                        
                                        
                                            
                                                 A string that
                                                  contains the data type of this PCD Entry. PCD data
                                                  types are restricted to the following set:UINT8,
                                                  UINT16, UINT32, UINT64, VOID*, BOOLEAN.
                                                
                                            
                                        
                                        
                                            
                                                 A string that
                                                  contains one or more PCD Item types separated by
                                                  spaces. The PCD Item types are restricted to
                                                  FeaturePcd, FixedPcd, PatchPcd, Pcd and/or PcdEx.
                                                
                                            
                                        
                                        
                                        
                                            
                                                 This is a
                                                  recommended maximum data size for VOID* data
                                                  types, the actual value should be defined by the
                                                  Platform Integrator. It is not required for the
                                                  other data types. 
                                                 The minLength of
                                                  3 is required to handle the "0x" prefix to the hex
                                                  number. 
                                            
                                            
                                                
                                                  
                                                
                                            
                                        
                                        
                                        
                                            
                                                 Valid Error
                                                  messages that may be implemented in a module for
                                                  the PCD Entry. Only One Error Number per PcdError,
                                                  (multiple ErrorMessage entries are permitted) and
                                                  multiple PcdError elements are permitted.
                                                
                                            
                                            
                                                
                                                  
                                                  
                                                   One of the
                                                  following types of comparisons, which must be able
                                                  to evaluate to either true or false.
                                                  
                                                  
                                                  
                                                  
                                                   The PCD Value
                                                  must be space separated list of values. Values are
                                                  restricted to the data type of this PCD.
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                   The PCD must
                                                  be within a specifed range of numeric values.
                                                  Restricted to C style Relational, Equality and
                                                  Logicial Operators and parenthesis are valid. Only
                                                  the CName for this PCD is permitted in the
                                                  ValidValueRange expression. All other values must
                                                  be numeric.
                                                   LValue (op
                                                  RValue)+ 
                                                  
                                                  
                                                  
                                                  
                                                   A in-fix
                                                  logical expression using C style logical
                                                  operators. 
                                                  
                                                  
                                                  
                                                  
                                                  
                                                   A hexadecimal
                                                  value for the error message as defined by
                                                  specifications. 
                                                   The minLength
                                                  of 3 is required to handle the "0x" prefix to the
                                                  hex number. 
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                   This string
                                                  should be defined by specifications. There are
                                                  pre-defined error number ranges in the UEFI/PI
                                                  specificaiton. 
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                
                                            
                                        
                                    
                                    
                                
                            
                        
                    
                
                
                
                    
                         This section is used to describe any PCD
                            interdependencies or relationships. 
                    
                    
                        
                            
                                
                                     This entry must used
                                        TokenSpaceGuidCName.PcdCname for every named PCD. Restricted
                                        to Relational, Equality and Logical Operators (NOT, AND, OR,
                                        GT, GE, EQ, LE, LT and XOR) and parenthesis are valid. Only
                                        the TokenSpaceGuidCName.PcdCname us permitted to name PCDs
                                        in the expression. All other values must be numeric. 
                                     LValue (op RValue)+
                                    
                                
                            
                        
                    
                
                
                    
                         This section contains files that are not
                            part of the code distributed with this package. 
                    
                    
                        
                            
                                
                                     Only required if different
                                        from the Package Copyright. 
                                
                            
                            
                                
                                     Only required if different
                                        from the Package License. 
                                
                            
                            
                                
                                     A one line description of
                                        this section's content. 
                                
                            
                            
                                
                                     A complete description of
                                        the files in this section. 
                                
                            
                            
                                
                                     This is the PackagePath
                                        relative path and filename location within the ZIP file.
                                    
                                
                                
                                    
                                        
                                            
                                                
                                                   If true, used
                                                  by installation tools to ensure that a file that
                                                  must be executable has the correct properties to
                                                  permit execution. 
                                                
                                            
                                        
                                    
                                
                            
                        
                    
                
                
                
                    
                         This section is used for any processing
                            instructions that may be custom to the content provided by this package
                            that are common to this package. 
                    
                    
                        
                            
                        
                        
                            
                                 This is a single word identifier
                                    for grouping similar content that does not fit into previously
                                    defined sections or other sections of the Distribution.
                                
                            
                        
                        
                            
                                 This can be used to
                                    differentiate multiple sections with a grouping. 
                                 For example, a PRE_PROCESS
                                    Identifier might indicate specific steps and tools required
                                    before processing module content, while a different
                                    UserExtensions section with a POST_PROCESS Identifier might
                                    describe steps that need to be executed after operations on the
                                    modules in this package. 
                            
                        
                        
                    
                
                
            
        
    
    
    
        
             Each module is uniquely identified by it's GUID and
                Version number. Backward compatible releases of a module need only change the
                version number, while non-backward compatible changes require the GUID to change
                (resetting the version number to 1.0 is optional.) 
        
        
            
                
                    
                        
                            
                                
                                     This is the User Interface
                                        Name for this Module. 
                                
                                
                                    
                                        
                                            
                                                
                                                   This is a
                                                  single word BaseName that will be used to create a
                                                  module meta-data file. 
                                                   This name
                                                  should also be used to create output file names
                                                  and directories. 
                                                
                                            
                                        
                                    
                                
                            
                            
                                
                                     This GUID and the Version
                                        attribute uniquely identify a given Module.
                                    
                                
                                
                                    
                                        
                                            
                                                
                                                   This value,
                                                  along with the GUID, is used to uniquely identify
                                                  this object. 
                                                   Backward
                                                  compatible changes must make sure this number is
                                                  incremented from the most recent version.
                                                  Non-backward compatible changes require a new
                                                  GUID, and the version can be reset.
                                                  
                                                
                                            
                                        
                                    
                                
                            
                            
                                
                                     This is only required if the
                                        Copyright is different from either the Package or
                                        Distribution copyright. Multiple copyright lines are
                                        permitted within this section. 
                                
                            
                            
                                
                                     This is only required if the
                                        license is different from either the Package or Distribution
                                        license. Multiple licenses are permitted within this
                                        section. 
                                
                            
                            
                                
                                     A brief text description of
                                        the module. 
                                
                            
                            
                                
                                     A complete description of
                                        the module contents and/or features including a description
                                        of the updates since the previous module release.
                                    
                                
                            
                        
                    
                
                
                
                    
                         List general information about a module,
                            including the Supported Architectures, this module's type,
                            specifications the module is coded against, and other informational
                            content. 
                    
                    
                        
                            
                                
                                     One of the Enumerated module
                                        types that limit the use of a module. 
                                
                            
                            
                                
                                     For stand-alone modules that
                                        are NOT part of any package, this is the path to the root of
                                        the module as listed in the ZIP file. For modules included
                                        in a package, this is the location, relative to the root of
                                        the package (PackagePath) this module belongs to.
                                    
                                
                            
                            
                                
                                     This element is only
                                        required for the PEIM that produces the PCD PPI or the DXE
                                        Driver that produces the PCD Protocol. 
                                
                                
                                    
                                        
                                        
                                    
                                
                            
                            
                            
                            
                                
                                     This is a list of other
                                        specifications that this module is written against. These
                                        entries can be used in #define statements (depending on the
                                        build system implementation, they may be autogenerated.)
                                    
                                
                                
                                    
                                        
                                            
                                        
                                    
                                
                            
                            
                                
                                     Different firmware execution
                                        paths may be taken based on a given state of the hardware,
                                        firmware, or through feature settings. A BootMode may be
                                        declared (PRODUCES) or discovered (CONSUMES) based on these
                                        states and feature settings. If the usage is UNDEFINE, it
                                        implies that a Boot Mode is used, but the package creator
                                        does not know how it is used. The supported boot modes map
                                        to the PI specification Boot Modes. The boot modes listed
                                        with Recovery are to indicate that the BootMode is valid
                                        during a recovery boot. 
                                
                                
                                    
                                        
                                            
                                                
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                
                                            
                                        
                                        
                                    
                                    
                                        
                                            
                                                
                                                  
                                                   The module
                                                  always supports the given boot modes.
                                                  
                                                  
                                                
                                                
                                                  
                                                   The module may
                                                  support a given mode on some execution paths.
                                                  
                                                  
                                                
                                                
                                                  
                                                   The module
                                                  will change the boot mode. 
                                                  
                                                
                                                
                                                  
                                                   The module
                                                  will change the boot mode on some exection paths.
                                                  
                                                  
                                                
                                                
                                                  
                                                   The package
                                                  creator does not know how the boot mode is used.
                                                  
                                                  
                                                
                                            
                                        
                                    
                                    
                                    
                                
                            
                            
                                
                                     The functions that make up
                                        the Event, Timer, and Task Priority Services are used during
                                        preboot to create, close, signal, and wait for events; to
                                        set timers; and to raise and restore task priority levels as
                                        defined in the UEFI specification. GUIDed events should be
                                        listed in the Guids section. 
                                
                                
                                    
                                        
                                    
                                    
                                        
                                            
                                                
                                                  
                                                   The module
                                                  will register a notification function and calls
                                                  the function when it is signaled.
                                                  
                                                  
                                                
                                                
                                                  
                                                   The module
                                                  will register a notification function and calls
                                                  the function when it is signaled on some execution
                                                  paths. 
                                                  
                                                
                                                
                                                  
                                                   The module
                                                  will signal all events in an event group.
                                                  
                                                  
                                                
                                                
                                                  
                                                   The module
                                                  will signal all events in an event group under
                                                  some execution paths. 
                                                  
                                                
                                                
                                                  
                                                   The package
                                                  creator does not know how an event is used.
                                                  
                                                  
                                                
                                            
                                        
                                    
                                    
                                        
                                            
                                                
                                                
                                                
                                            
                                        
                                    
                                    
                                    
                                
                            
                            
                                
                                     This is a list of non-GUIDed
                                        Hand Off Blocks (HOBs) produced or consumed by this module.
                                    
                                
                                
                                    
                                        
                                    
                                    
                                        
                                            
                                                
                                                
                                                
                                                
                                                
                                                
                                            
                                        
                                    
                                    
                                        
                                            
                                                
                                                  
                                                   A HOB must be
                                                  present in the system. 
                                                  
                                                
                                                
                                                  
                                                   If present,
                                                  the HOB will be used. 
                                                  
                                                
                                                
                                                  
                                                   The HOB is
                                                  always produced by the module. 
                                                  
                                                
                                                
                                                  
                                                   The HOB may be
                                                  produced by the module under some execution paths.
                                                  
                                                  
                                                
                                                
                                                  
                                                   The package
                                                  creator knows that a HOB is used, but does not
                                                  know how it is used. 
                                                  
                                                
                                            
                                        
                                    
                                    
                                    
                                
                            
                        
                        
                    
                
                
                
                    
                         This section may be included for Modules
                            that are copied from a different module. 
                    
                    
                        
                            
                                
                                     This GUID and the Version
                                        attribute uniquely identify the Module that this Module was
                                        copied from. 
                                
                                
                                    
                                        
                                            
                                                
                                                   This value,
                                                  along with the GUID, is used to uniquely identify
                                                  this object. 
                                                
                                            
                                        
                                    
                                
                            
                        
                    
                
                
                
                    
                         A list of the different Library Classes
                            consumed by a driver, core and/or application module, or produced by a
                            Library module. 
                    
                    
                        
                            
                                
                                    
                                        
                                            
                                                 Used by tools
                                                  to identify different instances of libraries that
                                                  provide the library class. This keyword identifies
                                                  the library class this module needs to be linked
                                                  against. 
                                            
                                        
                                        
                                            
                                                
                                                  
                                                  
                                                   This GUID and
                                                  the Version attribute uniquely identify the
                                                  recommended Library Instance for this module .
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                   This value,
                                                  along with the GUID, is used to uniquely identify
                                                  this object. 
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                
                                            
                                        
                                        
                                    
                                    
                                        
                                            
                                                 Library
                                                  instances can provide code for a library class, or
                                                  may require other library instances themselves.
                                                  Since different execution paths in a library (or
                                                  module) may need different library classes based
                                                  on some setting, library classes may not alway be
                                                  required. 
                                            
                                            
                                                
                                                
                                                
                                                
                                            
                                        
                                    
                                    
                                    
                                        
                                             A FeatureFlag
                                                attribute must evaluate to either true or false - it
                                                may be a fixed value of true or false, a C name or
                                                an in-fix expression. 
                                        
                                    
                                
                            
                        
                    
                
                
                
                    
                        
                            
                                
                                     This is the module relative
                                        (ModuleProperties.Path) path and filename location within
                                        the ZIP file. 
                                
                                
                                    
                                        
                                            
                                                
                                                   The Family
                                                  attribute is used to restrict usage to a given
                                                  family of compilers, such as GCC or MSFT. Since
                                                  not all code processing tools use the same syntax,
                                                  especially for assembly, this field can be used to
                                                  identify different syntax. 
                                                
                                            
                                            
                                            
                                            
                                        
                                    
                                
                            
                            
                        
                    
                
                
                
                    
                        
                            
                                
                                    
                                        
                                            
                                                 This is the
                                                  module relative (ModuleProperties.Path) path and
                                                  filename location within the ZIP file.
                                                
                                            
                                            
                                                
                                                  
                                                  
                                                  
                                                  
                                                  
                                                   Binary file
                                                  distribution is limited to UEFI/PI FFS leaf
                                                  section file types. 
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                   A UEFI/PI FFS
                                                  Leaf section file type, not a raw PE32 file.
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                
                                            
                                        
                                        
                                            
                                                 This section
                                                  contains information about how the module was
                                                  coded, such as Compiler Tools, Flags, PCDs (only
                                                  PatchPcd and/or PcdEx) and Library Class Instances
                                                  used to build the binary. 
                                            
                                            
                                                
                                                  
                                                  
                                                   The element is
                                                  the Patchable PCD Value that was used during the
                                                  build. 
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                   The minLength
                                                  of 3 is required to handle the "0x" prefix to the
                                                  hex number. 
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                   This field is
                                                  required if the Pcd Datum Type is VOID* 
                                                   The minLength
                                                  of 3 is required to handle the "0x" prefix to the
                                                  hex number. 
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                   The minLength
                                                  of 3 is required to handle the "0x" prefix to the
                                                  hex number. 
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                   Error
                                                  information implemented by the module.
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                   The minLength
                                                  of 3 is required to handle the "0x" prefix to the
                                                  hex number. 
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                   The element is
                                                  the DynamicEx PCD Value that was used during the
                                                  build. 
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                   The minLength
                                                  of 3 is required to handle the "0x" prefix to the
                                                  hex number. 
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                   This field is
                                                  required if the Pcd Datum Type is VOID*
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                   Error
                                                  information implemented by the module.
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                   The minLength
                                                  of 3 is required to handle the "0x" prefix to the
                                                  hex number. 
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                   This is the
                                                  actual library instance that was used to link
                                                  against the module. 
                                                  
                                                  
                                                  
                                                  
                                                  
                                                   This GUID and
                                                  the Version attribute uniquely identify the actual
                                                  Library Instance linked in this module.
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                   This value,
                                                  along with the GUID, is used to uniquely identify
                                                  this object. 
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                   Any
                                                  description of OS, Tool, and flags for the
                                                  individual tool can go in this section.
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                  
                                                
                                            
                                        
                                        
                                        
                                    
                                
                            
                        
                    
                
                
                
                    
                        
                            
                                
                                    
                                        
                                            
                                                
                                                  
                                                  
                                                  
                                                
                                            
                                        
                                        
                                            
                                                 This GUID and
                                                  the Version attribute uniquely identify Package
                                                  that this Module depends on. 
                                            
                                            
                                                
                                                  
                                                  
                                                  
                                                   This value,
                                                  along with the GUID, is used to uniquely identify
                                                  this object. If the version attribute is not
                                                  specified, the most recent version of the package
                                                  can be used. 
                                                  
                                                  
                                                  
                                                
                                            
                                        
                                    
                                    
                                    
                                    
                                
                            
                        
                    
                
                
                
                    
                        
                            
                                
                                    
                                        
                                        
                                            
                                                 Only valid for
                                                  Variable GUID types. 
                                                 This can be either a Hex Array or
                                                  C string in unicode format: L"string" Data.
                                                
                                            
                                        
                                        
                                    
                                    
                                        
                                            
                                                
                                                  
                                                  The module does
                                                  not install the GUID, and the GUID must be present
                                                  for the module to execute. 
                                                  
                                                
                                                
                                                  
                                                   The module
                                                  does not install the GUID, however, the GUID will
                                                  be used if it is present. 
                                                  
                                                
                                                
                                                  
                                                   The module
                                                  always installs the GUID. 
                                                  
                                                
                                                
                                                  
                                                   The Module
                                                  will install the GUID under certain execution
                                                  paths. 
                                                  
                                                
                                                
                                                  
                                                   The package
                                                  creator knows that a GUID is used, but does not
                                                  know how it is used. 
                                                  
                                                
                                            
                                        
                                    
                                    
                                    
                                    
                                    
                                
                            
                        
                    
                
                
                
                    
                         A listing of protocols required or
                            produced by this module. 
                    
                    
                        
                            
                                
                                    
                                        
                                        
                                    
                                    
                                        
                                            
                                                
                                                
                                                
                                                
                                                
                                                
                                                
                                            
                                        
                                    
                                    
                                    
                                    
                                    
                                
                            
                        
                    
                
                
                
                    
                         A listing of PPIs required or produced
                            by this module. 
                    
                    
                        
                            
                                
                                    
                                        
                                        
                                    
                                    
                                        
                                            
                                                
                                                
                                                
                                                
                                                
                                            
                                        
                                    
                                    
                                    
                                    
                                    
                                
                            
                        
                    
                
                
                
                    
                         These elements specify additional
                            information about the module. This area may be used by tools to generate
                            code. 
                    
                    
                        
                            
                                
                                    
                                        
                                            
                                                
                                                
                                            
                                            
                                                
                                                
                                            
                                        
                                        
                                    
                                    
                                    
                                    
                                
                            
                        
                    
                
                
                
                    
                         This section describes how a platform is
                            coded with respect to the platform configuration knobs.
                        
                    
                    
                        
                            
                                
                                    
                                        
                                        
                                        
                                        
                                    
                                    
                                    
                                        
                                            
                                                
                                                
                                                
                                                
                                                
                                            
                                        
                                    
                                    
                                    
                                    
                                
                            
                        
                    
                
                
                
                    
                         This is the PEI dependency expression
                            for a Dependency Section. 
                    
                    
                        
                            
                                
                                     An in-fix expression, of C
                                        identifiers and TRUE, FALSE, AND, OR, NOT, BEFORE, and AFTER
                                        as well as parenthesis () in the in-fix notation. The
                                        operators are restricted to grammar defined in the PI
                                        specification. 
                                
                            
                            
                        
                        
                        
                        
                    
                
                
                
                    
                         This is the DXE dependency expression
                            for a Dependency Section. 
                    
                    
                        
                            
                                
                                     An in-fix expression, of C
                                        identifiers and TRUE, FALSE, AND, OR, NOT, BEFORE, and AFTER
                                        as well as parenthesis () in the in-fix notation. The
                                        operators are restricted to grammar defined in the PI
                                        specification. 
                                
                            
                            
                        
                        
                        
                        
                    
                
                
                
                    
                         This is the SMM dependency expression
                            for a Dependency Section. 
                    
                    
                        
                            
                                
                                     An in-fix expression, of C
                                        identifiers and TRUE, FALSE, AND, OR, NOT, BEFORE, and AFTER
                                        as well as parenthesis () in the in-fix notation. The
                                        operators are restricted to grammar defined in the PI
                                        specification. 
                                
                            
                            
                        
                        
                        
                        
                    
                
                
                
                    
                         This section is used to provide comments
                            and/or list auxiliary files, such as pdb or map files.
                        
                    
                    
                        
                            
                                
                                    
                                        
                                            
                                        
                                    
                                
                            
                            
                                
                                     This is the path and
                                        filename location within the ZIP file. 
                                
                                
                                    
                                        
                                            
                                                
                                                   If true, used
                                                  by installation tools to ensure that a file that
                                                  must be executable has the correct properties to
                                                  permit execution. 
                                                
                                            
                                        
                                    
                                
                            
                        
                    
                
                
                
                    
                         This section is used for any processing
                            instructions that may be custom to the content provided by the
                            distribution that are common to module. 
                         The content is vendor specific. 
                         The content can be plain text as well as
                            any user-defined, properly formatted XML structure. 
                    
                    
                        
                            
                                 This is a single word identifier
                                    for grouping similar content. For example, ReferenceBuild might
                                    be used to identify non-PI compliant build steps, with two
                                    different UserExtensions sections, one with an Identifier of
                                    Prebuild, and another of PostBuild. Both UserExtensions sections
                                    would use the same UserId. 
                            
                        
                        
                            
                                 This can be any string used to
                                    differentiate or identify this section from other UserExtensions
                                    sections. 
                                 For example, a PRE_PROCESS
                                    Identifier might indicate specific steps and tools required
                                    before processing module content, while a different
                                    UserExtensions section with a POST_PROCESS Identifier might
                                    describe steps that need to be executed after operations on this
                                    module. 
                            
                        
                        
                    
                
                
            
            
                
                     This attribute is used when the binaries are
                        distributed for this module and no code generation from source files is
                        required. If set, then the BinaryFiles section should be used, and any files
                        listed in the SourceFiles section do not have to be built. Additionally, the
                        AsBuilt section for each binary file must be included. 
                
            
        
    
    
    
        
            
                
                    
                        
                            
                                
                                    This is the User Interface
                                        Name for this Tools Distribution.
                                
                            
                            
                                
                                     This is only required if the
                                        Copyright is different from the Distribution Package
                                        copyright. 
                                
                            
                            
                                
                                     This is only required if the
                                        License is different from the Distribution Package license.
                                    
                                
                            
                            
                                
                                     This is only required if the
                                        Abstract is different from the Distribution Package
                                        Abstract. 
                                
                            
                            
                                
                                     This is only required if the
                                        Description is different from the Distribution Package
                                        Description. 
                                
                            
                        
                    
                
                
                    
                         This is the path and filename location
                            within the ZIP file. 
                    
                    
                        
                            
                                
                                    
                                         This is required for
                                            tools that execute; it should not be used for
                                            configuration files. 
                                    
                                
                                
                                    
                                         If true, used by
                                            installation tools to ensure that a file that must be
                                            executable has the correct properties to permit
                                            execution. 
                                    
                                
                            
                        
                    
                
            
        
    
    
    
        
             This section contains a list of files that are not
                part of the code distributed with modules, packages or tools. 
        
        
            
                
                    
                        
                            
                                
                                     The User interface name for
                                        this content. 
                                
                            
                            
                                
                                     This is only required if the
                                        Copyright is different from the Distribution Package
                                        Copyright. 
                                
                            
                            
                                
                                     This is only required if the
                                        License is different from the Distribution Package License.
                                    
                                
                            
                            
                            
                                
                                    
                                        
                                            
                                        
                                    
                                
                            
                        
                    
                
                
                    
                         This is the path and filename location
                            within the ZIP file. 
                    
                    
                        
                            
                                
                                    
                                         If true, used by
                                            installation tools to ensure that a file that must be
                                            executable has the correct properties to permit
                                            execution. 
                                    
                                
                            
                        
                    
                
            
        
    
    
    
        
            
                
            
            
                
                     This is a single word identifier for
                        grouping similar content. For example, ReferenceBuild might be used to
                        identify non-PI compliant build steps, with two different UserExtensions
                        sections, one with an Identifier of Prebuild, and another of PostBuild. Both
                        UserExtensions sections would use the same UserId. 
                
            
            
                
                     This can be any string used to differentiate
                        or identify this section from other UserExtensions sections. 
                     For example, a PRE_PROCESS Identifier might
                        indicate specific steps and tools required before processing distribution
                        package content, while a different UserExtensions section with a
                        POST_PROCESS Identifier might describe steps that need to be executed after
                        operations on this content. 
                
            
            
        
    
    
    
        
            
                
                    
                
            
        
    
    
    
        
        
    
    
    
        
    
    
        
            
            
            
            
            
                
                     Any processor architecture not listed above.
                        The Architecture must be a target architecture of one or more compiler tool
                        chains. 
                
            
        
    
    
        
            
            
            
                
                     Any other family of build utilities for
                        which compiler tools exist. 
                
            
        
    
    
        
    
    
        
            
            
            
            
            
            
            
            
            
            
        
    
    
        
            
        
    
    
        
            
        
    
    
        
    
    
        
             The following module types are defined by
                specifications. 
             Module types for components and libraries defined
                for this distribution mechanism. 
        
        
            
                
                     Use of this module is not restricted.
                    
                
            
            
                
                     This module is only applicable to the DXE
                        core. 
                
            
            
                
                     This module is only applicable to a DXE
                        driver. 
                
            
            
                
                     This module is only applicable to a DXE
                        runtime driver. 
                
            
            
                
                     This module is only applicable to an IPF DXE
                        runtime driver. 
                
            
            
                
                     This module is only applicable to a DXE SMM
                        driver. 
                
            
            
                
                     This module is only applicable to the PEI
                        core. 
                
            
            
                
                     This module is only valid for PEI modules.
                    
                
            
            
                
                     This module is only applicable to Security
                        phase. 
                
            
            
                
                     This module is only valid for UEFI drivers.
                    
                
            
            
                
                     This module is only valid for UEFI runtime
                        drivers.
                
            
            
                
                     This module is only valid for UEFI
                        applications. 
                
            
            
                
                     This module is only applicable to the SMM
                        core.
                
            
            
                
                     This content is restricted to a specific
                        implementation. 
                
            
            
                
                     This enumeration is for use in a list that
                        where the package creator does not know the what module types are supported
                        by a module. 
                
            
            
                
                     This pattern has been added for use in a
                        module lists - for future expansion. 
                
            
        
    
    
        
             The following data types are defined by the PCD
                specification (or PCD section of the UEFI/PI specifications.) 
        
        
            
            
            
            
            
            
        
    
    
        
    
    
        
            
                
                     The Feature PCD is a binary, evaluating to
                        either true or false. This is used during build to include/exclude content.
                        It can also be used during execution to force execution paths within
                        drivers, or to enable/disable features within a driver for a given platform.
                    
                
            
            
                
                     The Fixed PCD is a #define value that is set
                        at build time. 
                
            
            
                
                     The Patch PCD is a #define that is set at
                        build time, and that can be modified within a binary file. Additional
                        information, such as the offset location of the value, along with it's
                        length may need to be provided.
                
            
            
                
                     This PCD type has an overloaded definition.
                        Prior to build, the platform integrator may choose to implement a PCD as
                        Fixed, Patchable or a Dynamic PCD. If the platform integrator choose to use
                        the PCD as dynamic, then a PCD driver is required in the platform
                        (PEI/DXE/both) to track the PCD in some sort of 'database' of these items.
                        For Dynamic PCDs, the PcdGet* must pass in the token space guid and the
                        token number to retrieve data (PcdSet* also needs these values.)
                    
                
            
            
                
                     The PCD can only be used as Dynamic, and the
                        platform firmware must contain a driver to maintain a 'database' of these
                        items. For Dynamic PCDs, the PcdGet* must pass in the token space guid and
                        the token number to retrieve data (PcdSet* also needs these values.)
                    
                
            
        
    
    
        
             A GUID must contain five different Hexadecimal
                character sets that are separated by a dash (-) character. 
        
        
            
        
    
    
        
             The EDK II build system supports workstations
                running one of the following supported operating systems. This is the OS for the
                developer's workstation, not the target platform. 
        
        
            
                
                     For Windows 2003, Windows XP and Windows
                        Vista. 
                
            
            
                
                     For Windows 2003, Windows XP and Windows
                        Vista. 
                
            
            
            
            
            
            
                
                     Typically, this is used for Windows Batch
                        files. 
                
            
            
                
                     Typically use for shell scripts - valid for
                        any Linux and Mac OS/X.