int VBoxGINACredentialsPollerCreate(void) { if (!VBoxGINAHandleCurrentSession()) return VINF_SUCCESS; VBoxGINAVerbose(0, "VBoxGINA::credentialsPollerCreate\n"); /* don't create more than one of them */ if (gThreadPoller != NIL_RTTHREAD) { VBoxGINAVerbose(0, "VBoxGINA::credentialsPollerCreate: thread already running, returning!\n"); return VINF_SUCCESS; } /* create the poller thread */ int rc = RTThreadCreate(&gThreadPoller, credentialsPoller, NULL, 0, RTTHREADTYPE_INFREQUENT_POLLER, RTTHREADFLAGS_WAITABLE, "creds"); if (RT_FAILURE(rc)) VBoxGINAVerbose(0, "VBoxGINA::credentialsPollerCreate: failed to create thread, rc = %Rrc\n", rc); return rc; }
/** * Tries to retrieve credentials and enters them into the specified windows, * optionally followed by a button press to confirm/abort the dialog. * * @return IPRT status code. * @param hwndDlg Handle of dialog to enter credentials into. * @param hwndUserId Handle of username text field. Optional. * @param hwndPassword Handle of password text field. Optional. * @param hwndDomain Handle of domain text field. Optional. * @param wButtonToPress Button ID of dialog to press after successful * retrieval + storage. If set to 0 no button will * be pressed. */ int credentialsHandle(HWND hwndDlg, HWND hwndUserId, HWND hwndPassword, HWND hwndDomain, WORD wButtonToPress) { int rc = VINF_SUCCESS; if (!VBoxGINAHandleCurrentSession()) rc = VERR_NOT_FOUND; if (RT_SUCCESS(rc)) { rc = VbglR3CredentialsQueryAvailability(); if (RT_FAILURE(rc)) { if (rc != VERR_NOT_FOUND) VBoxGINAVerbose(0, "VBoxGINA::credentialsHandle: error querying for credentials, rc=%Rrc\n", rc); } } if (RT_SUCCESS(rc)) { VBoxGINAVerbose(0, "VBoxGINA::credentialsHandle: credentials available\n"); /* * Set status to "terminating" to let the host know this module now * tries to receive and use passed credentials so that credentials from * the host won't be sent twice. */ VBoxGINAReportStatus(VBoxGuestFacilityStatus_Terminating); PRTUTF16 pwszUser, pwszPassword, pwszDomain; rc = VbglR3CredentialsRetrieveUtf16(&pwszUser, &pwszPassword, &pwszDomain); if (RT_SUCCESS(rc)) { #ifdef DEBUG VBoxGINAVerbose(0, "VBoxGINA::credentialsHandle: retrieved credentials: user=%ls, password=%ls, domain=%ls\n", pwszUser, pwszPassword, pwszDomain); #else VBoxGINAVerbose(0, "VBoxGINA::credentialsHandle: retrieved credentials: user=%ls, password=XXX, domain=%ls\n", pwszUser, pwszDomain); #endif /* Fill in credentials to appropriate UI elements. */ rc = credentialsToUI(hwndDlg, hwndUserId, hwndPassword, hwndDomain, pwszUser, pwszPassword, pwszDomain); if (RT_SUCCESS(rc)) { /* Confirm/cancel the dialog by pressing the appropriate button. */ if (wButtonToPress) { WPARAM wParam = MAKEWPARAM(wButtonToPress, BN_CLICKED); PostMessage(hwndDlg, WM_COMMAND, wParam, 0); } } VbglR3CredentialsDestroyUtf16(pwszUser, pwszPassword, pwszDomain, 3 /* Passes */); } } VBoxGINAVerbose(3, "VBoxGINA::credentialsHandle: returned with rc=%Rrc\n", rc); return rc; }