/** @file
  UEFI User Manager Protocol definition.

  This protocol manages user profiles.

  Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#pragma once

///
/// Global ID for the User Manager Protocol
///
#define EFI_USER_MANAGER_PROTOCOL_GUID \
  { \
    0x6fd5b00c, 0xd426, 0x4283, { 0x98, 0x87, 0x6c, 0xf5, 0xcf, 0x1c, 0xb1, 0xfe } \
  }

#define EFI_EVENT_GROUP_USER_PROFILE_CHANGED \
  { \
    0xbaf1e6de, 0x209e, 0x4adb, { 0x8d, 0x96, 0xfd, 0x8b, 0x71, 0xf3, 0xf6, 0x83 } \
  }

typedef VOID  *EFI_USER_PROFILE_HANDLE;
typedef VOID  *EFI_USER_INFO_HANDLE;

///
/// The attributes of the user profile information.
///
typedef UINT16 EFI_USER_INFO_ATTRIBS;
#define EFI_USER_INFO_STORAGE                0x000F
#define EFI_USER_INFO_STORAGE_VOLATILE       0x0000
#define EFI_USER_INFO_STORAGE_CREDENTIAL_NV  0x0001
#define EFI_USER_INFO_STORAGE_PLATFORM_NV    0x0002

#define EFI_USER_INFO_ACCESS     0x0070
#define EFI_USER_INFO_PUBLIC     0x0010
#define EFI_USER_INFO_PRIVATE    0x0020
#define EFI_USER_INFO_PROTECTED  0x0030
#define EFI_USER_INFO_EXCLUSIVE  0x0080

///
/// User information structure
///
typedef struct {
  ///
  /// The user credential identifier associated with this user information or else Nil if the
  /// information is not associated with any specific credential.
  ///
  EFI_GUID                 Credential;
  ///
  /// The type of user information.
  ///
  UINT8                    InfoType;
  ///
  /// Must be set to 0.
  ///
  UINT8                    Reserved1;
  ///
  /// The attributes of the user profile information.
  ///
  EFI_USER_INFO_ATTRIBS    InfoAttribs;
  ///
  /// The size of the user information, in bytes, including this header.
  ///
  UINT32                   InfoSize;
} EFI_USER_INFO;

///
/// User credential class GUIDs
///
#define EFI_USER_CREDENTIAL_CLASS_UNKNOWN \
  { 0x5cf32e68, 0x7660, 0x449b, { 0x80, 0xe6, 0x7e, 0xa3, 0x6e, 0x3, 0xf6, 0xa8 } }
#define EFI_USER_CREDENTIAL_CLASS_PASSWORD \
  { 0xf8e5058c, 0xccb6, 0x4714, { 0xb2, 0x20, 0x3f, 0x7e, 0x3a, 0x64, 0xb, 0xd1 } }
#define EFI_USER_CREDENTIAL_CLASS_SMART_CARD \
  { 0x5f03ba33, 0x8c6b, 0x4c24, { 0xaa, 0x2e, 0x14, 0xa2, 0x65, 0x7b, 0xd4, 0x54 } }
#define EFI_USER_CREDENTIAL_CLASS_FINGERPRINT \
  { 0x32cba21f, 0xf308, 0x4cbc, { 0x9a, 0xb5, 0xf5, 0xa3, 0x69, 0x9f, 0x4, 0x4a } }
#define EFI_USER_CREDENTIAL_CLASS_HANDPRINT \
  { 0x5917ef16, 0xf723, 0x4bb9, { 0xa6, 0x4b, 0xd8, 0xc5, 0x32, 0xf4, 0xd8, 0xb5 } }
#define EFI_USER_CREDENTIAL_CLASS_SECURE_CARD \
  { 0x8a6b4a83, 0x42fe, 0x45d2, { 0xa2, 0xef, 0x46, 0xf0, 0x6c, 0x7d, 0x98, 0x52 } }

typedef UINT64 EFI_CREDENTIAL_CAPABILITIES;
#define EFI_CREDENTIAL_CAPABILITIES_ENROLL  0x0000000000000001

///
/// Credential logon flags
///
typedef UINT32 EFI_CREDENTIAL_LOGON_FLAGS;
#define EFI_CREDENTIAL_LOGON_FLAG_AUTO     0x00000001
#define EFI_CREDENTIAL_LOGON_FLAG_DEFAULT  0x00000002

///
/// User information record types
///

///
/// No information.
///
#define EFI_USER_INFO_EMPTY_RECORD  0x00
///
/// Provide the user's name for the enrolled user.
///
#define EFI_USER_INFO_NAME_RECORD  0x01
typedef CHAR16 *EFI_USER_INFO_NAME;
///
/// Provides the date and time when the user profile was created.
///
#define EFI_USER_INFO_CREATE_DATE_RECORD  0x02
typedef EFI_TIME EFI_USER_INFO_CREATE_DATE;
///
/// Provides the date and time when the user profile was selected.
///
#define EFI_USER_INFO_USAGE_DATE_RECORD  0x03
typedef EFI_TIME EFI_USER_INFO_USAGE_DATE;
///
/// Provides the number of times that the user profile has been selected.
///
#define EFI_USER_INFO_USAGE_COUNT_RECORD  0x04
typedef UINT64 EFI_USER_INFO_USAGE_COUNT;
///
/// Provides a unique non-volatile user identifier for each enrolled user.
///
#define EFI_USER_INFO_IDENTIFIER_RECORD  0x05
typedef UINT8 EFI_USER_INFO_IDENTIFIER[16];
///
/// Specifies the type of a particular credential associated with the user profile.
///
#define EFI_USER_INFO_CREDENTIAL_TYPE_RECORD  0x06
typedef EFI_GUID EFI_USER_INFO_CREDENTIAL_TYPE;
///
/// Specifies the user-readable name of a particular credential type.
///
#define EFI_USER_INFO_CREDENTIAL_TYPE_NAME_RECORD  0x07
typedef CHAR16 *EFI_USER_INFO_CREDENTIAL_TYPE_NAME;
///
/// Specifies the credential provider.
///
#define EFI_USER_INFO_CREDENTIAL_PROVIDER_RECORD  0x08
typedef EFI_GUID EFI_USER_INFO_CREDENTIAL_PROVIDER;
///
/// Specifies the user-readable name of a particular credential's provider.
///
#define EFI_USER_INFO_CREDENTIAL_PROVIDER_NAME_RECORD  0x09
typedef CHAR16 *EFI_USER_INFO_CREDENTIAL_PROVIDER_NAME;
///
/// Provides PKCS#11 credential information from a smart card.
///
#define EFI_USER_INFO_PKCS11_RECORD  0x0A
///
/// Provides standard biometric information in the format specified by the ISO 19785 (Common
/// Biometric Exchange Formats Framework) specification.
///
#define EFI_USER_INFO_CBEFF_RECORD  0x0B
typedef VOID *EFI_USER_INFO_CBEFF;
///
/// Indicates how close of a match the fingerprint must be in order to be considered a match.
///
#define EFI_USER_INFO_FAR_RECORD  0x0C
typedef UINT8 EFI_USER_INFO_FAR;
///
/// Indicates how many attempts the user has to with a particular credential before the system prevents
/// further attempts.
///
#define EFI_USER_INFO_RETRY_RECORD  0x0D
typedef UINT8 EFI_USER_INFO_RETRY;
///
/// Provides the user's pre-OS access rights.
///
#define EFI_USER_INFO_ACCESS_POLICY_RECORD  0x0E

typedef struct {
  UINT32    Type; ///< Specifies the type of user access control.
  UINT32    Size; ///< Specifies the size of the user access control record, in bytes, including this header.
} EFI_USER_INFO_ACCESS_CONTROL;

typedef EFI_USER_INFO_ACCESS_CONTROL EFI_USER_INFO_ACCESS_POLICY;

///
/// User Information access types
///

///
/// Forbids the user from booting or loading executables from the specified device path or any child
/// device paths.
///
#define EFI_USER_INFO_ACCESS_FORBID_LOAD  0x00000001
///
/// Permits the user from booting or loading executables from the specified device path or any child
/// device paths.
/// Note: in-consistency between code and the UEFI 2.3 specification here.
/// The definition EFI_USER_INFO_ACCESS_PERMIT_BOOT in the specification should be typo and wait for
/// spec update.
///
#define EFI_USER_INFO_ACCESS_PERMIT_LOAD  0x00000002
///
/// Presence of this record indicates that a user can update enrollment information.
///
#define EFI_USER_INFO_ACCESS_ENROLL_SELF  0x00000003
///
/// Presence of this record indicates that a user can enroll new users.
///
#define EFI_USER_INFO_ACCESS_ENROLL_OTHERS  0x00000004
///
/// Presence of this record indicates that a user can update the user information of any user.
///
#define EFI_USER_INFO_ACCESS_MANAGE  0x00000005
///
/// Describes permissions usable when configuring the platform.
///
#define EFI_USER_INFO_ACCESS_SETUP  0x00000006
///
/// Standard GUIDs for access to configure the platform.
///
#define EFI_USER_INFO_ACCESS_SETUP_ADMIN_GUID \
  { 0x85b75607, 0xf7ce, 0x471e, { 0xb7, 0xe4, 0x2a, 0xea, 0x5f, 0x72, 0x32, 0xee } }
#define EFI_USER_INFO_ACCESS_SETUP_NORMAL_GUID \
  { 0x1db29ae0, 0x9dcb, 0x43bc, { 0x8d, 0x87, 0x5d, 0xa1, 0x49, 0x64, 0xdd, 0xe2 } }
#define EFI_USER_INFO_ACCESS_SETUP_RESTRICTED_GUID \
  { 0xbdb38125, 0x4d63, 0x49f4, { 0x82, 0x12, 0x61, 0xcf, 0x5a, 0x19, 0xa, 0xf8 } }

///
/// Forbids UEFI drivers from being started from the specified device path(s) or any child device paths.
///
#define EFI_USER_INFO_ACCESS_FORBID_CONNECT  0x00000007
///
/// Permits UEFI drivers to be started on the specified device path(s) or any child device paths.
///
#define EFI_USER_INFO_ACCESS_PERMIT_CONNECT  0x00000008
///
/// Modifies the boot order.
///
#define EFI_USER_INFO_ACCESS_BOOT_ORDER  0x00000009
typedef UINT32 EFI_USER_INFO_ACCESS_BOOT_ORDER_HDR;

#define EFI_USER_INFO_ACCESS_BOOT_ORDER_MASK  0x0000000F
///
/// Insert new boot options at the beginning of the boot order.
///
#define EFI_USER_INFO_ACCESS_BOOT_ORDER_INSERT  0x00000000
///
/// Append new boot options to the end of the boot order.
///
#define EFI_USER_INFO_ACCESS_BOOT_ORDER_APPEND  0x00000001
///
/// Replace the entire boot order.
///
#define EFI_USER_INFO_ACCESS_BOOT_ORDER_REPLACE  0x00000002
///
/// The Boot Manager will not attempt find a default boot device
/// when the default boot order is does not lead to a bootable device.
///
#define EFI_USER_INFO_ACCESS_BOOT_ORDER_NODEFAULT  0x00000010

///
/// Provides the expression which determines which credentials are required to assert user identity.
///
#define EFI_USER_INFO_IDENTITY_POLICY_RECORD  0x0F

typedef struct {
  UINT32    Type;   ///< Specifies either an operator or a data item.
  UINT32    Length; ///< The length of this block, in bytes, including this header.
} EFI_USER_INFO_IDENTITY_POLICY;

///
/// User identity policy expression operators.
///
#define EFI_USER_INFO_IDENTITY_FALSE                0x00
#define EFI_USER_INFO_IDENTITY_TRUE                 0x01
#define EFI_USER_INFO_IDENTITY_CREDENTIAL_TYPE      0x02
#define EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER  0x03
#define EFI_USER_INFO_IDENTITY_NOT                  0x10
#define EFI_USER_INFO_IDENTITY_AND                  0x11
#define EFI_USER_INFO_IDENTITY_OR                   0x12

///
/// Provides placeholder for additional user profile information identified by a GUID.
///
#define EFI_USER_INFO_GUID_RECORD  0xFF
typedef EFI_GUID EFI_USER_INFO_GUID;

///
/// User information table
/// A collection of EFI_USER_INFO records, prefixed with this header.
///
typedef struct {
  UINT64    Size; ///< Total size of the user information table, in bytes.
} EFI_USER_INFO_TABLE;

typedef struct _EFI_USER_MANAGER_PROTOCOL EFI_USER_MANAGER_PROTOCOL;

/**
  Create a new user profile.

  This function creates a new user profile with only a new user identifier attached and returns its
  handle. The user profile is non-volatile, but the handle User can change across reboots.

  @param[in]  This               Points to this instance of the EFI_USER_MANAGER_PROTOCOL.
  @param[out] User               On return, points to the new user profile handle.
                                 The user profile handle is unique only during this boot.

  @retval EFI_SUCCESS            User profile was successfully created.
  @retval EFI_ACCESS_DENIED      Current user does not have sufficient permissions to create a user profile.
  @retval EFI_UNSUPPORTED        Creation of new user profiles is not supported.
  @retval EFI_INVALID_PARAMETER  The User parameter is NULL.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_USER_PROFILE_CREATE)(
  IN CONST EFI_USER_MANAGER_PROTOCOL  *This,
  OUT      EFI_USER_PROFILE_HANDLE    *User
  );

/**
  Delete an existing user profile.

  @param[in] This                Points to this instance of the EFI_USER_MANAGER_PROTOCOL.
  @param[in] User                User profile handle.

  @retval EFI_SUCCESS            User profile was successfully deleted.
  @retval EFI_ACCESS_DENIED      Current user does not have sufficient permissions to delete a user
                                 profile or there is only one user profile.
  @retval EFI_UNSUPPORTED        Deletion of new user profiles is not supported.
  @retval EFI_INVALID_PARAMETER  User does not refer to a valid user profile.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_USER_PROFILE_DELETE)(
  IN CONST EFI_USER_MANAGER_PROTOCOL  *This,
  IN       EFI_USER_PROFILE_HANDLE    User
  );

/**
  Enumerate all of the enrolled users on the platform.

  This function returns the next enrolled user profile. To retrieve the first user profile handle, point
  User at a NULL. Each subsequent call will retrieve another user profile handle until there are no
  more, at which point User will point to NULL.

  @param[in]     This            Points to this instance of the EFI_USER_MANAGER_PROTOCOL.
  @param[in,out] User            On entry, points to the previous user profile handle or NULL to
                                 start enumeration. On exit, points to the next user profile handle
                                 or NULL if there are no more user profiles.

  @retval EFI_SUCCESS            Next enrolled user profile successfully returned.
  @retval EFI_ACCESS_DENIED      Next enrolled user profile was not successfully returned.
  @retval EFI_INVALID_PARAMETER  The User parameter is NULL.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_USER_PROFILE_GET_NEXT)(
  IN CONST EFI_USER_MANAGER_PROTOCOL  *This,
  IN OUT   EFI_USER_PROFILE_HANDLE    *User
  );

/**
  Return the current user profile handle.

  @param[in]  This               Points to this instance of the EFI_USER_MANAGER_PROTOCOL.
  @param[out] CurrentUser        On return, points to the current user profile handle.

  @retval EFI_SUCCESS            Current user profile handle returned successfully.
  @retval EFI_INVALID_PARAMETER  The CurrentUser parameter is NULL.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_USER_PROFILE_CURRENT)(
  IN CONST EFI_USER_MANAGER_PROTOCOL  *This,
  OUT      EFI_USER_PROFILE_HANDLE    *CurrentUser
  );

/**
  Identify a user.

  Identify the user and, if authenticated, returns the user handle and changes the current user profile.
  All user information marked as private in a previously selected profile is no longer available for
  inspection.
  Whenever the current user profile is changed then the an event with the GUID
  EFI_EVENT_GROUP_USER_PROFILE_CHANGED is signaled.

  @param[in]  This               Points to this instance of the EFI_USER_MANAGER_PROTOCOL.
  @param[out] User               On return, points to the user profile handle for the current user profile.

  @retval EFI_SUCCESS            User was successfully identified.
  @retval EFI_ACCESS_DENIED      User was not successfully identified.
  @retval EFI_INVALID_PARAMETER  The User parameter is NULL.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_USER_PROFILE_IDENTIFY)(
  IN CONST EFI_USER_MANAGER_PROTOCOL  *This,
  OUT      EFI_USER_PROFILE_HANDLE    *User
  );

/**
  Find a user using a user information record.

  This function searches all user profiles for the specified user information record. The search starts
  with the user information record handle following UserInfo and continues until either the
  information is found or there are no more user profiles.
  A match occurs when the Info.InfoType field matches the user information record type and the
  user information record data matches the portion of Info.

  @param[in]     This      Points to this instance of the EFI_USER_MANAGER_PROTOCOL.
  @param[in,out] User      On entry, points to the previously returned user profile handle or NULL to start
                           searching with the first user profile. On return, points to the user profile handle or
                           NULL if not found.
  @param[in,out] UserInfo  On entry, points to the previously returned user information handle or NULL to start
                           searching with the first. On return, points to the user information handle of the user
                           information record or NULL if not found. Can be NULL, in which case only one user
                           information record per user can be returned.
  @param[in]     Info      Points to the buffer containing the user information to be compared to the user
                           information record. If the user information record data is empty, then only the user
                           information record type is compared.
                           If InfoSize is 0, then the user information record must be empty.

  @param[in]     InfoSize  The size of Info, in bytes.

  @retval EFI_SUCCESS           User information was found. User points to the user profile handle and UserInfo
                                points to the user information handle.
  @retval EFI_NOT_FOUND         User information was not found. User points to NULL and UserInfo points to NULL.
  @retval EFI_INVALID_PARAMETER User is NULL. Or Info is NULL.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_USER_PROFILE_FIND)(
  IN CONST EFI_USER_MANAGER_PROTOCOL  *This,
  IN OUT   EFI_USER_PROFILE_HANDLE    *User,
  IN OUT   EFI_USER_INFO_HANDLE       *UserInfo OPTIONAL,
  IN CONST EFI_USER_INFO              *Info,
  IN       UINTN                      InfoSize
  );

/**
  Called by credential provider to notify of information change.

  This function allows the credential provider to notify the User Identity Manager when user status
  has changed.
  If the User Identity Manager doesn't support asynchronous changes in credentials, then this function
  should return EFI_UNSUPPORTED.
  If current user does not exist, and the credential provider can identify a user, then make the user
  to be current user and signal the EFI_EVENT_GROUP_USER_PROFILE_CHANGED event.
  If current user already exists, and the credential provider can identify another user, then switch
  current user to the newly identified user, and signal the EFI_EVENT_GROUP_USER_PROFILE_CHANGED event.
  If current user was identified by this credential provider and now the credential provider cannot identify
  current user, then logout current user and signal the EFI_EVENT_GROUP_USER_PROFILE_CHANGED event.

  @param[in] This          Points to this instance of the EFI_USER_MANAGER_PROTOCOL.
  @param[in] Changed       Handle on which is installed an instance of the
                           EFI_USER_CREDENTIAL_PROTOCOL where the user has changed.

  @retval EFI_SUCCESS      The User Identity Manager has handled the notification.
  @retval EFI_NOT_READY    The function was called while the specified credential provider was not selected.
  @retval EFI_UNSUPPORTED  The User Identity Manager doesn't support asynchronous notifications.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_USER_PROFILE_NOTIFY)(
  IN CONST EFI_USER_MANAGER_PROTOCOL  *This,
  IN       EFI_HANDLE                 Changed
  );

/**
  Return information attached to the user.

  This function returns user information. The format of the information is described in User
  Information. The function may return EFI_ACCESS_DENIED if the information is marked private
  and the handle specified by User is not the current user profile. The function may return
  EFI_ACCESS_DENIED if the information is marked protected and the information is associated
  with a credential provider for which the user has not been authenticated.

  @param[in]     This           Points to this instance of the EFI_USER_MANAGER_PROTOCOL.
  @param[in]     User           Handle of the user whose profile will be retrieved.
  @param[in]     UserInfo       Handle of the user information data record.
  @param[out]    Info           On entry, points to a buffer of at least *InfoSize bytes. On exit, holds the user
                                information. If the buffer is too small to hold the information, then
                                EFI_BUFFER_TOO_SMALL is returned and InfoSize is updated to contain the
                                number of bytes actually required.
  @param[in,out] InfoSize       On entry, points to the size of Info. On return, points to the size of the user
                                information.

  @retval EFI_SUCCESS           Information returned successfully.
  @retval EFI_ACCESS_DENIED     The information about the specified user cannot be accessed by the current user.
  @retval EFI_BUFFER_TOO_SMALL  The number of bytes specified by *InfoSize is too small to hold
                                the returned data. The actual size required is returned in *InfoSize.
  @retval EFI_NOT_FOUND         User does not refer to a valid user profile or UserInfo does not refer to a valid
                                user info handle.
  @retval EFI_INVALID_PARAMETER Info is NULL or InfoSize is NULL.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_USER_PROFILE_GET_INFO)(
  IN CONST EFI_USER_MANAGER_PROTOCOL  *This,
  IN       EFI_USER_PROFILE_HANDLE    User,
  IN       EFI_USER_INFO_HANDLE       UserInfo,
  OUT      EFI_USER_INFO              *Info,
  IN OUT   UINTN                      *InfoSize
  );

/**
  Add or update user information.

  This function changes user information.  If NULL is pointed to by UserInfo, then a new user
  information record is created and its handle is returned in UserInfo. Otherwise, the existing one is
  replaced.
  If EFI_USER_INFO_IDENTITY_POLICY_RECORD is changed, it is the caller's responsibility to keep it to
  be synced with the information on credential providers.
  If EFI_USER_INFO_EXCLUSIVE is specified in Info and a user information record of the same
  type already exists in the user profile, then EFI_ACCESS_DENIED will be returned and
  UserInfo will point to the handle of the existing record.

  @param[in]     This             Points to this instance of the EFI_USER_MANAGER_PROTOCOL.
  @param[in]     User             Handle of the user whose profile will be retrieved.
  @param[in,out] UserInfo         Handle of the user information data record.
  @param[in]     Info             On entry, points to a buffer of at least *InfoSize bytes. On exit, holds the user
                                  information. If the buffer is too small to hold the information, then
                                  EFI_BUFFER_TOO_SMALL is returned and InfoSize is updated to contain the
                                  number of bytes actually required.
  @param[in]     InfoSize         On entry, points to the size of Info. On return, points to the size of the user
                                  information.

  @retval EFI_SUCCESS             Information returned successfully.
  @retval EFI_ACCESS_DENIED       The record is exclusive.
  @retval EFI_SECURITY_VIOLATION  The current user does not have permission to change the specified
                                  user profile or user information record.
  @retval EFI_NOT_FOUND           User does not refer to a valid user profile or UserInfo does not refer to a valid
                                  user info handle.
  @retval EFI_INVALID_PARAMETER   UserInfo is NULL or Info is NULL.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_USER_PROFILE_SET_INFO)(
  IN CONST EFI_USER_MANAGER_PROTOCOL  *This,
  IN       EFI_USER_PROFILE_HANDLE    User,
  IN OUT   EFI_USER_INFO_HANDLE       *UserInfo,
  IN CONST EFI_USER_INFO              *Info,
  IN       UINTN                      InfoSize
  );

/**
  Delete user information.

  Delete the user information attached to the user profile specified by the UserInfo.

  @param[in] This            Points to this instance of the EFI_USER_MANAGER_PROTOCOL.
  @param[in] User            Handle of the user whose information will be deleted.
  @param[in] UserInfo        Handle of the user information to remove.

  @retval EFI_SUCCESS        User information deleted successfully.
  @retval EFI_NOT_FOUND      User information record UserInfo does not exist in the user profile.
  @retval EFI_ACCESS_DENIED  The current user does not have permission to delete this user information.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_USER_PROFILE_DELETE_INFO)(
  IN CONST EFI_USER_MANAGER_PROTOCOL  *This,
  IN       EFI_USER_PROFILE_HANDLE    User,
  IN       EFI_USER_INFO_HANDLE       UserInfo
  );

/**
  Enumerate user information of all the enrolled users on the platform.

  This function returns the next user information record. To retrieve the first user information record
  handle, point UserInfo at a NULL. Each subsequent call will retrieve another user information
  record handle until there are no more, at which point UserInfo will point to NULL.

  @param[in]     This           Points to this instance of the EFI_USER_MANAGER_PROTOCOL.
  @param[in]     User           Handle of the user whose information will be deleted.
  @param[in,out] UserInfo       Handle of the user information to remove.

  @retval EFI_SUCCESS           User information returned.
  @retval EFI_NOT_FOUND         No more user information found.
  @retval EFI_INVALID_PARAMETER UserInfo is NULL.
**/
typedef
EFI_STATUS
(EFIAPI *EFI_USER_PROFILE_GET_NEXT_INFO)(
  IN CONST EFI_USER_MANAGER_PROTOCOL  *This,
  IN       EFI_USER_PROFILE_HANDLE    User,
  IN OUT   EFI_USER_INFO_HANDLE       *UserInfo
  );

