352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync/* $Id$ */
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync/** @file
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * VBoxCredentialProvider - Main file of the VirtualBox Credential Provider.
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync */
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync/*
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync * Copyright (C) 2012-2014 Oracle Corporation
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync *
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * available from http://www.virtualbox.org. This file is free software;
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * you can redistribute it and/or modify it under the terms of the GNU
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * General Public License (GPL) as published by the Free Software
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync */
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync/*******************************************************************************
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync* Header Files *
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync*******************************************************************************/
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync#include <windows.h>
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync#include <initguid.h>
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync#include <new> /* For bad_alloc. */
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync
576099bc515c7c7349219499579f5729ffea3c35vboxsync#ifdef VBOX_WITH_SENS
576099bc515c7c7349219499579f5729ffea3c35vboxsync# include <eventsys.h>
576099bc515c7c7349219499579f5729ffea3c35vboxsync# include <sens.h>
576099bc515c7c7349219499579f5729ffea3c35vboxsync# include <Sensevts.h>
576099bc515c7c7349219499579f5729ffea3c35vboxsync#endif
576099bc515c7c7349219499579f5729ffea3c35vboxsync
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync#include <iprt/buildconfig.h>
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync#include <iprt/initterm.h>
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync#ifdef VBOX_WITH_SENS
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync# include <iprt/string.h>
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync#endif
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync#include <VBox/VBoxGuestLib.h>
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync#include "VBoxCredentialProvider.h"
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync#include "VBoxCredProvFactory.h"
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync/*******************************************************************************
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync* Global Variables *
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync*******************************************************************************/
843b8afbce599180500f9d522be54bff1f8a6a18vboxsyncstatic LONG g_cDllRefs = 0; /**< Global DLL reference count. */
843b8afbce599180500f9d522be54bff1f8a6a18vboxsyncstatic HINSTANCE g_hDllInst = NULL; /**< Global DLL hInstance. */
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync#ifdef VBOX_WITH_SENS
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsyncstatic bool g_fSENSEnabled = false;
843b8afbce599180500f9d522be54bff1f8a6a18vboxsyncstatic IEventSystem *g_pIEventSystem = NULL; /**< Pointer to IEventSystem interface. */
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync/**
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync * Subscribed SENS events.
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync */
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsyncstatic struct VBOXCREDPROVSENSEVENTS
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync{
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync /** The actual method name the subscription is for. */
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync char *pszMethod;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync /** A friendly name for the subscription. */
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync char *pszSubscriptionName;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync /** The actual subscription UUID.
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync * Should not be changed. */
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync char *pszSubscriptionUUID;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync} g_aSENSEvents[] = {
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync { "Logon", "VBoxCredProv SENS Logon", "{561D0791-47C0-4BC3-87C0-CDC2621EA653}" },
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync { "Logoff", "VBoxCredProv SENS Logoff", "{12B618B1-F2E0-4390-BADA-7EB1DC31A70A}" },
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync { "StartShell", "VBoxCredProv SENS StartShell", "{5941931D-015A-4F91-98DA-81AAE262D090}" },
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync { "DisplayLock", "VBoxCredProv SENS DisplayLock", "{B7E2C510-501A-4961-938F-A458970930D7}" },
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync { "DisplayUnlock", "VBoxCredProv SENS DisplayUnlock", "{11305987-8FFC-41AD-A264-991BD5B7488A}" },
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync { "StartScreenSaver", "VBoxCredProv SENS StartScreenSaver", "{6E2D26DF-0095-4EC4-AE00-2395F09AF7F2}" },
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync { "StopScreenSaver", "VBoxCredProv SENS StopScreenSaver", "{F53426BC-412F-41E8-9A5F-E5FA8A164BD6}" }
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync};
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync/**
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync * Implementation of the ISensLogon interface for getting
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync * SENS (System Event Notification Service) events. SENS must be up
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync * and running on this OS!
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync */
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsyncinterface VBoxCredProvSensLogon : public ISensLogon
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync{
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsyncpublic:
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync VBoxCredProvSensLogon(void) :
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync m_cRefs(1)
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync {
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync }
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync STDMETHODIMP QueryInterface(REFIID interfaceID, void **ppvInterface)
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync {
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync if ( IsEqualIID(interfaceID, IID_IUnknown)
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync || IsEqualIID(interfaceID, IID_IDispatch)
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync || IsEqualIID(interfaceID, IID_ISensLogon))
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync {
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync *ppvInterface = this;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync AddRef();
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync return S_OK;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync }
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync *ppvInterface = NULL;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync return E_NOINTERFACE;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync }
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync ULONG STDMETHODCALLTYPE AddRef(void)
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync {
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync return InterlockedIncrement(&m_cRefs);
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync }
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync ULONG STDMETHODCALLTYPE Release(void)
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync {
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync ULONG ulTemp = InterlockedDecrement(&m_cRefs);
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync return ulTemp;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync }
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync HRESULT STDMETHODCALLTYPE GetTypeInfoCount(unsigned int FAR* pctinfo)
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync {
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync return E_NOTIMPL;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync }
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync HRESULT STDMETHODCALLTYPE GetTypeInfo(unsigned int iTInfo, LCID lcid, ITypeInfo FAR* FAR* ppTInfo)
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync {
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync return E_NOTIMPL;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync }
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid,
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync OLECHAR FAR* FAR* rgszNames, unsigned int cNames,
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync LCID lcid, DISPID FAR* rgDispId)
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync {
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync return E_NOTIMPL;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync }
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags,
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync DISPPARAMS FAR* pDispParams, VARIANT FAR* parResult, EXCEPINFO FAR* pExcepInfo,
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync unsigned int FAR* puArgErr)
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync {
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync return E_NOTIMPL;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync }
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync /* ISensLogon methods */
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync STDMETHODIMP Logon(BSTR bstrUserName)
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync {
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync VBoxCredProvVerbose(0, "VBoxCredProvSensLogon: Logon\n");
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync return S_OK;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync }
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync STDMETHODIMP Logoff(BSTR bstrUserName)
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync {
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync VBoxCredProvVerbose(0, "VBoxCredProvSensLogon: Logoff\n");
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync return S_OK;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync }
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync STDMETHODIMP StartShell(BSTR bstrUserName)
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync {
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync VBoxCredProvVerbose(0, "VBoxCredProvSensLogon: Logon\n");
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync return S_OK;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync }
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync STDMETHODIMP DisplayLock(BSTR bstrUserName)
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync {
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync VBoxCredProvVerbose(0, "VBoxCredProvSensLogon: DisplayLock\n");
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync return S_OK;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync }
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync STDMETHODIMP DisplayUnlock(BSTR bstrUserName)
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync {
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync VBoxCredProvVerbose(0, "VBoxCredProvSensLogon: DisplayUnlock\n");
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync return S_OK;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync }
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync STDMETHODIMP StartScreenSaver(BSTR bstrUserName)
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync {
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync VBoxCredProvVerbose(0, "VBoxCredProvSensLogon: StartScreenSaver\n");
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync return S_OK;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync }
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync STDMETHODIMP StopScreenSaver(BSTR bstrUserName)
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync {
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync VBoxCredProvVerbose(0, "VBoxCredProvSensLogon: StopScreenSaver\n");
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync return S_OK;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync }
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsyncprotected:
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync LONG m_cRefs;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync};
843b8afbce599180500f9d522be54bff1f8a6a18vboxsyncstatic VBoxCredProvSensLogon *g_pISensLogon = NULL;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync/**
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync * Register events to be called by SENS.
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync *
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync * @return HRESULT
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync */
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsyncstatic HRESULT VBoxCredentialProviderRegisterSENS(void)
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync{
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync VBoxCredProvVerbose(0, "VBoxCredentialProviderRegisterSENS\n");
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync HRESULT hr = CoCreateInstance(CLSID_CEventSystem, 0, CLSCTX_SERVER, IID_IEventSystem, (void**)&g_pIEventSystem);
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync if (FAILED(hr))
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync {
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync VBoxCredProvVerbose(0, "VBoxCredentialProviderRegisterSENS: Could not connect to CEventSystem, hr=%Rhrc\n",
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync hr);
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync return hr;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync }
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync try
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync {
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync g_pISensLogon = new VBoxCredProvSensLogon();
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync AssertPtr(g_pISensLogon);
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync }
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync catch (std::bad_alloc &ex)
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync {
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync NOREF(ex);
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync hr = E_OUTOFMEMORY;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync }
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
843b8afbce599180500f9d522be54bff1f8a6a18vboxsync if ( SUCCEEDED(hr)
843b8afbce599180500f9d522be54bff1f8a6a18vboxsync && g_pIEventSystem)
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync {
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync IEventSubscription *pIEventSubscription;
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync int i;
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync for (i = 0; i < RT_ELEMENTS(g_aSENSEvents); i++)
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync {
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync VBoxCredProvVerbose(0, "VBoxCredProv: Registering \"%s\" (%s) ...\n",
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync g_aSENSEvents[i].pszMethod, g_aSENSEvents[i].pszSubscriptionName);
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync hr = CoCreateInstance(CLSID_CEventSubscription, 0, CLSCTX_SERVER, IID_IEventSubscription, (LPVOID*)&pIEventSubscription);
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync if (FAILED(hr))
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync continue;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync hr = pIEventSubscription->put_EventClassID(L"{d5978630-5b9f-11d1-8dd2-00aa004abd5e}" /* SENSGUID_EVENTCLASS_LOGON */);
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync if (FAILED(hr))
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync break;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync hr = pIEventSubscription->put_SubscriberInterface((IUnknown*)g_pISensLogon);
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync if (FAILED(hr))
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync break;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync PRTUTF16 pwszTemp;
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync int rc = RTStrToUtf16(g_aSENSEvents[i].pszMethod, &pwszTemp);
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync if (RT_SUCCESS(rc))
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync {
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync hr = pIEventSubscription->put_MethodName(pwszTemp);
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync RTUtf16Free(pwszTemp);
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync }
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync else
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync hr = ERROR_OUTOFMEMORY;
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync if (FAILED(hr))
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync break;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync rc = RTStrToUtf16(g_aSENSEvents[i].pszSubscriptionName, &pwszTemp);
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync if (RT_SUCCESS(rc))
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync {
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync hr = pIEventSubscription->put_SubscriptionName(pwszTemp);
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync RTUtf16Free(pwszTemp);
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync }
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync else
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync hr = ERROR_OUTOFMEMORY;
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync if (FAILED(hr))
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync break;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync rc = RTStrToUtf16(g_aSENSEvents[i].pszSubscriptionUUID, &pwszTemp);
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync if (RT_SUCCESS(rc))
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync {
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync hr = pIEventSubscription->put_SubscriptionID(pwszTemp);
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync RTUtf16Free(pwszTemp);
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync }
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync else
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync hr = ERROR_OUTOFMEMORY;
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync if (FAILED(hr))
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync break;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync hr = pIEventSubscription->put_PerUser(TRUE);
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync if (FAILED(hr))
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync break;
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync hr = g_pIEventSystem->Store(PROGID_EventSubscription, (IUnknown*)pIEventSubscription);
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync if (FAILED(hr))
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync break;
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync pIEventSubscription->Release();
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync pIEventSubscription = NULL;
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync }
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync if (FAILED(hr))
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync VBoxCredProvVerbose(0, "VBoxCredentialProviderRegisterSENS: Could not register \"%s\" (%s), hr=%Rhrc\n",
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync g_aSENSEvents[i].pszMethod, g_aSENSEvents[i].pszSubscriptionName, hr);
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync if (pIEventSubscription != NULL)
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync pIEventSubscription->Release();
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync }
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync if (FAILED(hr))
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync {
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync VBoxCredProvVerbose(0, "VBoxCredentialProviderRegisterSENS: Error registering SENS provider, hr=%Rhrc\n", hr);
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync if (g_pIEventSystem)
843b8afbce599180500f9d522be54bff1f8a6a18vboxsync {
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync g_pIEventSystem->Release();
843b8afbce599180500f9d522be54bff1f8a6a18vboxsync g_pIEventSystem = NULL;
843b8afbce599180500f9d522be54bff1f8a6a18vboxsync }
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync }
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
843b8afbce599180500f9d522be54bff1f8a6a18vboxsync VBoxCredProvVerbose(0, "VBoxCredentialProviderRegisterSENS: Returning hr=%Rhrc\n", hr);
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync return hr;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync}
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync/**
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync * Unregisters registered SENS events.
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync */
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsyncstatic void VBoxCredentialProviderUnregisterSENS(void)
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync{
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync if (g_pIEventSystem)
843b8afbce599180500f9d522be54bff1f8a6a18vboxsync {
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync g_pIEventSystem->Release();
843b8afbce599180500f9d522be54bff1f8a6a18vboxsync g_pIEventSystem = NULL;
843b8afbce599180500f9d522be54bff1f8a6a18vboxsync }
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync /* We need to reconnecto to the event system because we can be called
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync * in a different context COM can't handle. */
843b8afbce599180500f9d522be54bff1f8a6a18vboxsync HRESULT hr = CoCreateInstance(CLSID_CEventSystem, 0,
843b8afbce599180500f9d522be54bff1f8a6a18vboxsync CLSCTX_SERVER, IID_IEventSystem, (void**)&g_pIEventSystem);
843b8afbce599180500f9d522be54bff1f8a6a18vboxsync if ( SUCCEEDED(hr)
843b8afbce599180500f9d522be54bff1f8a6a18vboxsync && g_pIEventSystem)
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync {
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync VBoxCredProvVerbose(0, "VBoxCredentialProviderUnregisterSENS\n");
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync HRESULT hr;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync for (int i = 0; i < RT_ELEMENTS(g_aSENSEvents); i++)
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync {
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync int iErrorIdX;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync char *pszSubToRemove;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync if (!RTStrAPrintf(&pszSubToRemove, "SubscriptionID=%s",
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync g_aSENSEvents[i].pszSubscriptionUUID))
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync {
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync continue; /* Keep going. */
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync }
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync PRTUTF16 pwszTemp;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync int rc2 = RTStrToUtf16(pszSubToRemove, &pwszTemp);
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync if (RT_SUCCESS(rc2))
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync {
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync hr = g_pIEventSystem->Remove(PROGID_EventSubscription, pwszTemp,
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync &iErrorIdX);
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync RTUtf16Free(pwszTemp);
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync }
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync else
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync hr = ERROR_OUTOFMEMORY;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync if (FAILED(hr))
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync VBoxCredProvVerbose(0, "VBoxCredentialProviderUnregisterSENS: Could not unregister \"%s\" (query: %s), hr=%Rhrc (index: %d)\n",
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync g_aSENSEvents[i].pszMethod, pszSubToRemove, hr, iErrorIdX);
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync /* Keep going. */
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync RTStrFree(pszSubToRemove);
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync }
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync g_pIEventSystem->Release();
843b8afbce599180500f9d522be54bff1f8a6a18vboxsync g_pIEventSystem = NULL;
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync }
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync if (g_pISensLogon)
843b8afbce599180500f9d522be54bff1f8a6a18vboxsync {
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync delete g_pISensLogon;
843b8afbce599180500f9d522be54bff1f8a6a18vboxsync g_pISensLogon = NULL;
843b8afbce599180500f9d522be54bff1f8a6a18vboxsync }
843b8afbce599180500f9d522be54bff1f8a6a18vboxsync
843b8afbce599180500f9d522be54bff1f8a6a18vboxsync VBoxCredProvVerbose(0, "VBoxCredentialProviderUnregisterSENS: Returning hr=%Rhrc\n", hr);
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync}
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync#endif /* VBOX_WITH_SENS */
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsyncBOOL WINAPI DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID pReserved)
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync{
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync NOREF(pReserved);
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync g_hDllInst = hInst;
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync switch (dwReason)
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync {
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync case DLL_PROCESS_ATTACH:
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync {
71955773a7f477f9a159a491f765ba97e1f00e1avboxsync int rc = RTR3InitDll(RTR3INIT_FLAGS_UNOBTRUSIVE);
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync if (RT_SUCCESS(rc))
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync rc = VbglR3Init();
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync if (RT_SUCCESS(rc))
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync {
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync VBoxCredProvVerbose(0, "VBoxCredProv: v%s r%s (%s %s) loaded (refs=%ld)\n",
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync RTBldCfgVersion(), RTBldCfgRevisionStr(),
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync __DATE__, __TIME__, g_cDllRefs);
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync }
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync DisableThreadLibraryCalls(hInst);
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync break;
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync }
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync case DLL_PROCESS_DETACH:
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync VBoxCredProvVerbose(0, "VBoxCredProv: Unloaded (refs=%ld)\n", g_cDllRefs);
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync if (!g_cDllRefs)
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync VbglR3Term();
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync break;
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync case DLL_THREAD_ATTACH:
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync case DLL_THREAD_DETACH:
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync break;
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync default:
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync break;
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync }
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync return TRUE;
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync}
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync/**
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * Increments the reference count by one. Must be released
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * with VBoxCredentialProviderRelease() when finished.
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync */
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsyncvoid VBoxCredentialProviderAcquire(void)
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync{
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync LONG cRefCount = InterlockedIncrement(&g_cDllRefs);
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync VBoxCredProvVerbose(0, "VBoxCredentialProviderAcquire: Increasing global refcount to %ld\n",
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync cRefCount);
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync}
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync/**
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * Decrements the reference count by one.
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync */
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsyncvoid VBoxCredentialProviderRelease(void)
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync{
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync LONG cRefCount = InterlockedDecrement(&g_cDllRefs);
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync VBoxCredProvVerbose(0, "VBoxCredentialProviderRelease: Decreasing global refcount to %ld\n",
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync cRefCount);
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync}
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync/**
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * Returns the current DLL reference count.
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync *
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * @return LONG The current reference count.
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync */
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsyncLONG VBoxCredentialProviderRefCount(void)
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync{
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync return g_cDllRefs;
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync}
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync/**
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * Entry point for determining whether the credential
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * provider DLL can be unloaded or not.
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync *
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * @return HRESULT
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync */
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsyncHRESULT __stdcall DllCanUnloadNow(void)
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync{
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync VBoxCredProvVerbose(0, "DllCanUnloadNow (refs=%ld)\n",
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync g_cDllRefs);
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync#ifdef VBOX_WITH_SENS
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync if (!g_cDllRefs)
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync {
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync if (g_fSENSEnabled)
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync VBoxCredentialProviderUnregisterSENS();
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync CoUninitialize();
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync }
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync#endif
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync return (g_cDllRefs > 0) ? S_FALSE : S_OK;
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync}
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync/**
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * Create the VirtualBox credential provider by creating
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * its factory which then in turn can create instances of the
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * provider itself.
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync *
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * @return HRESULT
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * @param classID The class ID.
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * @param interfaceID The interface ID.
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * @param ppvInterface Receives the interface pointer on successful
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * object creation.
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync */
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsyncHRESULT VBoxCredentialProviderCreate(REFCLSID classID, REFIID interfaceID,
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync void **ppvInterface)
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync{
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync HRESULT hr;
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync if (classID == CLSID_VBoxCredProvider)
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync {
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync try
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync {
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync VBoxCredProvFactory* pFactory = new VBoxCredProvFactory();
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync AssertPtr(pFactory);
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync hr = pFactory->QueryInterface(interfaceID,
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync ppvInterface);
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync pFactory->Release();
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync#ifdef VBOX_WITH_SENS
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync g_fSENSEnabled = true; /* By default SENS support is enabled. */
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync HKEY hKey;
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync /** @todo Add some registry wrapper function(s) as soon as we got more values to retrieve. */
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync DWORD dwRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Oracle\\VirtualBox Guest Additions\\AutoLogon",
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync 0L, KEY_QUERY_VALUE, &hKey);
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync if (dwRet == ERROR_SUCCESS)
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync {
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync DWORD dwValue;
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync DWORD dwType = REG_DWORD;
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync DWORD dwSize = sizeof(DWORD);
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync dwRet = RegQueryValueEx(hKey, L"HandleSENS", NULL, &dwType, (LPBYTE)&dwValue, &dwSize);
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync if ( dwRet == ERROR_SUCCESS
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync && dwType == REG_DWORD
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync && dwSize == sizeof(DWORD))
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync {
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync g_fSENSEnabled = RT_BOOL(dwValue);
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync }
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync RegCloseKey(hKey);
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync }
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync VBoxCredProvVerbose(0, "VBoxCredentialProviderCreate: g_fSENSEnabled=%RTbool\n",
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync g_fSENSEnabled);
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync if ( SUCCEEDED(hr)
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync && g_fSENSEnabled)
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync {
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync VBoxCredentialProviderRegisterSENS();
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync }
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync#else
82439a7f18027a77f179cbff437c1c9012d20ba8vboxsync VBoxCredProvVerbose(0, "VBoxCredentialProviderCreate: SENS support is disabled\n");
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync#endif
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync }
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync catch (std::bad_alloc &ex)
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync {
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync NOREF(ex);
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync hr = E_OUTOFMEMORY;
9dfe45f98c4eace98447efa6bead6f5d23454e27vboxsync }
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync }
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync else
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync hr = CLASS_E_CLASSNOTAVAILABLE;
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync return hr;
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync}
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync/**
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * Entry point for getting the actual credential provider
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * class object.
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync *
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * @return HRESULT
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * @param classID The class ID.
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * @param interfaceID The interface ID.
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * @param ppvInterface Receives the interface pointer on successful
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync * object creation.
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync */
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsyncHRESULT __stdcall DllGetClassObject(REFCLSID classID, REFIID interfaceID,
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync void **ppvInterface)
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync{
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync VBoxCredProvVerbose(0, "DllGetClassObject (refs=%ld)\n",
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync g_cDllRefs);
6da8aad9b9f0e2aa239259658e3d82073f5761e4vboxsync
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync return VBoxCredentialProviderCreate(classID, interfaceID, ppvInterface);
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync}
352bb6b9d2fa1f7df7797f50c58e297ac37059a2vboxsync