You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
556 lines
14 KiB
556 lines
14 KiB
//////////////////////////////////////////////////////////////////////
|
|
// NetSecProv.h : Declaration of the CNetSecProv
|
|
// Copyright (c)1997-2001 Microsoft Corporation
|
|
//
|
|
// this is the Network Security WMI provider for SCE
|
|
// Original Create Date: 2/19/2001
|
|
// Original Author: shawnwu
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#pragma once
|
|
|
|
#include "globals.h"
|
|
|
|
using namespace std;
|
|
|
|
typedef LPVOID * PPVOID;
|
|
|
|
//
|
|
// forward declaration to use these two interface inside function declaration
|
|
//
|
|
|
|
interface ISceKeyChain;
|
|
|
|
interface IIPSecObjectImpl;
|
|
|
|
|
|
/*
|
|
|
|
Class CCriticalSection
|
|
|
|
Naming:
|
|
|
|
CCriticalSection stands for Critical Section.
|
|
|
|
Base class:
|
|
|
|
None.
|
|
|
|
Purpose of class:
|
|
|
|
Wrapper of Critical section object. This trivial helper at least do two
|
|
things:
|
|
|
|
(1) Critical section initialization and deletion will be automatic.
|
|
|
|
(2) Helps to easily create a unique global stack variable of a critical
|
|
section. Don't need to worry about creation time any more.
|
|
|
|
Design:
|
|
|
|
Trivial. Just the initialization inside constructor and deletion inside
|
|
destructor, plus a pair of Enter and Leave functions.
|
|
|
|
|
|
Use:
|
|
|
|
(1) Create an instance if you need to do so. Otherwise, just reference the
|
|
already created one.
|
|
|
|
(2) Call Enter just as you would do with EnterCriticalSection when you need
|
|
protected access to global objects.
|
|
|
|
(3) Call Leave just as you would do with LeaveCriticalSection when you are
|
|
done with the protected global objects.
|
|
|
|
Notes:
|
|
|
|
|
|
|
|
class CCriticalSection
|
|
{
|
|
public:
|
|
CCriticalSection()
|
|
{
|
|
::InitializeCriticalSection(&m_cs);
|
|
}
|
|
|
|
~CCriticalSection()
|
|
{
|
|
::DeleteCriticalSection(&m_cs);
|
|
}
|
|
|
|
void Enter()
|
|
{
|
|
::EnterCriticalSection(&m_cs);
|
|
}
|
|
|
|
void Leave()
|
|
{
|
|
::LeaveCriticalSection(&m_cs);
|
|
}
|
|
|
|
private:
|
|
|
|
CRITICAL_SECTION m_cs;
|
|
};
|
|
*/
|
|
|
|
|
|
//
|
|
// Two helper functions
|
|
//
|
|
|
|
//
|
|
// $undone:shawnwu, need work on refining this pulling implementation.
|
|
// We should do a pushing to enhance performance of the globals
|
|
//
|
|
|
|
// void UpdateGlobals(IWbemServices* pNamespace, IWbemContext* pCtx);
|
|
|
|
//
|
|
// To support testing. Since IPSec's operations may render the system
|
|
// totally unusable, during development, we will be so much better off
|
|
// if we can do (thus test) everything except the last step, which is
|
|
// to put/delete object to/from SPD.
|
|
//
|
|
|
|
|
|
/*
|
|
|
|
Class CDefWbemService
|
|
|
|
Naming:
|
|
|
|
CDefWbemService stands for Default Wbem Service.
|
|
|
|
Base class:
|
|
|
|
(1) CComObjectRootEx: for threading model and IUnknown.
|
|
|
|
(2) IWbemServices: the purpose of the class. We don't want to
|
|
the real provider to have so many dummy functions to confuse
|
|
ourselves. We thus implement all of those that we don't want
|
|
to implement in our final provider class.
|
|
|
|
Purpose of class:
|
|
|
|
Implements all functions (to not supported) so that the its derived class
|
|
is no longer crowded by all these functions. This cleans up our real
|
|
provider's implmentation.
|
|
|
|
Design:
|
|
|
|
(1) return WBEM_E_NOT_SUPPORTED for all the functions of IWbemServices.
|
|
|
|
(2) Inherit from CComObjectRootEx to get the threading model and IUnknown.
|
|
|
|
|
|
Use:
|
|
|
|
(1) This is only for our provider class to inherit. You will never use it
|
|
directly other than deriving from it.
|
|
|
|
Notes:
|
|
|
|
|
|
*/
|
|
|
|
class ATL_NO_VTABLE CDefWbemService
|
|
:
|
|
public CComObjectRootEx<CComMultiThreadModel>,
|
|
public IWbemServices
|
|
{
|
|
public:
|
|
|
|
DECLARE_NOT_AGGREGATABLE(CDefWbemService)
|
|
|
|
DECLARE_PROTECT_FINAL_CONSTRUCT()
|
|
|
|
BEGIN_COM_MAP(CDefWbemService)
|
|
COM_INTERFACE_ENTRY(IWbemServices)
|
|
END_COM_MAP()
|
|
|
|
public:
|
|
|
|
STDMETHOD(OpenNamespace)(
|
|
IN const BSTR Namespace,
|
|
IN long lFlags,
|
|
IN IWbemContext * pCtx,
|
|
IN OUT IWbemServices ** ppWorkingNamespace,
|
|
IN OUT IWbemCallResult ** ppResult
|
|
)
|
|
{
|
|
return WBEM_E_NOT_SUPPORTED;
|
|
}
|
|
|
|
STDMETHOD(CancelAsyncCall) (
|
|
IN IWbemObjectSink * pSink
|
|
)
|
|
{
|
|
return WBEM_E_NOT_SUPPORTED;
|
|
}
|
|
|
|
STDMETHOD(QueryObjectSink) (
|
|
IN long lFlags,
|
|
IN OUT IWbemObjectSink ** pSink
|
|
)
|
|
{
|
|
return WBEM_E_NOT_SUPPORTED;
|
|
}
|
|
|
|
STDMETHOD(GetObject) (
|
|
IN const BSTR ObjectPath,
|
|
IN long lFlags,
|
|
IN IWbemContext * pCtx,
|
|
IN OUT IWbemClassObject ** ppObject,
|
|
IN OUT IWbemCallResult ** ppCallResult
|
|
)
|
|
{
|
|
return WBEM_E_NOT_SUPPORTED;
|
|
}
|
|
|
|
STDMETHOD(GetObjectAsync) (
|
|
IN const BSTR ObjectPath,
|
|
IN long lFlags,
|
|
IN IWbemContext * pCtx,
|
|
IN IWbemObjectSink * pSink
|
|
)
|
|
{
|
|
return WBEM_E_NOT_SUPPORTED;
|
|
}
|
|
|
|
STDMETHOD(PutClass) (
|
|
IN IWbemClassObject * pObject,
|
|
IN long lFlags,
|
|
IN IWbemContext * pCtx,
|
|
IN OUT IWbemCallResult ** ppCallResult
|
|
)
|
|
{
|
|
return WBEM_E_NOT_SUPPORTED;
|
|
}
|
|
|
|
STDMETHOD(PutClassAsync) (
|
|
IN IWbemClassObject * pObject,
|
|
IN long lFlags,
|
|
IN IWbemContext * pCtx,
|
|
IN IWbemObjectSink * pSink
|
|
)
|
|
{
|
|
return WBEM_E_NOT_SUPPORTED;
|
|
}
|
|
|
|
STDMETHOD(DeleteClass) (
|
|
IN const BSTR Class,
|
|
IN long lFlags,
|
|
IN IWbemContext * pCtx,
|
|
IN OUT IWbemCallResult ** ppCallResult
|
|
)
|
|
{
|
|
return WBEM_E_NOT_SUPPORTED;
|
|
}
|
|
|
|
STDMETHOD(DeleteClassAsync)(
|
|
IN const BSTR Class,
|
|
IN long lFlags,
|
|
IN IWbemContext * pCtx,
|
|
IN IWbemObjectSink * pSink
|
|
)
|
|
{
|
|
return WBEM_E_NOT_SUPPORTED;
|
|
}
|
|
|
|
STDMETHOD(CreateClassEnum) (
|
|
IN const BSTR Superclass,
|
|
IN long lFlags,
|
|
IN IWbemContext * pCtx,
|
|
OUT IEnumWbemClassObject ** ppEnum
|
|
)
|
|
{
|
|
return WBEM_E_NOT_SUPPORTED;
|
|
}
|
|
|
|
STDMETHOD(CreateClassEnumAsync) (
|
|
IN const BSTR Superclass,
|
|
IN long lFlags,
|
|
IN IWbemContext * pCtx,
|
|
IN IWbemObjectSink * pResponseHandler
|
|
)
|
|
{
|
|
return WBEM_E_NOT_SUPPORTED;
|
|
}
|
|
|
|
STDMETHOD(PutInstance)(
|
|
IN IWbemClassObject * pInst,
|
|
IN long lFlags,
|
|
IN IWbemContext * pCtx,
|
|
OUT IWbemCallResult ** ppCallResult
|
|
)
|
|
{
|
|
return WBEM_E_NOT_SUPPORTED;
|
|
}
|
|
|
|
STDMETHOD(PutInstanceAsync) (
|
|
IN IWbemClassObject * pInst,
|
|
IN long lFlags,
|
|
IN IWbemContext * pCtx,
|
|
IN IWbemObjectSink * pSink
|
|
)
|
|
{
|
|
return WBEM_E_NOT_SUPPORTED;
|
|
}
|
|
|
|
STDMETHOD(DeleteInstanceAsync) (
|
|
IN const BSTR ObjectPath,
|
|
IN long lFlags,
|
|
IN IWbemContext * pCtx,
|
|
IN IWbemObjectSink * pSink
|
|
)
|
|
{
|
|
return WBEM_E_NOT_SUPPORTED;
|
|
}
|
|
|
|
STDMETHOD(DeleteInstance) (
|
|
IN const BSTR ObjectPath,
|
|
IN long lFlags,
|
|
IN IWbemContext * pCtx,
|
|
OUT IWbemCallResult ** ppCallResult
|
|
)
|
|
{
|
|
return WBEM_E_NOT_SUPPORTED;
|
|
}
|
|
|
|
STDMETHOD(CreateInstanceEnum)(
|
|
IN const BSTR Class,
|
|
IN long lFlags,
|
|
IN IWbemContext * pCtx,
|
|
OUT IEnumWbemClassObject ** ppEnum
|
|
)
|
|
{
|
|
return WBEM_E_NOT_SUPPORTED;
|
|
}
|
|
|
|
STDMETHOD(CreateInstanceEnumAsync) (
|
|
IN const BSTR Class,
|
|
IN long lFlags,
|
|
IN IWbemContext * pCtx,
|
|
IN IWbemObjectSink * pSink
|
|
)
|
|
{
|
|
return WBEM_E_NOT_SUPPORTED;
|
|
}
|
|
|
|
STDMETHOD(ExecQuery) (
|
|
IN const BSTR QueryLanguage,
|
|
IN const BSTR Query,
|
|
IN long lFlags,
|
|
IN IWbemContext * pCtx,
|
|
OUT IEnumWbemClassObject ** ppEnum
|
|
)
|
|
{
|
|
return WBEM_E_NOT_SUPPORTED;
|
|
}
|
|
|
|
STDMETHOD(ExecQueryAsync) (
|
|
IN const BSTR QueryLanguage,
|
|
IN const BSTR Query,
|
|
IN long lFlags,
|
|
IN IWbemContext * pCtx,
|
|
IN IWbemObjectSink * pSink
|
|
)
|
|
{
|
|
return WBEM_E_NOT_SUPPORTED;
|
|
}
|
|
|
|
STDMETHOD(ExecNotificationQuery) (
|
|
IN const BSTR QueryLanguage,
|
|
IN const BSTR Query,
|
|
IN long lFlags,
|
|
IN IWbemContext * pCtx,
|
|
OUT IEnumWbemClassObject ** ppEnum
|
|
)
|
|
{
|
|
return WBEM_E_NOT_SUPPORTED;
|
|
}
|
|
|
|
STDMETHOD(ExecNotificationQueryAsync) (
|
|
IN const BSTR QueryLanguage,
|
|
IN const BSTR Query,
|
|
IN long lFlags,
|
|
IN IWbemContext * pCtx,
|
|
IN IWbemObjectSink * pSink
|
|
)
|
|
{
|
|
return WBEM_E_NOT_SUPPORTED;
|
|
}
|
|
|
|
STDMETHOD(ExecMethod) (
|
|
IN const BSTR,
|
|
IN const BSTR,
|
|
IN long,
|
|
IN IWbemContext*,
|
|
IN IWbemClassObject*,
|
|
IN IWbemClassObject**,
|
|
IN IWbemCallResult**
|
|
)
|
|
{
|
|
return WBEM_E_NOT_SUPPORTED;
|
|
}
|
|
|
|
STDMETHOD(ExecMethodAsync) (
|
|
IN const BSTR,
|
|
IN const BSTR,
|
|
IN long,
|
|
IN IWbemContext*,
|
|
IN IWbemClassObject*,
|
|
IN IWbemObjectSink*
|
|
)
|
|
{
|
|
return WBEM_E_NOT_SUPPORTED;
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
/*
|
|
|
|
Class CNetSecProv
|
|
|
|
Naming:
|
|
|
|
CNetSecProv stands for Network Security Provider.
|
|
|
|
Base class:
|
|
|
|
(1) CDefWbemService: for threading model and IUnknown, and those functions that we
|
|
are not interested at all.
|
|
|
|
(2) CComCoClass: for class factory support. This is necessary to be
|
|
a provider because we need to be an externally createable class.
|
|
|
|
(3) IWbemProviderInit: Allow initialization. Necessary as a provider.
|
|
|
|
(4) IWbemServices: indirectly from CDefWbemService.
|
|
|
|
Purpose of class:
|
|
|
|
This is the provider that WMI sees.
|
|
|
|
Design:
|
|
|
|
(1) Implements those functions of IWbemServices that we are interested in,
|
|
plus two static helpers functions for key chain creation. Extremely simple design.
|
|
|
|
|
|
Use:
|
|
|
|
(1) You will never create an instance directly yourself. It's created by WMI.
|
|
|
|
(2) Call the static functions as you need them.
|
|
|
|
Notes:
|
|
|
|
|
|
*/
|
|
|
|
class ATL_NO_VTABLE CNetSecProv :
|
|
public CDefWbemService,
|
|
public CComCoClass<CNetSecProv, &CLSID_NetSecProv>,
|
|
public IWbemProviderInit
|
|
{
|
|
public:
|
|
CNetSecProv()
|
|
{
|
|
}
|
|
|
|
~CNetSecProv()
|
|
{
|
|
}
|
|
|
|
DECLARE_REGISTRY_RESOURCEID(IDR_NETSECPROV)
|
|
DECLARE_NOT_AGGREGATABLE(CNetSecProv)
|
|
|
|
DECLARE_PROTECT_FINAL_CONSTRUCT()
|
|
|
|
BEGIN_COM_MAP(CNetSecProv)
|
|
COM_INTERFACE_ENTRY(IWbemProviderInit)
|
|
COM_INTERFACE_ENTRY_CHAIN(CDefWbemService)
|
|
END_COM_MAP()
|
|
|
|
|
|
public:
|
|
|
|
STDMETHOD(Initialize) (
|
|
IN LPWSTR pszUser,
|
|
IN LONG lFlags,
|
|
IN LPWSTR pszNamespace,
|
|
IN LPWSTR pszLocale,
|
|
IN IWbemServices * pNamespace,
|
|
IN IWbemContext * pCtx,
|
|
IN IWbemProviderInitSink * pInitSink
|
|
);
|
|
|
|
//IWbemServices
|
|
|
|
STDMETHOD(GetObjectAsync) (
|
|
IN const BSTR ObjectPath,
|
|
IN long lFlags,
|
|
IN IWbemContext * pCtx,
|
|
IN IWbemObjectSink * pSink
|
|
);
|
|
|
|
STDMETHOD(PutInstanceAsync) (
|
|
IN IWbemClassObject * pInst,
|
|
IN long lFlags,
|
|
IN IWbemContext * pCtx,
|
|
IN IWbemObjectSink * pSink
|
|
);
|
|
|
|
STDMETHOD(DeleteInstanceAsync) (
|
|
IN const BSTR ObjectPath,
|
|
IN long lFlags,
|
|
IN IWbemContext * pCtx,
|
|
IN IWbemObjectSink * pSink
|
|
);
|
|
|
|
STDMETHOD(CreateInstanceEnumAsync) (
|
|
IN const BSTR Class,
|
|
IN long lFlags,
|
|
IN IWbemContext * pCtx,
|
|
IN IWbemObjectSink * pSink
|
|
);
|
|
|
|
STDMETHOD(ExecQueryAsync) (
|
|
IN const BSTR QueryLanguage,
|
|
IN const BSTR Query,
|
|
IN long lFlags,
|
|
IN IWbemContext * pCtx,
|
|
IN IWbemObjectSink * pSink
|
|
);
|
|
|
|
STDMETHOD(ExecMethodAsync)(
|
|
IN const BSTR bstrPath,
|
|
IN const BSTR bstrMethod,
|
|
IN long Flag,
|
|
IN IWbemContext * pCtx,
|
|
IN IWbemClassObject * pObj,
|
|
IN IWbemObjectSink * pSink
|
|
);
|
|
|
|
static HRESULT GetKeyChainByPath (
|
|
IN LPCWSTR pszPath,
|
|
OUT IIPSecKeyChain ** ppKeyChain
|
|
);
|
|
|
|
static HRESULT GetKeyChainFromQuery (
|
|
IN LPCWSTR pszQuery,
|
|
IN LPCWSTR pszWhereProperty,
|
|
OUT IIPSecKeyChain ** ppKeyChain
|
|
);
|
|
|
|
private:
|
|
|
|
CComPtr<IWbemServices> m_srpNamespace;
|
|
};
|
|
|