static INT TUILockedSAS( IN OUT PGINA_CONTEXT pgContext) { HANDLE hToken; WCHAR UserName[256]; WCHAR Password[256]; NTSTATUS SubStatus; NTSTATUS Status; TRACE("TUILockedSAS()\n"); UNREFERENCED_PARAMETER(pgContext); if (!DisplayResourceText(IDS_LOGGEDOUTSAS, TRUE)) return WLX_SAS_ACTION_UNLOCK_WKSTA; /* Ask the user for credentials */ if (!ReadString(IDS_ASKFORUSER, UserName, _countof(UserName), TRUE)) return WLX_SAS_ACTION_NONE; if (!ReadString(IDS_ASKFORPASSWORD, Password, _countof(Password), FALSE)) return WLX_SAS_ACTION_NONE; Status = ConnectToLsa(pgContext); if (!NT_SUCCESS(Status)) { WARN("ConnectToLsa() failed\n"); return WLX_SAS_ACTION_NONE; } Status = MyLogonUser(pgContext->LsaHandle, pgContext->AuthenticationPackage, UserName, NULL, Password, &hToken, &SubStatus); if (!NT_SUCCESS(Status)) { WARN("MyLogonUser() failed\n"); return WLX_SAS_ACTION_NONE; } CloseHandle(hToken); return WLX_SAS_ACTION_UNLOCK_WKSTA; }
static BOOL DoChangePassword( IN PGINA_CONTEXT pgContext, IN HWND hwndDlg) { WCHAR UserName[256]; WCHAR Domain[256]; WCHAR OldPassword[256]; WCHAR NewPassword1[256]; WCHAR NewPassword2[256]; PMSV1_0_CHANGEPASSWORD_REQUEST RequestBuffer = NULL; PMSV1_0_CHANGEPASSWORD_RESPONSE ResponseBuffer = NULL; ULONG RequestBufferSize; ULONG ResponseBufferSize = 0; LPWSTR Ptr; BOOL res = FALSE; NTSTATUS ProtocolStatus; NTSTATUS Status; GetDlgItemTextW(hwndDlg, IDC_CHANGEPWD_USERNAME, UserName, 256); GetDlgItemTextW(hwndDlg, IDC_CHANGEPWD_DOMAIN, Domain, 256); GetDlgItemTextW(hwndDlg, IDC_CHANGEPWD_OLDPWD, OldPassword, 256); GetDlgItemTextW(hwndDlg, IDC_CHANGEPWD_NEWPWD1, NewPassword1, 256); GetDlgItemTextW(hwndDlg, IDC_CHANGEPWD_NEWPWD2, NewPassword2, 256); /* Compare the two passwords and fail if they do not match */ if (wcscmp(NewPassword1, NewPassword2) != 0) { ResourceMessageBox(pgContext, hwndDlg, MB_OK | MB_ICONEXCLAMATION, IDS_CHANGEPWDTITLE, IDS_NONMATCHINGPASSWORDS); return FALSE; } /* Calculate the request buffer size */ RequestBufferSize = sizeof(MSV1_0_CHANGEPASSWORD_REQUEST) + ((wcslen(Domain) + 1) * sizeof(WCHAR)) + ((wcslen(UserName) + 1) * sizeof(WCHAR)) + ((wcslen(OldPassword) + 1) * sizeof(WCHAR)) + ((wcslen(NewPassword1) + 1) * sizeof(WCHAR)); /* Allocate the request buffer */ RequestBuffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, RequestBufferSize); if (RequestBuffer == NULL) { ERR("HeapAlloc failed\n"); return FALSE; } /* Initialize the request buffer */ RequestBuffer->MessageType = MsV1_0ChangePassword; RequestBuffer->Impersonating = TRUE; Ptr = (LPWSTR)((ULONG_PTR)RequestBuffer + sizeof(MSV1_0_CHANGEPASSWORD_REQUEST)); /* Pack the domain name */ RequestBuffer->DomainName.Length = wcslen(Domain) * sizeof(WCHAR); RequestBuffer->DomainName.MaximumLength = RequestBuffer->DomainName.Length + sizeof(WCHAR); RequestBuffer->DomainName.Buffer = Ptr; RtlCopyMemory(RequestBuffer->DomainName.Buffer, Domain, RequestBuffer->DomainName.MaximumLength); Ptr = (LPWSTR)((ULONG_PTR)Ptr + RequestBuffer->DomainName.MaximumLength); /* Pack the user name */ RequestBuffer->AccountName.Length = wcslen(UserName) * sizeof(WCHAR); RequestBuffer->AccountName.MaximumLength = RequestBuffer->AccountName.Length + sizeof(WCHAR); RequestBuffer->AccountName.Buffer = Ptr; RtlCopyMemory(RequestBuffer->AccountName.Buffer, UserName, RequestBuffer->AccountName.MaximumLength); Ptr = (LPWSTR)((ULONG_PTR)Ptr + RequestBuffer->AccountName.MaximumLength); /* Pack the old password */ RequestBuffer->OldPassword.Length = wcslen(OldPassword) * sizeof(WCHAR); RequestBuffer->OldPassword.MaximumLength = RequestBuffer->OldPassword.Length + sizeof(WCHAR); RequestBuffer->OldPassword.Buffer = Ptr; RtlCopyMemory(RequestBuffer->OldPassword.Buffer, OldPassword, RequestBuffer->OldPassword.MaximumLength); Ptr = (LPWSTR)((ULONG_PTR)Ptr + RequestBuffer->OldPassword.MaximumLength); /* Pack the new password */ RequestBuffer->NewPassword.Length = wcslen(NewPassword1) * sizeof(WCHAR); RequestBuffer->NewPassword.MaximumLength = RequestBuffer->NewPassword.Length + sizeof(WCHAR); RequestBuffer->NewPassword.Buffer = Ptr; RtlCopyMemory(RequestBuffer->NewPassword.Buffer, NewPassword1, RequestBuffer->NewPassword.MaximumLength); /* Connect to the LSA server */ if (!ConnectToLsa(pgContext)) { ERR("ConnectToLsa() failed\n"); goto done; } /* Call the authentication package */ Status = LsaCallAuthenticationPackage(pgContext->LsaHandle, pgContext->AuthenticationPackage, RequestBuffer, RequestBufferSize, (PVOID*)&ResponseBuffer, &ResponseBufferSize, &ProtocolStatus); if (!NT_SUCCESS(Status)) { ERR("LsaCallAuthenticationPackage failed (Status 0x%08lx)\n", Status); goto done; } if (!NT_SUCCESS(ProtocolStatus)) { TRACE("LsaCallAuthenticationPackage failed (ProtocolStatus 0x%08lx)\n", ProtocolStatus); goto done; } res = TRUE; ResourceMessageBox(pgContext, hwndDlg, MB_OK | MB_ICONINFORMATION, IDS_CHANGEPWDTITLE, IDS_PASSWORDCHANGED); if ((wcscmp(UserName, pgContext->UserName) == 0) && (wcscmp(Domain, pgContext->Domain) == 0) && (wcscmp(OldPassword, pgContext->Password) == 0)) { ZeroMemory(pgContext->Password, 256 * sizeof(WCHAR)); wcscpy(pgContext->Password, NewPassword1); } done: if (RequestBuffer != NULL) HeapFree(GetProcessHeap(), 0, RequestBuffer); if (ResponseBuffer != NULL) LsaFreeReturnBuffer(ResponseBuffer); return res; }