+/**\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