/** * Copies an UTF16 string into a PUNICODE_STRING by allocating space for it. * * @return HRESULT * @param pUnicodeDest Where to store the copied (allocated) unicode string. * @param pwszSource UTF16 string to copy. */ HRESULT VBoxCredProvCredential::RTUTF16ToUnicodeA(PUNICODE_STRING pUnicodeDest, PRTUTF16 pwszSource) { AssertPtrReturn(pUnicodeDest, E_POINTER); AssertPtrReturn(pwszSource, E_POINTER); size_t cbLen = RTUtf16Len(pwszSource) * sizeof(RTUTF16); pUnicodeDest->Buffer = (LPWSTR)CoTaskMemAlloc(cbLen); if (!pUnicodeDest->Buffer) return E_OUTOFMEMORY; pUnicodeDest->MaximumLength = (USHORT)cbLen; pUnicodeDest->Length = 0; return RTUTF16ToUnicode(pUnicodeDest, pwszSource, true /* fCopy */); }
HRESULT VBoxCredProvCredential::kerberosLogonInit(KERB_INTERACTIVE_LOGON *pLogonIn, CREDENTIAL_PROVIDER_USAGE_SCENARIO enmUsage, PRTUTF16 pwszUser, PRTUTF16 pwszPassword, PRTUTF16 pwszDomain) { AssertPtrReturn(pLogonIn, E_INVALIDARG); AssertPtrReturn(pwszUser, E_INVALIDARG); AssertPtrReturn(pwszPassword, E_INVALIDARG); /* pwszDomain is optional. */ HRESULT hr; /* Do we have a domain name set? */ if ( pwszDomain && RTUtf16Len(pwszDomain)) { hr = RTUTF16ToUnicode(&pLogonIn->LogonDomainName, pwszDomain, true /* fCopy */); } else /* No domain (FQDN) given, try local computer name. */ { WCHAR wszComputerName[MAX_COMPUTERNAME_LENGTH + 1]; DWORD cch = ARRAYSIZE(wszComputerName); if (GetComputerNameW(wszComputerName, &cch)) { /* Is a domain name missing? Then use the name of the local computer. */ hr = RTUTF16ToUnicode(&pLogonIn->LogonDomainName, wszComputerName, true /* fCopy */); VBoxCredProvVerbose(0, "VBoxCredProvCredential::kerberosLogonInit: Local computer name=%ls\n", wszComputerName); } else hr = HRESULT_FROM_WIN32(GetLastError()); } /* Fill in the username and password. */ if (SUCCEEDED(hr)) { hr = RTUTF16ToUnicode(&pLogonIn->UserName, pwszUser, true /* fCopy */); if (SUCCEEDED(hr)) { hr = RTUTF16ToUnicode(&pLogonIn->Password, pwszPassword, true /* fCopy */); if (SUCCEEDED(hr)) { /* Set credential type according to current usage scenario. */ switch (enmUsage) { case CPUS_UNLOCK_WORKSTATION: pLogonIn->MessageType = KerbWorkstationUnlockLogon; break; case CPUS_LOGON: pLogonIn->MessageType = KerbInteractiveLogon; break; case CPUS_CREDUI: pLogonIn->MessageType = (KERB_LOGON_SUBMIT_TYPE)0; /* No message type required here. */ break; default: VBoxCredProvVerbose(0, "VBoxCredProvCredential::kerberosLogonInit: Unknown usage scenario=%ld\n", enmUsage); hr = E_FAIL; break; } } } } return hr; }