]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredentialProvider.c
SecurityPkg: Remove code under UserIdentification folder.
[mirror_edk2.git] / SecurityPkg / UserIdentification / PwdCredentialProviderDxe / PwdCredentialProvider.c
diff --git a/SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredentialProvider.c b/SecurityPkg/UserIdentification/PwdCredentialProviderDxe/PwdCredentialProvider.c
deleted file mode 100644 (file)
index 52fc68b..0000000
+++ /dev/null
@@ -1,1464 +0,0 @@
-/** @file\r
-  Password Credential Provider driver implementation.\r
-\r
-Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
-(C) Copyright 2018 Hewlett Packard Enterprise Development LP<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-**/\r
-\r
-#include "PwdCredentialProvider.h"\r
-\r
-CREDENTIAL_TABLE            *mPwdTable      = NULL;\r
-PWD_PROVIDER_CALLBACK_INFO  *mCallbackInfo  = NULL;\r
-PASSWORD_CREDENTIAL_INFO    *mPwdInfoHandle = NULL;\r
-\r
-HII_VENDOR_DEVICE_PATH      mHiiVendorDevicePath = {\r
-  {\r
-    {\r
-      HARDWARE_DEVICE_PATH,\r
-      HW_VENDOR_DP,\r
-      {\r
-        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),\r
-        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
-      }\r
-    },\r
-    PWD_CREDENTIAL_PROVIDER_GUID\r
-  },\r
-  {\r
-    END_DEVICE_PATH_TYPE,\r
-    END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
-    {\r
-      (UINT8) (END_DEVICE_PATH_LENGTH),\r
-      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
-    }\r
-  }\r
-};\r
-\r
-EFI_USER_CREDENTIAL2_PROTOCOL  gPwdCredentialProviderDriver = {\r
-  PWD_CREDENTIAL_PROVIDER_GUID,\r
-  EFI_USER_CREDENTIAL_CLASS_PASSWORD,\r
-  CredentialEnroll,\r
-  CredentialForm,\r
-  CredentialTile,\r
-  CredentialTitle,\r
-  CredentialUser,\r
-  CredentialSelect,\r
-  CredentialDeselect,\r
-  CredentialDefault,\r
-  CredentialGetInfo,\r
-  CredentialGetNextInfo,\r
-  EFI_CREDENTIAL_CAPABILITIES_ENROLL,\r
-  CredentialDelete\r
-};\r
-\r
-\r
-/**\r
-  Get string by string id from HII Interface.\r
-\r
-\r
-  @param[in] Id      String ID to get the string from.\r
-\r
-  @retval  CHAR16 *  String from ID.\r
-  @retval  NULL      If error occurs.\r
-\r
-**/\r
-CHAR16 *\r
-GetStringById (\r
-  IN EFI_STRING_ID             Id\r
-  )\r
-{\r
-  //\r
-  // Get the current string for the current Language.\r
-  //\r
-  return HiiGetString (mCallbackInfo->HiiHandle, Id, NULL);\r
-}\r
-\r
-\r
-/**\r
-  Expand password table size.\r
-\r
-**/\r
-VOID\r
-ExpandTableSize (\r
-  VOID\r
-  )\r
-{\r
-  CREDENTIAL_TABLE  *NewTable;\r
-  UINTN             Count;\r
-\r
-  Count = mPwdTable->MaxCount + PASSWORD_TABLE_INC;\r
-  //\r
-  // Create new credential table.\r
-  //\r
-  NewTable = (CREDENTIAL_TABLE *) AllocateZeroPool (\r
-                                    sizeof (CREDENTIAL_TABLE) +\r
-                                    (Count - 1) * sizeof (PASSWORD_INFO)\r
-                                    );\r
-  ASSERT (NewTable != NULL);\r
-\r
-  NewTable->MaxCount    = Count;\r
-  NewTable->Count       = mPwdTable->Count;\r
-  NewTable->ValidIndex  = mPwdTable->ValidIndex;\r
-  //\r
-  // Copy old entries\r
-  //\r
-  CopyMem (\r
-    &NewTable->UserInfo,\r
-    &mPwdTable->UserInfo,\r
-    mPwdTable->Count * sizeof (PASSWORD_INFO)\r
-    );\r
-  FreePool (mPwdTable);\r
-  mPwdTable = NewTable;\r
-}\r
-\r
-\r
-/**\r
-  Add, update or delete info in table, and sync with NV variable.\r
-\r
-  @param[in]  Index     The index of the password in table. If index is found in\r
-                        table, update the info, else add the into to table.\r
-  @param[in]  Info      The new password info to add into table.If Info is NULL,\r
-                        delete the info by Index.\r
-\r
-  @retval EFI_INVALID_PARAMETER  Info is NULL when save the info.\r
-  @retval EFI_SUCCESS            Modify the table successfully.\r
-  @retval Others                 Failed to modify the table.\r
-\r
-**/\r
-EFI_STATUS\r
-ModifyTable (\r
-  IN  UINTN                                     Index,\r
-  IN  PASSWORD_INFO                             * Info OPTIONAL\r
-  )\r
-{\r
-  EFI_STATUS       Status;\r
-  PASSWORD_INFO    *NewPasswordInfo;\r
-\r
-  NewPasswordInfo = NULL;\r
-\r
-  if (Index < mPwdTable->Count) {\r
-    if (Info == NULL) {\r
-      //\r
-      // Delete the specified entry.\r
-      //\r
-      mPwdTable->Count--;\r
-      if (Index != mPwdTable->Count) {\r
-        NewPasswordInfo = &mPwdTable->UserInfo[mPwdTable->Count];\r
-      }\r
-    } else {\r
-      //\r
-      // Update the specified entry.\r
-      //\r
-      NewPasswordInfo = Info;\r
-    }\r
-  } else {\r
-    //\r
-    // Add a new password info.\r
-    //\r
-    if (Info == NULL) {\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-\r
-    if (mPwdTable->Count >= mPwdTable->MaxCount) {\r
-      ExpandTableSize ();\r
-    }\r
-\r
-    NewPasswordInfo = Info;\r
-    mPwdTable->Count++;\r
-  }\r
-\r
-  if (NewPasswordInfo != NULL) {\r
-    CopyMem (&mPwdTable->UserInfo[Index], NewPasswordInfo, sizeof (PASSWORD_INFO));\r
-  }\r
-\r
-  //\r
-  // Save the credential table.\r
-  //\r
-  Status = gRT->SetVariable (\r
-                  L"PwdCredential",\r
-                  &gPwdCredentialProviderGuid,\r
-                  EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
-                  mPwdTable->Count * sizeof (PASSWORD_INFO),\r
-                  &mPwdTable->UserInfo\r
-                  );\r
-  return Status;\r
-}\r
-\r
-\r
-/**\r
-  Create a password table.\r
-\r
-  @retval EFI_SUCCESS      Create a password table successfully.\r
-  @retval Others           Failed to create a password.\r
-\r
-**/\r
-EFI_STATUS\r
-InitCredentialTable (\r
-  VOID\r
-  )\r
-{\r
-  EFI_STATUS  Status;\r
-  UINT8       *Var;\r
-  UINTN       VarSize;\r
-\r
-  //\r
-  // Get Password credential data from NV variable.\r
-  //\r
-  VarSize = 0;\r
-  Var     = NULL;\r
-  Status  = gRT->GetVariable (\r
-                   L"PwdCredential",\r
-                   &gPwdCredentialProviderGuid,\r
-                   NULL,\r
-                   &VarSize,\r
-                   Var\r
-                   );\r
-  if (Status == EFI_BUFFER_TOO_SMALL) {\r
-    Var = AllocateZeroPool (VarSize);\r
-    if (Var == NULL) {\r
-      return EFI_OUT_OF_RESOURCES;\r
-    }\r
-    Status = gRT->GetVariable (\r
-                    L"PwdCredential",\r
-                    &gPwdCredentialProviderGuid,\r
-                    NULL,\r
-                    &VarSize,\r
-                    Var\r
-                    );\r
-  }\r
-  if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {\r
-    return Status;\r
-  }\r
-\r
-  //\r
-  // Create the password credential table.\r
-  //\r
-  mPwdTable = AllocateZeroPool (\r
-                sizeof (CREDENTIAL_TABLE) - sizeof (PASSWORD_INFO) +\r
-                PASSWORD_TABLE_INC * sizeof (PASSWORD_INFO) +\r
-                VarSize\r
-                );\r
-  if (mPwdTable == NULL) {\r
-    FreePool (Var);\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  mPwdTable->Count      = VarSize / sizeof (PASSWORD_INFO);\r
-  mPwdTable->MaxCount   = mPwdTable->Count + PASSWORD_TABLE_INC;\r
-  mPwdTable->ValidIndex = 0;\r
-  if (Var != NULL) {\r
-    CopyMem (mPwdTable->UserInfo, Var, VarSize);\r
-    FreePool (Var);\r
-  }\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
-  Hash the password to get credential.\r
-\r
-  @param[in]   Password       Points to the input password.\r
-  @param[in]   PasswordSize   The size of password, in bytes.\r
-  @param[out]  Credential     Points to the hashed result.\r
-\r
-  @retval      TRUE           Hash the password successfully.\r
-  @retval      FALSE          Failed to hash the password.\r
-\r
-**/\r
-BOOLEAN\r
-GenerateCredential (\r
-  IN      CHAR16                              *Password,\r
-  IN      UINTN                               PasswordSize,\r
-     OUT  UINT8                               *Credential\r
-  )\r
-{\r
-  BOOLEAN           Status;\r
-  UINTN             HashSize;\r
-  VOID              *Hash;\r
-\r
-  HashSize = Sha1GetContextSize ();\r
-  Hash     = AllocatePool (HashSize);\r
-  ASSERT (Hash != NULL);\r
-\r
-  Status = Sha1Init (Hash);\r
-  if (!Status) {\r
-    goto Done;\r
-  }\r
-\r
-  Status = Sha1Update (Hash, Password, PasswordSize);\r
-  if (!Status) {\r
-    goto Done;\r
-  }\r
-\r
-  Status = Sha1Final (Hash, Credential);\r
-\r
-Done:\r
-  FreePool (Hash);\r
-  return Status;\r
-}\r
-\r
-\r
-/**\r
-  Get password from user input.\r
-\r
-  @param[in]   FirstPwd       If True, prompt to input the first password.\r
-                              If False, prompt to input password again.\r
-  @param[out]  Credential     Points to the input password.\r
-\r
-**/\r
-VOID\r
-GetPassword (\r
-  IN  BOOLEAN                               FirstPwd,\r
-  OUT CHAR8                                 *Credential\r
-  )\r
-{\r
-  EFI_INPUT_KEY Key;\r
-  CHAR16        PasswordMask[CREDENTIAL_LEN + 1];\r
-  CHAR16        Password[CREDENTIAL_LEN];\r
-  UINTN         PasswordLen;\r
-  CHAR16        *QuestionStr;\r
-  CHAR16        *LineStr;\r
-\r
-  PasswordLen = 0;\r
-  while (TRUE) {\r
-    PasswordMask[PasswordLen]     = L'_';\r
-    PasswordMask[PasswordLen + 1] = L'\0';\r
-    LineStr = GetStringById (STRING_TOKEN (STR_DRAW_A_LINE));\r
-    if (FirstPwd) {\r
-      QuestionStr = GetStringById (STRING_TOKEN (STR_INPUT_PASSWORD));\r
-    } else {\r
-      QuestionStr = GetStringById (STRING_TOKEN (STR_INPUT_PASSWORD_AGAIN));\r
-    }\r
-    CreatePopUp (\r
-      EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
-      &Key,\r
-      QuestionStr,\r
-      LineStr,\r
-      PasswordMask,\r
-      NULL\r
-      );\r
-    FreePool (QuestionStr);\r
-    FreePool (LineStr);\r
-\r
-    //\r
-    // Check key stroke\r
-    //\r
-    if (Key.ScanCode == SCAN_NULL) {\r
-      if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {\r
-        break;\r
-      } else if (Key.UnicodeChar == CHAR_BACKSPACE) {\r
-        if (PasswordLen > 0) {\r
-          PasswordLen--;\r
-        }\r
-      } else if ((Key.UnicodeChar == CHAR_NULL) ||\r
-                 (Key.UnicodeChar == CHAR_TAB) ||\r
-                 (Key.UnicodeChar == CHAR_LINEFEED)) {\r
-        continue;\r
-      } else {\r
-        Password[PasswordLen] = Key.UnicodeChar;\r
-        PasswordMask[PasswordLen] = L'*';\r
-        PasswordLen++;\r
-        if (PasswordLen == CREDENTIAL_LEN) {\r
-          break;\r
-        }\r
-      }\r
-    }\r
-  }\r
-\r
-  PasswordLen = PasswordLen * sizeof (CHAR16);\r
-  GenerateCredential (Password, PasswordLen, (UINT8 *)Credential);\r
-}\r
-\r
-/**\r
-  Check whether the password can be found on this provider.\r
-\r
-  @param[in]  Password           The password to be found.\r
-\r
-  @retval EFI_SUCCESS            Found password sucessfully.\r
-  @retval EFI_NOT_FOUND          Fail to find the password.\r
-\r
-**/\r
-EFI_STATUS\r
-CheckPassword (\r
-  IN CHAR8                                      *Password\r
-  )\r
-{\r
-  UINTN      Index;\r
-  CHAR8      *Pwd;\r
-\r
-  //\r
-  // Check password credential.\r
-  //\r
-  mPwdTable->ValidIndex = 0;\r
-  for (Index = 0; Index < mPwdTable->Count; Index++) {\r
-    Pwd = mPwdTable->UserInfo[Index].Password;\r
-    if (CompareMem (Pwd, Password, CREDENTIAL_LEN) == 0) {\r
-      mPwdTable->ValidIndex = Index + 1;\r
-      return EFI_SUCCESS;\r
-    }\r
-  }\r
-\r
-  return EFI_NOT_FOUND;\r
-}\r
-\r
-\r
-/**\r
-  Find a user infomation record by the information record type.\r
-\r
-  This function searches all user information records of User from beginning\r
-  until either the information is found, or there are no more user infomation\r
-  records. A match occurs when a Info.InfoType field matches the user information\r
-  record type.\r
-\r
-  @param[in]     User      Points to the user profile record to search.\r
-  @param[in]     InfoType  The infomation type to be searched.\r
-  @param[out]    Info      Points to the user info found, the caller is responsible\r
-                           to free.\r
-\r
-  @retval EFI_SUCCESS      Find the user information successfully.\r
-  @retval Others           Fail to find the user information.\r
-\r
-**/\r
-EFI_STATUS\r
-FindUserInfoByType (\r
-  IN      EFI_USER_PROFILE_HANDLE               User,\r
-  IN      UINT8                                 InfoType,\r
-  OUT     EFI_USER_INFO                         **Info\r
-  )\r
-{\r
-  EFI_STATUS                 Status;\r
-  EFI_USER_INFO              *UserInfo;\r
-  UINTN                      UserInfoSize;\r
-  EFI_USER_INFO_HANDLE       UserInfoHandle;\r
-  EFI_USER_MANAGER_PROTOCOL  *UserManager;\r
-\r
-  //\r
-  // Find user information by information type.\r
-  //\r
-  if (Info == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  Status = gBS->LocateProtocol (\r
-                  &gEfiUserManagerProtocolGuid,\r
-                  NULL,\r
-                  (VOID **) &UserManager\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
-  //\r
-  // Get each user information.\r
-  //\r
-\r
-  UserInfoHandle = NULL;\r
-  UserInfo       = NULL;\r
-  UserInfoSize   = 0;\r
-  while (TRUE) {\r
-    Status = UserManager->GetNextInfo (UserManager, User, &UserInfoHandle);\r
-    if (EFI_ERROR (Status)) {\r
-      break;\r
-    }\r
-    //\r
-    // Get information.\r
-    //\r
-    Status = UserManager->GetInfo (\r
-                            UserManager,\r
-                            User,\r
-                            UserInfoHandle,\r
-                            UserInfo,\r
-                            &UserInfoSize\r
-                            );\r
-    if (Status == EFI_BUFFER_TOO_SMALL) {\r
-      if (UserInfo != NULL) {\r
-        FreePool (UserInfo);\r
-      }\r
-      UserInfo = AllocateZeroPool (UserInfoSize);\r
-      if (UserInfo == NULL) {\r
-        return EFI_OUT_OF_RESOURCES;\r
-      }\r
-      Status = UserManager->GetInfo (\r
-                              UserManager,\r
-                              User,\r
-                              UserInfoHandle,\r
-                              UserInfo,\r
-                              &UserInfoSize\r
-                              );\r
-    }\r
-    if (EFI_ERROR (Status)) {\r
-      break;\r
-    }\r
-\r
-    ASSERT (UserInfo != NULL);\r
-    if (UserInfo->InfoType == InfoType) {\r
-      *Info = UserInfo;\r
-      return EFI_SUCCESS;\r
-    }\r
-  }\r
-\r
-  if (UserInfo != NULL) {\r
-    FreePool (UserInfo);\r
-  }\r
-  return Status;\r
-}\r
-\r
-\r
-/**\r
-  This function processes the results of changes in configuration.\r
-\r
-  @param  This                   Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
-  @param  Action                 Specifies the type of action taken by the browser.\r
-  @param  QuestionId             A unique value which is sent to the original\r
-                                 exporting driver so that it can identify the type\r
-                                 of data to expect.\r
-  @param  Type                   The type of value for the question.\r
-  @param  Value                  A pointer to the data being sent to the original\r
-                                 exporting driver.\r
-  @param  ActionRequest          On return, points to the action requested by the\r
-                                 callback function.\r
-\r
-  @retval EFI_SUCCESS            The callback successfully handled the action.\r
-  @retval EFI_OUT_OF_RESOURCES   Not enough storage is available to hold the\r
-                                 variable and its data.\r
-  @retval EFI_DEVICE_ERROR       The variable could not be saved.\r
-  @retval EFI_UNSUPPORTED        The specified Action is not supported by the\r
-                                 callback.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CredentialDriverCallback (\r
-  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,\r
-  IN  EFI_BROWSER_ACTION                     Action,\r
-  IN  EFI_QUESTION_ID                        QuestionId,\r
-  IN  UINT8                                  Type,\r
-  IN  EFI_IFR_TYPE_VALUE                     *Value,\r
-  OUT EFI_BROWSER_ACTION_REQUEST             *ActionRequest\r
-  )\r
-{\r
-  EFI_STATUS    Status;\r
-  EFI_INPUT_KEY Key;\r
-  CHAR8         Password[CREDENTIAL_LEN];\r
-  CHAR16        *PromptStr;\r
-\r
-  if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
-    if (QuestionId == KEY_GET_PASSWORD) {\r
-      //\r
-      // Get and check password.\r
-      //\r
-      GetPassword (TRUE, Password);\r
-      Status = CheckPassword (Password);\r
-      if (EFI_ERROR (Status)) {\r
-        PromptStr = GetStringById (STRING_TOKEN (STR_PASSWORD_INCORRECT));\r
-        CreatePopUp (\r
-          EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
-          &Key,\r
-          L"",\r
-          PromptStr,\r
-          L"",\r
-          NULL\r
-          );\r
-        FreePool (PromptStr);\r
-        return Status;\r
-      }\r
-      *ActionRequest  = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
-    }\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  //\r
-  // All other action return unsupported.\r
-  //\r
-  return EFI_UNSUPPORTED;\r
-}\r
-\r
-\r
-/**\r
-  This function allows a caller to extract the current configuration for one\r
-  or more named elements from the target driver.\r
-\r
-\r
-  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
-  @param Request         A null-terminated Unicode string in <ConfigRequest> format.\r
-  @param Progress        On return, points to a character in the Request string.\r
-                         Points to the string's null terminator if request was successful.\r
-                         Points to the most recent '&' before the first failing name/value\r
-                         pair (or the beginning of the string if the failure is in the\r
-                         first name/value pair) if the request was not successful.\r
-  @param Results         A null-terminated Unicode string in <ConfigAltResp> format which\r
-                         has all values filled in for the names in the Request string.\r
-                         String to be allocated by the called function.\r
-\r
-  @retval  EFI_SUCCESS            The Results is filled with the requested values.\r
-  @retval  EFI_OUT_OF_RESOURCES   Not enough memory to store the results.\r
-  @retval  EFI_INVALID_PARAMETER  Request is illegal syntax, or unknown name.\r
-  @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in this driver.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-FakeExtractConfig (\r
-  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,\r
-  IN  CONST EFI_STRING                       Request,\r
-  OUT EFI_STRING                             *Progress,\r
-  OUT EFI_STRING                             *Results\r
-  )\r
-{\r
-  if (Progress == NULL || Results == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  *Progress = Request;\r
-  return EFI_NOT_FOUND;\r
-}\r
-\r
-/**\r
-  This function processes the results of changes in configuration.\r
-\r
-\r
-  @param This            Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
-  @param Configuration   A null-terminated Unicode string in <ConfigResp> format.\r
-  @param Progress        A pointer to a string filled in with the offset of the most\r
-                         recent '&' before the first failing name/value pair (or the\r
-                         beginning of the string if the failure is in the first\r
-                         name/value pair) or the terminating NULL if all was successful.\r
-\r
-  @retval  EFI_SUCCESS            The Results is processed successfully.\r
-  @retval  EFI_INVALID_PARAMETER  Configuration is NULL.\r
-  @retval  EFI_NOT_FOUND          Routing data doesn't match any storage in this driver.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-FakeRouteConfig (\r
-  IN  CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,\r
-  IN  CONST EFI_STRING                       Configuration,\r
-  OUT EFI_STRING                             *Progress\r
-  )\r
-{\r
-  if (Configuration == NULL || Progress == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  *Progress = Configuration;\r
-\r
-  return EFI_NOT_FOUND;\r
-}\r
-\r
-/**\r
-  This function initialize the data mainly used in form browser.\r
-\r
-  @retval EFI_SUCCESS          Initialize form data successfully.\r
-  @retval Others               Fail to Initialize form data.\r
-\r
-**/\r
-EFI_STATUS\r
-InitFormBrowser (\r
-  VOID\r
-  )\r
-{\r
-  EFI_STATUS                  Status;\r
-  PWD_PROVIDER_CALLBACK_INFO  *CallbackInfo;\r
-\r
-  //\r
-  // Initialize driver private data.\r
-  //\r
-  CallbackInfo = AllocateZeroPool (sizeof (PWD_PROVIDER_CALLBACK_INFO));\r
-  if (CallbackInfo == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  CallbackInfo->Signature                   = PWD_PROVIDER_SIGNATURE;\r
-  CallbackInfo->ConfigAccess.ExtractConfig  = FakeExtractConfig;\r
-  CallbackInfo->ConfigAccess.RouteConfig    = FakeRouteConfig;\r
-  CallbackInfo->ConfigAccess.Callback       = CredentialDriverCallback;\r
-  CallbackInfo->DriverHandle  = NULL;\r
-\r
-  //\r
-  // Install Device Path Protocol and Config Access protocol to driver handle.\r
-  //\r
-  Status = gBS->InstallMultipleProtocolInterfaces (\r
-                  &CallbackInfo->DriverHandle,\r
-                  &gEfiDevicePathProtocolGuid,\r
-                  &mHiiVendorDevicePath,\r
-                  &gEfiHiiConfigAccessProtocolGuid,\r
-                  &CallbackInfo->ConfigAccess,\r
-                  NULL\r
-                  );\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  //\r
-  // Publish HII data.\r
-  //\r
-  CallbackInfo->HiiHandle = HiiAddPackages (\r
-                              &gPwdCredentialProviderGuid,\r
-                              CallbackInfo->DriverHandle,\r
-                              PwdCredentialProviderStrings,\r
-                              PwdCredentialProviderVfrBin,\r
-                              NULL\r
-                              );\r
-  if (CallbackInfo->HiiHandle == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-  mCallbackInfo = CallbackInfo;\r
-\r
-  return Status;\r
-}\r
-\r
-\r
-/**\r
-  Enroll a user on a credential provider.\r
-\r
-  This function enrolls a user on this credential provider. If the user exists on\r
-  this credential provider, update the user information on this credential provider;\r
-  otherwise add the user information on credential provider.\r
-\r
-  @param[in] This                Points to this instance of EFI_USER_CREDENTIAL2_PROTOCOL.\r
-  @param[in] User                The user profile to enroll.\r
-\r
-  @retval EFI_SUCCESS            User profile was successfully enrolled.\r
-  @retval EFI_ACCESS_DENIED      Current user profile does not permit enrollment on the\r
-                                 user profile handle. Either the user profile cannot enroll\r
-                                 on any user profile or cannot enroll on a user profile\r
-                                 other than the current user profile.\r
-  @retval EFI_UNSUPPORTED        This credential provider does not support enrollment in\r
-                                 the pre-OS.\r
-  @retval EFI_DEVICE_ERROR       The new credential could not be created because of a device\r
-                                 error.\r
-  @retval EFI_INVALID_PARAMETER  User does not refer to a valid user profile handle.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CredentialEnroll (\r
-  IN CONST  EFI_USER_CREDENTIAL2_PROTOCOL       *This,\r
-  IN        EFI_USER_PROFILE_HANDLE             User\r
-  )\r
-{\r
-  EFI_STATUS                Status;\r
-  UINTN                     Index;\r
-  PASSWORD_INFO             PwdInfo;\r
-  EFI_USER_INFO             *UserInfo;\r
-  CHAR8                     Password[CREDENTIAL_LEN];\r
-  EFI_INPUT_KEY             Key;\r
-  UINT8                     *UserId;\r
-  CHAR16                    *QuestionStr;\r
-  CHAR16                    *PromptStr;\r
-\r
-  if ((This == NULL) || (User == NULL)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  //\r
-  // Get User Identifier.\r
-  //\r
-  UserInfo = NULL;\r
-  Status = FindUserInfoByType (\r
-             User,\r
-             EFI_USER_INFO_IDENTIFIER_RECORD,\r
-             &UserInfo\r
-             );\r
-  if (EFI_ERROR (Status)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  CopyMem (PwdInfo.UserId, (UINT8 *) (UserInfo + 1), sizeof (EFI_USER_INFO_IDENTIFIER));\r
-  FreePool (UserInfo);\r
-\r
-  //\r
-  // Get password from user.\r
-  //\r
-  while (TRUE) {\r
-    //\r
-    // Input password.\r
-    //\r
-    GetPassword (TRUE, PwdInfo.Password);\r
-\r
-    //\r
-    // Input password again.\r
-    //\r
-    GetPassword (FALSE, Password);\r
-\r
-    //\r
-    // Compare the two password consistency.\r
-    //\r
-    if (CompareMem (PwdInfo.Password, Password, CREDENTIAL_LEN) == 0) {\r
-      break;\r
-    }\r
-\r
-    QuestionStr = GetStringById (STRING_TOKEN (STR_PASSWORD_MISMATCH));\r
-    PromptStr   = GetStringById (STRING_TOKEN (STR_INPUT_PASSWORD_AGAIN));\r
-    CreatePopUp (\r
-      EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
-      &Key,\r
-      QuestionStr,\r
-      L"",\r
-      PromptStr,\r
-      NULL\r
-      );\r
-    FreePool (QuestionStr);\r
-    FreePool (PromptStr);\r
-  }\r
-\r
-  //\r
-  // Check whether User is ever enrolled in the provider.\r
-  //\r
-  for (Index = 0; Index < mPwdTable->Count; Index++) {\r
-    UserId = (UINT8 *) &mPwdTable->UserInfo[Index].UserId;\r
-    if (CompareMem (UserId, (UINT8 *) &PwdInfo.UserId, sizeof (EFI_USER_INFO_IDENTIFIER)) == 0) {\r
-      //\r
-      // User already exists, update the password.\r
-      //\r
-      break;\r
-    }\r
-  }\r
-\r
-  //\r
-  // Enroll the User to the provider.\r
-  //\r
-  Status = ModifyTable (Index, &PwdInfo);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
-  Returns the user interface information used during user identification.\r
-\r
-  This function returns information about the form used when interacting with the\r
-  user during user identification. The form is the first enabled form in the form-set\r
-  class EFI_HII_USER_CREDENTIAL_FORMSET_GUID installed on the HII handle HiiHandle. If\r
-  the user credential provider does not require a form to identify the user, then this\r
-  function should return EFI_NOT_FOUND.\r
-\r
-  @param[in]  This       Points to this instance of the EFI_USER_CREDENTIAL2_PROTOCOL.\r
-  @param[out] Hii        On return, holds the HII database handle.\r
-  @param[out] FormSetId  On return, holds the identifier of the form set which contains\r
-                         the form used during user identification.\r
-  @param[out] FormId     On return, holds the identifier of the form used during user\r
-                         identification.\r
-\r
-  @retval EFI_SUCCESS            Form returned successfully.\r
-  @retval EFI_NOT_FOUND          Form not returned.\r
-  @retval EFI_INVALID_PARAMETER  Hii is NULL or FormSetId is NULL or FormId is NULL.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CredentialForm (\r
-  IN CONST  EFI_USER_CREDENTIAL2_PROTOCOL       *This,\r
-  OUT       EFI_HII_HANDLE                      *Hii,\r
-  OUT       EFI_GUID                            *FormSetId,\r
-  OUT       EFI_FORM_ID                         *FormId\r
-  )\r
-{\r
-  if ((This == NULL) || (Hii == NULL) ||\r
-      (FormSetId == NULL) || (FormId == NULL)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  *Hii       = mCallbackInfo->HiiHandle;\r
-  *FormId    = FORMID_GET_PASSWORD_FORM;\r
-  CopyGuid (FormSetId, &gPwdCredentialProviderGuid);\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
-  Returns bitmap used to describe the credential provider type.\r
-\r
-  This optional function returns a bitmap that is less than or equal to the number\r
-  of pixels specified by Width and Height. If no such bitmap exists, then EFI_NOT_FOUND\r
-  is returned.\r
-\r
-  @param[in]      This    Points to this instance of the EFI_USER_CREDENTIAL2_PROTOCOL.\r
-  @param[in, out] Width   On entry, points to the desired bitmap width. If NULL then no\r
-                          bitmap information will be returned. On exit, points to the\r
-                          width of the bitmap returned.\r
-  @param[in, out] Height  On entry, points to the desired bitmap height. If NULL then no\r
-                          bitmap information will be returned. On exit, points to the\r
-                          height of the bitmap returned\r
-  @param[out]     Hii     On return, holds the HII database handle.\r
-  @param[out]     Image   On return, holds the HII image identifier.\r
-\r
-  @retval EFI_SUCCESS            Image identifier returned successfully.\r
-  @retval EFI_NOT_FOUND          Image identifier not returned.\r
-  @retval EFI_INVALID_PARAMETER  Hii is NULL or Image is NULL.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CredentialTile (\r
-  IN  CONST  EFI_USER_CREDENTIAL2_PROTOCOL       *This,\r
-  IN  OUT    UINTN                               *Width,\r
-  IN  OUT    UINTN                               *Height,\r
-      OUT    EFI_HII_HANDLE                      *Hii,\r
-      OUT    EFI_IMAGE_ID                        *Image\r
-  )\r
-{\r
-  if ((This == NULL) || (Hii == NULL) || (Image == NULL)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  return EFI_NOT_FOUND;\r
-}\r
-\r
-\r
-/**\r
-  Returns string used to describe the credential provider type.\r
-\r
-  This function returns a string which describes the credential provider. If no\r
-  such string exists, then EFI_NOT_FOUND is returned.\r
-\r
-  @param[in]  This       Points to this instance of the EFI_USER_CREDENTIAL2_PROTOCOL.\r
-  @param[out] Hii        On return, holds the HII database handle.\r
-  @param[out] String     On return, holds the HII string identifier.\r
-\r
-  @retval EFI_SUCCESS            String identifier returned successfully.\r
-  @retval EFI_NOT_FOUND          String identifier not returned.\r
-  @retval EFI_INVALID_PARAMETER  Hii is NULL or String is NULL.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CredentialTitle (\r
-  IN CONST  EFI_USER_CREDENTIAL2_PROTOCOL       *This,\r
-  OUT       EFI_HII_HANDLE                      *Hii,\r
-  OUT       EFI_STRING_ID                       *String\r
-  )\r
-{\r
-  if ((This == NULL) || (Hii == NULL) || (String == NULL)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  //\r
-  // Set Hii handle and String ID.\r
-  //\r
-  *Hii    = mCallbackInfo->HiiHandle;\r
-  *String = STRING_TOKEN (STR_CREDENTIAL_TITLE);\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
-  Return the user identifier associated with the currently authenticated user.\r
-\r
-  This function returns the user identifier of the user authenticated by this credential\r
-  provider. This function is called after the credential-related information has been\r
-  submitted on a form, OR after a call to Default() has returned that this credential is\r
-  ready to log on.\r
-\r
-  @param[in]  This           Points to this instance of the EFI_USER_CREDENTIAL2_PROTOCOL.\r
-  @param[in]  User           The user profile handle of the user profile currently being\r
-                             considered by the user identity manager. If NULL, then no user\r
-                             profile is currently under consideration.\r
-  @param[out] Identifier     On return, points to the user identifier.\r
-\r
-  @retval EFI_SUCCESS            User identifier returned successfully.\r
-  @retval EFI_NOT_READY          No user identifier can be returned.\r
-  @retval EFI_ACCESS_DENIED      The user has been locked out of this user credential.\r
-  @retval EFI_INVALID_PARAMETER  This is NULL, or Identifier is NULL.\r
-  @retval EFI_NOT_FOUND          User is not NULL, and the specified user handle can't be\r
-                                 found in user profile database\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CredentialUser (\r
-  IN CONST  EFI_USER_CREDENTIAL2_PROTOCOL       *This,\r
-  IN        EFI_USER_PROFILE_HANDLE             User,\r
-  OUT       EFI_USER_INFO_IDENTIFIER            *Identifier\r
-  )\r
-{\r
-  EFI_STATUS    Status;\r
-  UINTN         Index;\r
-  EFI_USER_INFO *UserInfo;\r
-  UINT8         *UserId;\r
-  UINT8         *NewUserId;\r
-  CHAR8         *Pwd;\r
-  CHAR8         *NewPwd;\r
-\r
-  if ((This == NULL) || (Identifier == NULL)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (mPwdTable->ValidIndex == 0) {\r
-    //\r
-    // No password input, or the input password doesn't match\r
-    // anyone in PwdTable.\r
-    //\r
-    return EFI_NOT_READY;\r
-  }\r
-\r
-  if (User == NULL) {\r
-    //\r
-    // Return the user ID whose password matches the input password.\r
-    //\r
-    CopyMem (\r
-      Identifier,\r
-      &mPwdTable->UserInfo[mPwdTable->ValidIndex - 1].UserId,\r
-      sizeof (EFI_USER_INFO_IDENTIFIER)\r
-      );\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  //\r
-  // Get the User's ID.\r
-  //\r
-  Status = FindUserInfoByType (\r
-             User,\r
-             EFI_USER_INFO_IDENTIFIER_RECORD,\r
-             &UserInfo\r
-             );\r
-  if (EFI_ERROR (Status)) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
-  //\r
-  // Check whether the input password matches one in PwdTable.\r
-  //\r
-  for (Index = 0; Index < mPwdTable->Count; Index++) {\r
-    UserId    = (UINT8 *) &mPwdTable->UserInfo[Index].UserId;\r
-    NewUserId = (UINT8 *) (UserInfo + 1);\r
-    if (CompareMem (UserId, NewUserId, sizeof (EFI_USER_INFO_IDENTIFIER)) == 0) {\r
-      Pwd    = mPwdTable->UserInfo[Index].Password;\r
-      NewPwd = mPwdTable->UserInfo[mPwdTable->ValidIndex - 1].Password;\r
-      if (CompareMem (Pwd, NewPwd, CREDENTIAL_LEN) == 0) {\r
-        CopyMem (Identifier, UserId, sizeof (EFI_USER_INFO_IDENTIFIER));\r
-        FreePool (UserInfo);\r
-        return EFI_SUCCESS;\r
-      }\r
-    }\r
-  }\r
-\r
-  FreePool (UserInfo);\r
-  return EFI_NOT_READY;\r
-}\r
-\r
-\r
-/**\r
-  Indicate that user interface interaction has begun for the specified credential.\r
-\r
-  This function is called when a credential provider is selected by the user. If\r
-  AutoLogon returns FALSE, then the user interface will be constructed by the User\r
-  Identity Manager.\r
-\r
-  @param[in]  This       Points to this instance of the EFI_USER_CREDENTIAL2_PROTOCOL.\r
-  @param[out] AutoLogon  On return, points to the credential provider's capabilities\r
-                         after the credential provider has been selected by the user.\r
-\r
-  @retval EFI_SUCCESS            Credential provider successfully selected.\r
-  @retval EFI_INVALID_PARAMETER  AutoLogon is NULL.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CredentialSelect (\r
-  IN  CONST  EFI_USER_CREDENTIAL2_PROTOCOL   *This,\r
-  OUT        EFI_CREDENTIAL_LOGON_FLAGS      *AutoLogon\r
-  )\r
-{\r
-  if ((This == NULL) || (AutoLogon == NULL)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  *AutoLogon = 0;\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
-  Indicate that user interface interaction has ended for the specified credential.\r
-\r
-  This function is called when a credential provider is deselected by the user.\r
-\r
-  @param[in] This        Points to this instance of the EFI_USER_CREDENTIAL2_PROTOCOL.\r
-\r
-  @retval EFI_SUCCESS    Credential provider successfully deselected.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CredentialDeselect (\r
-  IN CONST  EFI_USER_CREDENTIAL2_PROTOCOL       *This\r
-  )\r
-{\r
-  if (This == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
-  Return the default logon behavior for this user credential.\r
-\r
-  This function reports the default login behavior regarding this credential provider.\r
-\r
-  @param[in]  This       Points to this instance of the EFI_USER_CREDENTIAL2_PROTOCOL.\r
-  @param[out] AutoLogon  On return, holds whether the credential provider should be used\r
-                         by default to automatically log on the user.\r
-\r
-  @retval EFI_SUCCESS            Default information successfully returned.\r
-  @retval EFI_INVALID_PARAMETER  AutoLogon is NULL.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CredentialDefault (\r
-  IN CONST  EFI_USER_CREDENTIAL2_PROTOCOL       *This,\r
-  OUT       EFI_CREDENTIAL_LOGON_FLAGS          *AutoLogon\r
-  )\r
-{\r
-  if ((This == NULL) || (AutoLogon == NULL)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-  *AutoLogon = 0;\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
-  Return information attached to the credential provider.\r
-\r
-  This function returns user information.\r
-\r
-  @param[in]      This          Points to this instance of the EFI_USER_CREDENTIAL2_PROTOCOL.\r
-  @param[in]      UserInfo      Handle of the user information data record.\r
-  @param[out]     Info          On entry, points to a buffer of at least *InfoSize bytes. On\r
-                                exit, holds the user information. If the buffer is too small\r
-                                to hold the information, then EFI_BUFFER_TOO_SMALL is returned\r
-                                and InfoSize is updated to contain the number of bytes actually\r
-                                required.\r
-  @param[in, out] InfoSize      On entry, points to the size of Info. On return, points to the\r
-                                size of the user information.\r
-\r
-  @retval EFI_SUCCESS           Information returned successfully.\r
-  @retval EFI_BUFFER_TOO_SMALL  The size specified by InfoSize is too small to hold all of the\r
-                                user information. The size required is returned in *InfoSize.\r
-  @retval EFI_INVALID_PARAMETER Info is NULL or InfoSize is NULL.\r
-  @retval EFI_NOT_FOUND         The specified UserInfo does not refer to a valid user info handle.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CredentialGetInfo (\r
-  IN CONST  EFI_USER_CREDENTIAL2_PROTOCOL       *This,\r
-  IN        EFI_USER_INFO_HANDLE                UserInfo,\r
-  OUT       EFI_USER_INFO                       *Info,\r
-  IN OUT    UINTN                               *InfoSize\r
-  )\r
-{\r
-  EFI_USER_INFO            *CredentialInfo;\r
-  UINTN                    Index;\r
-\r
-  if ((This == NULL) || (InfoSize == NULL) || (Info == NULL)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if ((UserInfo == NULL) || (mPwdInfoHandle == NULL)) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
-  //\r
-  // Find information handle in credential info table.\r
-  //\r
-  for (Index = 0; Index < mPwdInfoHandle->Count; Index++) {\r
-    CredentialInfo = mPwdInfoHandle->Info[Index];\r
-    if (UserInfo == (EFI_USER_INFO_HANDLE)CredentialInfo) {\r
-      //\r
-      // The handle is found, copy the user info.\r
-      //\r
-      if (CredentialInfo->InfoSize > *InfoSize) {\r
-        *InfoSize = CredentialInfo->InfoSize;\r
-        return EFI_BUFFER_TOO_SMALL;\r
-      }\r
-      CopyMem (Info, CredentialInfo, CredentialInfo->InfoSize);\r
-      return EFI_SUCCESS;\r
-    }\r
-  }\r
-\r
-  return EFI_NOT_FOUND;\r
-}\r
-\r
-\r
-/**\r
-  Enumerate all of the user informations on the credential provider.\r
-\r
-  This function returns the next user information record. To retrieve the first user\r
-  information record handle, point UserInfo at a NULL. Each subsequent call will retrieve\r
-  another user information record handle until there are no more, at which point UserInfo\r
-  will point to NULL.\r
-\r
-  @param[in]      This     Points to this instance of the EFI_USER_CREDENTIAL2_PROTOCOL.\r
-  @param[in, out] UserInfo On entry, points to the previous user information handle or NULL\r
-                           to start enumeration. On exit, points to the next user information\r
-                           handle or NULL if there is no more user information.\r
-\r
-  @retval EFI_SUCCESS            User information returned.\r
-  @retval EFI_NOT_FOUND          No more user information found.\r
-  @retval EFI_INVALID_PARAMETER  UserInfo is NULL.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CredentialGetNextInfo (\r
-  IN CONST  EFI_USER_CREDENTIAL2_PROTOCOL       *This,\r
-  IN OUT    EFI_USER_INFO_HANDLE                *UserInfo\r
-  )\r
-{\r
-  EFI_USER_INFO            *Info;\r
-  CHAR16                   *ProvNameStr;\r
-  UINTN                    InfoLen;\r
-  UINTN                    Index;\r
-  UINTN                    ProvStrLen;\r
-\r
-  if ((This == NULL) || (UserInfo == NULL)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (mPwdInfoHandle == NULL) {\r
-    //\r
-    // Initilized user info table. There are 4 user info records in the table.\r
-    //\r
-    InfoLen  = sizeof (PASSWORD_CREDENTIAL_INFO) + (4 - 1) * sizeof (EFI_USER_INFO *);\r
-    mPwdInfoHandle = AllocateZeroPool (InfoLen);\r
-    if (mPwdInfoHandle == NULL) {\r
-      *UserInfo = NULL;\r
-      return EFI_NOT_FOUND;\r
-    }\r
-\r
-    //\r
-    // The first information, Credential Provider info.\r
-    //\r
-    InfoLen = sizeof (EFI_USER_INFO) + sizeof (EFI_GUID);\r
-    Info    = AllocateZeroPool (InfoLen);\r
-    ASSERT (Info != NULL);\r
-\r
-    Info->InfoType    = EFI_USER_INFO_CREDENTIAL_PROVIDER_RECORD;\r
-    Info->InfoSize    = (UINT32) InfoLen;\r
-    Info->InfoAttribs = EFI_USER_INFO_PROTECTED;\r
-    CopyGuid (&Info->Credential, &gPwdCredentialProviderGuid);\r
-    CopyGuid ((EFI_GUID *)(Info + 1), &gPwdCredentialProviderGuid);\r
-\r
-    mPwdInfoHandle->Info[0] = Info;\r
-    mPwdInfoHandle->Count++;\r
-\r
-    //\r
-    // The second information, Credential Provider name info.\r
-    //\r
-    ProvNameStr = GetStringById (STRING_TOKEN (STR_PROVIDER_NAME));\r
-    ProvStrLen  = StrSize (ProvNameStr);\r
-    InfoLen     = sizeof (EFI_USER_INFO) + ProvStrLen;\r
-    Info        = AllocateZeroPool (InfoLen);\r
-    ASSERT (Info != NULL);\r
-\r
-    Info->InfoType    = EFI_USER_INFO_CREDENTIAL_PROVIDER_NAME_RECORD;\r
-    Info->InfoSize    = (UINT32) InfoLen;\r
-    Info->InfoAttribs = EFI_USER_INFO_PROTECTED;\r
-    CopyGuid (&Info->Credential, &gPwdCredentialProviderGuid);\r
-    CopyMem ((UINT8*)(Info + 1), ProvNameStr, ProvStrLen);\r
-    FreePool (ProvNameStr);\r
-\r
-    mPwdInfoHandle->Info[1] = Info;\r
-    mPwdInfoHandle->Count++;\r
-\r
-    //\r
-    // The third information, Credential Provider type info.\r
-    //\r
-    InfoLen = sizeof (EFI_USER_INFO) + sizeof (EFI_GUID);\r
-    Info    = AllocateZeroPool (InfoLen);\r
-    ASSERT (Info != NULL);\r
-\r
-    Info->InfoType    = EFI_USER_INFO_CREDENTIAL_TYPE_RECORD;\r
-    Info->InfoSize    = (UINT32) InfoLen;\r
-    Info->InfoAttribs = EFI_USER_INFO_PROTECTED;\r
-    CopyGuid (&Info->Credential, &gPwdCredentialProviderGuid);\r
-    CopyGuid ((EFI_GUID *)(Info + 1), &gEfiUserCredentialClassPasswordGuid);\r
-\r
-    mPwdInfoHandle->Info[2] = Info;\r
-    mPwdInfoHandle->Count++;\r
-\r
-    //\r
-    // The fourth information, Credential Provider type name info.\r
-    //\r
-    ProvNameStr = GetStringById (STRING_TOKEN (STR_PROVIDER_TYPE_NAME));\r
-    ProvStrLen  = StrSize (ProvNameStr);\r
-    InfoLen     = sizeof (EFI_USER_INFO) + ProvStrLen;\r
-    Info        = AllocateZeroPool (InfoLen);\r
-    ASSERT (Info != NULL);\r
-\r
-    Info->InfoType    = EFI_USER_INFO_CREDENTIAL_PROVIDER_NAME_RECORD;\r
-    Info->InfoSize    = (UINT32) InfoLen;\r
-    Info->InfoAttribs = EFI_USER_INFO_PROTECTED;\r
-    CopyGuid (&Info->Credential, &gPwdCredentialProviderGuid);\r
-    CopyMem ((UINT8*)(Info + 1), ProvNameStr, ProvStrLen);\r
-    FreePool (ProvNameStr);\r
-\r
-    mPwdInfoHandle->Info[3] = Info;\r
-    mPwdInfoHandle->Count++;\r
-  }\r
-\r
-  if (*UserInfo == NULL) {\r
-    //\r
-    // Return the first info handle.\r
-    //\r
-    *UserInfo = (EFI_USER_INFO_HANDLE) mPwdInfoHandle->Info[0];\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  //\r
-  // Find information handle in credential info table.\r
-  //\r
-  for (Index = 0; Index < mPwdInfoHandle->Count; Index++) {\r
-    Info = mPwdInfoHandle->Info[Index];\r
-    if (*UserInfo == (EFI_USER_INFO_HANDLE)Info) {\r
-      //\r
-      // The handle is found, get the next one.\r
-      //\r
-      if (Index == mPwdInfoHandle->Count - 1) {\r
-        //\r
-        // Already last one.\r
-        //\r
-        *UserInfo = NULL;\r
-        return EFI_NOT_FOUND;\r
-      }\r
-\r
-      Index++;\r
-      *UserInfo = (EFI_USER_INFO_HANDLE)mPwdInfoHandle->Info[Index];\r
-      return EFI_SUCCESS;\r
-    }\r
-  }\r
-\r
-  *UserInfo = NULL;\r
-  return EFI_NOT_FOUND;\r
-}\r
-\r
-/**\r
-  Delete a user on this credential provider.\r
-\r
-  This function deletes a user on this credential provider.\r
-\r
-  @param[in]     This            Points to this instance of the EFI_USER_CREDENTIAL2_PROTOCOL.\r
-  @param[in]     User            The user profile handle to delete.\r
-\r
-  @retval EFI_SUCCESS            User profile was successfully deleted.\r
-  @retval EFI_ACCESS_DENIED      Current user profile does not permit deletion on the user profile handle.\r
-                                 Either the user profile cannot delete on any user profile or cannot delete\r
-                                 on a user profile other than the current user profile.\r
-  @retval EFI_UNSUPPORTED        This credential provider does not support deletion in the pre-OS.\r
-  @retval EFI_DEVICE_ERROR       The new credential could not be deleted because of a device error.\r
-  @retval EFI_INVALID_PARAMETER  User does not refer to a valid user profile handle.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CredentialDelete (\r
-  IN CONST  EFI_USER_CREDENTIAL2_PROTOCOL       *This,\r
-  IN        EFI_USER_PROFILE_HANDLE             User\r
-  )\r
-{\r
-  EFI_STATUS                Status;\r
-  EFI_USER_INFO             *UserInfo;\r
-  UINT8                     *UserId;\r
-  UINT8                     *NewUserId;\r
-  UINTN                     Index;\r
-\r
-  if ((This == NULL) || (User == NULL)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  //\r
-  // Get User Identifier.\r
-  //\r
-  UserInfo = NULL;\r
-  Status = FindUserInfoByType (\r
-             User,\r
-             EFI_USER_INFO_IDENTIFIER_RECORD,\r
-             &UserInfo\r
-             );\r
-  if (EFI_ERROR (Status)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  //\r
-  // Find the user by user identifier in mPwdTable.\r
-  //\r
-  for (Index = 0; Index < mPwdTable->Count; Index++) {\r
-    UserId    = (UINT8 *) &mPwdTable->UserInfo[Index].UserId;\r
-    NewUserId = (UINT8 *) (UserInfo + 1);\r
-    if (CompareMem (UserId, NewUserId, sizeof (EFI_USER_INFO_IDENTIFIER)) == 0) {\r
-      //\r
-      // Found the user, delete it.\r
-      //\r
-      ModifyTable (Index, NULL);\r
-      break;\r
-    }\r
-  }\r
-\r
-  FreePool (UserInfo);\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
-  Main entry for this driver.\r
-\r
-  @param ImageHandle     Image handle this driver.\r
-  @param SystemTable     Pointer to SystemTable.\r
-\r
-  @retval EFI_SUCESS     This function always complete successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-PasswordProviderInit (\r
-  IN EFI_HANDLE        ImageHandle,\r
-  IN EFI_SYSTEM_TABLE  *SystemTable\r
-  )\r
-{\r
-  EFI_STATUS  Status;\r
-\r
-  //\r
-  // It is NOT robust enough to be included in production.\r
-  //\r
-  #error "This implementation is just a sample, please comment this line if you really want to use this driver."\r
-\r
-  //\r
-  // Init credential table.\r
-  //\r
-  Status = InitCredentialTable ();\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  //\r
-  // Init Form Browser.\r
-  //\r
-  Status = InitFormBrowser ();\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  //\r
-  // Install protocol interfaces for the password credential provider.\r
-  //\r
-  Status = gBS->InstallProtocolInterface (\r
-                  &mCallbackInfo->DriverHandle,\r
-                  &gEfiUserCredential2ProtocolGuid,\r
-                  EFI_NATIVE_INTERFACE,\r
-                  &gPwdCredentialProviderDriver\r
-                  );\r
-  return Status;\r
-}\r