diff --git a/reactos/dll/win32/samlib/samlib.c b/reactos/dll/win32/samlib/samlib.c index be6b3541808..19cfb9d69f5 100644 --- a/reactos/dll/win32/samlib/samlib.c +++ b/reactos/dll/win32/samlib/samlib.c @@ -31,6 +31,12 @@ WINE_DEFAULT_DEBUG_CHANNEL(samlib); + +NTSTATUS +WINAPI +SystemFunction007(PUNICODE_STRING string, + LPBYTE hash); + /* GLOBALS *******************************************************************/ @@ -1594,11 +1600,50 @@ SamSetInformationUser(IN SAM_HANDLE UserHandle, IN USER_INFORMATION_CLASS UserInformationClass, IN PVOID Buffer) { + PSAMPR_USER_SET_PASSWORD_INFORMATION PasswordBuffer; + SAMPR_USER_INTERNAL1_INFORMATION Internal1Buffer; + NTSTATUS Status; TRACE("SamSetInformationUser(%p %lu %p)\n", UserHandle, UserInformationClass, Buffer); + if (UserInformationClass == UserSetPasswordInformation) + { + PasswordBuffer = (PSAMPR_USER_SET_PASSWORD_INFORMATION)Buffer; + + /* Calculate the NT hash value of the passord */ + Status = SystemFunction007((PUNICODE_STRING)&PasswordBuffer->Password, + (LPBYTE)&Internal1Buffer.EncryptedNtOwfPassword); + if (!NT_SUCCESS(Status)) + { + TRACE("SystemFunction007 failed (Status 0x%08lx)\n", Status); + return Status; + } + + Internal1Buffer.NtPasswordPresent = TRUE; + Internal1Buffer.LmPasswordPresent = FALSE; + Internal1Buffer.PasswordExpired = PasswordBuffer->PasswordExpired; + + RpcTryExcept + { + Status = SamrSetInformationUser((SAMPR_HANDLE)UserHandle, + UserInternal1Information, + (PVOID)&Internal1Buffer); + } + RpcExcept(EXCEPTION_EXECUTE_HANDLER) + { + Status = I_RpcMapWin32Status(RpcExceptionCode()); + } + RpcEndExcept; + + if (!NT_SUCCESS(Status)) + { + TRACE("SamrSetInformation() failed (Status 0x%08lx)\n", Status); + return Status; + } + } + RpcTryExcept { Status = SamrSetInformationUser((SAMPR_HANDLE)UserHandle,