VirtualBox

Changeset 40393 in vbox for trunk/src/VBox/Additions/WINNT


Ignore:
Timestamp:
Mar 7, 2012 2:41:37 PM (13 years ago)
Author:
vboxsync
Message:

VBoxCredProv: Fixed reference counting + wiping credentials, logging adjustments.

Location:
trunk/src/VBox/Additions/WINNT/VBoxCredProv
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/VBoxCredProv/VBoxCredProvCredential.cpp

    r40348 r40393  
    3030#include <lm.h>
    3131
     32#include <iprt/initterm.h>
    3233#include <iprt/mem.h>
    3334#include <iprt/string.h>
     
    3536
    3637
    37 VBoxCredProvCredential::VBoxCredProvCredential(VBoxCredProvProvider *pProvider) :
     38VBoxCredProvCredential::VBoxCredProvCredential(void) :
     39    m_cpUS(CPUS_INVALID),
    3840    m_cRefCount(1),
    3941    m_pEvents(NULL)
    4042{
    41     VBoxCredProvVerbose(0, "VBoxCredProvCredential: Created, pProvider=%p\n",
    42                         pProvider);
     43    VBoxCredProvVerbose(0, "VBoxCredProvCredential: Created\n");
    4344
    4445    VBoxCredentialProviderAcquire();
    4546
    46     AssertPtr(pProvider);
    47     m_pProvider = pProvider;
    48 
    49     ZeroMemory(m_pwszCredentials, sizeof(m_pwszCredentials));
     47    ZeroMemory(m_pwszCredentials, sizeof(PRTUTF16) * VBOXCREDPROV_NUM_FIELDS);
    5048}
    5149
     
    5452{
    5553    VBoxCredProvVerbose(0, "VBoxCredProvCredential: Destroying\n");
     54
     55    Reset();
    5656
    5757    VBoxCredentialProviderRelease();
     
    6262ULONG VBoxCredProvCredential::AddRef(void)
    6363{
    64     VBoxCredProvVerbose(0, "VBoxCredProvCredential: Increasing reference to %ld\n",
    65                         m_cRefCount + 1);
    66 
    67     return m_cRefCount++;
     64    LONG cRefCount = InterlockedIncrement(&m_cRefCount);
     65    VBoxCredProvVerbose(0, "VBoxCredProvCredential::AddRef: Returning refcount=%ld\n",
     66                        cRefCount);
     67    return cRefCount;
    6868}
    6969
     
    7171ULONG VBoxCredProvCredential::Release(void)
    7272{
    73     Assert(m_cRefCount);
    74 
    75     ULONG cRefCount = --m_cRefCount;
    76     VBoxCredProvVerbose(0, "VBoxCredProvCredential: Decreasing reference to %ld\n",
     73    LONG cRefCount = InterlockedDecrement(&m_cRefCount);
     74    VBoxCredProvVerbose(0, "VBoxCredProvCredential::Release: Returning refcount=%ld\n",
    7775                        cRefCount);
    7876    if (!cRefCount)
     
    127125                                                   bool fCopy)
    128126{
     127    AssertPtrReturn(pUnicodeDest, VERR_INVALID_POINTER);
    129128    AssertPtrReturn(pwszSource, VERR_INVALID_POINTER);
    130     AssertPtrReturn(pUnicodeDest, VERR_INVALID_POINTER);
    131129
    132130    size_t cbLen = RTUtf16Len(pwszSource) * sizeof(RTUTF16);
     
    165163
    166164#ifdef DEBUG
    167     VBoxCredProvVerbose(3, "VBoxCredProvCredential: AllocateLogonPackage: Allocating %ld bytes (%d bytes credentials)\n",
     165    VBoxCredProvVerbose(3, "VBoxCredProvCredential::AllocateLogonPackage: Allocating %ld bytes (%d bytes credentials)\n",
    168166                        cbLogon, cbLogon - sizeof(KERB_INTERACTIVE_UNLOCK_LOGON));
    169167#endif
     
    207205
    208206
    209 void VBoxCredProvCredential::Reset(void)
    210 {
    211     VBoxCredProvVerbose(0, "VBoxCredProvCredential: Wiping credentials ...\n");
     207HRESULT VBoxCredProvCredential::Reset(void)
     208{
     209
     210    VBoxCredProvVerbose(0, "VBoxCredProvCredential::Reset: Wiping credentials user=%ls, pw=%ls, domain=%ls\n",
     211                        m_pwszCredentials[VBOXCREDPROV_FIELDID_USERNAME],
     212#ifdef DEBUG
     213                        m_pwszCredentials[VBOXCREDPROV_FIELDID_PASSWORD],
     214#else
     215                        L"XXX" /* Don't show any passwords in release mode. */,
     216#endif
     217                        m_pwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME]);
    212218
    213219    VbglR3CredentialsDestroyUtf16(m_pwszCredentials[VBOXCREDPROV_FIELDID_USERNAME],
     
    215221                                  m_pwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME],
    216222                                  3 /* Passes */);
     223    HRESULT hr = S_OK;
    217224    if (m_pEvents)
    218225    {
    219         m_pEvents->SetFieldString(this, VBOXCREDPROV_FIELDID_USERNAME, NULL);
    220         m_pEvents->SetFieldString(this, VBOXCREDPROV_FIELDID_PASSWORD, NULL);
    221         m_pEvents->SetFieldString(this, VBOXCREDPROV_FIELDID_DOMAINNAME, NULL);
    222     }
     226        /* Note: On Windows 8, set "this" to "nullptr". */
     227        HRESULT hr2 = m_pEvents->SetFieldString(this, VBOXCREDPROV_FIELDID_USERNAME, L"");
     228        if (SUCCEEDED(hr))
     229            hr = hr2;
     230        hr2 = m_pEvents->SetFieldString(this, VBOXCREDPROV_FIELDID_PASSWORD, L"");
     231        if (SUCCEEDED(hr))
     232            hr = hr2;
     233        hr2 = m_pEvents->SetFieldString(this, VBOXCREDPROV_FIELDID_DOMAINNAME, L"");
     234        if (SUCCEEDED(hr))
     235            hr = hr2;
     236    }
     237
     238    VBoxCredProvVerbose(0, "VBoxCredProvCredential::Reset: Returned hr=%08x\n", hr);
     239    return hr;
    223240}
    224241
     
    240257                                            &m_pwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME]);
    241258
    242         VBoxCredProvVerbose(0, "VBoxCredProvCredential: Retrieving credentials returned rc=%Rrc\n", rc);
     259        VBoxCredProvVerbose(0, "VBoxCredProvCredential::RetrieveCredentials: Retrieved credentials with rc=%Rrc\n", rc);
    243260    }
    244261
    245262    if (RT_SUCCESS(rc))
    246263    {
    247         VBoxCredProvVerbose(0, "VBoxCredProvCredential: Got credentials: User=%ls, Password=%ls, Domain=%ls\n",
     264        VBoxCredProvVerbose(0, "VBoxCredProvCredential::RetrieveCredentials: User=%ls, Password=%ls, Domain=%ls\n",
    248265                            m_pwszCredentials[VBOXCREDPROV_FIELDID_USERNAME],
    249266#ifdef DEBUG
     
    262279        if (TranslateAccountName(m_pwszCredentials[VBOXCREDPROV_FIELDID_USERNAME], &pwszAcount))
    263280        {
    264             VBoxCredProvVerbose(0, "VBoxCredProvCredential: Translated account name %ls -> %ls\n",
     281            VBoxCredProvVerbose(0, "VBoxCredProvCredential::RetrieveCredentials: Translated account name %ls -> %ls\n",
    265282                                m_pwszCredentials[VBOXCREDPROV_FIELDID_USERNAME], pwszAcount);
    266283
    267             RTUtf16Free(m_pwszCredentials[VBOXCREDPROV_FIELDID_USERNAME]);
     284            if (m_pwszCredentials[VBOXCREDPROV_FIELDID_USERNAME])
     285            {
     286                RTMemWipeThoroughly(m_pwszCredentials[VBOXCREDPROV_FIELDID_USERNAME],
     287                                    RTUtf16Len(m_pwszCredentials[VBOXCREDPROV_FIELDID_USERNAME]) + sizeof(RTUTF16), 3 /* Passes */);
     288                RTUtf16Free(m_pwszCredentials[VBOXCREDPROV_FIELDID_USERNAME]);
     289            }
    268290            m_pwszCredentials[VBOXCREDPROV_FIELDID_USERNAME] = pwszAcount;
    269291        }
     
    281303            {
    282304                /* Update user name. */
    283                 RTUtf16Free(m_pwszCredentials[VBOXCREDPROV_FIELDID_USERNAME]);
     305                if (m_pwszCredentials[VBOXCREDPROV_FIELDID_USERNAME])
     306                {
     307                    RTMemWipeThoroughly(m_pwszCredentials[VBOXCREDPROV_FIELDID_USERNAME],
     308                                        RTUtf16Len(m_pwszCredentials[VBOXCREDPROV_FIELDID_USERNAME]) + sizeof(RTUTF16), 3 /* Passes */);
     309                    RTUtf16Free(m_pwszCredentials[VBOXCREDPROV_FIELDID_USERNAME]);
     310                }
    284311                m_pwszCredentials[VBOXCREDPROV_FIELDID_USERNAME] = pwszAcount;
    285312
    286313                /* Update domain. */
    287                 RTUtf16Free(m_pwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME]);
     314                if (m_pwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME])
     315                {
     316                    RTMemWipeThoroughly(m_pwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME],
     317                                        RTUtf16Len(m_pwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME]) + sizeof(RTUTF16), 3 /* Passes */);
     318                    RTUtf16Free(m_pwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME]);
     319                }
    288320                m_pwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME] = pwszDomain;
    289321
    290                 VBoxCredProvVerbose(0, "VBoxCredProvCredential: Extracted account data is pwszAccount=%ls, pwszDomain=%ls\n",
    291                                     pwszAcount, pwszDomain);
     322                VBoxCredProvVerbose(0, "VBoxCredProvCredential::RetrieveCredentials: Extracted account data pwszAccount=%ls, pwszDomain=%ls\n",
     323                                    m_pwszCredentials[VBOXCREDPROV_FIELDID_USERNAME],
     324                                    m_pwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME]);
    292325            }
    293326        }
    294327    }
    295328
    296     VBoxCredProvVerbose(0, "VBoxCredProvCredential: Checking credentials returned with rc=%Rrc\n", rc);
     329    VBoxCredProvVerbose(0, "VBoxCredProvCredential::RetrieveCredentials: Returned rc=%Rrc\n", rc);
    297330    return rc;
    298331}
     
    306339HRESULT VBoxCredProvCredential::Initialize(CREDENTIAL_PROVIDER_USAGE_SCENARIO cpUS)
    307340{
    308     VBoxCredProvVerbose(0, "VBoxCredProvCredential: Initialize: cpUS=%ld\n", cpUS);
     341    VBoxCredProvVerbose(0, "VBoxCredProvCredential::Initialize: cpUS=%ld\n", cpUS);
    309342
    310343    m_cpUS = cpUS;
     
    318351 * Store this callback pointer for later use.
    319352 */
    320 HRESULT VBoxCredProvCredential::Advise(ICredentialProviderCredentialEvents* pcpce)
    321 {
    322     VBoxCredProvVerbose(0, "VBoxCredProvCredential: Advise\n");
    323 
    324     if (m_pEvents != NULL)
     353HRESULT VBoxCredProvCredential::Advise(ICredentialProviderCredentialEvents *pEvents)
     354{
     355    VBoxCredProvVerbose(0, "VBoxCredProvCredential::Advise: pEvents=0x%p\n",
     356                        pEvents);
     357
     358    if (m_pEvents)
     359    {
    325360        m_pEvents->Release();
    326     m_pEvents = pcpce;
    327     m_pEvents->AddRef();
     361        m_pEvents = NULL;
     362    }
     363
     364    m_pEvents = pEvents;
     365    if (m_pEvents)
     366        m_pEvents->AddRef();
     367
    328368    return S_OK;
    329369}
     
    333373HRESULT VBoxCredProvCredential::UnAdvise(void)
    334374{
    335     VBoxCredProvVerbose(0, "VBoxCredProvCredential: UnAdvise\n");
    336 
    337     /*
    338      * We're done with the current iteration, trigger a refresh of ourselves
    339      * to reset credentials and to keep the logon UI clean (no stale entries anymore).
    340      */
    341     Reset();
    342 
    343     /*
    344      * Force a re-iteration of the provider (which will give zero credentials
    345      * to try out because we just reset our one and only a line above.
    346      */
    347     if (m_pProvider)
    348         m_pProvider->OnCredentialsProvided();
     375    VBoxCredProvVerbose(0, "VBoxCredProvCredential::UnAdvise\n");
    349376
    350377    if (m_pEvents)
     378    {
    351379        m_pEvents->Release();
    352     m_pEvents = NULL;
     380        m_pEvents = NULL;
     381    }
     382
    353383    return S_OK;
    354384}
     
    363393 * selected, you would do it here.
    364394 */
    365 HRESULT VBoxCredProvCredential::SetSelected(BOOL* pbAutoLogon)
    366 {
    367     VBoxCredProvVerbose(0, "VBoxCredProvCredential: SetSelected\n");
     395HRESULT VBoxCredProvCredential::SetSelected(BOOL *pbAutoLogon)
     396{
     397    VBoxCredProvVerbose(0, "VBoxCredProvCredential::SetSelected\n");
    368398
    369399    /*
     
    372402     * winlogon wait before new login attempts can be made.
    373403     */
    374     *pbAutoLogon = FALSE;
     404    if (pbAutoLogon)
     405        *pbAutoLogon = FALSE;
    375406    return S_OK;
    376407}
     
    382413 * is to clear out the password field.
    383414 */
    384 HRESULT VBoxCredProvCredential::SetDeselected()
    385 {
    386     VBoxCredProvVerbose(0, "VBoxCredProvCredential: SetDeselected\n");
    387 
    388     VbglR3CredentialsDestroyUtf16(m_pwszCredentials[VBOXCREDPROV_FIELDID_USERNAME],
    389                                   m_pwszCredentials[VBOXCREDPROV_FIELDID_PASSWORD],
    390                                   m_pwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME],
    391                                   3 /* Passes */);
     415HRESULT VBoxCredProvCredential::SetDeselected(void)
     416{
     417    VBoxCredProvVerbose(0, "VBoxCredProvCredential::SetDeselected\n");
     418
     419    Reset();
    392420
    393421    if (m_pEvents)
     
    406434                                              CREDENTIAL_PROVIDER_FIELD_INTERACTIVE_STATE* pFieldstateInteractive)
    407435{
    408     VBoxCredProvVerbose(0, "VBoxCredProvCredential: GetFieldState: dwFieldID=%ld\n", dwFieldID);
     436    VBoxCredProvVerbose(0, "VBoxCredProvCredential::GetFieldState: dwFieldID=%ld\n", dwFieldID);
    409437
    410438    HRESULT hr = S_OK;
     
    431459{
    432460    AssertPtrReturn(pwszDisplayName, FALSE);
    433     VBoxCredProvVerbose(0, "VBoxCredProvCredential: TranslateAccountName: Getting account name for \"%ls\" ...\n",
     461    VBoxCredProvVerbose(0, "VBoxCredProvCredential::TranslateAccountName: Getting account name for \"%ls\" ...\n",
    434462                        pwszDisplayName);
    435463
     
    482510                        }
    483511                        else
    484                             VBoxCredProvVerbose(0, "VBoxCredProvCredential: TranslateAccountName: Error copying data, hr=%08x\n", hr);
     512                            VBoxCredProvVerbose(0, "VBoxCredProvCredential::TranslateAccountName: Error copying data, hr=%08x\n", hr);
    485513                        break;
    486514                    }
     
    502530    }
    503531
    504     VBoxCredProvVerbose(0, "VBoxCredProvCredential: TranslateAccountName: Returned nStatus=%ld, fFound=%s\n",
    505                         nStatus, fFound ? "Yes" : "No");
     532    VBoxCredProvVerbose(0, "VBoxCredProvCredential::TranslateAccountName returned nStatus=%ld, fFound=%RTbool\n",
     533                        nStatus, fFound);
    506534    return fFound;
    507535
     
    512540        && cbLen > 0)
    513541    {
    514         VBoxCredProvVerbose(0, "VBoxCredProvCredential: GetAccountName: Translated ADS name has %u characters\n", cbLen));
     542        VBoxCredProvVerbose(0, "VBoxCredProvCredential::GetAccountName: Translated ADS name has %u characters\n", cbLen));
    515543
    516544        ppwszAccoutName = (PWSTR)RTMemAlloc(cbLen * sizeof(WCHAR));
     
    518546        if (TranslateNameW(pwszName, NameUnknown, NameUserPrincipal, ppwszAccoutName, &cbLen))
    519547        {
    520             VBoxCredProvVerbose(0, "VBoxCredProvCredential: GetAccountName: Real ADS account name of '%ls' is '%ls'\n",
     548            VBoxCredProvVerbose(0, "VBoxCredProvCredential::GetAccountName: Real ADS account name of '%ls' is '%ls'\n",
    521549                 pwszName, ppwszAccoutName));
    522550        }
     
    546574{
    547575    AssertPtrReturn(pwszAccountData, FALSE);
    548     VBoxCredProvVerbose(0, "VBoxCredProvCredential: ExtractAccoutData: Getting account name for \"%ls\" ...\n",
     576    VBoxCredProvVerbose(0, "VBoxCredProvCredential::ExtractAccoutData: Getting account name for \"%ls\" ...\n",
    549577                        pwszAccountData);
    550578    HRESULT hr = E_FAIL;
     
    573601                }
    574602                else
    575                     VBoxCredProvVerbose(0, "VBoxCredProvCredential: ExtractAccoutData: Error copying domain data, hr=%08x\n", hr);
     603                    VBoxCredProvVerbose(0, "VBoxCredProvCredential::ExtractAccoutData: Error copying domain data, hr=%08x\n", hr);
    576604            }
    577605            else
    578606            {
    579607                hr = E_FAIL;
    580                 VBoxCredProvVerbose(0, "VBoxCredProvCredential: ExtractAccoutData: No domain name found!\n");
     608                VBoxCredProvVerbose(0, "VBoxCredProvCredential::ExtractAccoutData: No domain name found!\n");
    581609            }
    582610        }
    583611        else
    584             VBoxCredProvVerbose(0, "VBoxCredProvCredential: ExtractAccoutData: Error copying account data, hr=%08x\n", hr);
     612            VBoxCredProvVerbose(0, "VBoxCredProvCredential::ExtractAccoutData: Error copying account data, hr=%08x\n", hr);
    585613
    586614        if (hr != S_OK)
     
    592620    }
    593621    else
    594         VBoxCredProvVerbose(0, "VBoxCredProvCredential: ExtractAccoutData: No valid principal account name found!\n");
     622        VBoxCredProvVerbose(0, "VBoxCredProvCredential::ExtractAccoutData: No valid principal account name found!\n");
    595623
    596624    return (hr == S_OK);
     
    632660#ifdef DEBUG
    633661        if (SUCCEEDED(hr))
    634             VBoxCredProvVerbose(0, "VBoxCredProvCredential: GetStringValue: dwFieldID=%ld, ppwszString=%ls\n",
     662            VBoxCredProvVerbose(0, "VBoxCredProvCredential::GetStringValue: dwFieldID=%ld, ppwszString=%ls\n",
    635663                                dwFieldID, *ppwszString);
    636664#endif
     
    651679                                                     DWORD* pdwAdjacentTo)
    652680{
    653     VBoxCredProvVerbose(0, "VBoxCredProvCredential: GetSubmitButtonValue: dwFieldID=%ld\n", dwFieldID);
     681    VBoxCredProvVerbose(0, "VBoxCredProvCredential::GetSubmitButtonValue: dwFieldID=%ld\n", dwFieldID);
    654682
    655683    HRESULT hr = S_OK;
     
    661689        /* pdwAdjacentTo is a pointer to the fieldID you want the submit button to appear next to. */
    662690        *pdwAdjacentTo = VBOXCREDPROV_FIELDID_PASSWORD;
    663         VBoxCredProvVerbose(0, "VBoxCredProvCredential: GetSubmitButtonValue: dwFieldID=%ld, *pdwAdjacentTo=%ld\n",
     691        VBoxCredProvVerbose(0, "VBoxCredProvCredential::GetSubmitButtonValue: dwFieldID=%ld, *pdwAdjacentTo=%ld\n",
    664692                            dwFieldID, *pdwAdjacentTo);
    665693    }
     
    678706                                               PCWSTR pcwzString)
    679707{
    680     VBoxCredProvVerbose(0, "VBoxCredProvCredential: SetStringValue: dwFieldID=%ld, pcwzString=%ls\n",
     708#ifdef DEBUG
     709    VBoxCredProvVerbose(0, "VBoxCredProvCredential::SetStringValue: dwFieldID=%ld, pcwzString=%ls\n",
    681710                        dwFieldID, pcwzString);
    682 
    683     /*
    684      * We don't set any values into fields (e.g. the password, hidden
    685      * by dots), instead keep it secret by resetting all credentials.
    686      */
    687     Reset();
    688 
    689     return S_OK;
     711#endif
     712
     713    /* Do more things here later. */
     714    HRESULT hr = S_OK;
     715
     716    VBoxCredProvVerbose(0, "VBoxCredProvCredential::SetStringValue returned with hr=%08x\n", hr);
     717    return hr;
    690718}
    691719
     
    787815
    788816#ifdef DEBUG
    789     VBoxCredProvVerbose(0, "VBoxCredProvCredential: GetSerialization: Username=%ls, Password=%ls, Domain=%ls\n",
     817    VBoxCredProvVerbose(0, "VBoxCredProvCredential::GetSerialization: Username=%ls, Password=%ls, Domain=%ls\n",
    790818                        m_pwszCredentials[VBOXCREDPROV_FIELDID_USERNAME],
    791819                        m_pwszCredentials[VBOXCREDPROV_FIELDID_PASSWORD],
     
    793821#endif
    794822
    795     WCHAR wszComputerName[MAX_COMPUTERNAME_LENGTH + 1];
    796     DWORD cch = ARRAYSIZE(wszComputerName);
    797     if (GetComputerNameW(wszComputerName, &cch))
    798     {
    799         /* Is a domain name missing? Then use the name of the local computer. */
    800         if (   m_pwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME]
    801             && RTUtf16Len(m_pwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME]))
    802         {
    803             hr = RTUTF16toToUnicode(&pKerberosLogon->LogonDomainName,
    804                                     m_pwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME],
    805                                     false /* Just assign, no copy */);
    806         }
    807         else
     823    /* Do we have a domain name set? */
     824    if (   m_pwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME]
     825        && RTUtf16Len(m_pwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME]))
     826    {
     827        hr = RTUTF16toToUnicode(&pKerberosLogon->LogonDomainName,
     828                                m_pwszCredentials[VBOXCREDPROV_FIELDID_DOMAINNAME],
     829                                false /* Just assign, no copy */);
     830    }
     831    else /* No domain (FQDN) given, try local computer name. */
     832    {
     833        WCHAR wszComputerName[MAX_COMPUTERNAME_LENGTH + 1];
     834        DWORD cch = ARRAYSIZE(wszComputerName);
     835        if (GetComputerNameW(wszComputerName, &cch))
     836        {
     837            /* Is a domain name missing? Then use the name of the local computer. */
    808838            hr = RTUTF16toToUnicode(&pKerberosLogon->LogonDomainName,
    809839                                    wszComputerName,
    810840                                    false /* Just assign, no copy */);
    811841
     842            VBoxCredProvVerbose(0, "VBoxCredProvCredential::GetSerialization: Local computer name=%ls\n",
     843                                wszComputerName);
     844        }
     845        else
     846            hr = HRESULT_FROM_WIN32(GetLastError());
     847    }
     848
     849    if (SUCCEEDED(hr))
     850    {
    812851        /* Fill in the username and password. */
    813852        if (SUCCEEDED(hr))
     
    844883                    }
    845884
    846                     if (SUCCEEDED(hr))
    847                     {
    848                         /* Allocate copies of, and package, the strings in a binary blob. */
     885                    if (SUCCEEDED(hr)) /* Build the logon package. */
    849886                        hr = AllocateLogonPackage(KerberosUnlockLogon,
    850887                                                  &pcpCredentialSerialization->rgbSerialization,
    851888                                                  &pcpCredentialSerialization->cbSerialization);
    852                     }
    853889
    854890                    if (SUCCEEDED(hr))
     
    900936        }
    901937    }
    902     else
    903         hr = HRESULT_FROM_WIN32(GetLastError());
    904 
    905     VBoxCredProvVerbose(0, "VBoxCredProvCredential: GetSerialization: Returned 0x%08x\n", hr);
     938
     939    VBoxCredProvVerbose(0, "VBoxCredProvCredential::GetSerialization returned hr=0x%08x\n", hr);
    906940    return hr;
    907941}
     
    914948 * being disabled.
    915949 */
    916 HRESULT VBoxCredProvCredential::ReportResult(NTSTATUS                         ntsStatus,
    917                                              NTSTATUS                         ntsSubstatus,
     950HRESULT VBoxCredProvCredential::ReportResult(NTSTATUS                         ntStatus,
     951                                             NTSTATUS                         ntSubStatus,
    918952                                             PWSTR                           *ppwszOptionalStatusText,
    919953                                             CREDENTIAL_PROVIDER_STATUS_ICON *pcpsiOptionalStatusIcon)
     
    923957     * this function can't fail
    924958     */
     959    VBoxCredProvVerbose(0, "VBoxCredProvCredential::ReportResult: ntStatus=%ld, ntSubStatus=%ld\n",
     960                        ntStatus, ntSubStatus);
    925961    return S_OK;
    926962}
  • trunk/src/VBox/Additions/WINNT/VBoxCredProv/VBoxCredProvCredential.h

    r40271 r40393  
    4343    public:
    4444
    45         VBoxCredProvCredential(VBoxCredProvProvider *pProvider);
     45        VBoxCredProvCredential(void);
    4646
    4747        virtual ~VBoxCredProvCredential(void);
     
    8181                                         PWSTR                                         *ppwszOptionalStatusText,
    8282                                         CREDENTIAL_PROVIDER_STATUS_ICON               *pcpsiOptionalStatusIcon);
    83         IFACEMETHODIMP ReportResult(NTSTATUS                         ntsStatus,
    84                                     NTSTATUS                         ntsSubstatus,
     83        IFACEMETHODIMP ReportResult(NTSTATUS                         ntStatus,
     84                                    NTSTATUS                         ntSubStatus,
    8585                                    PWSTR*                           ppwszOptionalStatusText,
    8686                                    CREDENTIAL_PROVIDER_STATUS_ICON* pcpsiOptionalStatusIcon);
     
    8888    public:
    8989
    90         void Reset(void);
     90        HRESULT Reset(void);
    9191        HRESULT Initialize(CREDENTIAL_PROVIDER_USAGE_SCENARIO cpus);
    9292        int RetrieveCredentials(void);
     
    102102    private:
    103103
    104         /** Pointer to parent. */
    105         VBoxCredProvProvider                 *m_pProvider;
    106104        /** Internal reference count. */
    107         ULONG                                 m_cRefCount;
     105        LONG                                  m_cRefCount;
    108106        /** The usage scenario for which we were enumerated. */
    109107        CREDENTIAL_PROVIDER_USAGE_SCENARIO    m_cpUS;
  • trunk/src/VBox/Additions/WINNT/VBoxCredProv/VBoxCredProvFactory.cpp

    r40271 r40393  
    3535ULONG VBoxCredProvFactory::AddRef(void)
    3636{
    37     VBoxCredProvVerbose(0, "VBoxCredProvFactory: Increasing reference from %ld to %ld\n",
    38                         m_cRefCount, m_cRefCount + 1);
    39 
    40     return m_cRefCount++;
     37    LONG cRefCount = InterlockedIncrement(&m_cRefCount);
     38    VBoxCredProvVerbose(0, "VBoxCredProvFactory: AddRef: Returning refcount=%ld\n",
     39                        cRefCount);
     40    return cRefCount;
    4141}
    4242
    4343ULONG VBoxCredProvFactory::Release(void)
    4444{
    45     VBoxCredProvVerbose(0, "VBoxCredProvFactory: Decreasing reference from %ld to %ld\n",
    46                         m_cRefCount, m_cRefCount - 1);
    47 
    48     ULONG cRefCount = --m_cRefCount;
     45    LONG cRefCount = InterlockedDecrement(&m_cRefCount);
     46    VBoxCredProvVerbose(0, "VBoxCredProvFactory: Release: Returning refcount=%ld\n",
     47                        cRefCount);
    4948    if (!cRefCount)
    5049    {
     
    5756HRESULT VBoxCredProvFactory::QueryInterface(REFIID interfaceID, void **ppvInterface)
    5857{
     58    VBoxCredProvVerbose(0, "VBoxCredProvFactory: QueryInterface\n");
     59
    5960    HRESULT hr = S_OK;
    6061    if (ppvInterface)
  • trunk/src/VBox/Additions/WINNT/VBoxCredProv/VBoxCredProvFactory.h

    r40271 r40393  
    4747    private:
    4848
    49         ULONG m_cRefCount;
     49        LONG m_cRefCount;
    5050        friend HRESULT VBoxCredentialProviderCreate(REFCLSID rclsid, REFIID riid, void** ppv);
    5151};
  • trunk/src/VBox/Additions/WINNT/VBoxCredProv/VBoxCredProvPoller.cpp

    r40271 r40393  
    3939VBoxCredProvPoller::~VBoxCredProvPoller(void)
    4040{
     41    VBoxCredProvVerbose(0, "VBoxCredProvPoller: Destroying ...\n");
     42
    4143    Shutdown();
    4244}
     
    5254    if (m_hThreadPoller != NIL_RTTHREAD)
    5355    {
    54         VBoxCredProvVerbose(0, "VBoxCredProvPoller: Thread already running, returning!\n");
     56        VBoxCredProvVerbose(0, "VBoxCredProvPoller: Thread already running, returning\n");
    5557        return VINF_SUCCESS;
    5658    }
     
    5860    if (m_pProv != NULL)
    5961        m_pProv->Release();
     62
    6063    m_pProv = pProvider;
    61     AssertPtr(m_pProv);
     64    /*
     65     * We must not add a reference via AddRef() here, otherwise
     66     * the credential provider does not get destructed properly.
     67     * In order to get this thread terminated normally the credential
     68     * provider has to call Shutdown().
     69     */
    6270
    6371    /* Create the poller thread. */
     
    8593        /* Wait until the thread has terminated. */
    8694        rc = RTThreadWait(m_hThreadPoller, RT_INDEFINITE_WAIT, NULL);
    87         VBoxCredProvVerbose(0, "VBoxCredProvPoller: Thread has (probably) terminated (rc=%Rrc)\n", rc);
     95        if (RT_FAILURE(rc))
     96            VBoxCredProvVerbose(0, "VBoxCredProvPoller: Wait returned error rc=%Rrc\n", rc);
    8897    }
    8998    else
    90     {
    91         /* Failed to signal the thread - very unlikely - so no point in waiting long. */
    92         VBoxCredProvVerbose(0, "VBoxCredProvPoller::Shutdown: Failed to signal semaphore, rc=%Rrc\n", rc);
    93         rc = RTThreadWait(m_hThreadPoller, 100, NULL);
    94         VBoxCredProvVerbose(0, "VBoxCredProvPoller::Shutdown: Thread has terminated? Wait rc=%Rrc\n", rc);
    95     }
     99        VBoxCredProvVerbose(0, "VBoxCredProvPoller: Error waiting for thread shutdown, rc=%Rrc\n", rc);
    96100
     101    m_pProv = NULL;
    97102    m_hThreadPoller = NIL_RTTHREAD;
     103
     104    VBoxCredProvVerbose(0, "VBoxCredProvPoller: Shutdown returned with rc=%Rrc\n", rc);
    98105    return rc;
    99106}
  • trunk/src/VBox/Additions/WINNT/VBoxCredProv/VBoxCredProvProvider.cpp

    r40271 r40393  
    3030    m_pPoller(NULL),
    3131    m_pCred(NULL),
    32     m_pCredProvEvents(NULL),
    33     m_fGotCredentials(false),
     32    m_pEvents(NULL),
    3433    m_fHandleRemoteSessions(false)
    3534{
    36     LONG cRefCount = VBoxCredentialProviderAcquire();
     35    VBoxCredentialProviderAcquire();
    3736
    3837    VBoxCredProvReportStatus(VBoxGuestFacilityStatus_Init);
     
    4241VBoxCredProvProvider::~VBoxCredProvProvider(void)
    4342{
     43    VBoxCredProvVerbose(0, "VBoxCredProv: Destroying\n");
     44
    4445    if (m_pCred)
    4546    {
     
    5556    }
    5657
    57     ULONG cRefCount = VBoxCredentialProviderRefCount();
    58     VBoxCredProvVerbose(0, "VBoxCredProv: Destroying (global DLL refcount=%ld)\n", cRefCount);
    59 
    6058    VBoxCredProvReportStatus(VBoxGuestFacilityStatus_Terminated);
    6159
     
    6765ULONG VBoxCredProvProvider::AddRef(void)
    6866{
    69     VBoxCredProvVerbose(0, "VBoxCredProv: Increasing reference from %ld to %ld\n",
    70                         m_cRefCount, m_cRefCount + 1);
    71 
    72     return m_cRefCount++;
     67    LONG cRefCount = InterlockedIncrement(&m_cRefCount);
     68    VBoxCredProvVerbose(0, "VBoxCredProv: AddRef: Returning refcount=%ld\n",
     69                        cRefCount);
     70    return cRefCount;
    7371}
    7472
     
    7674ULONG VBoxCredProvProvider::Release(void)
    7775{
    78     Assert(m_cRefCount);
    79 
    80     VBoxCredProvVerbose(0, "VBoxCredProv: Decreasing reference from %ld to %ld\n",
    81                         m_cRefCount, m_cRefCount - 1);
    82 
    83     ULONG cRefCount = --m_cRefCount;
     76    LONG cRefCount = InterlockedDecrement(&m_cRefCount);
     77    VBoxCredProvVerbose(0, "VBoxCredProv: Release: Returning refcount=%ld\n",
     78                        cRefCount);
    8479    if (!cRefCount)
    8580    {
     
    203198    HRESULT hr = S_OK;
    204199    DWORD dwErr;
     200
     201    VBoxCredProvVerbose(0, "VBoxCredProv::SetUsageScenario: cpUS=%d, dwFlags=%ld\n",
     202                        cpUsageScenario, dwFlags);
    205203
    206204    m_cpUsageScenario = cpUsageScenario;
     
    238236            if (!m_pCred)
    239237            {
    240                 m_pCred = new VBoxCredProvCredential(this);
     238                m_pCred = new VBoxCredProvCredential();
    241239                if (m_pCred)
    242240                {
     
    251249            }
    252250
    253             /* If we did fail -> cleanup */
     251            /* If we failed, do some cleanup. */
    254252            if (FAILED(hr))
    255253            {
     
    275273    }
    276274
    277     VBoxCredProvVerbose(0, "VBoxCredProv::SetUsageScenario returned hr=0x%08x (cpUS=%d, dwFlags=%ld)\n",
    278                         hr, cpUsageScenario, dwFlags);
     275    VBoxCredProvVerbose(0, "VBoxCredProv::SetUsageScenario returned hr=0x%08x\n", hr);
    279276    return hr;
    280277}
     
    308305                                     UINT_PTR                   upAdviseContext)
    309306{
    310     VBoxCredProvVerbose(0, "VBoxCredProv::Advise\n");
    311 
    312     if (m_pCredProvEvents != NULL)
    313         m_pCredProvEvents->Release();
    314 
    315     m_pCredProvEvents = pcpEvents;
    316     AssertPtr(m_pCredProvEvents);
    317     m_pCredProvEvents->AddRef();
     307    VBoxCredProvVerbose(0, "VBoxCredProv::Advise, pcpEvents=0x%p, upAdviseContext=%u\n",
     308                        pcpEvents, upAdviseContext);
     309    if (m_pEvents)
     310    {
     311        m_pEvents->Release();
     312        m_pEvents = NULL;
     313    }
     314
     315    m_pEvents = pcpEvents;
     316    if (m_pEvents)
     317        m_pEvents->AddRef();
    318318
    319319    /*
     
    329329HRESULT VBoxCredProvProvider::UnAdvise(void)
    330330{
    331     VBoxCredProvVerbose(0, "VBoxCredProv::UnAdvise\n");
    332     if (m_pCredProvEvents != NULL)
    333     {
    334         m_pCredProvEvents->Release();
    335         m_pCredProvEvents = NULL;
     331    VBoxCredProvVerbose(0, "VBoxCredProv::UnAdvise: pEvents=0x%p\n",
     332                        m_pEvents);
     333    if (m_pEvents)
     334    {
     335        m_pEvents->Release();
     336        m_pEvents = NULL;
    336337    }
    337338
     
    350351HRESULT VBoxCredProvProvider::GetFieldDescriptorCount(DWORD *pdwCount)
    351352{
    352     Assert(pdwCount);
    353     *pdwCount = VBOXCREDPROV_NUM_FIELDS;
    354 
    355     VBoxCredProvVerbose(0, "VBoxCredProv::GetFieldDescriptorCount: %ld\n", *pdwCount);
     353    if (pdwCount)
     354    {
     355        *pdwCount = VBOXCREDPROV_NUM_FIELDS;
     356        VBoxCredProvVerbose(0, "VBoxCredProv::GetFieldDescriptorCount: %ld\n", *pdwCount);
     357    }
    356358    return S_OK;
    357359}
     
    457459    HRESULT hr;
    458460
    459     VBoxCredProvVerbose(0, "VBoxCredProv::GetCredentialAt: Index=%ld, ppCredProvCredential=%p\n", dwIndex, ppCredProvCredential);
     461    VBoxCredProvVerbose(0, "VBoxCredProv::GetCredentialAt: Index=%ld, ppCredProvCredential=0x%p\n",
     462                        dwIndex, ppCredProvCredential);
    460463
    461464    if (!m_pCred)
     
    487490    VBoxCredProvVerbose(0, "VBoxCredProv::OnCredentialsProvided\n");
    488491
    489     if (m_pCredProvEvents != NULL)
    490         m_pCredProvEvents->CredentialsChanged(m_upAdviseContext);
     492    if (m_pEvents)
     493        m_pEvents->CredentialsChanged(m_upAdviseContext);
    491494}
    492495
  • trunk/src/VBox/Additions/WINNT/VBoxCredProv/VBoxCredProvProvider.h

    r40271 r40393  
    7575
    7676        /** Interface reference count. */
    77         ULONG                                    m_cRefCount;
     77        LONG                                     m_cRefCount;
    7878        /** Our one and only credential. */
    7979        VBoxCredProvCredential                  *m_pCred;
     
    8181        VBoxCredProvPoller                      *m_pPoller;
    8282        /** Used to tell our owner to re-enumerate credentials. */
    83         ICredentialProviderEvents               *m_pCredProvEvents;
     83        ICredentialProviderEvents               *m_pEvents;
    8484        /** Used to tell our owner who we are when asking to re-enumerate credentials. */
    8585        UINT_PTR                                 m_upAdviseContext;
    8686        /** Saved usage scenario. */
    8787        CREDENTIAL_PROVIDER_USAGE_SCENARIO       m_cpUsageScenario;
    88         /** Flag indicating we got some credentials to work with. */
    89         bool                                     m_fGotCredentials;
    9088        /** Flag whether we need to handle remote session over Windows Remote
    9189         *  Desktop Service. */
  • trunk/src/VBox/Additions/WINNT/VBoxCredProv/VBoxCredentialProvider.cpp

    r40271 r40393  
    3333*   Global Variables                                                           *
    3434*******************************************************************************/
    35 static LONG g_cDllRefCount = 0;        /* Global DLL reference count. */
    36 HINSTANCE g_hDllInst      = NULL;     /* Global DLL hInstance. */
     35static LONG g_cDllRefCount  = 0;        /* Global DLL reference count. */
     36static HINSTANCE g_hDllInst = NULL;     /* Global DLL hInstance. */
    3737
    3838
     
    5656            if (RT_SUCCESS(rc))
    5757            {
    58                 VBoxCredProvVerbose(0, "VBoxCredProv: v%s r%s (%s %s) loaded\n",
     58                VBoxCredProvVerbose(0, "VBoxCredProv: v%s r%s (%s %s) loaded (refs=%ld)\n",
    5959                                    RTBldCfgVersion(), RTBldCfgRevisionStr(),
    60                                     __DATE__, __TIME__);
     60                                    __DATE__, __TIME__, g_cDllRefCount);
    6161            }
    6262
     
    6767        case DLL_PROCESS_DETACH:
    6868
    69             VbglR3Term();
     69            if (!g_cDllRefCount)
     70                VbglR3Term();
    7071            break;
    7172
     
    8283 * Increments the reference count by one. Must be released
    8384 * with VBoxCredentialProviderRelease() when finished.
    84  *
    85  * @return  LONG                The current referecne count.
    8685 */
    87 LONG VBoxCredentialProviderAcquire(void)
     86void VBoxCredentialProviderAcquire(void)
    8887{
    89     VBoxCredProvVerbose(0, "VBoxCredProv: Increasing global refcount to %ld\n",
    90                         g_cDllRefCount + 1);
    91     return InterlockedIncrement(&g_cDllRefCount);
     88    LONG cRefCount = InterlockedIncrement(&g_cDllRefCount);
     89    VBoxCredProvVerbose(0, "VBoxCredentialProviderAcquire: Increasing global refcount to %ld\n",
     90                        cRefCount);
    9291}
    9392
     
    9594/**
    9695 * Decrements the reference count by one.
    97  *
    98  * @return  LONG                The current referecne count.
    9996 */
    100 LONG VBoxCredentialProviderRelease(void)
     97void VBoxCredentialProviderRelease(void)
    10198{
    102     VBoxCredProvVerbose(0, "VBoxCredProv: Decreasing global refcount to %ld\n",
    103                         g_cDllRefCount - 1);
    104     return InterlockedDecrement(&g_cDllRefCount);
     99    LONG cRefCount = InterlockedDecrement(&g_cDllRefCount);
     100    VBoxCredProvVerbose(0, "VBoxCredentialProviderRelease: Decreasing global refcount to %ld\n",
     101                        cRefCount);
    105102}
    106103
  • trunk/src/VBox/Additions/WINNT/VBoxCredProv/VBoxCredentialProvider.h

    r40271 r40393  
    7171
    7272/** Prototypes. */
    73 LONG VBoxCredentialProviderAcquire(void);
    74 LONG VBoxCredentialProviderRelease(void);
     73void VBoxCredentialProviderAcquire(void);
     74void VBoxCredentialProviderRelease(void);
    7575LONG VBoxCredentialProviderRefCount(void);
    7676
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette