0. Remove the unused private GUID from module source files. 1. Use gEfiCallerIdGuid replace of the private module GUID. 2. Add the public header files to define HII FormSet and PackageList GUID used in every HII driver. Signed-off-by: lgao4 Reviewed-by: ydong10 gdong1 tye jfan12 wli12 rsun3 jyao1 ftian git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12375 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			2512 lines
		
	
	
		
			71 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			2512 lines
		
	
	
		
			71 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  The functions to modify a user profile.
 | 
						|
    
 | 
						|
Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>
 | 
						|
This program and the accompanying materials 
 | 
						|
are licensed and made available under the terms and conditions of the BSD License 
 | 
						|
which accompanies this distribution.  The full text of the license may be found at 
 | 
						|
http://opensource.org/licenses/bsd-license.php
 | 
						|
 | 
						|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 
 | 
						|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#include "UserProfileManager.h"
 | 
						|
 | 
						|
EFI_USER_PROFILE_HANDLE           mModifyUser = NULL;
 | 
						|
 | 
						|
/**
 | 
						|
  Display user select form, cab select a user to modify.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
SelectUserToModify  (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS              Status;
 | 
						|
  UINT8                   Index;
 | 
						|
  EFI_USER_PROFILE_HANDLE User;
 | 
						|
  EFI_USER_PROFILE_HANDLE CurrentUser;
 | 
						|
  UINT32                  CurrentAccessRight;
 | 
						|
  VOID                    *StartOpCodeHandle;
 | 
						|
  VOID                    *EndOpCodeHandle;
 | 
						|
  EFI_IFR_GUID_LABEL      *StartLabel;
 | 
						|
  EFI_IFR_GUID_LABEL      *EndLabel;
 | 
						|
 | 
						|
  //
 | 
						|
  // Initialize the container for dynamic opcodes.
 | 
						|
  //
 | 
						|
  StartOpCodeHandle = HiiAllocateOpCodeHandle ();
 | 
						|
  ASSERT (StartOpCodeHandle != NULL);
 | 
						|
 | 
						|
  EndOpCodeHandle = HiiAllocateOpCodeHandle ();
 | 
						|
  ASSERT (EndOpCodeHandle != NULL);
 | 
						|
 | 
						|
  //
 | 
						|
  // Create Hii Extend Label OpCode.
 | 
						|
  //
 | 
						|
  StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
 | 
						|
                                        StartOpCodeHandle,
 | 
						|
                                        &gEfiIfrTianoGuid,
 | 
						|
                                        NULL,
 | 
						|
                                        sizeof (EFI_IFR_GUID_LABEL)
 | 
						|
                                        );
 | 
						|
  StartLabel->ExtendOpCode  = EFI_IFR_EXTEND_OP_LABEL;
 | 
						|
  StartLabel->Number        = LABEL_USER_MOD_FUNC;
 | 
						|
 | 
						|
  EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
 | 
						|
                                      EndOpCodeHandle,
 | 
						|
                                      &gEfiIfrTianoGuid,
 | 
						|
                                      NULL,
 | 
						|
                                      sizeof (EFI_IFR_GUID_LABEL)
 | 
						|
                                      );
 | 
						|
  EndLabel->ExtendOpCode  = EFI_IFR_EXTEND_OP_LABEL;
 | 
						|
  EndLabel->Number        = LABEL_END;
 | 
						|
 | 
						|
  //
 | 
						|
  // Add each user can be modified.
 | 
						|
  //
 | 
						|
  User  = NULL;
 | 
						|
  Index = 1;
 | 
						|
  mUserManager->Current (mUserManager, &CurrentUser);
 | 
						|
  while (TRUE) {
 | 
						|
    Status = mUserManager->GetNext (mUserManager, &User);
 | 
						|
    if (EFI_ERROR (Status)) {
 | 
						|
      break;
 | 
						|
    }
 | 
						|
 | 
						|
    Status = GetAccessRight (&CurrentAccessRight);
 | 
						|
    if (EFI_ERROR (Status)) {
 | 
						|
      CurrentAccessRight = EFI_USER_INFO_ACCESS_ENROLL_SELF;
 | 
						|
    }
 | 
						|
 | 
						|
    if ((CurrentAccessRight == EFI_USER_INFO_ACCESS_MANAGE) || (User == CurrentUser)) {
 | 
						|
      AddUserToForm (User, (UINT16)(KEY_MODIFY_USER | KEY_SELECT_USER | Index), StartOpCodeHandle);
 | 
						|
    }
 | 
						|
    Index++;
 | 
						|
  }
 | 
						|
 | 
						|
  HiiUpdateForm (
 | 
						|
    mCallbackInfo->HiiHandle, // HII handle
 | 
						|
    &gUserProfileManagerGuid, // Formset GUID
 | 
						|
    FORMID_MODIFY_USER,       // Form ID
 | 
						|
    StartOpCodeHandle,        // Label for where to insert opcodes
 | 
						|
    EndOpCodeHandle           // Replace data
 | 
						|
    );
 | 
						|
 | 
						|
  HiiFreeOpCodeHandle (StartOpCodeHandle);
 | 
						|
  HiiFreeOpCodeHandle (EndOpCodeHandle);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Get all the user info from mModifyUser in the user manager, and save on the
 | 
						|
  global variable.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
GetAllUserInfo (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS            Status;
 | 
						|
  EFI_USER_INFO_HANDLE  UserInfo;
 | 
						|
  EFI_USER_INFO         *Info;
 | 
						|
  UINTN                 InfoSize;
 | 
						|
  UINTN                 MemSize;
 | 
						|
  UINTN                 DataLen;
 | 
						|
 | 
						|
  //
 | 
						|
  // Init variable to default value.
 | 
						|
  //
 | 
						|
  mProviderChoice                   = 0;
 | 
						|
  mConncetLogical                   = 0;
 | 
						|
 | 
						|
  mUserInfo.CreateDateExist         = FALSE;
 | 
						|
  mUserInfo.UsageDateExist          = FALSE;
 | 
						|
  mUserInfo.UsageCount              = 0;
 | 
						|
  
 | 
						|
  mUserInfo.AccessPolicyLen         = 0;
 | 
						|
  mUserInfo.AccessPolicyModified    = FALSE;
 | 
						|
  if (mUserInfo.AccessPolicy != NULL) {
 | 
						|
    FreePool (mUserInfo.AccessPolicy);
 | 
						|
    mUserInfo.AccessPolicy = NULL;
 | 
						|
  }
 | 
						|
  mUserInfo.IdentityPolicyLen       = 0;
 | 
						|
  mUserInfo.IdentityPolicyModified  = FALSE;
 | 
						|
  if (mUserInfo.IdentityPolicy != NULL) {
 | 
						|
    FreePool (mUserInfo.IdentityPolicy);
 | 
						|
    mUserInfo.IdentityPolicy = NULL;
 | 
						|
  }
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Allocate user information memory.
 | 
						|
  //
 | 
						|
  MemSize = sizeof (EFI_USER_INFO) + 63;
 | 
						|
  Info    = AllocateZeroPool (MemSize);
 | 
						|
  if (Info == NULL) {
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Get each user information.
 | 
						|
  //
 | 
						|
  UserInfo = NULL;
 | 
						|
  while (TRUE) {
 | 
						|
    Status = mUserManager->GetNextInfo (mUserManager, mModifyUser, &UserInfo);
 | 
						|
    if (EFI_ERROR (Status)) {
 | 
						|
      break;
 | 
						|
    }
 | 
						|
    //
 | 
						|
    // Get information.
 | 
						|
    //
 | 
						|
    InfoSize  = MemSize;
 | 
						|
    Status    = mUserManager->GetInfo (
 | 
						|
                                mUserManager, 
 | 
						|
                                mModifyUser, 
 | 
						|
                                UserInfo, 
 | 
						|
                                Info, 
 | 
						|
                                &InfoSize
 | 
						|
                                );
 | 
						|
    if (Status == EFI_BUFFER_TOO_SMALL) {
 | 
						|
      MemSize = InfoSize;
 | 
						|
      FreePool (Info);
 | 
						|
      Info = AllocateZeroPool (MemSize);
 | 
						|
      if (Info == NULL) {
 | 
						|
        return ;
 | 
						|
      }
 | 
						|
 | 
						|
      Status = mUserManager->GetInfo (
 | 
						|
                               mUserManager,
 | 
						|
                               mModifyUser,
 | 
						|
                               UserInfo,
 | 
						|
                               Info,
 | 
						|
                               &InfoSize
 | 
						|
                               );
 | 
						|
    }
 | 
						|
 | 
						|
    if (Status == EFI_SUCCESS) {
 | 
						|
      //
 | 
						|
      // Deal with each information according to informaiton type.
 | 
						|
      //
 | 
						|
      DataLen = Info->InfoSize - sizeof (EFI_USER_INFO);
 | 
						|
      switch (Info->InfoType) {
 | 
						|
      case EFI_USER_INFO_NAME_RECORD:
 | 
						|
        CopyMem (&mUserInfo.UserName, (UINT8 *) (Info + 1), DataLen);
 | 
						|
        break;
 | 
						|
 | 
						|
      case EFI_USER_INFO_CREATE_DATE_RECORD:
 | 
						|
        CopyMem (&mUserInfo.CreateDate, (UINT8 *) (Info + 1), DataLen);
 | 
						|
        mUserInfo.CreateDateExist = TRUE;
 | 
						|
        break;
 | 
						|
 | 
						|
      case EFI_USER_INFO_USAGE_DATE_RECORD:
 | 
						|
        CopyMem (&mUserInfo.UsageDate, (UINT8 *) (Info + 1), DataLen);
 | 
						|
        mUserInfo.UsageDateExist = TRUE;
 | 
						|
        break;
 | 
						|
 | 
						|
      case EFI_USER_INFO_USAGE_COUNT_RECORD:
 | 
						|
        CopyMem (&mUserInfo.UsageCount, (UINT8 *) (Info + 1), DataLen);
 | 
						|
        break;
 | 
						|
 | 
						|
      case EFI_USER_INFO_ACCESS_POLICY_RECORD:
 | 
						|
        mUserInfo.AccessPolicy = AllocateZeroPool (DataLen);
 | 
						|
        if (mUserInfo.AccessPolicy == NULL) {
 | 
						|
          break;
 | 
						|
        }
 | 
						|
 | 
						|
        CopyMem (mUserInfo.AccessPolicy, (UINT8 *) (Info + 1), DataLen);
 | 
						|
        mUserInfo.AccessPolicyLen = DataLen;
 | 
						|
        break;
 | 
						|
 | 
						|
      case EFI_USER_INFO_IDENTITY_POLICY_RECORD:
 | 
						|
        mUserInfo.IdentityPolicy = AllocateZeroPool (DataLen);
 | 
						|
        if (mUserInfo.IdentityPolicy == NULL) {
 | 
						|
          break;
 | 
						|
        }
 | 
						|
 | 
						|
        CopyMem (mUserInfo.IdentityPolicy, (UINT8 *) (Info + 1), DataLen);
 | 
						|
        mUserInfo.IdentityPolicyLen = DataLen;
 | 
						|
        break;
 | 
						|
 | 
						|
      default:
 | 
						|
        break;
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
  FreePool (Info);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Convert the Date to a string, and update the Hii database DateID string with it.
 | 
						|
 | 
						|
  @param[in] Date       Points to the date to be converted.
 | 
						|
  @param[in] DateId     String ID in the HII database to be replaced.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
ResolveDate (
 | 
						|
  IN EFI_TIME                                   *Date,
 | 
						|
  IN EFI_STRING_ID                              DateId
 | 
						|
  )
 | 
						|
{
 | 
						|
  CHAR16  *Str;
 | 
						|
  UINTN   DateBufLen;
 | 
						|
 | 
						|
  //
 | 
						|
  // Convert date to string.
 | 
						|
  //
 | 
						|
  DateBufLen = 64;
 | 
						|
  Str        = AllocateZeroPool (DateBufLen);
 | 
						|
  if (Str == NULL) {
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
 | 
						|
  UnicodeSPrint (
 | 
						|
    Str,
 | 
						|
    DateBufLen,
 | 
						|
    L"%4d-%2d-%2d ",
 | 
						|
    Date->Year,
 | 
						|
    Date->Month,
 | 
						|
    Date->Day
 | 
						|
    );
 | 
						|
 | 
						|
  //
 | 
						|
  // Convert time to string.
 | 
						|
  //
 | 
						|
  DateBufLen -= StrLen (Str);
 | 
						|
  UnicodeSPrint (
 | 
						|
    Str + StrLen (Str),
 | 
						|
    DateBufLen,
 | 
						|
    L"%2d:%2d:%2d", 
 | 
						|
    Date->Hour,
 | 
						|
    Date->Minute,
 | 
						|
    Date->Second
 | 
						|
    );
 | 
						|
  
 | 
						|
  HiiSetString (mCallbackInfo->HiiHandle, DateId, Str, NULL);
 | 
						|
  FreePool (Str);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Convert the CountVal to a string, and update the Hii database CountId string
 | 
						|
  with it.
 | 
						|
 | 
						|
  @param[in]  CountVal   The hex value to convert.
 | 
						|
  @param[in]  CountId    String ID in the HII database to be replaced.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
ResolveCount (
 | 
						|
  IN UINT32                                     CountVal,
 | 
						|
  IN EFI_STRING_ID                              CountId
 | 
						|
  )
 | 
						|
{
 | 
						|
  CHAR16  Count[10];
 | 
						|
 | 
						|
  UnicodeSPrint (Count, 20, L"%d", CountVal);  
 | 
						|
  HiiSetString (mCallbackInfo->HiiHandle, CountId, Count, NULL);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Concatenates one Null-terminated Unicode string to another Null-terminated
 | 
						|
  Unicode string.
 | 
						|
 | 
						|
  @param[in, out]  Source1      On entry, point to a Null-terminated Unicode string.
 | 
						|
                                On exit, point to a new concatenated Unicode string                                
 | 
						|
  @param[in]       Source2      Pointer to a Null-terminated Unicode string.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
AddStr (
 | 
						|
  IN OUT  CHAR16                  **Source1,
 | 
						|
  IN      CONST CHAR16            *Source2
 | 
						|
  )
 | 
						|
{
 | 
						|
  CHAR16                        *TmpStr;
 | 
						|
  UINTN                         StrLength;
 | 
						|
 | 
						|
  ASSERT (Source1 != NULL);
 | 
						|
  ASSERT (Source2 != NULL);
 | 
						|
 | 
						|
  if (*Source1 == NULL) {
 | 
						|
    StrLength = StrSize (Source2);
 | 
						|
  } else {
 | 
						|
    StrLength  = StrSize (*Source1);
 | 
						|
    StrLength += StrSize (Source2) -1;
 | 
						|
  }
 | 
						|
 | 
						|
  TmpStr     = AllocateZeroPool (StrLength);
 | 
						|
  ASSERT (TmpStr != NULL);
 | 
						|
 | 
						|
  if (*Source1 == NULL) {
 | 
						|
    StrCpy (TmpStr, Source2);;
 | 
						|
  } else {
 | 
						|
    StrCpy (TmpStr, *Source1);
 | 
						|
    FreePool (*Source1);
 | 
						|
    StrCat (TmpStr, Source2);
 | 
						|
  }
 | 
						|
 | 
						|
  *Source1 = TmpStr;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Convert the identity policy to a unicode string and update the Hii database
 | 
						|
  IpStringId string with it.
 | 
						|
 | 
						|
  @param[in]  Ip         Points to identity policy.
 | 
						|
  @param[in]  IpLen      The identity policy length.
 | 
						|
  @param[in]  IpStringId String ID in the HII database to be replaced.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
ResolveIdentityPolicy (
 | 
						|
  IN  UINT8                                     *Ip,
 | 
						|
  IN  UINTN                                     IpLen,
 | 
						|
  IN  EFI_STRING_ID                             IpStringId
 | 
						|
  )
 | 
						|
{
 | 
						|
  CHAR16                        *TmpStr;
 | 
						|
  UINTN                         ChkLen;
 | 
						|
  EFI_USER_INFO_IDENTITY_POLICY *Identity;
 | 
						|
  UINT16                        Index;
 | 
						|
  CHAR16                        *ProvStr;
 | 
						|
  EFI_STRING_ID                 ProvId;
 | 
						|
  EFI_HII_HANDLE                HiiHandle;
 | 
						|
  EFI_USER_CREDENTIAL_PROTOCOL  *UserCredential;
 | 
						|
 
 | 
						|
  TmpStr = NULL;
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Resolve each policy.
 | 
						|
  //
 | 
						|
  ChkLen  = 0;
 | 
						|
  while (ChkLen < IpLen) {
 | 
						|
    Identity = (EFI_USER_INFO_IDENTITY_POLICY *) (Ip + ChkLen);
 | 
						|
    switch (Identity->Type) {
 | 
						|
    case EFI_USER_INFO_IDENTITY_FALSE:
 | 
						|
      AddStr (&TmpStr, L"False");
 | 
						|
      break;
 | 
						|
 | 
						|
    case EFI_USER_INFO_IDENTITY_TRUE:
 | 
						|
      AddStr (&TmpStr, L"None");
 | 
						|
      break;
 | 
						|
 | 
						|
    case EFI_USER_INFO_IDENTITY_NOT:
 | 
						|
      AddStr (&TmpStr, L"! ");
 | 
						|
      break;
 | 
						|
 | 
						|
    case EFI_USER_INFO_IDENTITY_AND:
 | 
						|
      AddStr (&TmpStr, L" && ");
 | 
						|
      break;
 | 
						|
 | 
						|
    case EFI_USER_INFO_IDENTITY_OR:
 | 
						|
      AddStr (&TmpStr, L" || ");
 | 
						|
      break;
 | 
						|
 | 
						|
    case EFI_USER_INFO_IDENTITY_CREDENTIAL_TYPE:
 | 
						|
      for (Index = 0; Index < mProviderInfo->Count; Index++) {
 | 
						|
        UserCredential = mProviderInfo->Provider[Index];
 | 
						|
        if (CompareGuid ((EFI_GUID *) (Identity + 1), &UserCredential->Type)) {     
 | 
						|
          UserCredential->Title (
 | 
						|
                            UserCredential, 
 | 
						|
                            &HiiHandle, 
 | 
						|
                            &ProvId
 | 
						|
                            );
 | 
						|
          ProvStr = HiiGetString (HiiHandle, ProvId, NULL);
 | 
						|
          if (ProvStr != NULL) {
 | 
						|
            AddStr (&TmpStr, ProvStr);
 | 
						|
            FreePool (ProvStr);
 | 
						|
          }
 | 
						|
          break;
 | 
						|
        }
 | 
						|
      }
 | 
						|
      break;
 | 
						|
 | 
						|
    case EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER:
 | 
						|
      for (Index = 0; Index < mProviderInfo->Count; Index++) {
 | 
						|
        UserCredential = mProviderInfo->Provider[Index];
 | 
						|
        if (CompareGuid ((EFI_GUID *) (Identity + 1), &UserCredential->Identifier)) {          
 | 
						|
          UserCredential->Title (
 | 
						|
                            UserCredential,
 | 
						|
                            &HiiHandle,
 | 
						|
                            &ProvId
 | 
						|
                            );
 | 
						|
          ProvStr = HiiGetString (HiiHandle, ProvId, NULL);
 | 
						|
          if (ProvStr != NULL) {
 | 
						|
            AddStr (&TmpStr, ProvStr);
 | 
						|
            FreePool (ProvStr);
 | 
						|
          }
 | 
						|
          break;
 | 
						|
        }
 | 
						|
      }
 | 
						|
      break;
 | 
						|
    }
 | 
						|
 | 
						|
    ChkLen += Identity->Length;
 | 
						|
  }
 | 
						|
 | 
						|
  if (TmpStr != NULL) {
 | 
						|
    HiiSetString (mCallbackInfo->HiiHandle, IpStringId, TmpStr, NULL);
 | 
						|
    FreePool (TmpStr);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Display modify user information form.
 | 
						|
 | 
						|
  This form displays, username, create Date, usage date, usage count, identity policy,
 | 
						|
  and access policy.
 | 
						|
 | 
						|
  @param[in] UserIndex       The index of the user in display list to modify.
 | 
						|
  
 | 
						|
**/
 | 
						|
VOID
 | 
						|
ModifyUserInfo (
 | 
						|
  IN UINT8                                      UserIndex
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS               Status;
 | 
						|
  EFI_USER_PROFILE_HANDLE  CurrentUser;
 | 
						|
  UINT32                   CurrentAccessRight;
 | 
						|
  VOID                     *StartOpCodeHandle;
 | 
						|
  VOID                     *EndOpCodeHandle;
 | 
						|
  EFI_IFR_GUID_LABEL       *StartLabel;
 | 
						|
  EFI_IFR_GUID_LABEL       *EndLabel;
 | 
						|
 | 
						|
  //
 | 
						|
  // Initialize the container for dynamic opcodes.
 | 
						|
  //
 | 
						|
  StartOpCodeHandle = HiiAllocateOpCodeHandle ();
 | 
						|
  ASSERT (StartOpCodeHandle != NULL);
 | 
						|
 | 
						|
  EndOpCodeHandle = HiiAllocateOpCodeHandle ();
 | 
						|
  ASSERT (EndOpCodeHandle != NULL);
 | 
						|
 | 
						|
  //
 | 
						|
  // Create Hii Extend Label OpCode.
 | 
						|
  //
 | 
						|
  StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
 | 
						|
                                        StartOpCodeHandle,
 | 
						|
                                        &gEfiIfrTianoGuid,
 | 
						|
                                        NULL,
 | 
						|
                                        sizeof (EFI_IFR_GUID_LABEL)
 | 
						|
                                        );
 | 
						|
  StartLabel->ExtendOpCode  = EFI_IFR_EXTEND_OP_LABEL;
 | 
						|
  StartLabel->Number        = LABEL_USER_INFO_FUNC;
 | 
						|
 | 
						|
  EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
 | 
						|
                                      EndOpCodeHandle,
 | 
						|
                                      &gEfiIfrTianoGuid,
 | 
						|
                                      NULL,
 | 
						|
                                      sizeof (EFI_IFR_GUID_LABEL)
 | 
						|
                                      );
 | 
						|
  EndLabel->ExtendOpCode  = EFI_IFR_EXTEND_OP_LABEL;
 | 
						|
  EndLabel->Number        = LABEL_END;
 | 
						|
 | 
						|
  //
 | 
						|
  // Find the user profile to be modified.
 | 
						|
  //
 | 
						|
  mModifyUser = NULL;
 | 
						|
  Status      = mUserManager->GetNext (mUserManager, &mModifyUser);
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
 | 
						|
  while (UserIndex > 1) {
 | 
						|
    Status = mUserManager->GetNext (mUserManager, &mModifyUser);
 | 
						|
    if (EFI_ERROR (Status)) {
 | 
						|
      return ;
 | 
						|
    }
 | 
						|
    UserIndex--;
 | 
						|
  }
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Get user profile information.
 | 
						|
  //
 | 
						|
  GetAllUserInfo ();
 | 
						|
 | 
						|
  //
 | 
						|
  // Update user name.
 | 
						|
  HiiSetString (
 | 
						|
    mCallbackInfo->HiiHandle,
 | 
						|
    STRING_TOKEN (STR_USER_NAME_VAL),
 | 
						|
    mUserInfo.UserName,
 | 
						|
    NULL
 | 
						|
    );
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Update create date.
 | 
						|
  //
 | 
						|
  if (mUserInfo.CreateDateExist) {
 | 
						|
    ResolveDate (&mUserInfo.CreateDate, STRING_TOKEN (STR_CREATE_DATE_VAL));
 | 
						|
  } else {
 | 
						|
    HiiSetString (
 | 
						|
      mCallbackInfo->HiiHandle,
 | 
						|
      STRING_TOKEN (STR_CREATE_DATE_VAL),
 | 
						|
      L"",
 | 
						|
      NULL
 | 
						|
      );
 | 
						|
  }
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Add usage date.
 | 
						|
  //
 | 
						|
  if (mUserInfo.UsageDateExist) {
 | 
						|
    ResolveDate (&mUserInfo.UsageDate, STRING_TOKEN (STR_USAGE_DATE_VAL));
 | 
						|
  } else {
 | 
						|
    HiiSetString (
 | 
						|
      mCallbackInfo->HiiHandle,
 | 
						|
      STRING_TOKEN (STR_USAGE_DATE_VAL),
 | 
						|
      L"",
 | 
						|
      NULL
 | 
						|
      );
 | 
						|
  }
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Add usage count.
 | 
						|
  //
 | 
						|
  ResolveCount ((UINT32) mUserInfo.UsageCount, STRING_TOKEN (STR_USAGE_COUNT_VAL));
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Add identity policy.
 | 
						|
  //
 | 
						|
  mUserManager->Current (mUserManager, &CurrentUser);
 | 
						|
  if (mModifyUser == CurrentUser) {
 | 
						|
    ResolveIdentityPolicy (
 | 
						|
      mUserInfo.IdentityPolicy,
 | 
						|
      mUserInfo.IdentityPolicyLen,
 | 
						|
      STRING_TOKEN (STR_IDENTIFY_POLICY_VAL)
 | 
						|
      );
 | 
						|
    HiiCreateGotoOpCode (
 | 
						|
      StartOpCodeHandle,                                  // Container for opcodes
 | 
						|
      FORMID_MODIFY_IP,                                   // Target Form ID
 | 
						|
      STRING_TOKEN (STR_IDENTIFY_POLICY),                 // Prompt text
 | 
						|
      STRING_TOKEN (STR_IDENTIFY_POLICY_VAL),             // Help text
 | 
						|
      EFI_IFR_FLAG_CALLBACK,                              // Question flag
 | 
						|
      KEY_MODIFY_USER | KEY_SELECT_USER | KEY_MODIFY_IP   // Question ID
 | 
						|
      );
 | 
						|
  }
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Add access policy.
 | 
						|
  //
 | 
						|
  Status = GetAccessRight (&CurrentAccessRight);
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    CurrentAccessRight = EFI_USER_INFO_ACCESS_ENROLL_SELF;
 | 
						|
  }
 | 
						|
 | 
						|
  if (CurrentAccessRight == EFI_USER_INFO_ACCESS_MANAGE) {
 | 
						|
    HiiCreateGotoOpCode (
 | 
						|
      StartOpCodeHandle,                                  // Container for opcodes
 | 
						|
      FORMID_MODIFY_AP,                                   // Target Form ID
 | 
						|
      STRING_TOKEN (STR_ACCESS_POLICY),                   // Prompt text
 | 
						|
      STRING_TOKEN (STR_NULL_STRING),                     // Help text
 | 
						|
      EFI_IFR_FLAG_CALLBACK,                              // Question flag
 | 
						|
      KEY_MODIFY_USER | KEY_SELECT_USER | KEY_MODIFY_AP   // Question ID
 | 
						|
      );
 | 
						|
  }
 | 
						|
 | 
						|
  HiiUpdateForm (
 | 
						|
    mCallbackInfo->HiiHandle,                             // HII handle
 | 
						|
    &gUserProfileManagerGuid,                             // Formset GUID
 | 
						|
    FORMID_USER_INFO,                                     // Form ID
 | 
						|
    StartOpCodeHandle,                                    // Label
 | 
						|
    EndOpCodeHandle                                       // Replace data
 | 
						|
    );
 | 
						|
 | 
						|
  HiiFreeOpCodeHandle (StartOpCodeHandle);
 | 
						|
  HiiFreeOpCodeHandle (EndOpCodeHandle);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Get all the access policy info from current user info, and save in the global
 | 
						|
  variable.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
ResolveAccessPolicy (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINTN                         OffSet;
 | 
						|
  EFI_USER_INFO_ACCESS_CONTROL  Control;
 | 
						|
  UINTN                         ValLen;
 | 
						|
  UINT8                         *AccessData;
 | 
						|
 | 
						|
  //
 | 
						|
  // Set default value 
 | 
						|
  //
 | 
						|
  mAccessInfo.AccessRight       = EFI_USER_INFO_ACCESS_ENROLL_SELF;
 | 
						|
  mAccessInfo.AccessSetup       = ACCESS_SETUP_RESTRICTED;
 | 
						|
  mAccessInfo.AccessBootOrder   = EFI_USER_INFO_ACCESS_BOOT_ORDER_INSERT;
 | 
						|
 | 
						|
  mAccessInfo.LoadPermitLen     = 0;
 | 
						|
  mAccessInfo.LoadForbidLen     = 0;
 | 
						|
  mAccessInfo.ConnectPermitLen  = 0;
 | 
						|
  mAccessInfo.ConnectForbidLen  = 0;
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Get each user access policy.
 | 
						|
  //
 | 
						|
  OffSet = 0;
 | 
						|
  while (OffSet < mUserInfo.AccessPolicyLen) {
 | 
						|
    CopyMem (&Control, mUserInfo.AccessPolicy + OffSet, sizeof (Control));    
 | 
						|
    ValLen = Control.Size - sizeof (Control);
 | 
						|
    switch (Control.Type) {
 | 
						|
    case EFI_USER_INFO_ACCESS_ENROLL_SELF:
 | 
						|
      mAccessInfo.AccessRight = EFI_USER_INFO_ACCESS_ENROLL_SELF;
 | 
						|
      break;
 | 
						|
 | 
						|
    case EFI_USER_INFO_ACCESS_ENROLL_OTHERS:
 | 
						|
      mAccessInfo.AccessRight = EFI_USER_INFO_ACCESS_ENROLL_OTHERS;
 | 
						|
      break;
 | 
						|
 | 
						|
    case EFI_USER_INFO_ACCESS_MANAGE:
 | 
						|
      mAccessInfo.AccessRight = EFI_USER_INFO_ACCESS_MANAGE;
 | 
						|
      break;
 | 
						|
 | 
						|
    case EFI_USER_INFO_ACCESS_SETUP:
 | 
						|
      AccessData = mUserInfo.AccessPolicy + OffSet + sizeof (Control);
 | 
						|
      if (CompareGuid ((EFI_GUID *) AccessData, &gEfiUserInfoAccessSetupNormalGuid)) {
 | 
						|
        mAccessInfo.AccessSetup = ACCESS_SETUP_NORMAL;
 | 
						|
      } else if (CompareGuid ((EFI_GUID *) AccessData, &gEfiUserInfoAccessSetupRestrictedGuid)) {
 | 
						|
        mAccessInfo.AccessSetup = ACCESS_SETUP_RESTRICTED;
 | 
						|
      } else if (CompareGuid ((EFI_GUID *) AccessData, &gEfiUserInfoAccessSetupAdminGuid)) {
 | 
						|
        mAccessInfo.AccessSetup = ACCESS_SETUP_ADMIN;
 | 
						|
      }
 | 
						|
      break;
 | 
						|
 | 
						|
    case EFI_USER_INFO_ACCESS_BOOT_ORDER:
 | 
						|
      AccessData = mUserInfo.AccessPolicy + OffSet + sizeof (Control);
 | 
						|
      CopyMem (&mAccessInfo.AccessBootOrder, AccessData, sizeof (UINT32));
 | 
						|
      break;
 | 
						|
 | 
						|
    case EFI_USER_INFO_ACCESS_FORBID_LOAD:
 | 
						|
      if (mAccessInfo.LoadForbid != NULL) {
 | 
						|
        FreePool (mAccessInfo.LoadForbid);
 | 
						|
      }
 | 
						|
 | 
						|
      mAccessInfo.LoadForbid = AllocateZeroPool (ValLen);
 | 
						|
      if (mAccessInfo.LoadForbid != NULL) {
 | 
						|
        AccessData = mUserInfo.AccessPolicy + OffSet + sizeof (Control);
 | 
						|
        CopyMem (mAccessInfo.LoadForbid, AccessData, ValLen);
 | 
						|
        mAccessInfo.LoadForbidLen = ValLen;
 | 
						|
      }
 | 
						|
      break;
 | 
						|
 | 
						|
    case EFI_USER_INFO_ACCESS_PERMIT_LOAD:
 | 
						|
      if (mAccessInfo.LoadPermit != NULL) {
 | 
						|
        FreePool (mAccessInfo.LoadPermit);
 | 
						|
      }
 | 
						|
 | 
						|
      mAccessInfo.LoadPermit = AllocateZeroPool (ValLen);
 | 
						|
      if (mAccessInfo.LoadPermit != NULL) {
 | 
						|
        AccessData = mUserInfo.AccessPolicy + OffSet + sizeof (Control);
 | 
						|
        CopyMem (mAccessInfo.LoadPermit, AccessData, ValLen);
 | 
						|
        mAccessInfo.LoadPermitLen = ValLen;
 | 
						|
      }
 | 
						|
      break;
 | 
						|
 | 
						|
    case EFI_USER_INFO_ACCESS_FORBID_CONNECT:
 | 
						|
      if (mAccessInfo.ConnectForbid != NULL) {
 | 
						|
        FreePool (mAccessInfo.ConnectForbid);
 | 
						|
      }
 | 
						|
 | 
						|
      mAccessInfo.ConnectForbid = AllocateZeroPool (ValLen);
 | 
						|
      if (mAccessInfo.ConnectForbid != NULL) {
 | 
						|
        AccessData = mUserInfo.AccessPolicy + OffSet + sizeof (Control);
 | 
						|
        CopyMem (mAccessInfo.ConnectForbid, AccessData, ValLen);
 | 
						|
        mAccessInfo.ConnectForbidLen = ValLen;
 | 
						|
      }
 | 
						|
      break;
 | 
						|
 | 
						|
    case EFI_USER_INFO_ACCESS_PERMIT_CONNECT:
 | 
						|
      if (mAccessInfo.ConnectPermit != NULL) {
 | 
						|
        FreePool (mAccessInfo.ConnectPermit);
 | 
						|
      }
 | 
						|
 | 
						|
      mAccessInfo.ConnectPermit = AllocateZeroPool (ValLen);
 | 
						|
      if (mAccessInfo.ConnectPermit != NULL) {
 | 
						|
        AccessData = mUserInfo.AccessPolicy + OffSet + sizeof (Control);
 | 
						|
        CopyMem (mAccessInfo.ConnectPermit, AccessData, ValLen);
 | 
						|
        mAccessInfo.ConnectPermitLen = ValLen;
 | 
						|
      }
 | 
						|
      break;
 | 
						|
    }
 | 
						|
 | 
						|
    OffSet += Control.Size;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Find the specified info in profile mModifyUser by the InfoType.
 | 
						|
 | 
						|
  @param[in]  InfoType     The user information type to find.
 | 
						|
  @param[out] UserInfo     Points to user information handle found.
 | 
						|
  
 | 
						|
  @retval EFI_SUCCESS      Find the user information successfully.
 | 
						|
  @retval Others           Fail to find the user information.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
FindInfoByType (
 | 
						|
  IN  UINT8                                     InfoType,
 | 
						|
  OUT EFI_USER_INFO_HANDLE                      *UserInfo
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS    Status;
 | 
						|
  EFI_USER_INFO *Info;
 | 
						|
  UINTN         InfoSize;
 | 
						|
  UINTN         MemSize;
 | 
						|
 | 
						|
  if (UserInfo == NULL) {
 | 
						|
    return EFI_INVALID_PARAMETER;
 | 
						|
  }
 | 
						|
 | 
						|
  *UserInfo = NULL;
 | 
						|
  //
 | 
						|
  // Allocate user information memory.
 | 
						|
  //
 | 
						|
  MemSize = sizeof (EFI_USER_INFO) + 63;
 | 
						|
  Info    = AllocateZeroPool (MemSize);
 | 
						|
  if (Info == NULL) {
 | 
						|
    return EFI_OUT_OF_RESOURCES;
 | 
						|
  }
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Get each user information.
 | 
						|
  //
 | 
						|
  while (TRUE) {
 | 
						|
    Status = mUserManager->GetNextInfo (mUserManager, mModifyUser, UserInfo);
 | 
						|
    if (EFI_ERROR (Status)) {
 | 
						|
      break;
 | 
						|
    }
 | 
						|
    //
 | 
						|
    // Get information.
 | 
						|
    //
 | 
						|
    InfoSize  = MemSize;
 | 
						|
    Status    = mUserManager->GetInfo (
 | 
						|
                                mUserManager,
 | 
						|
                                mModifyUser,
 | 
						|
                                *UserInfo,
 | 
						|
                                Info,
 | 
						|
                                &InfoSize
 | 
						|
                                );
 | 
						|
    if (Status == EFI_BUFFER_TOO_SMALL) {
 | 
						|
      MemSize = InfoSize;
 | 
						|
      FreePool (Info);
 | 
						|
      Info = AllocateZeroPool (MemSize);
 | 
						|
      if (Info == NULL) {
 | 
						|
        return EFI_OUT_OF_RESOURCES;
 | 
						|
      }
 | 
						|
      Status = mUserManager->GetInfo (
 | 
						|
                               mUserManager,
 | 
						|
                               mModifyUser,
 | 
						|
                               *UserInfo,
 | 
						|
                               Info,
 | 
						|
                               &InfoSize
 | 
						|
                               );
 | 
						|
    }
 | 
						|
    if (Status == EFI_SUCCESS) {
 | 
						|
      if (Info->InfoType == InfoType) {
 | 
						|
        break;
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  FreePool (Info);
 | 
						|
  return Status;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Display modify user access policy form.
 | 
						|
 | 
						|
  In this form, access right, access setup and access boot order are dynamically
 | 
						|
  added. Load devicepath and connect devicepath are displayed too.
 | 
						|
  
 | 
						|
**/
 | 
						|
VOID
 | 
						|
ModidyAccessPolicy (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  VOID                *StartOpCodeHandle;
 | 
						|
  VOID                *EndOpCodeHandle;
 | 
						|
  VOID                *OptionsOpCodeHandle;
 | 
						|
  EFI_IFR_GUID_LABEL  *StartLabel;
 | 
						|
  EFI_IFR_GUID_LABEL  *EndLabel;
 | 
						|
  VOID                *DefaultOpCodeHandle;
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Initialize the container for dynamic opcodes.
 | 
						|
  //
 | 
						|
  StartOpCodeHandle = HiiAllocateOpCodeHandle ();
 | 
						|
  ASSERT (StartOpCodeHandle != NULL);
 | 
						|
 | 
						|
  EndOpCodeHandle = HiiAllocateOpCodeHandle ();
 | 
						|
  ASSERT (EndOpCodeHandle != NULL);
 | 
						|
 | 
						|
  //
 | 
						|
  // Create Hii Extend Label OpCode.
 | 
						|
  //
 | 
						|
  StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
 | 
						|
                                        StartOpCodeHandle,
 | 
						|
                                        &gEfiIfrTianoGuid,
 | 
						|
                                        NULL,
 | 
						|
                                        sizeof (EFI_IFR_GUID_LABEL)
 | 
						|
                                        );
 | 
						|
  StartLabel->ExtendOpCode  = EFI_IFR_EXTEND_OP_LABEL;
 | 
						|
  StartLabel->Number        = LABEL_AP_MOD_FUNC;
 | 
						|
 | 
						|
  EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
 | 
						|
                                      EndOpCodeHandle,
 | 
						|
                                      &gEfiIfrTianoGuid,
 | 
						|
                                      NULL,
 | 
						|
                                      sizeof (EFI_IFR_GUID_LABEL)
 | 
						|
                                      );
 | 
						|
  EndLabel->ExtendOpCode  = EFI_IFR_EXTEND_OP_LABEL;
 | 
						|
  EndLabel->Number        = LABEL_END;
 | 
						|
 | 
						|
 | 
						|
  //
 | 
						|
  // Resolve access policy information.
 | 
						|
  //
 | 
						|
  ResolveAccessPolicy ();
 | 
						|
 | 
						|
  //
 | 
						|
  // Add access right one-of-code.
 | 
						|
  //
 | 
						|
  OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
 | 
						|
  ASSERT (OptionsOpCodeHandle != NULL);
 | 
						|
  DefaultOpCodeHandle = HiiAllocateOpCodeHandle ();
 | 
						|
  ASSERT (DefaultOpCodeHandle != NULL);
 | 
						|
  
 | 
						|
  HiiCreateOneOfOptionOpCode (
 | 
						|
    OptionsOpCodeHandle,
 | 
						|
    STRING_TOKEN (STR_NORMAL),
 | 
						|
    0,
 | 
						|
    EFI_IFR_NUMERIC_SIZE_1,
 | 
						|
    EFI_USER_INFO_ACCESS_ENROLL_SELF
 | 
						|
    );
 | 
						|
 | 
						|
  HiiCreateOneOfOptionOpCode (
 | 
						|
    OptionsOpCodeHandle,
 | 
						|
    STRING_TOKEN (STR_ENROLL),
 | 
						|
    0,
 | 
						|
    EFI_IFR_NUMERIC_SIZE_1,
 | 
						|
    EFI_USER_INFO_ACCESS_ENROLL_OTHERS
 | 
						|
    );
 | 
						|
 | 
						|
  HiiCreateOneOfOptionOpCode (
 | 
						|
    OptionsOpCodeHandle,
 | 
						|
    STRING_TOKEN (STR_MANAGE),
 | 
						|
    0,
 | 
						|
    EFI_IFR_NUMERIC_SIZE_1,
 | 
						|
    EFI_USER_INFO_ACCESS_MANAGE
 | 
						|
    );
 | 
						|
 | 
						|
  HiiCreateDefaultOpCode (
 | 
						|
    DefaultOpCodeHandle, 
 | 
						|
    EFI_HII_DEFAULT_CLASS_STANDARD, 
 | 
						|
    EFI_IFR_NUMERIC_SIZE_1, 
 | 
						|
    mAccessInfo.AccessRight
 | 
						|
    );
 | 
						|
 
 | 
						|
  HiiCreateOneOfOpCode (
 | 
						|
    StartOpCodeHandle,                    // Container for dynamic created opcodes
 | 
						|
    KEY_MODIFY_USER | KEY_SELECT_USER | KEY_MODIFY_AP | KEY_MODIFY_RIGHT, // Question ID
 | 
						|
    0,                                    // VarStore ID
 | 
						|
    0,                                    // Offset in Buffer Storage
 | 
						|
    STRING_TOKEN (STR_ACCESS_RIGHT),      // Question prompt text
 | 
						|
    STRING_TOKEN (STR_ACCESS_RIGHT_HELP), // Question help text
 | 
						|
    EFI_IFR_FLAG_CALLBACK,                // Question flag
 | 
						|
    EFI_IFR_NUMERIC_SIZE_1,               // Data type of Question Value
 | 
						|
    OptionsOpCodeHandle,                  // Option Opcode list
 | 
						|
    DefaultOpCodeHandle                   // Default Opcode
 | 
						|
    );
 | 
						|
  HiiFreeOpCodeHandle (DefaultOpCodeHandle);
 | 
						|
  HiiFreeOpCodeHandle (OptionsOpCodeHandle);
 | 
						|
 | 
						|
 | 
						|
  //
 | 
						|
  // Add setup type one-of-code.
 | 
						|
  //
 | 
						|
  OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
 | 
						|
  ASSERT (OptionsOpCodeHandle != NULL);
 | 
						|
  DefaultOpCodeHandle = HiiAllocateOpCodeHandle ();
 | 
						|
  ASSERT (DefaultOpCodeHandle != NULL);
 | 
						|
  
 | 
						|
  HiiCreateOneOfOptionOpCode (
 | 
						|
    OptionsOpCodeHandle,
 | 
						|
    STRING_TOKEN (STR_RESTRICTED),
 | 
						|
    0,
 | 
						|
    EFI_IFR_NUMERIC_SIZE_1,
 | 
						|
    ACCESS_SETUP_RESTRICTED
 | 
						|
    );
 | 
						|
    
 | 
						|
  HiiCreateOneOfOptionOpCode (
 | 
						|
    OptionsOpCodeHandle,
 | 
						|
    STRING_TOKEN (STR_NORMAL),
 | 
						|
    0,
 | 
						|
    EFI_IFR_NUMERIC_SIZE_1,
 | 
						|
    ACCESS_SETUP_NORMAL
 | 
						|
    );
 | 
						|
 | 
						|
  HiiCreateOneOfOptionOpCode (
 | 
						|
    OptionsOpCodeHandle,
 | 
						|
    STRING_TOKEN (STR_ADMIN),
 | 
						|
    0,
 | 
						|
    EFI_IFR_NUMERIC_SIZE_1,
 | 
						|
    ACCESS_SETUP_ADMIN
 | 
						|
    );
 | 
						|
 | 
						|
  HiiCreateDefaultOpCode (
 | 
						|
    DefaultOpCodeHandle, 
 | 
						|
    EFI_HII_DEFAULT_CLASS_STANDARD, 
 | 
						|
    EFI_IFR_NUMERIC_SIZE_1, 
 | 
						|
    mAccessInfo.AccessSetup
 | 
						|
    );    
 | 
						|
 | 
						|
  HiiCreateOneOfOpCode (
 | 
						|
    StartOpCodeHandle,                    // Container for dynamic created opcodes
 | 
						|
    KEY_MODIFY_USER | KEY_SELECT_USER | KEY_MODIFY_AP | KEY_MODIFY_SETUP, // Question ID
 | 
						|
    0,                                    // VarStore ID
 | 
						|
    0,                                    // Offset in Buffer Storage
 | 
						|
    STRING_TOKEN (STR_ACCESS_SETUP),      // Question prompt text
 | 
						|
    STRING_TOKEN (STR_ACCESS_SETUP_HELP), // Question help text
 | 
						|
    EFI_IFR_FLAG_CALLBACK,                // Question flag
 | 
						|
    EFI_IFR_NUMERIC_SIZE_1,               // Data type of Question Value
 | 
						|
    OptionsOpCodeHandle,                  // Option Opcode list
 | 
						|
    DefaultOpCodeHandle                   // Default Opcode
 | 
						|
    );
 | 
						|
  HiiFreeOpCodeHandle (DefaultOpCodeHandle);
 | 
						|
  HiiFreeOpCodeHandle (OptionsOpCodeHandle);
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Add boot order one-of-code.
 | 
						|
  //
 | 
						|
  OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
 | 
						|
  ASSERT (OptionsOpCodeHandle != NULL);
 | 
						|
  DefaultOpCodeHandle = HiiAllocateOpCodeHandle ();
 | 
						|
  ASSERT (DefaultOpCodeHandle != NULL);
 | 
						|
  
 | 
						|
  HiiCreateOneOfOptionOpCode (
 | 
						|
    OptionsOpCodeHandle,
 | 
						|
    STRING_TOKEN (STR_INSERT),
 | 
						|
    0,
 | 
						|
    EFI_IFR_NUMERIC_SIZE_4,
 | 
						|
    EFI_USER_INFO_ACCESS_BOOT_ORDER_INSERT
 | 
						|
    );
 | 
						|
 | 
						|
  HiiCreateOneOfOptionOpCode (
 | 
						|
    OptionsOpCodeHandle,
 | 
						|
    STRING_TOKEN (STR_APPEND),
 | 
						|
    0,
 | 
						|
    EFI_IFR_NUMERIC_SIZE_4,
 | 
						|
    EFI_USER_INFO_ACCESS_BOOT_ORDER_APPEND
 | 
						|
    );
 | 
						|
 | 
						|
  HiiCreateOneOfOptionOpCode (
 | 
						|
    OptionsOpCodeHandle,
 | 
						|
    STRING_TOKEN (STR_REPLACE),
 | 
						|
    0,
 | 
						|
    EFI_IFR_NUMERIC_SIZE_4,
 | 
						|
    EFI_USER_INFO_ACCESS_BOOT_ORDER_REPLACE
 | 
						|
    );
 | 
						|
    
 | 
						|
  HiiCreateOneOfOptionOpCode (
 | 
						|
    OptionsOpCodeHandle,
 | 
						|
    STRING_TOKEN (STR_NODEFAULT),
 | 
						|
    0,
 | 
						|
    EFI_IFR_NUMERIC_SIZE_4,
 | 
						|
    EFI_USER_INFO_ACCESS_BOOT_ORDER_NODEFAULT
 | 
						|
    );
 | 
						|
 | 
						|
  HiiCreateDefaultOpCode (
 | 
						|
    DefaultOpCodeHandle, 
 | 
						|
    EFI_HII_DEFAULT_CLASS_STANDARD, 
 | 
						|
    EFI_IFR_NUMERIC_SIZE_4, 
 | 
						|
    mAccessInfo.AccessBootOrder
 | 
						|
    );
 | 
						|
    
 | 
						|
  HiiCreateOneOfOpCode (
 | 
						|
    StartOpCodeHandle,                  // Container for dynamic created opcodes
 | 
						|
    KEY_MODIFY_USER | KEY_SELECT_USER | KEY_MODIFY_AP | KEY_MODIFY_BOOT, // Question ID
 | 
						|
    0,                                  // VarStore ID
 | 
						|
    0,                                  // Offset in Buffer Storage
 | 
						|
    STRING_TOKEN (STR_BOOR_ORDER),      // Question prompt text
 | 
						|
    STRING_TOKEN (STR_BOOT_ORDER_HELP), // Question help text
 | 
						|
    EFI_IFR_FLAG_CALLBACK,              // Question flag
 | 
						|
    EFI_IFR_NUMERIC_SIZE_1,             // Data type of Question Value
 | 
						|
    OptionsOpCodeHandle,                // Option Opcode list
 | 
						|
    DefaultOpCodeHandle                 // Default Opcode
 | 
						|
    );
 | 
						|
  HiiFreeOpCodeHandle (DefaultOpCodeHandle);    
 | 
						|
  HiiFreeOpCodeHandle (OptionsOpCodeHandle);
 | 
						|
 | 
						|
  //
 | 
						|
  // Update Form.
 | 
						|
  //
 | 
						|
  HiiUpdateForm (
 | 
						|
    mCallbackInfo->HiiHandle,           // HII handle
 | 
						|
    &gUserProfileManagerGuid,           // Formset GUID
 | 
						|
    FORMID_MODIFY_AP,                   // Form ID
 | 
						|
    StartOpCodeHandle,                  // Label for where to insert opcodes
 | 
						|
    EndOpCodeHandle                     // Replace data
 | 
						|
    );
 | 
						|
 | 
						|
  HiiFreeOpCodeHandle (StartOpCodeHandle);
 | 
						|
  HiiFreeOpCodeHandle (EndOpCodeHandle);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Expand access policy memory size.
 | 
						|
 | 
						|
  @param[in] ValidLen       The valid access policy length.
 | 
						|
  @param[in] ExpandLen      The length that is needed to expand.
 | 
						|
    
 | 
						|
**/
 | 
						|
VOID
 | 
						|
ExpandMemory (
 | 
						|
  IN      UINTN                                 ValidLen,
 | 
						|
  IN      UINTN                                 ExpandLen
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINT8 *Mem;
 | 
						|
  UINTN Len;
 | 
						|
 | 
						|
  //
 | 
						|
  // Expand memory.
 | 
						|
  //
 | 
						|
  Len = mUserInfo.AccessPolicyLen + (ExpandLen / 64 + 1) * 64;
 | 
						|
  Mem = AllocateZeroPool (Len);
 | 
						|
  ASSERT (Mem != NULL);
 | 
						|
 | 
						|
  if (mUserInfo.AccessPolicy != NULL) {
 | 
						|
    CopyMem (Mem, mUserInfo.AccessPolicy, ValidLen);
 | 
						|
    FreePool (mUserInfo.AccessPolicy);
 | 
						|
  }
 | 
						|
 | 
						|
  mUserInfo.AccessPolicy    = Mem;
 | 
						|
  mUserInfo.AccessPolicyLen = Len;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Collect all the access policy data to mUserInfo.AccessPolicy, 
 | 
						|
  and save it to user profile.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
SaveAccessPolicy (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS                    Status;
 | 
						|
  UINTN                         OffSet;
 | 
						|
  UINTN                         Size;
 | 
						|
  EFI_USER_INFO_ACCESS_CONTROL  Control;
 | 
						|
  EFI_USER_INFO_HANDLE          UserInfo;
 | 
						|
  EFI_USER_INFO                 *Info;
 | 
						|
 | 
						|
  if (mUserInfo.AccessPolicy != NULL) {
 | 
						|
    FreePool (mUserInfo.AccessPolicy);
 | 
						|
  }
 | 
						|
  mUserInfo.AccessPolicy          = NULL;
 | 
						|
  mUserInfo.AccessPolicyLen       = 0;
 | 
						|
  mUserInfo.AccessPolicyModified  = TRUE;
 | 
						|
  OffSet                          = 0;
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Save access right.
 | 
						|
  //
 | 
						|
  Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL);
 | 
						|
  if (mUserInfo.AccessPolicyLen - OffSet < Size) {
 | 
						|
    ExpandMemory (OffSet, Size);
 | 
						|
  }
 | 
						|
 | 
						|
  Control.Type = mAccessInfo.AccessRight;
 | 
						|
  Control.Size = (UINT32) Size;
 | 
						|
  CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));
 | 
						|
  OffSet += sizeof (Control);
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Save access setup.
 | 
						|
  //
 | 
						|
  Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + sizeof (EFI_GUID);
 | 
						|
  if (mUserInfo.AccessPolicyLen - OffSet < Size) {
 | 
						|
    ExpandMemory (OffSet, Size);
 | 
						|
  }
 | 
						|
 | 
						|
  Control.Type = EFI_USER_INFO_ACCESS_SETUP;
 | 
						|
  Control.Size = (UINT32) Size;  
 | 
						|
  CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));
 | 
						|
  OffSet += sizeof (Control);
 | 
						|
  
 | 
						|
  if (mAccessInfo.AccessSetup == ACCESS_SETUP_NORMAL) {
 | 
						|
    CopyGuid ((EFI_GUID *) (mUserInfo.AccessPolicy + OffSet), &gEfiUserInfoAccessSetupNormalGuid);
 | 
						|
  } else if (mAccessInfo.AccessSetup == ACCESS_SETUP_RESTRICTED) {
 | 
						|
    CopyGuid ((EFI_GUID *) (mUserInfo.AccessPolicy + OffSet), &gEfiUserInfoAccessSetupRestrictedGuid);
 | 
						|
  } else if (mAccessInfo.AccessSetup == ACCESS_SETUP_ADMIN) {
 | 
						|
    CopyGuid ((EFI_GUID *) (mUserInfo.AccessPolicy + OffSet), &gEfiUserInfoAccessSetupAdminGuid);
 | 
						|
  }
 | 
						|
  OffSet += sizeof (EFI_GUID);
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Save access of boot order.
 | 
						|
  //
 | 
						|
  Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + sizeof (UINT32);
 | 
						|
  if (mUserInfo.AccessPolicyLen - OffSet < Size) {
 | 
						|
    ExpandMemory (OffSet, Size);
 | 
						|
  }
 | 
						|
 | 
						|
  Control.Type = EFI_USER_INFO_ACCESS_BOOT_ORDER;
 | 
						|
  Control.Size = (UINT32) Size;  
 | 
						|
  CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));
 | 
						|
  OffSet += sizeof (Control);
 | 
						|
 | 
						|
  CopyMem ((UINT8 *) (mUserInfo.AccessPolicy + OffSet), &mAccessInfo.AccessBootOrder, sizeof (UINT32));
 | 
						|
  OffSet += sizeof (UINT32);
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Save permit load.
 | 
						|
  //
 | 
						|
  if (mAccessInfo.LoadPermitLen > 0) {
 | 
						|
    Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + mAccessInfo.LoadPermitLen;
 | 
						|
    if (mUserInfo.AccessPolicyLen - OffSet < Size) {
 | 
						|
      ExpandMemory (OffSet, Size);
 | 
						|
    }
 | 
						|
 | 
						|
    Control.Type = EFI_USER_INFO_ACCESS_PERMIT_LOAD;
 | 
						|
    Control.Size = (UINT32) Size;  
 | 
						|
    CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));
 | 
						|
    OffSet += sizeof (Control);
 | 
						|
  
 | 
						|
    CopyMem (mUserInfo.AccessPolicy + OffSet, mAccessInfo.LoadPermit, mAccessInfo.LoadPermitLen);
 | 
						|
    OffSet += mAccessInfo.LoadPermitLen;
 | 
						|
  }
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Save forbid load.
 | 
						|
  //
 | 
						|
  if (mAccessInfo.LoadForbidLen > 0) {
 | 
						|
    Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + mAccessInfo.LoadForbidLen;
 | 
						|
    if (mUserInfo.AccessPolicyLen - OffSet < Size) {
 | 
						|
      ExpandMemory (OffSet, Size);
 | 
						|
    }
 | 
						|
 | 
						|
    Control.Type = EFI_USER_INFO_ACCESS_FORBID_LOAD;
 | 
						|
    Control.Size = (UINT32) Size;  
 | 
						|
    CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));
 | 
						|
    OffSet += sizeof (Control);
 | 
						|
    
 | 
						|
    CopyMem (mUserInfo.AccessPolicy + OffSet, mAccessInfo.LoadForbid, mAccessInfo.LoadForbidLen);
 | 
						|
    OffSet += mAccessInfo.LoadForbidLen;
 | 
						|
  }
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Save permit connect.
 | 
						|
  //
 | 
						|
  if (mAccessInfo.ConnectPermitLen > 0) {
 | 
						|
    Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + mAccessInfo.ConnectPermitLen;
 | 
						|
    if (mUserInfo.AccessPolicyLen - OffSet < Size) {
 | 
						|
      ExpandMemory (OffSet, Size);
 | 
						|
    }
 | 
						|
 | 
						|
    Control.Type = EFI_USER_INFO_ACCESS_PERMIT_CONNECT;
 | 
						|
    Control.Size = (UINT32) Size;  
 | 
						|
    CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));
 | 
						|
    OffSet += sizeof (Control);
 | 
						|
    
 | 
						|
    CopyMem (mUserInfo.AccessPolicy + OffSet, mAccessInfo.ConnectPermit, mAccessInfo.ConnectPermitLen);
 | 
						|
    OffSet += mAccessInfo.ConnectPermitLen;
 | 
						|
  }
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Save forbid connect.
 | 
						|
  //
 | 
						|
  if (mAccessInfo.ConnectForbidLen > 0) {
 | 
						|
    Size = sizeof (EFI_USER_INFO_ACCESS_CONTROL) + mAccessInfo.ConnectForbidLen;
 | 
						|
    if (mUserInfo.AccessPolicyLen - OffSet < Size) {
 | 
						|
      ExpandMemory (OffSet, Size);
 | 
						|
    }
 | 
						|
 | 
						|
    Control.Type = EFI_USER_INFO_ACCESS_FORBID_CONNECT;
 | 
						|
    Control.Size = (UINT32) Size;  
 | 
						|
    CopyMem (mUserInfo.AccessPolicy + OffSet, &Control, sizeof (Control));
 | 
						|
    OffSet += sizeof (Control);
 | 
						|
    
 | 
						|
    CopyMem (mUserInfo.AccessPolicy + OffSet, mAccessInfo.ConnectForbid, mAccessInfo.ConnectForbidLen);
 | 
						|
    OffSet += mAccessInfo.ConnectForbidLen;
 | 
						|
  }
 | 
						|
 | 
						|
  mUserInfo.AccessPolicyLen = OffSet;
 | 
						|
 | 
						|
  //
 | 
						|
  // Save access policy.
 | 
						|
  //
 | 
						|
  if (mUserInfo.AccessPolicyModified && (mUserInfo.AccessPolicyLen > 0)) {
 | 
						|
    Info = AllocateZeroPool (sizeof (EFI_USER_INFO) + mUserInfo.AccessPolicyLen);
 | 
						|
    if (Info == NULL) {
 | 
						|
      return ;
 | 
						|
    }
 | 
						|
 | 
						|
    Status = FindInfoByType (EFI_USER_INFO_ACCESS_POLICY_RECORD, &UserInfo);
 | 
						|
    if (!EFI_ERROR (Status)) {
 | 
						|
      Info->InfoType    = EFI_USER_INFO_ACCESS_POLICY_RECORD;
 | 
						|
      Info->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV |
 | 
						|
                          EFI_USER_INFO_PUBLIC |
 | 
						|
                          EFI_USER_INFO_EXCLUSIVE;
 | 
						|
      Info->InfoSize    = (UINT32) (sizeof (EFI_USER_INFO) + mUserInfo.AccessPolicyLen);
 | 
						|
      CopyMem ((UINT8 *) (Info + 1), mUserInfo.AccessPolicy, mUserInfo.AccessPolicyLen);
 | 
						|
      Status = mUserManager->SetInfo (
 | 
						|
                               mUserManager,
 | 
						|
                               mModifyUser,
 | 
						|
                               &UserInfo,
 | 
						|
                               Info,
 | 
						|
                               Info->InfoSize
 | 
						|
                               );
 | 
						|
      mUserInfo.AccessPolicyModified = FALSE;
 | 
						|
    }
 | 
						|
    FreePool (Info);
 | 
						|
  }
 | 
						|
 | 
						|
  if (mAccessInfo.ConnectForbid != NULL) {
 | 
						|
    FreePool (mAccessInfo.ConnectForbid);
 | 
						|
    mAccessInfo.ConnectForbid = NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  if (mAccessInfo.ConnectPermit != NULL) {
 | 
						|
    FreePool (mAccessInfo.ConnectPermit);
 | 
						|
    mAccessInfo.ConnectPermit = NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  if (mAccessInfo.LoadForbid != NULL) {
 | 
						|
    FreePool (mAccessInfo.LoadForbid);
 | 
						|
    mAccessInfo.LoadForbid = NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  if (mAccessInfo.LoadPermit != NULL) {
 | 
						|
    FreePool (mAccessInfo.LoadPermit);
 | 
						|
    mAccessInfo.LoadPermit = NULL;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Get the username from user input, and update username string in the Hii 
 | 
						|
  database with it.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
ModifyUserName (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS              Status;
 | 
						|
  CHAR16                  UserName[USER_NAME_LENGTH];
 | 
						|
  UINTN                   Len;
 | 
						|
  EFI_INPUT_KEY           Key;
 | 
						|
  EFI_USER_INFO_HANDLE    UserInfo;
 | 
						|
  EFI_USER_INFO           *Info;
 | 
						|
  EFI_USER_PROFILE_HANDLE TempUser;
 | 
						|
 | 
						|
  //
 | 
						|
  // Get the new user name.
 | 
						|
  //
 | 
						|
  Len = sizeof (UserName);
 | 
						|
  Status = GetUserNameInput (&Len, UserName);
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    if (Status != EFI_ABORTED) {
 | 
						|
      CreatePopUp (
 | 
						|
        EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
 | 
						|
        &Key,
 | 
						|
        L"Failed To Get User Name.",
 | 
						|
        L"",
 | 
						|
        L"Please Press Any Key to Continue ...",
 | 
						|
        NULL
 | 
						|
        );
 | 
						|
    }
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Check whether the username had been used or not.
 | 
						|
  //
 | 
						|
  Info = AllocateZeroPool (sizeof (EFI_USER_INFO) + Len);
 | 
						|
  if (Info == NULL) {
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
 | 
						|
  Info->InfoType    = EFI_USER_INFO_NAME_RECORD;
 | 
						|
  Info->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV |
 | 
						|
                      EFI_USER_INFO_PUBLIC |
 | 
						|
                      EFI_USER_INFO_EXCLUSIVE;
 | 
						|
  Info->InfoSize    = (UINT32) (sizeof (EFI_USER_INFO) + Len);
 | 
						|
  CopyMem ((UINT8 *) (Info + 1), UserName, Len);
 | 
						|
 | 
						|
  TempUser  = NULL;
 | 
						|
  Status    = mUserManager->Find (
 | 
						|
                              mUserManager,
 | 
						|
                              &TempUser,
 | 
						|
                              NULL,
 | 
						|
                              Info,
 | 
						|
                              Info->InfoSize
 | 
						|
                              );
 | 
						|
  if (!EFI_ERROR (Status)) {
 | 
						|
    CreatePopUp (
 | 
						|
      EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
 | 
						|
      &Key,
 | 
						|
      L"The User Name Had Been Used.",
 | 
						|
      L"",
 | 
						|
      L"Please Use Other User Name",
 | 
						|
      NULL
 | 
						|
      );
 | 
						|
    FreePool (Info);
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Update username display in the form.
 | 
						|
  //
 | 
						|
  CopyMem (mUserInfo.UserName, UserName, Len);
 | 
						|
  HiiSetString (
 | 
						|
    mCallbackInfo->HiiHandle, 
 | 
						|
    STRING_TOKEN (STR_USER_NAME_VAL), 
 | 
						|
    mUserInfo.UserName, 
 | 
						|
    NULL
 | 
						|
    );
 | 
						|
 | 
						|
  //
 | 
						|
  // Save the user name.
 | 
						|
  //
 | 
						|
  Status = FindInfoByType (EFI_USER_INFO_NAME_RECORD, &UserInfo);
 | 
						|
  if (!EFI_ERROR (Status)) {
 | 
						|
    mUserManager->SetInfo (
 | 
						|
                    mUserManager,
 | 
						|
                    mModifyUser,
 | 
						|
                    &UserInfo,
 | 
						|
                    Info,
 | 
						|
                    Info->InfoSize
 | 
						|
                    );
 | 
						|
  }
 | 
						|
  FreePool (Info);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Display the form of the modifying user identity policy.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
ModifyIdentityPolicy (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINTN               Index;
 | 
						|
  CHAR16              *ProvStr;
 | 
						|
  EFI_STRING_ID       ProvID;
 | 
						|
  EFI_HII_HANDLE      HiiHandle;
 | 
						|
  VOID                *OptionsOpCodeHandle;
 | 
						|
  VOID                *StartOpCodeHandle;
 | 
						|
  VOID                *EndOpCodeHandle;
 | 
						|
  EFI_IFR_GUID_LABEL  *StartLabel;
 | 
						|
  EFI_IFR_GUID_LABEL  *EndLabel;
 | 
						|
 | 
						|
  //
 | 
						|
  // Initialize the container for dynamic opcodes.
 | 
						|
  //
 | 
						|
  StartOpCodeHandle = HiiAllocateOpCodeHandle ();
 | 
						|
  ASSERT (StartOpCodeHandle != NULL);
 | 
						|
 | 
						|
  EndOpCodeHandle = HiiAllocateOpCodeHandle ();
 | 
						|
  ASSERT (EndOpCodeHandle != NULL);
 | 
						|
 | 
						|
  //
 | 
						|
  // Create Hii Extend Label OpCode.
 | 
						|
  //
 | 
						|
  StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
 | 
						|
                                        StartOpCodeHandle,
 | 
						|
                                        &gEfiIfrTianoGuid,
 | 
						|
                                        NULL,
 | 
						|
                                        sizeof (EFI_IFR_GUID_LABEL)
 | 
						|
                                        );
 | 
						|
  StartLabel->ExtendOpCode  = EFI_IFR_EXTEND_OP_LABEL;
 | 
						|
  StartLabel->Number        = LABEL_IP_MOD_FUNC;
 | 
						|
 | 
						|
  EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
 | 
						|
                                      EndOpCodeHandle,
 | 
						|
                                      &gEfiIfrTianoGuid,
 | 
						|
                                      NULL,
 | 
						|
                                      sizeof (EFI_IFR_GUID_LABEL)
 | 
						|
                                      );
 | 
						|
  EndLabel->ExtendOpCode  = EFI_IFR_EXTEND_OP_LABEL;
 | 
						|
  EndLabel->Number        = LABEL_END;
 | 
						|
 | 
						|
  //
 | 
						|
  // Add credential providers
 | 
						|
  //.
 | 
						|
  if (mProviderInfo->Count > 0) {
 | 
						|
    OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
 | 
						|
    ASSERT (OptionsOpCodeHandle != NULL);
 | 
						|
 | 
						|
    //
 | 
						|
    // Add credential provider Option OpCode.
 | 
						|
    //
 | 
						|
    for (Index = 0; Index < mProviderInfo->Count; Index++) {
 | 
						|
      mProviderInfo->Provider[Index]->Title (
 | 
						|
                                        mProviderInfo->Provider[Index],
 | 
						|
                                        &HiiHandle,
 | 
						|
                                        &ProvID
 | 
						|
                                        );
 | 
						|
      ProvStr = HiiGetString (HiiHandle, ProvID, NULL);
 | 
						|
      ProvID  = HiiSetString (mCallbackInfo->HiiHandle, 0, ProvStr, NULL);
 | 
						|
      FreePool (ProvStr);
 | 
						|
      if (ProvID == 0) {
 | 
						|
        return ;
 | 
						|
      }
 | 
						|
 | 
						|
      HiiCreateOneOfOptionOpCode (
 | 
						|
        OptionsOpCodeHandle,
 | 
						|
        ProvID,
 | 
						|
        0,
 | 
						|
        EFI_IFR_NUMERIC_SIZE_1,
 | 
						|
        (UINT8) Index
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    HiiCreateOneOfOpCode (
 | 
						|
      StartOpCodeHandle,                // Container for dynamic created opcodes
 | 
						|
      KEY_MODIFY_USER | KEY_SELECT_USER | KEY_MODIFY_IP | KEY_MODIFY_PROV,  // Question ID
 | 
						|
      0,                                // VarStore ID
 | 
						|
      0,                                // Offset in Buffer Storage
 | 
						|
      STRING_TOKEN (STR_PROVIDER),      // Question prompt text
 | 
						|
      STRING_TOKEN (STR_PROVIDER_HELP), // Question help text
 | 
						|
      EFI_IFR_FLAG_CALLBACK,            // Question flag
 | 
						|
      EFI_IFR_NUMERIC_SIZE_1,           // Data type of Question Value
 | 
						|
      OptionsOpCodeHandle,              // Option Opcode list
 | 
						|
      NULL                              // Default Opcode is NULl
 | 
						|
      );
 | 
						|
 | 
						|
    HiiFreeOpCodeHandle (OptionsOpCodeHandle);
 | 
						|
  }
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Add logical connector Option OpCode.
 | 
						|
  //
 | 
						|
  OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
 | 
						|
  ASSERT (OptionsOpCodeHandle != NULL);
 | 
						|
 | 
						|
  HiiCreateOneOfOptionOpCode (
 | 
						|
    OptionsOpCodeHandle,
 | 
						|
    STRING_TOKEN (STR_AND_CON),
 | 
						|
    0,
 | 
						|
    EFI_IFR_NUMERIC_SIZE_1,
 | 
						|
    0
 | 
						|
    );
 | 
						|
 | 
						|
  HiiCreateOneOfOptionOpCode (
 | 
						|
    OptionsOpCodeHandle,
 | 
						|
    STRING_TOKEN (STR_OR_CON),
 | 
						|
    0,
 | 
						|
    EFI_IFR_NUMERIC_SIZE_1,
 | 
						|
    1
 | 
						|
    );
 | 
						|
 | 
						|
  HiiCreateOneOfOpCode (
 | 
						|
    StartOpCodeHandle,                  // Container for dynamic created opcodes
 | 
						|
    KEY_MODIFY_USER | KEY_SELECT_USER | KEY_MODIFY_IP | KEY_MODIFY_CONN,  // Question ID
 | 
						|
    0,                                  // VarStore ID
 | 
						|
    0,                                  // Offset in Buffer Storage
 | 
						|
    STRING_TOKEN (STR_CONNECTOR),       // Question prompt text
 | 
						|
    STRING_TOKEN (STR_CONNECTOR_HELP),  // Question help text
 | 
						|
    EFI_IFR_FLAG_CALLBACK,              // Question flag
 | 
						|
    EFI_IFR_NUMERIC_SIZE_1,             // Data type of Question Value
 | 
						|
    OptionsOpCodeHandle,                // Option Opcode list
 | 
						|
    NULL                                // Default Opcode is NULl
 | 
						|
    );
 | 
						|
 | 
						|
  HiiFreeOpCodeHandle (OptionsOpCodeHandle);
 | 
						|
 | 
						|
  //
 | 
						|
  // Update identity policy in the form.
 | 
						|
  //
 | 
						|
  ResolveIdentityPolicy (
 | 
						|
    mUserInfo.IdentityPolicy, 
 | 
						|
    mUserInfo.IdentityPolicyLen, 
 | 
						|
    STRING_TOKEN (STR_IDENTIFY_POLICY_VALUE)
 | 
						|
    );
 | 
						|
 | 
						|
  if (mUserInfo.NewIdentityPolicy != NULL) {
 | 
						|
    FreePool (mUserInfo.NewIdentityPolicy);
 | 
						|
    mUserInfo.NewIdentityPolicy         = NULL;
 | 
						|
    mUserInfo.NewIdentityPolicyLen      = 0;
 | 
						|
    mUserInfo.NewIdentityPolicyModified = FALSE;
 | 
						|
  }
 | 
						|
  mProviderChoice = 0;
 | 
						|
  mConncetLogical = 0;
 | 
						|
 | 
						|
  HiiUpdateForm (
 | 
						|
    mCallbackInfo->HiiHandle, // HII handle
 | 
						|
    &gUserProfileManagerGuid, // Formset GUID
 | 
						|
    FORMID_MODIFY_IP,         // Form ID
 | 
						|
    StartOpCodeHandle,        // Label for where to insert opcodes
 | 
						|
    EndOpCodeHandle           // Replace data
 | 
						|
    );
 | 
						|
 | 
						|
  HiiFreeOpCodeHandle (StartOpCodeHandle);
 | 
						|
  HiiFreeOpCodeHandle (EndOpCodeHandle);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Save the identity policy and update UI with it.
 | 
						|
  
 | 
						|
  This funciton will verify the new identity policy, in current implementation, 
 | 
						|
  the identity policy can be:  T, P & P & P & ..., P | P | P | ...
 | 
						|
  Here, "T" means "True", "P" means "Credential Provider", "&" means "and", "|" means "or".
 | 
						|
  Other identity policies are not supported.  
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
SaveIdentityPolicy (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS                    Status;
 | 
						|
  EFI_USER_INFO_IDENTITY_POLICY *Identity;
 | 
						|
  EFI_USER_INFO_HANDLE          UserInfo;
 | 
						|
  EFI_USER_INFO                 *Info;
 | 
						|
  EFI_INPUT_KEY                 Key;
 | 
						|
  UINTN                         Offset;
 | 
						|
  UINT32                        OpCode;
 | 
						|
  UINTN                         InfoSize;
 | 
						|
 | 
						|
  if (!mUserInfo.NewIdentityPolicyModified || (mUserInfo.NewIdentityPolicyLen == 0)) {
 | 
						|
    return;
 | 
						|
  }
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Check policy expression.
 | 
						|
  //
 | 
						|
  OpCode  = EFI_USER_INFO_IDENTITY_FALSE;
 | 
						|
  Offset  = 0;
 | 
						|
  while (Offset < mUserInfo.NewIdentityPolicyLen) {
 | 
						|
    //
 | 
						|
    // Check access policy according to type
 | 
						|
    //
 | 
						|
    Identity = (EFI_USER_INFO_IDENTITY_POLICY *) (mUserInfo.NewIdentityPolicy + Offset);
 | 
						|
    switch (Identity->Type) {
 | 
						|
 | 
						|
    case EFI_USER_INFO_IDENTITY_TRUE:
 | 
						|
      break;
 | 
						|
 | 
						|
    case EFI_USER_INFO_IDENTITY_OR:
 | 
						|
      if (OpCode == EFI_USER_INFO_IDENTITY_AND) {
 | 
						|
        CreatePopUp (
 | 
						|
          EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
 | 
						|
          &Key,
 | 
						|
          L"Invalid Identity Policy, Mixed Connector Unsupport!",
 | 
						|
          L"",
 | 
						|
          L"Press Any Key to Continue ...",
 | 
						|
          NULL
 | 
						|
          );
 | 
						|
        return ;
 | 
						|
      }
 | 
						|
 | 
						|
      OpCode = EFI_USER_INFO_IDENTITY_OR;
 | 
						|
      break;
 | 
						|
 | 
						|
    case EFI_USER_INFO_IDENTITY_AND:
 | 
						|
      if (OpCode == EFI_USER_INFO_IDENTITY_OR) {
 | 
						|
        CreatePopUp (
 | 
						|
          EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
 | 
						|
          &Key,
 | 
						|
          L"Invalid Identity Policy, Mixed Connector Unsupport!",
 | 
						|
          L"",
 | 
						|
          L"Press Any Key to Continue ...",
 | 
						|
          NULL
 | 
						|
          );
 | 
						|
        return ;
 | 
						|
      }
 | 
						|
 | 
						|
      OpCode = EFI_USER_INFO_IDENTITY_AND;
 | 
						|
      break;
 | 
						|
 | 
						|
    case EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER:
 | 
						|
      break;
 | 
						|
 | 
						|
    default:
 | 
						|
      CreatePopUp (
 | 
						|
        EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
 | 
						|
        &Key,
 | 
						|
        L"Unsupport parameter",
 | 
						|
        L"",
 | 
						|
        L"Press Any Key to Continue ...",
 | 
						|
        NULL
 | 
						|
        );
 | 
						|
      return ;
 | 
						|
    }
 | 
						|
    Offset += Identity->Length;
 | 
						|
  }
 | 
						|
 | 
						|
  //
 | 
						|
  // Save identity policy.
 | 
						|
  //
 | 
						|
  Info = AllocateZeroPool (
 | 
						|
           sizeof (EFI_USER_INFO) + 
 | 
						|
           mUserInfo.NewIdentityPolicyLen
 | 
						|
           );
 | 
						|
  if (Info == NULL) {
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
 | 
						|
  Status = FindInfoByType (EFI_USER_INFO_IDENTITY_POLICY_RECORD, &UserInfo);
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    FreePool (Info);
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
  
 | 
						|
  Info->InfoType    = EFI_USER_INFO_IDENTITY_POLICY_RECORD;
 | 
						|
  Info->InfoAttribs = EFI_USER_INFO_STORAGE_PLATFORM_NV |
 | 
						|
                      EFI_USER_INFO_PRIVATE |
 | 
						|
                      EFI_USER_INFO_EXCLUSIVE;
 | 
						|
  Info->InfoSize    = (UINT32) (sizeof (EFI_USER_INFO) + mUserInfo.NewIdentityPolicyLen);
 | 
						|
  CopyMem ((UINT8 *) (Info + 1), mUserInfo.NewIdentityPolicy, mUserInfo.NewIdentityPolicyLen);
 | 
						|
  Status = mUserManager->SetInfo (
 | 
						|
                           mUserManager,
 | 
						|
                           mModifyUser,
 | 
						|
                           &UserInfo,
 | 
						|
                           Info,
 | 
						|
                           Info->InfoSize
 | 
						|
                           );
 | 
						|
  FreePool (Info);                           
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    //
 | 
						|
    // Get the user information again, it may be changed during saving it.
 | 
						|
    //
 | 
						|
    InfoSize = 0;
 | 
						|
    Status = mUserManager->GetInfo (
 | 
						|
                             mUserManager,
 | 
						|
                             mModifyUser,
 | 
						|
                             UserInfo,
 | 
						|
                             Info,
 | 
						|
                             &InfoSize
 | 
						|
                             );
 | 
						|
    if (Status == EFI_BUFFER_TOO_SMALL) {
 | 
						|
      Info = AllocateZeroPool (InfoSize);
 | 
						|
      ASSERT (Info != NULL);
 | 
						|
      Status = mUserManager->GetInfo (
 | 
						|
                               mUserManager,
 | 
						|
                               mModifyUser,
 | 
						|
                               UserInfo,
 | 
						|
                               Info,
 | 
						|
                               &InfoSize
 | 
						|
                               );
 | 
						|
    }
 | 
						|
    ASSERT_EFI_ERROR (Status);
 | 
						|
    
 | 
						|
    //
 | 
						|
    // Save current identification policy to mUserInfo.IdentityPolicy. 
 | 
						|
    //
 | 
						|
    ASSERT (Info != NULL);
 | 
						|
    if (mUserInfo.IdentityPolicy != NULL) {
 | 
						|
      FreePool (mUserInfo.IdentityPolicy);
 | 
						|
    }
 | 
						|
 | 
						|
    mUserInfo.IdentityPolicyLen = Info->InfoSize - sizeof (EFI_USER_INFO);
 | 
						|
    mUserInfo.IdentityPolicy    = AllocateCopyPool (mUserInfo.IdentityPolicyLen, Info + 1);    
 | 
						|
    ASSERT (mUserInfo.IdentityPolicy != NULL);  
 | 
						|
 | 
						|
    //
 | 
						|
    // Free the memory
 | 
						|
    //
 | 
						|
    FreePool (Info);
 | 
						|
    FreePool (mUserInfo.NewIdentityPolicy);
 | 
						|
  } else {  
 | 
						|
    //
 | 
						|
    // Update the mUserInfo.IdentityPolicy by mUserInfo.NewIdentityPolicy
 | 
						|
    //
 | 
						|
    if (mUserInfo.IdentityPolicy != NULL) {
 | 
						|
      FreePool (mUserInfo.IdentityPolicy);
 | 
						|
    }
 | 
						|
    mUserInfo.IdentityPolicy    = mUserInfo.NewIdentityPolicy;
 | 
						|
    mUserInfo.IdentityPolicyLen = mUserInfo.NewIdentityPolicyLen;
 | 
						|
  }
 | 
						|
 | 
						|
  mUserInfo.NewIdentityPolicy         = NULL;
 | 
						|
  mUserInfo.NewIdentityPolicyLen      = 0;
 | 
						|
  mUserInfo.NewIdentityPolicyModified = FALSE;   
 | 
						|
 | 
						|
  //
 | 
						|
  // Update identity policy choice.
 | 
						|
  //
 | 
						|
  ResolveIdentityPolicy (
 | 
						|
    mUserInfo.IdentityPolicy, 
 | 
						|
    mUserInfo.IdentityPolicyLen, 
 | 
						|
    STRING_TOKEN (STR_IDENTIFY_POLICY_VAL)
 | 
						|
    );
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Verify the new identity policy in the current implementation. The same credential
 | 
						|
  provider can't appear twice in one identity policy.
 | 
						|
 | 
						|
  @param[in] NewGuid       Points to the credential provider guid.
 | 
						|
  
 | 
						|
  @retval TRUE     The NewGuid was found in the identity policy.
 | 
						|
  @retval FALSE    The NewGuid was not found.
 | 
						|
 | 
						|
**/
 | 
						|
BOOLEAN
 | 
						|
CheckIdentityPolicy (
 | 
						|
  IN EFI_GUID                                      *NewGuid
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINTN                         Offset;
 | 
						|
  EFI_USER_INFO_IDENTITY_POLICY *Identity;
 | 
						|
  EFI_INPUT_KEY                 Key;
 | 
						|
 | 
						|
  Offset = 0;
 | 
						|
  while (Offset < mUserInfo.NewIdentityPolicyLen) {
 | 
						|
    //
 | 
						|
    // Check access policy according to type.
 | 
						|
    //
 | 
						|
    Identity = (EFI_USER_INFO_IDENTITY_POLICY *) (mUserInfo.NewIdentityPolicy + Offset);
 | 
						|
    switch (Identity->Type) {
 | 
						|
 | 
						|
    case EFI_USER_INFO_IDENTITY_TRUE:
 | 
						|
    case EFI_USER_INFO_IDENTITY_OR:
 | 
						|
    case EFI_USER_INFO_IDENTITY_AND:
 | 
						|
      break;
 | 
						|
 | 
						|
    case EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER:
 | 
						|
      if (CompareGuid (NewGuid, (EFI_GUID *) (Identity + 1))) {
 | 
						|
        CreatePopUp (
 | 
						|
          EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
 | 
						|
          &Key,
 | 
						|
          L"This Credential Provider Are Already Used!",
 | 
						|
          L"",
 | 
						|
          L"Press Any Key to Continue ...",
 | 
						|
          NULL
 | 
						|
          );
 | 
						|
        return FALSE;
 | 
						|
      }
 | 
						|
      break;
 | 
						|
 | 
						|
    default:
 | 
						|
      CreatePopUp (
 | 
						|
        EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
 | 
						|
        &Key,
 | 
						|
        L"Unsupport parameter",
 | 
						|
        L"",
 | 
						|
        L"Press Any Key to Continue ...",
 | 
						|
        NULL
 | 
						|
        );
 | 
						|
      return FALSE;
 | 
						|
    }
 | 
						|
 | 
						|
    Offset += Identity->Length;
 | 
						|
  }
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Update the mUserInfo.NewIdentityPolicy, and UI when 'add option' is pressed.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
AddIdentityPolicyItem (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINT8                         *NewInfo;
 | 
						|
  EFI_USER_INFO_IDENTITY_POLICY *Policy;
 | 
						|
 | 
						|
  if (mProviderInfo->Count == 0) {
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
 | 
						|
  if (!mUserInfo.NewIdentityPolicyModified && (mUserInfo.NewIdentityPolicyLen > 0)) {
 | 
						|
    FreePool (mUserInfo.NewIdentityPolicy);
 | 
						|
    mUserInfo.NewIdentityPolicy     = NULL;
 | 
						|
    mUserInfo.NewIdentityPolicyLen  = 0;
 | 
						|
  }
 | 
						|
  //
 | 
						|
  // Expand the identity policy memory for the newly added policy info.
 | 
						|
  //
 | 
						|
  if (mUserInfo.NewIdentityPolicyLen > 0) {
 | 
						|
    //
 | 
						|
    // The new policy is not empty, expand space for connetor and provider.
 | 
						|
    //
 | 
						|
    if (!CheckIdentityPolicy (&mProviderInfo->Provider[mProviderChoice]->Identifier)) {
 | 
						|
      return ;
 | 
						|
    }
 | 
						|
    NewInfo = AllocateZeroPool (
 | 
						|
                mUserInfo.NewIdentityPolicyLen + 
 | 
						|
                sizeof (EFI_USER_INFO_IDENTITY_POLICY) * 2 + 
 | 
						|
                sizeof (EFI_GUID)
 | 
						|
                );
 | 
						|
  } else {
 | 
						|
    //
 | 
						|
    // The new policy is empty, only expand space for provider.
 | 
						|
    //
 | 
						|
    NewInfo = AllocateZeroPool (
 | 
						|
                mUserInfo.NewIdentityPolicyLen + 
 | 
						|
                sizeof (EFI_USER_INFO_IDENTITY_POLICY) + 
 | 
						|
                sizeof (EFI_GUID)
 | 
						|
                );
 | 
						|
  }
 | 
						|
 | 
						|
  if (NewInfo == NULL) {
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
 | 
						|
  if (mUserInfo.NewIdentityPolicyLen > 0) {
 | 
						|
    CopyMem (NewInfo, mUserInfo.NewIdentityPolicy, mUserInfo.NewIdentityPolicyLen);
 | 
						|
    FreePool (mUserInfo.NewIdentityPolicy);
 | 
						|
  }
 | 
						|
  mUserInfo.NewIdentityPolicy = NewInfo;
 | 
						|
 | 
						|
  //
 | 
						|
  // Save logical connector.
 | 
						|
  //
 | 
						|
  if (mUserInfo.NewIdentityPolicyLen > 0) {
 | 
						|
    Policy = (EFI_USER_INFO_IDENTITY_POLICY *) (mUserInfo.NewIdentityPolicy +
 | 
						|
                                                mUserInfo.NewIdentityPolicyLen);
 | 
						|
    if (mConncetLogical == 0) {
 | 
						|
      Policy->Type = EFI_USER_INFO_IDENTITY_AND;
 | 
						|
    } else {
 | 
						|
      Policy->Type = EFI_USER_INFO_IDENTITY_OR;
 | 
						|
    }
 | 
						|
 | 
						|
    Policy->Length = sizeof (EFI_USER_INFO_IDENTITY_POLICY);
 | 
						|
    mUserInfo.NewIdentityPolicyLen += Policy->Length;
 | 
						|
  }
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Save credential provider.
 | 
						|
  //
 | 
						|
  Policy = (EFI_USER_INFO_IDENTITY_POLICY *) (mUserInfo.NewIdentityPolicy + 
 | 
						|
                                              mUserInfo.NewIdentityPolicyLen);
 | 
						|
  Policy->Length = sizeof (EFI_USER_INFO_IDENTITY_POLICY) + sizeof (EFI_GUID);
 | 
						|
  Policy->Type   = EFI_USER_INFO_IDENTITY_CREDENTIAL_PROVIDER;
 | 
						|
  CopyGuid ((EFI_GUID *) (Policy + 1), &mProviderInfo->Provider[mProviderChoice]->Identifier);
 | 
						|
  mUserInfo.NewIdentityPolicyLen += Policy->Length;
 | 
						|
 | 
						|
  //
 | 
						|
  // Update identity policy choice.
 | 
						|
  //
 | 
						|
  mUserInfo.NewIdentityPolicyModified = TRUE;
 | 
						|
  ResolveIdentityPolicy (
 | 
						|
    mUserInfo.NewIdentityPolicy, 
 | 
						|
    mUserInfo.NewIdentityPolicyLen, 
 | 
						|
    STRING_TOKEN (STR_IDENTIFY_POLICY_VALUE)
 | 
						|
    );
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Create an action OpCode with QuestionID and DevicePath on a given OpCodeHandle.
 | 
						|
 | 
						|
  @param[in]  QuestionID            The question ID.
 | 
						|
  @param[in]  DevicePath            Points to device path.
 | 
						|
  @param[in]  OpCodeHandle          Points to container for dynamic created opcodes.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
AddDevicePath (
 | 
						|
  IN  UINTN                                     QuestionID,
 | 
						|
  IN  EFI_DEVICE_PATH_PROTOCOL                  *DevicePath,
 | 
						|
  IN     VOID                                   *OpCodeHandle
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS                        Status;
 | 
						|
  EFI_DEVICE_PATH_PROTOCOL          *Next;
 | 
						|
  EFI_STRING_ID                     NameID;
 | 
						|
  EFI_STRING                        DriverName;
 | 
						|
  EFI_DEVICE_PATH_TO_TEXT_PROTOCOL  *DevicePathText;
 | 
						|
 | 
						|
  //
 | 
						|
  // Locate device path to text protocol.
 | 
						|
  //
 | 
						|
  Status = gBS->LocateProtocol (
 | 
						|
                  &gEfiDevicePathToTextProtocolGuid,
 | 
						|
                  NULL,
 | 
						|
                  (VOID **) &DevicePathText
 | 
						|
                  );
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Get driver file name node.
 | 
						|
  //
 | 
						|
  Next = DevicePath;
 | 
						|
  while (!IsDevicePathEnd (Next)) {
 | 
						|
    DevicePath  = Next;
 | 
						|
    Next        = NextDevicePathNode (Next);
 | 
						|
  }
 | 
						|
 | 
						|
  //
 | 
						|
  // Display the device path in form.
 | 
						|
  //
 | 
						|
  DriverName = DevicePathText->ConvertDevicePathToText (DevicePath, FALSE, FALSE);
 | 
						|
  NameID = HiiSetString (mCallbackInfo->HiiHandle, 0, DriverName, NULL);
 | 
						|
  FreePool (DriverName);
 | 
						|
  if (NameID == 0) {
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
 | 
						|
  HiiCreateActionOpCode (
 | 
						|
    OpCodeHandle,                   // Container for dynamic created opcodes
 | 
						|
    (UINT16) QuestionID,            // Question ID
 | 
						|
    NameID,                         // Prompt text
 | 
						|
    STRING_TOKEN (STR_NULL_STRING), // Help text
 | 
						|
    EFI_IFR_FLAG_CALLBACK,          // Question flag
 | 
						|
    0                               // Action String ID
 | 
						|
    );
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Check whether the DevicePath is in the device path forbid list 
 | 
						|
  (mAccessInfo.LoadForbid).
 | 
						|
 | 
						|
  @param[in]  DevicePath           Points to device path.
 | 
						|
  
 | 
						|
  @retval TRUE     The DevicePath is in the device path forbid list.
 | 
						|
  @retval FALSE    The DevicePath is not in the device path forbid list.
 | 
						|
 | 
						|
**/
 | 
						|
BOOLEAN
 | 
						|
IsLoadForbidden (
 | 
						|
  IN  EFI_DEVICE_PATH_PROTOCOL                  *DevicePath
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINTN                     OffSet;
 | 
						|
  UINTN                     DPSize;
 | 
						|
  UINTN                     Size;
 | 
						|
  EFI_DEVICE_PATH_PROTOCOL  *Dp;
 | 
						|
 | 
						|
  OffSet = 0;
 | 
						|
  Size   = GetDevicePathSize (DevicePath);
 | 
						|
  //
 | 
						|
  // Check each device path.
 | 
						|
  //
 | 
						|
  while (OffSet < mAccessInfo.LoadForbidLen) {
 | 
						|
    Dp      = (EFI_DEVICE_PATH_PROTOCOL *) (mAccessInfo.LoadForbid + OffSet);
 | 
						|
    DPSize  = GetDevicePathSize (Dp);
 | 
						|
    //
 | 
						|
    // Compare device path.
 | 
						|
    //
 | 
						|
    if ((DPSize == Size) && (CompareMem (DevicePath, Dp, Size) == 0)) {
 | 
						|
      return TRUE;
 | 
						|
    }
 | 
						|
    OffSet += DPSize;
 | 
						|
  }
 | 
						|
  return FALSE;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Display the permit load device path in the loadable device path list.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
DisplayLoadPermit(
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS          Status;
 | 
						|
  CHAR16              *Order;
 | 
						|
  UINTN               OrderSize;
 | 
						|
  UINTN               ListCount;
 | 
						|
  UINTN               Index;
 | 
						|
  UINT8               *Var;
 | 
						|
  UINT8               *VarPtr;
 | 
						|
  CHAR16              VarName[12];
 | 
						|
  VOID                *StartOpCodeHandle;
 | 
						|
  VOID                *EndOpCodeHandle;
 | 
						|
  EFI_IFR_GUID_LABEL  *StartLabel;
 | 
						|
  EFI_IFR_GUID_LABEL  *EndLabel;
 | 
						|
 | 
						|
  //
 | 
						|
  // Get DriverOrder.
 | 
						|
  //
 | 
						|
  OrderSize = 0;
 | 
						|
  Status    = gRT->GetVariable (
 | 
						|
                     L"DriverOrder", 
 | 
						|
                     &gEfiGlobalVariableGuid, 
 | 
						|
                     NULL, 
 | 
						|
                     &OrderSize, 
 | 
						|
                     NULL
 | 
						|
                     );
 | 
						|
  if (Status != EFI_BUFFER_TOO_SMALL) {
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
 | 
						|
  Order = AllocateZeroPool (OrderSize);
 | 
						|
  if (Order == NULL) {
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
 | 
						|
  Status = gRT->GetVariable (
 | 
						|
                  L"DriverOrder", 
 | 
						|
                  &gEfiGlobalVariableGuid, 
 | 
						|
                  NULL, 
 | 
						|
                  &OrderSize, 
 | 
						|
                  Order
 | 
						|
                  );
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Initialize the container for dynamic opcodes.
 | 
						|
  //
 | 
						|
  StartOpCodeHandle = HiiAllocateOpCodeHandle ();
 | 
						|
  ASSERT (StartOpCodeHandle != NULL);
 | 
						|
 | 
						|
  EndOpCodeHandle = HiiAllocateOpCodeHandle ();
 | 
						|
  ASSERT (EndOpCodeHandle != NULL);
 | 
						|
 | 
						|
  //
 | 
						|
  // Create Hii Extend Label OpCode.
 | 
						|
  //
 | 
						|
  StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
 | 
						|
                                        StartOpCodeHandle,
 | 
						|
                                        &gEfiIfrTianoGuid,
 | 
						|
                                        NULL,
 | 
						|
                                        sizeof (EFI_IFR_GUID_LABEL)
 | 
						|
                                        );
 | 
						|
  StartLabel->ExtendOpCode  = EFI_IFR_EXTEND_OP_LABEL;
 | 
						|
  StartLabel->Number        = LABEL_PERMIT_LOAD_FUNC;
 | 
						|
 | 
						|
  EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
 | 
						|
                                      EndOpCodeHandle,
 | 
						|
                                      &gEfiIfrTianoGuid,
 | 
						|
                                      NULL,
 | 
						|
                                      sizeof (EFI_IFR_GUID_LABEL)
 | 
						|
                                      );
 | 
						|
  EndLabel->ExtendOpCode  = EFI_IFR_EXTEND_OP_LABEL;
 | 
						|
  EndLabel->Number        = LABEL_END;
 | 
						|
 | 
						|
  //
 | 
						|
  // Add each driver option.
 | 
						|
  //
 | 
						|
  Var       = NULL;
 | 
						|
  ListCount = OrderSize / sizeof (UINT16);
 | 
						|
  for (Index = 0; Index < ListCount; Index++) {
 | 
						|
    //
 | 
						|
    // Get driver device path.
 | 
						|
    //
 | 
						|
    UnicodeSPrint (VarName, sizeof (VarName), L"Driver%04x", Order[Index]);
 | 
						|
    Var = GetEfiGlobalVariable (VarName);
 | 
						|
    if (Var == NULL) {
 | 
						|
      continue;
 | 
						|
    }
 | 
						|
    
 | 
						|
    //
 | 
						|
    // Check whether the driver is already forbidden.
 | 
						|
    //
 | 
						|
    
 | 
						|
    VarPtr = Var;
 | 
						|
    //
 | 
						|
    // Skip attribute.
 | 
						|
    //
 | 
						|
    VarPtr += sizeof (UINT32);
 | 
						|
 | 
						|
    //
 | 
						|
    // Skip device path lenth.
 | 
						|
    //
 | 
						|
    VarPtr += sizeof (UINT16);
 | 
						|
 | 
						|
    //
 | 
						|
    // Skip descript string.
 | 
						|
    //
 | 
						|
    VarPtr += StrSize ((UINT16 *) VarPtr);
 | 
						|
 | 
						|
    if (IsLoadForbidden ((EFI_DEVICE_PATH_PROTOCOL *) VarPtr)) {
 | 
						|
      FreePool (Var);
 | 
						|
      Var = NULL;
 | 
						|
      continue;
 | 
						|
    }
 | 
						|
 | 
						|
    AddDevicePath (
 | 
						|
      KEY_MODIFY_USER | KEY_MODIFY_AP_DP | KEY_LOAD_PERMIT_MODIFY | Order[Index],
 | 
						|
      (EFI_DEVICE_PATH_PROTOCOL *) VarPtr,
 | 
						|
      StartOpCodeHandle
 | 
						|
      );
 | 
						|
    FreePool (Var);
 | 
						|
    Var = NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  HiiUpdateForm (
 | 
						|
    mCallbackInfo->HiiHandle, // HII handle
 | 
						|
    &gUserProfileManagerGuid, // Formset GUID
 | 
						|
    FORMID_PERMIT_LOAD_DP,    // Form ID
 | 
						|
    StartOpCodeHandle,        // Label for where to insert opcodes
 | 
						|
    EndOpCodeHandle           // Replace data
 | 
						|
    );
 | 
						|
 | 
						|
  HiiFreeOpCodeHandle (StartOpCodeHandle);
 | 
						|
  HiiFreeOpCodeHandle (EndOpCodeHandle);
 | 
						|
 | 
						|
  //
 | 
						|
  // Clear Environment.
 | 
						|
  //
 | 
						|
  if (Var != NULL) {
 | 
						|
    FreePool (Var);
 | 
						|
  }
 | 
						|
  FreePool (Order);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Display the forbid load device path list (mAccessInfo.LoadForbid).
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
DisplayLoadForbid (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINTN                     Offset;
 | 
						|
  UINTN                     DPSize;
 | 
						|
  UINTN                     Index;
 | 
						|
  EFI_DEVICE_PATH_PROTOCOL  *Dp;
 | 
						|
  VOID                      *StartOpCodeHandle;
 | 
						|
  VOID                      *EndOpCodeHandle;
 | 
						|
  EFI_IFR_GUID_LABEL        *StartLabel;
 | 
						|
  EFI_IFR_GUID_LABEL        *EndLabel;
 | 
						|
 | 
						|
  //
 | 
						|
  // Initialize the container for dynamic opcodes.
 | 
						|
  //
 | 
						|
  StartOpCodeHandle = HiiAllocateOpCodeHandle ();
 | 
						|
  ASSERT (StartOpCodeHandle != NULL);
 | 
						|
 | 
						|
  EndOpCodeHandle = HiiAllocateOpCodeHandle ();
 | 
						|
  ASSERT (EndOpCodeHandle != NULL);
 | 
						|
 | 
						|
  //
 | 
						|
  // Create Hii Extend Label OpCode.
 | 
						|
  //
 | 
						|
  StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
 | 
						|
                                        StartOpCodeHandle,
 | 
						|
                                        &gEfiIfrTianoGuid,
 | 
						|
                                        NULL,
 | 
						|
                                        sizeof (EFI_IFR_GUID_LABEL)
 | 
						|
                                        );
 | 
						|
  StartLabel->ExtendOpCode  = EFI_IFR_EXTEND_OP_LABEL;
 | 
						|
  StartLabel->Number        = LABLE_FORBID_LOAD_FUNC;
 | 
						|
 | 
						|
  EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
 | 
						|
                                      EndOpCodeHandle,
 | 
						|
                                      &gEfiIfrTianoGuid,
 | 
						|
                                      NULL,
 | 
						|
                                      sizeof (EFI_IFR_GUID_LABEL)
 | 
						|
                                      );
 | 
						|
  EndLabel->ExtendOpCode  = EFI_IFR_EXTEND_OP_LABEL;
 | 
						|
  EndLabel->Number        = LABEL_END;
 | 
						|
 | 
						|
  //
 | 
						|
  // Add each forbid load drivers.
 | 
						|
  //
 | 
						|
  Offset  = 0;
 | 
						|
  Index   = 0;
 | 
						|
  while (Offset < mAccessInfo.LoadForbidLen) {
 | 
						|
    Dp      = (EFI_DEVICE_PATH_PROTOCOL *) (mAccessInfo.LoadForbid + Offset);
 | 
						|
    DPSize  = GetDevicePathSize (Dp);
 | 
						|
    AddDevicePath (
 | 
						|
      KEY_MODIFY_USER | KEY_MODIFY_AP_DP | KEY_LOAD_FORBID_MODIFY | Index,
 | 
						|
      Dp,
 | 
						|
      StartOpCodeHandle
 | 
						|
      );
 | 
						|
    Index++;
 | 
						|
    Offset += DPSize;
 | 
						|
  }
 | 
						|
 | 
						|
  HiiUpdateForm (
 | 
						|
    mCallbackInfo->HiiHandle, // HII handle
 | 
						|
    &gUserProfileManagerGuid, // Formset GUID
 | 
						|
    FORMID_FORBID_LOAD_DP,    // Form ID
 | 
						|
    StartOpCodeHandle,        // Label for where to insert opcodes
 | 
						|
    EndOpCodeHandle           // Replace data
 | 
						|
    );
 | 
						|
 | 
						|
  HiiFreeOpCodeHandle (StartOpCodeHandle);
 | 
						|
  HiiFreeOpCodeHandle (EndOpCodeHandle);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Display the permit connect device path.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
DisplayConnectPermit (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  //
 | 
						|
  // Note: 
 | 
						|
  // As no architect protocol/interface to be called in ConnectController()
 | 
						|
  // to verify the device path, just add a place holder for permitted connect
 | 
						|
  // device path.
 | 
						|
  //
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Display the forbid connect device path list.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
DisplayConnectForbid (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
{
 | 
						|
  //
 | 
						|
  // Note: 
 | 
						|
  // As no architect protocol/interface to be called in ConnectController()
 | 
						|
  // to verify the device path, just add a place holder for forbidden connect
 | 
						|
  // device path.
 | 
						|
  //
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Delete the specified device path by DriverIndex from the forbid device path 
 | 
						|
  list (mAccessInfo.LoadForbid).
 | 
						|
 | 
						|
  @param[in]  DriverIndex   The index of driver in forbidden device path list.
 | 
						|
  
 | 
						|
**/
 | 
						|
VOID
 | 
						|
DeleteFromForbidLoad (
 | 
						|
  IN  UINT16                                    DriverIndex
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINTN                     OffSet;
 | 
						|
  UINTN                     DPSize;
 | 
						|
  UINTN                     OffLen;
 | 
						|
  EFI_DEVICE_PATH_PROTOCOL  *Dp;
 | 
						|
 | 
						|
  OffSet = 0;
 | 
						|
  //
 | 
						|
  // Find the specified device path.
 | 
						|
  //
 | 
						|
  while ((OffSet < mAccessInfo.LoadForbidLen) && (DriverIndex > 0)) {
 | 
						|
    Dp      = (EFI_DEVICE_PATH_PROTOCOL *) (mAccessInfo.LoadForbid + OffSet);
 | 
						|
    DPSize  = GetDevicePathSize (Dp);
 | 
						|
    OffSet += DPSize;
 | 
						|
    DriverIndex--;
 | 
						|
  }
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Specified device path found.
 | 
						|
  //
 | 
						|
  if (DriverIndex == 0) {
 | 
						|
    Dp      = (EFI_DEVICE_PATH_PROTOCOL *) (mAccessInfo.LoadForbid + OffSet);
 | 
						|
    DPSize  = GetDevicePathSize (Dp);
 | 
						|
    OffLen  = mAccessInfo.LoadForbidLen - OffSet - DPSize;
 | 
						|
    if (OffLen > 0) {
 | 
						|
      CopyMem (
 | 
						|
        mAccessInfo.LoadForbid + OffSet, 
 | 
						|
        mAccessInfo.LoadForbid + OffSet + DPSize, 
 | 
						|
        OffLen
 | 
						|
        );
 | 
						|
    }
 | 
						|
    mAccessInfo.LoadForbidLen -= DPSize;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Add the specified device path by DriverIndex to the forbid device path 
 | 
						|
  list (mAccessInfo.LoadForbid).
 | 
						|
 | 
						|
  @param[in]  DriverIndex   The index of driver saved in driver options.
 | 
						|
  
 | 
						|
**/
 | 
						|
VOID
 | 
						|
AddToForbidLoad (
 | 
						|
  IN  UINT16                                    DriverIndex
 | 
						|
  )
 | 
						|
{
 | 
						|
  UINTN       DevicePathLen;
 | 
						|
  UINT8       *Var;
 | 
						|
  UINT8       *VarPtr;
 | 
						|
  UINTN       NewLen;
 | 
						|
  UINT8       *NewFL;
 | 
						|
  CHAR16      VarName[13];
 | 
						|
 | 
						|
  //
 | 
						|
  // Get loadable driver device path.
 | 
						|
  //
 | 
						|
  UnicodeSPrint  (VarName, sizeof (VarName), L"Driver%04x", DriverIndex);
 | 
						|
  Var = GetEfiGlobalVariable (VarName);
 | 
						|
  if (Var == NULL) {
 | 
						|
    return;
 | 
						|
  }
 | 
						|
  
 | 
						|
  //
 | 
						|
  // Save forbid load driver.
 | 
						|
  //
 | 
						|
  
 | 
						|
  VarPtr = Var;
 | 
						|
  //
 | 
						|
  // Skip attribute.
 | 
						|
  //
 | 
						|
  VarPtr += sizeof (UINT32);
 | 
						|
 | 
						|
  DevicePathLen = *(UINT16 *) VarPtr;
 | 
						|
  //
 | 
						|
  // Skip device path length.
 | 
						|
  //
 | 
						|
  VarPtr += sizeof (UINT16);
 | 
						|
 | 
						|
  //
 | 
						|
  // Skip description string.
 | 
						|
  //
 | 
						|
  VarPtr += StrSize ((UINT16 *) VarPtr);
 | 
						|
 | 
						|
  NewLen  = mAccessInfo.LoadForbidLen + DevicePathLen;
 | 
						|
  NewFL   = AllocateZeroPool (NewLen);
 | 
						|
  if (NewFL == NULL) {
 | 
						|
    FreePool (Var);
 | 
						|
    return ;
 | 
						|
  }
 | 
						|
 | 
						|
  if (mAccessInfo.LoadForbidLen > 0) {
 | 
						|
    CopyMem (NewFL, mAccessInfo.LoadForbid, mAccessInfo.LoadForbidLen);
 | 
						|
    FreePool (mAccessInfo.LoadForbid);
 | 
						|
  }
 | 
						|
 | 
						|
  CopyMem (NewFL + mAccessInfo.LoadForbidLen, VarPtr, DevicePathLen);
 | 
						|
  mAccessInfo.LoadForbidLen = NewLen;
 | 
						|
  mAccessInfo.LoadForbid    = NewFL;
 | 
						|
  FreePool (Var);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
  Get current user's access right.
 | 
						|
 | 
						|
  @param[out]  AccessRight  Points to the buffer used for user's access right.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS       Get current user access right successfully.
 | 
						|
  @retval others            Fail to get current user access right.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
GetAccessRight (
 | 
						|
  OUT  UINT32                                    *AccessRight
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS                    Status;
 | 
						|
  EFI_USER_INFO_HANDLE          UserInfo;
 | 
						|
  EFI_USER_INFO                 *Info;
 | 
						|
  UINTN                         InfoSize;
 | 
						|
  UINTN                         MemSize;
 | 
						|
  EFI_USER_INFO_ACCESS_CONTROL  Access;
 | 
						|
  EFI_USER_PROFILE_HANDLE       CurrentUser;
 | 
						|
  UINTN                         TotalLen;
 | 
						|
  UINTN                         CheckLen;
 | 
						|
 | 
						|
  //
 | 
						|
  // Allocate user information memory.
 | 
						|
  //
 | 
						|
  MemSize = sizeof (EFI_USER_INFO) + 63;
 | 
						|
  Info    = AllocateZeroPool (MemSize);
 | 
						|
  if (Info == NULL) {
 | 
						|
    return EFI_OUT_OF_RESOURCES;
 | 
						|
  }
 | 
						|
 
 | 
						|
  //
 | 
						|
  // Get user access information.
 | 
						|
  //
 | 
						|
  UserInfo = NULL;
 | 
						|
  mUserManager->Current (mUserManager, &CurrentUser);
 | 
						|
  while (TRUE) {
 | 
						|
    InfoSize = MemSize;
 | 
						|
    //
 | 
						|
    // Get next user information.
 | 
						|
    //
 | 
						|
    Status = mUserManager->GetNextInfo (mUserManager, CurrentUser, &UserInfo);
 | 
						|
    if (EFI_ERROR (Status)) {
 | 
						|
      break;
 | 
						|
    }
 | 
						|
 | 
						|
    Status = mUserManager->GetInfo (
 | 
						|
                             mUserManager,
 | 
						|
                             CurrentUser,
 | 
						|
                             UserInfo,
 | 
						|
                             Info,
 | 
						|
                             &InfoSize
 | 
						|
                             );
 | 
						|
    if (Status == EFI_BUFFER_TOO_SMALL) {
 | 
						|
      MemSize = InfoSize;
 | 
						|
      FreePool (Info);
 | 
						|
      Info = AllocateZeroPool (MemSize);
 | 
						|
      if (Info == NULL) {
 | 
						|
        return EFI_OUT_OF_RESOURCES;
 | 
						|
      }
 | 
						|
      Status = mUserManager->GetInfo (
 | 
						|
                               mUserManager,
 | 
						|
                               CurrentUser,
 | 
						|
                               UserInfo,
 | 
						|
                               Info,
 | 
						|
                               &InfoSize
 | 
						|
                               );
 | 
						|
    }
 | 
						|
    if (EFI_ERROR (Status)) {
 | 
						|
      break;
 | 
						|
    }
 | 
						|
    
 | 
						|
    //
 | 
						|
    // Check user information.
 | 
						|
    //
 | 
						|
    if (Info->InfoType == EFI_USER_INFO_ACCESS_POLICY_RECORD) {
 | 
						|
      TotalLen  = Info->InfoSize - sizeof (EFI_USER_INFO);
 | 
						|
      CheckLen  = 0;
 | 
						|
      //
 | 
						|
      // Get specified access information.
 | 
						|
      //
 | 
						|
      while (CheckLen < TotalLen) {
 | 
						|
        CopyMem (&Access, (UINT8 *) (Info + 1) + CheckLen, sizeof (Access));
 | 
						|
        if ((Access.Type == EFI_USER_INFO_ACCESS_ENROLL_SELF) ||
 | 
						|
            (Access.Type == EFI_USER_INFO_ACCESS_ENROLL_OTHERS) ||
 | 
						|
            (Access.Type == EFI_USER_INFO_ACCESS_MANAGE)
 | 
						|
            ) {
 | 
						|
          *AccessRight = Access.Type;
 | 
						|
          FreePool (Info);
 | 
						|
          return EFI_SUCCESS;
 | 
						|
        }
 | 
						|
        CheckLen += Access.Size;
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
  FreePool (Info);
 | 
						|
  return EFI_NOT_FOUND;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 |