]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/UserIdentification/UsbCredentialProviderDxe/UsbCredentialProvider.c
SecurityPkg: Remove code under UserIdentification folder.
[mirror_edk2.git] / SecurityPkg / UserIdentification / UsbCredentialProviderDxe / UsbCredentialProvider.c
diff --git a/SecurityPkg/UserIdentification/UsbCredentialProviderDxe/UsbCredentialProvider.c b/SecurityPkg/UserIdentification/UsbCredentialProviderDxe/UsbCredentialProvider.c
deleted file mode 100644 (file)
index 841e975..0000000
+++ /dev/null
@@ -1,1410 +0,0 @@
-/** @file\r
-  Usb Credential Provider driver implemenetation.\r
-\r
-Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<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 "UsbCredentialProvider.h"\r
-\r
-CREDENTIAL_TABLE            *mUsbTable       = NULL;\r
-USB_PROVIDER_CALLBACK_INFO  *mCallbackInfo   = NULL;\r
-USB_CREDENTIAL_INFO         *mUsbInfoHandle  = NULL;\r
-\r
-EFI_USER_CREDENTIAL2_PROTOCOL  gUsbCredentialProviderDriver = {\r
-  USB_CREDENTIAL_PROVIDER_GUID,\r
-  EFI_USER_CREDENTIAL_CLASS_SECURE_CARD,\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 = mUsbTable->MaxCount + USB_TABLE_INC;\r
-  //\r
-  // Create new credential table.\r
-  //\r
-  NewTable = AllocateZeroPool (\r
-               sizeof (CREDENTIAL_TABLE) - sizeof (USB_INFO) +\r
-               Count * sizeof (USB_INFO)\r
-               );\r
-  ASSERT (NewTable != NULL);\r
-\r
-  NewTable->MaxCount = Count;\r
-  NewTable->Count    = mUsbTable->Count;\r
-\r
-  //\r
-  // Copy old entries.\r
-  //\r
-  CopyMem (\r
-    &NewTable->UserInfo,\r
-    &mUsbTable->UserInfo,\r
-    mUsbTable->Count * sizeof (USB_INFO)\r
-    );\r
-  FreePool (mUsbTable);\r
-  mUsbTable = 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 credential 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  USB_INFO                             * Info OPTIONAL\r
-  )\r
-{\r
-  EFI_STATUS  Status;\r
-  USB_INFO    *NewUsbInfo;\r
-\r
-  NewUsbInfo = NULL;\r
-  if (Index < mUsbTable->Count) {\r
-    if (Info == NULL) {\r
-      //\r
-      // Delete the specified entry.\r
-      //\r
-      mUsbTable->Count--;\r
-      if (Index != mUsbTable->Count) {\r
-        NewUsbInfo = &mUsbTable->UserInfo[mUsbTable->Count];\r
-      }\r
-    } else {\r
-      //\r
-      // Update the specified entry.\r
-      //\r
-      NewUsbInfo = Info;\r
-    }\r
-  } else {\r
-    //\r
-    // Add a new entry\r
-    //\r
-    if (Info == NULL) {\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-\r
-    if (mUsbTable->Count >= mUsbTable->MaxCount) {\r
-      ExpandTableSize ();\r
-    }\r
-\r
-    NewUsbInfo = Info;\r
-    mUsbTable->Count++;\r
-  }\r
-\r
-  if (NewUsbInfo != NULL) {\r
-    CopyMem (&mUsbTable->UserInfo[Index], NewUsbInfo, sizeof (USB_INFO));\r
-  }\r
-\r
-  //\r
-  // Save the credential table.\r
-  //\r
-  Status = gRT->SetVariable (\r
-                  L"UsbCredential",\r
-                  &gUsbCredentialProviderGuid,\r
-                  EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,\r
-                  mUsbTable->Count * sizeof (USB_INFO),\r
-                  &mUsbTable->UserInfo\r
-                  );\r
-  return Status;\r
-}\r
-\r
-\r
-/**\r
-  Create a credential table\r
-\r
-  @retval EFI_SUCCESS      Create a credential 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 Usb credential data from NV variable.\r
-  //\r
-  VarSize = 0;\r
-  Var     = NULL;\r
-  Status  = gRT->GetVariable (\r
-                   L"UsbCredential",\r
-                   &gUsbCredentialProviderGuid,\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"UsbCredential",\r
-                    &gUsbCredentialProviderGuid,\r
-                    NULL,\r
-                    &VarSize,\r
-                    Var\r
-                    );\r
-  }\r
-  if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {\r
-    return Status;\r
-  }\r
-\r
-  //\r
-  // Init Usb credential table.\r
-  //\r
-  mUsbTable = AllocateZeroPool (\r
-                sizeof (CREDENTIAL_TABLE) - sizeof (USB_INFO) +\r
-                USB_TABLE_INC * sizeof (USB_INFO) +\r
-                VarSize\r
-                );\r
-  if (mUsbTable == NULL) {\r
-    FreePool (Var);\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  mUsbTable->Count      = VarSize / sizeof (USB_INFO);\r
-  mUsbTable->MaxCount   = mUsbTable->Count + USB_TABLE_INC;\r
-  if (Var != NULL) {\r
-    CopyMem (mUsbTable->UserInfo, Var, VarSize);\r
-    FreePool (Var);\r
-  }\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
-  Read the specified file by FileName in the Usb key and return the file size in BufferSize\r
-  and file content in Buffer.\r
-  Note: the caller is responsible to free the buffer memory.\r
-\r
-  @param  FileName               File to read.\r
-  @param  Buffer                 Returned with data read from the file.\r
-  @param  BufferSize             Size of the data buffer.\r
-\r
-  @retval EFI_SUCCESS            The command completed successfully.\r
-  @retval EFI_OUT_OF_RESOURCES   Resource allocation failed.\r
-  @retval EFI_NOT_FOUND          File not found.\r
-  @retval EFI_DEVICE_ERROR       Device I/O error.\r
-\r
-**/\r
-EFI_STATUS\r
-GetFileData (\r
-  IN     CHAR16                                 *FileName,\r
-  OUT VOID                                      **Buffer,\r
-  OUT UINTN                                     *BufferSize\r
-  )\r
-{\r
-  EFI_STATUS                      Status;\r
-  UINTN                           Index;\r
-  UINTN                           HandleCount;\r
-  UINTN                           ScratchBufferSize;\r
-  EFI_HANDLE                      *HandleBuffer;\r
-  EFI_FILE                        *RootFs;\r
-  EFI_FILE                        *FileHandle;\r
-  EFI_FILE_INFO                   *FileInfo;\r
-  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFileSystem;\r
-  EFI_BLOCK_IO_PROTOCOL           *BlkIo;\r
-\r
-  FileInfo      = NULL;\r
-  FileHandle    = NULL;\r
-\r
-  Status = gBS->LocateHandleBuffer (\r
-                  ByProtocol,\r
-                  &gEfiSimpleFileSystemProtocolGuid,\r
-                  NULL,\r
-                  &HandleCount,\r
-                  &HandleBuffer\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    DEBUG ((DEBUG_ERROR, "Can not Locate SimpleFileSystemProtocol\n"));\r
-    goto Done;\r
-  }\r
-\r
-  //\r
-  // Find and open the file in removable media disk.\r
-  //\r
-  for (Index = 0; Index < HandleCount; Index++) {\r
-    Status = gBS->HandleProtocol (\r
-                    HandleBuffer[Index],\r
-                    &gEfiBlockIoProtocolGuid,\r
-                    (VOID **) &BlkIo\r
-                    );\r
-    if (EFI_ERROR (Status)) {\r
-      continue;\r
-    }\r
-\r
-    if (BlkIo->Media->RemovableMedia) {\r
-      Status = gBS->HandleProtocol (\r
-                      HandleBuffer[Index],\r
-                      &gEfiSimpleFileSystemProtocolGuid,\r
-                      (VOID **) &SimpleFileSystem\r
-                      );\r
-      if (EFI_ERROR (Status)) {\r
-        continue;\r
-      }\r
-\r
-      Status = SimpleFileSystem->OpenVolume (\r
-                                   SimpleFileSystem,\r
-                                   &RootFs\r
-                                   );\r
-      if (EFI_ERROR (Status)) {\r
-        continue;\r
-      }\r
-\r
-      Status = RootFs->Open (\r
-                         RootFs,\r
-                         &FileHandle,\r
-                         FileName,\r
-                         EFI_FILE_MODE_READ,\r
-                         0\r
-                         );\r
-      if (!EFI_ERROR (Status)) {\r
-        break;\r
-      }\r
-    }\r
-  }\r
-\r
-  FreePool (HandleBuffer);\r
-\r
-  if (Index >= HandleCount) {\r
-    DEBUG ((DEBUG_ERROR, "Can not found the token file!\n"));\r
-    Status = EFI_NOT_FOUND;\r
-    goto Done;\r
-  }\r
-\r
-  //\r
-  // Figure out how big the file is.\r
-  //\r
-  ScratchBufferSize = 0;\r
-  Status = FileHandle->GetInfo (\r
-                        FileHandle,\r
-                        &gEfiFileInfoGuid,\r
-                        &ScratchBufferSize,\r
-                        NULL\r
-                        );\r
-  if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) {\r
-    DEBUG ((DEBUG_ERROR, "Can not obtain file size info!\n"));\r
-    Status = EFI_DEVICE_ERROR;\r
-    goto Done;\r
-  }\r
-\r
-  FileInfo = AllocateZeroPool (ScratchBufferSize);\r
-  if (FileInfo == NULL) {\r
-    DEBUG ((DEBUG_ERROR, "Can not allocate enough memory for the token file!\n"));\r
-    Status = EFI_OUT_OF_RESOURCES;\r
-    goto Done;\r
-  }\r
-\r
-  Status = FileHandle->GetInfo (\r
-                        FileHandle,\r
-                        &gEfiFileInfoGuid,\r
-                        &ScratchBufferSize,\r
-                        FileInfo\r
-                        );\r
-  if (EFI_ERROR (Status)) {\r
-    DEBUG ((DEBUG_ERROR, "Can not obtain file info from the token file!\n"));\r
-    Status = EFI_DEVICE_ERROR;\r
-    goto Done;\r
-  }\r
-\r
-  //\r
-  // Allocate a buffer for the file.\r
-  //\r
-  *BufferSize = (UINT32) FileInfo->FileSize;\r
-  *Buffer     = AllocateZeroPool (*BufferSize);\r
-  if (*Buffer == NULL) {\r
-    DEBUG ((DEBUG_ERROR, "Can not allocate a buffer for the file!\n"));\r
-    Status = EFI_OUT_OF_RESOURCES;\r
-    goto Done;\r
-  }\r
-\r
-  //\r
-  // Load file into the allocated memory.\r
-  //\r
-  Status = FileHandle->Read (FileHandle, BufferSize, *Buffer);\r
-  if (EFI_ERROR (Status)) {\r
-    FreePool (*Buffer);\r
-    DEBUG ((DEBUG_ERROR, "Can not read the token file!\n"));\r
-    Status = EFI_DEVICE_ERROR;\r
-    goto Done;\r
-  }\r
-\r
-  //\r
-  // Close file.\r
-  //\r
-  Status = FileHandle->Close (FileHandle);\r
-  if (EFI_ERROR (Status)) {\r
-    FreePool (*Buffer);\r
-    DEBUG ((DEBUG_ERROR, "Can not close the token file !\n"));\r
-    Status = EFI_DEVICE_ERROR;\r
-  }\r
-\r
-Done:\r
-\r
-  if (FileInfo != NULL) {\r
-    FreePool (FileInfo);\r
-  }\r
-\r
-  return Status;\r
-}\r
-\r
-\r
-/**\r
-  Hash the data to get credential.\r
-\r
-  @param[in]   Buffer         Points to the data buffer\r
-  @param[in]   BufferSize     The size of data in buffer, in bytes.\r
-  @param[out]  Credential     Points to the hashed result\r
-\r
-  @retval      TRUE           Hash the data successfully.\r
-  @retval      FALSE          Failed to hash the data.\r
-\r
-**/\r
-BOOLEAN\r
-GenerateCredential (\r
-  IN      UINT8                               *Buffer,\r
-  IN      UINTN                               BufferSize,\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, Buffer, BufferSize);\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
-  Read the token file, and default the Token is saved at the begining of the file.\r
-\r
-  @param[out]  Token            Token read from a Token file.\r
-\r
-  @retval EFI_SUCCESS           Read a Token successfully.\r
-  @retval Others                Fails to read a Token.\r
-\r
-**/\r
-EFI_STATUS\r
-GetToken (\r
-  OUT UINT8                                 *Token\r
-  )\r
-{\r
-  EFI_STATUS  Status;\r
-  UINT8       *Buffer;\r
-  UINTN       BufSize;\r
-  CHAR16      *TokenFile;\r
-\r
-  BufSize = 0;\r
-  Buffer  = NULL;\r
-  TokenFile = PcdGetPtr (PcdFixedUsbCredentialProviderTokenFileName);\r
-  Status = GetFileData (TokenFile, (VOID *)&Buffer, &BufSize);\r
-  if (EFI_ERROR (Status)) {\r
-    DEBUG ((DEBUG_ERROR, "Read file %s from USB error! Status=(%r)\n", TokenFile, Status));\r
-    return Status;\r
-  }\r
-\r
-  if (!GenerateCredential (Buffer, BufSize, Token)) {\r
-    DEBUG ((DEBUG_ERROR, "Generate credential from read data failed!\n"));\r
-    FreePool (Buffer);\r
-    return EFI_SECURITY_VIOLATION;\r
-  }\r
-\r
-  FreePool (Buffer);\r
-  return EFI_SUCCESS;\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
-  record. 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 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
-  USB_PROVIDER_CALLBACK_INFO  *CallbackInfo;\r
-\r
-  //\r
-  // Initialize driver private data.\r
-  //\r
-  CallbackInfo = AllocateZeroPool (sizeof (USB_PROVIDER_CALLBACK_INFO));\r
-  if (CallbackInfo == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  CallbackInfo->DriverHandle  = NULL;\r
-\r
-  //\r
-  // Publish HII data.\r
-  //\r
-  CallbackInfo->HiiHandle = HiiAddPackages (\r
-                              &gUsbCredentialProviderGuid,\r
-                              CallbackInfo->DriverHandle,\r
-                              UsbCredentialProviderStrings,\r
-                              NULL\r
-                              );\r
-  if (CallbackInfo->HiiHandle == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-  mCallbackInfo = CallbackInfo;\r
-\r
-  return EFI_SUCCESS;\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
-  USB_INFO                  UsbInfo;\r
-  EFI_USER_INFO             *UserInfo;\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 (UsbInfo.UserId, (UINT8 *) (UserInfo + 1), sizeof (EFI_USER_INFO_IDENTIFIER));\r
-  FreePool (UserInfo);\r
-\r
-  //\r
-  // Get Token and User ID to UsbInfo.\r
-  //\r
-  Status = GetToken (UsbInfo.Token);\r
-  if (EFI_ERROR (Status)) {\r
-    QuestionStr = GetStringById (STRING_TOKEN (STR_READ_USB_TOKEN_ERROR));\r
-    PromptStr   = GetStringById (STRING_TOKEN (STR_INSERT_USB_TOKEN));\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
-    return Status;\r
-  }\r
-\r
-  //\r
-  // Check whether User is ever enrolled in the provider.\r
-  //\r
-  for (Index = 0; Index < mUsbTable->Count; Index++) {\r
-    UserId = (UINT8 *) &mUsbTable->UserInfo[Index].UserId;\r
-    if (CompareMem (UserId, (UINT8 *) &UsbInfo.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, &UsbInfo);\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
-  return EFI_NOT_FOUND;\r
-}\r
-\r
-\r
-/**\r
-  Returns bitmap used to describe the credential provider type.\r
-\r
-  This optional function returns a bitmap which 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
-  // 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
-  UINT8         *UserToken;\r
-  UINT8         ReadToken[HASHED_CREDENTIAL_LEN];\r
-  EFI_INPUT_KEY Key;\r
-  CHAR16        *QuestionStr;\r
-  CHAR16        *PromptStr;\r
-\r
-  if ((This == NULL) || (Identifier == NULL)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  if (User == NULL) {\r
-    //\r
-    // Verify the auto logon user, get user id by matched token.\r
-    //\r
-    if (mUsbTable->Count == 0) {\r
-      return EFI_NOT_READY;\r
-    }\r
-\r
-    //\r
-    // No user selected, get token first and verify the user existed in user database.\r
-    //\r
-    Status = GetToken (ReadToken);\r
-    if (EFI_ERROR (Status)) {\r
-      return EFI_NOT_READY;\r
-    }\r
-\r
-    for (Index = 0; Index < mUsbTable->Count; Index++) {\r
-      //\r
-      // find the specified credential in the Usb credential database.\r
-      //\r
-      UserToken = mUsbTable->UserInfo[Index].Token;\r
-      if (CompareMem (UserToken, ReadToken, HASHED_CREDENTIAL_LEN) == 0) {\r
-        UserId  = (UINT8 *) &mUsbTable->UserInfo[Index].UserId;\r
-        CopyMem (Identifier, UserId, sizeof (EFI_USER_INFO_IDENTIFIER));\r
-        return EFI_SUCCESS;\r
-      }\r
-    }\r
-\r
-    return EFI_NOT_READY;\r
-  }\r
-\r
-  //\r
-  // User is not NULL here. Read a token, and check whether the token matches with\r
-  // the selected user's Token. If not, try to find a token in token DB to matches\r
-  // with read token.\r
-  //\r
-\r
-  Status = GetToken (ReadToken);\r
-  if (EFI_ERROR (Status)) {\r
-    QuestionStr = GetStringById (STRING_TOKEN (STR_READ_USB_TOKEN_ERROR));\r
-    PromptStr   = GetStringById (STRING_TOKEN (STR_INSERT_USB_TOKEN));\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
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
-  //\r
-  // Get the selected user's identifier.\r
-  //\r
-  Status = FindUserInfoByType (User, EFI_USER_INFO_IDENTIFIER_RECORD, &UserInfo);\r
-  if (EFI_ERROR (Status)) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
-  //\r
-  // Check the selected user's Token with the read token.\r
-  //\r
-  for (Index = 0; Index < mUsbTable->Count; Index++) {\r
-    UserId    = (UINT8 *) &mUsbTable->UserInfo[Index].UserId;\r
-    NewUserId = (UINT8 *) (UserInfo + 1);\r
-    if (CompareMem (UserId, NewUserId, sizeof (EFI_USER_INFO_IDENTIFIER)) == 0) {\r
-      //\r
-      // The user's ID is found in the UsbTable.\r
-      //\r
-      UserToken = mUsbTable->UserInfo[Index].Token;\r
-      if (CompareMem (UserToken, ReadToken, HASHED_CREDENTIAL_LEN) == 0) {\r
-        //\r
-        // The read token matches with the one in UsbTable.\r
-        //\r
-        CopyMem (Identifier, UserId, sizeof (EFI_USER_INFO_IDENTIFIER));\r
-        FreePool (UserInfo);\r
-        return EFI_SUCCESS;\r
-      }\r
-    }\r
-  }\r
-\r
-  FreePool (UserInfo);\r
-\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
-\r
-  *AutoLogon = EFI_CREDENTIAL_LOGON_FLAG_DEFAULT | EFI_CREDENTIAL_LOGON_FLAG_AUTO;\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
-\r
-  *AutoLogon = EFI_CREDENTIAL_LOGON_FLAG_DEFAULT | EFI_CREDENTIAL_LOGON_FLAG_AUTO;\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) || (mUsbInfoHandle == NULL)) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
-  //\r
-  // Find information handle in credential info table.\r
-  //\r
-  for (Index = 0; Index < mUsbInfoHandle->Count; Index++) {\r
-    CredentialInfo = mUsbInfoHandle->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
-\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 (mUsbInfoHandle == NULL) {\r
-    //\r
-    // Initilized user info table. There are 4 user info records in the table.\r
-    //\r
-    InfoLen  = sizeof (USB_CREDENTIAL_INFO) + (4 - 1) * sizeof (EFI_USER_INFO *);\r
-    mUsbInfoHandle = AllocateZeroPool (InfoLen);\r
-    if (mUsbInfoHandle == 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, &gUsbCredentialProviderGuid);\r
-    CopyGuid ((EFI_GUID *)(Info + 1), &gUsbCredentialProviderGuid);\r
-\r
-    mUsbInfoHandle->Info[0] = Info;\r
-    mUsbInfoHandle->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, &gUsbCredentialProviderGuid);\r
-    CopyMem ((UINT8*)(Info + 1), ProvNameStr, ProvStrLen);\r
-    FreePool (ProvNameStr);\r
-\r
-    mUsbInfoHandle->Info[1] = Info;\r
-    mUsbInfoHandle->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, &gUsbCredentialProviderGuid);\r
-    CopyGuid ((EFI_GUID *)(Info + 1), &gEfiUserCredentialClassSecureCardGuid);\r
-\r
-    mUsbInfoHandle->Info[2] = Info;\r
-    mUsbInfoHandle->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, &gUsbCredentialProviderGuid);\r
-    CopyMem ((UINT8*)(Info + 1), ProvNameStr, ProvStrLen);\r
-    FreePool (ProvNameStr);\r
-\r
-    mUsbInfoHandle->Info[3] = Info;\r
-    mUsbInfoHandle->Count++;\r
-  }\r
-\r
-  if (*UserInfo == NULL) {\r
-    //\r
-    // Return the first info handle.\r
-    //\r
-    *UserInfo = (EFI_USER_INFO_HANDLE) mUsbInfoHandle->Info[0];\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  //\r
-  // Find information handle in credential info table.\r
-  //\r
-  for (Index = 0; Index < mUsbInfoHandle->Count; Index++) {\r
-    Info = mUsbInfoHandle->Info[Index];\r
-    if (*UserInfo == (EFI_USER_INFO_HANDLE)Info) {\r
-      //\r
-      // The handle is found, get the next one.\r
-      //\r
-      if (Index == mUsbInfoHandle->Count - 1) {\r
-        //\r
-        // Already last one.\r
-        //\r
-        *UserInfo = NULL;\r
-        return EFI_NOT_FOUND;\r
-      }\r
-      Index++;\r
-      *UserInfo = (EFI_USER_INFO_HANDLE)mUsbInfoHandle->Info[Index];\r
-      return EFI_SUCCESS;\r
-    }\r
-  }\r
-\r
-  *UserInfo = NULL;\r
-  return EFI_NOT_FOUND;\r
-}\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 < mUsbTable->Count; Index++) {\r
-    UserId    = (UINT8 *) &mUsbTable->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
-UsbProviderInit (\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 Usb Credential Provider.\r
-  //\r
-  Status = gBS->InstallProtocolInterface (\r
-                  &mCallbackInfo->DriverHandle,\r
-                  &gEfiUserCredential2ProtocolGuid,\r
-                  EFI_NATIVE_INTERFACE,\r
-                  &gUsbCredentialProviderDriver\r
-                  );\r
-  return Status;\r
-}\r