///
/// This protocol provides the services used to manage user profiles.
///
struct _EFI_USER_MANAGER_PROTOCOL {
  EFI_USER_PROFILE_CREATE           Create;
  EFI_USER_PROFILE_DELETE           Delete;
  EFI_USER_PROFILE_GET_NEXT         GetNext;
  EFI_USER_PROFILE_CURRENT          Current;
  EFI_USER_PROFILE_IDENTIFY         Identify;
  EFI_USER_PROFILE_FIND             Find;
  EFI_USER_PROFILE_NOTIFY           Notify;
  EFI_USER_PROFILE_GET_INFO         GetInfo;
  EFI_USER_PROFILE_SET_INFO         SetInfo;
  EFI_USER_PROFILE_DELETE_INFO      DeleteInfo;
  EFI_USER_PROFILE_GET_NEXT_INFO    GetNextInfo;
};

extern EFI_GUID  gEfiUserManagerProtocolGuid;
extern EFI_GUID  gEfiEventUserProfileChangedGuid;
extern EFI_GUID  gEfiUserCredentialClassUnknownGuid;
extern EFI_GUID  gEfiUserCredentialClassPasswordGuid;
extern EFI_GUID  gEfiUserCredentialClassSmartCardGuid;
extern EFI_GUID  gEfiUserCredentialClassFingerprintGuid;
extern EFI_GUID  gEfiUserCredentialClassHandprintGuid;
extern EFI_GUID  gEfiUserCredentialClassSecureCardGuid;
extern EFI_GUID  gEfiUserInfoAccessSetupAdminGuid;
extern EFI_GUID  gEfiUserInfoAccessSetupNormalGuid;
extern EFI_GUID  gEfiUserInfoAccessSetupRestrictedGuid;
