488 lines
11 KiB
C++
488 lines
11 KiB
C++
//+--------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1996 - 1999
|
|
//
|
|
// File: manage.cpp
|
|
//
|
|
// Contents: Cert Server Policy & Exit manage module callouts
|
|
//
|
|
// History: 10-Sept-98 mattt created
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
|
|
#include <pch.cpp>
|
|
|
|
#pragma hdrstop
|
|
|
|
#include "csdisp.h"
|
|
#include "csprop.h"
|
|
|
|
#define __dwFILE__ __dwFILE_CERTLIB_MANAGE_CPP__
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
// IManageModule dispatch support
|
|
|
|
//+------------------------------------
|
|
// GetProperty method:
|
|
|
|
OLECHAR *managemodule_apszGetProperty[] = {
|
|
TEXT("GetProperty"),
|
|
TEXT("strConfig"),
|
|
TEXT("strStorageLocation"),
|
|
TEXT("strPropertyName"),
|
|
TEXT("Flags"),
|
|
};
|
|
|
|
//+------------------------------------
|
|
// SetProperty method:
|
|
|
|
OLECHAR *managemodule_apszSetProperty[] = {
|
|
TEXT("SetProperty"),
|
|
TEXT("strConfig"),
|
|
TEXT("strStorageLocation"),
|
|
TEXT("strPropertyName"),
|
|
TEXT("Flags"),
|
|
TEXT("pvarProperty"),
|
|
};
|
|
|
|
//+------------------------------------
|
|
// Configure method:
|
|
|
|
OLECHAR *managemodule_apszConfigure[] = {
|
|
TEXT("Configure"),
|
|
TEXT("strConfig"),
|
|
TEXT("strStorageLocation"),
|
|
TEXT("Flags"),
|
|
};
|
|
|
|
|
|
|
|
//+------------------------------------
|
|
// Dispatch Table:
|
|
|
|
DISPATCHTABLE g_adtManageModule[] =
|
|
{
|
|
#define MANAGEMODULE_GETPROPERTY 0
|
|
DECLARE_DISPATCH_ENTRY(managemodule_apszGetProperty)
|
|
|
|
#define MANAGEMODULE_SETPROPERTY 1
|
|
DECLARE_DISPATCH_ENTRY(managemodule_apszSetProperty)
|
|
|
|
#define MANAGEMODULE_CONFIGURE 2
|
|
DECLARE_DISPATCH_ENTRY(managemodule_apszConfigure)
|
|
};
|
|
#define CMANAGEMODULEDISPATCH (ARRAYSIZE(g_adtManageModule))
|
|
|
|
|
|
HRESULT
|
|
ManageModule_GetProperty(
|
|
IN DISPATCHINTERFACE *pdiManage,
|
|
IN WCHAR const *pwszConfig,
|
|
IN WCHAR const *pwszStorageLocation,
|
|
IN WCHAR const *pwszPropertyName,
|
|
IN DWORD dwFlags,
|
|
IN LONG ColumnType,
|
|
OUT VOID *pProperty)
|
|
{
|
|
HRESULT hr;
|
|
BSTR strConfig = NULL;
|
|
BSTR strStorageLocation = NULL;
|
|
BSTR strPropertyName = NULL;
|
|
BOOL fException = FALSE;
|
|
ULONG_PTR ExceptionAddress;
|
|
LONG RetType;
|
|
VARIANT varResult;
|
|
|
|
VariantInit(&varResult);
|
|
CSASSERT(NULL != pdiManage && NULL != pdiManage->pDispatchTable);
|
|
|
|
hr = E_OUTOFMEMORY;
|
|
strConfig = SysAllocString(pwszConfig);
|
|
if (NULL == strConfig)
|
|
{
|
|
_JumpError(hr, error, "SysAllocString");
|
|
}
|
|
strStorageLocation = SysAllocString(pwszStorageLocation);
|
|
if (NULL == strStorageLocation)
|
|
{
|
|
_JumpError(hr, error, "SysAllocString");
|
|
}
|
|
strPropertyName = SysAllocString(pwszPropertyName);
|
|
if (NULL == strPropertyName)
|
|
{
|
|
_JumpError(hr, error, "SysAllocString");
|
|
}
|
|
|
|
switch (ColumnType)
|
|
{
|
|
case PROPTYPE_BINARY:
|
|
case PROPTYPE_STRING:
|
|
RetType = VT_BSTR;
|
|
break;
|
|
|
|
case PROPTYPE_DATE:
|
|
RetType = VT_DATE;
|
|
break;
|
|
|
|
case PROPTYPE_LONG:
|
|
RetType = VT_I4;
|
|
break;
|
|
|
|
default:
|
|
hr = E_INVALIDARG;
|
|
_JumpError(hr, error, "PropertyType");
|
|
}
|
|
|
|
__try
|
|
{
|
|
if (NULL != pdiManage->pDispatch)
|
|
{
|
|
VARIANT avar[4];
|
|
|
|
avar[0].vt = VT_BSTR;
|
|
avar[0].bstrVal = strConfig;
|
|
avar[1].vt = VT_BSTR;
|
|
avar[1].bstrVal = strStorageLocation;
|
|
avar[2].vt = VT_BSTR;
|
|
avar[2].bstrVal = strPropertyName;
|
|
avar[3].vt = VT_I4;
|
|
avar[3].lVal = dwFlags;
|
|
|
|
hr = DispatchInvoke(
|
|
pdiManage,
|
|
MANAGEMODULE_GETPROPERTY,
|
|
ARRAYSIZE(avar),
|
|
avar,
|
|
RetType,
|
|
pProperty);
|
|
_JumpIfError(hr, error, "Invoke(GetName)");
|
|
}
|
|
else
|
|
{
|
|
hr = ((ICertManageModule *) pdiManage->pUnknown)->GetProperty(
|
|
strConfig,
|
|
strStorageLocation,
|
|
strPropertyName,
|
|
dwFlags,
|
|
&varResult);
|
|
_JumpIfError(hr, error, "ICertManageModule::GetProperty");
|
|
|
|
hr = DispatchGetReturnValue(&varResult, RetType, pProperty);
|
|
_JumpIfError2(hr, error, "DispatchGetReturnValue", CERTSRV_E_PROPERTY_EMPTY);
|
|
}
|
|
}
|
|
__except(
|
|
ExceptionAddress = (ULONG_PTR) (GetExceptionInformation())->ExceptionRecord->ExceptionAddress,
|
|
hr = myHEXCEPTIONCODE(),
|
|
EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
_PrintError(hr, "GetProperty: Exception");
|
|
fException = TRUE;
|
|
}
|
|
|
|
error:
|
|
if (NULL != strConfig)
|
|
{
|
|
SysFreeString(strConfig);
|
|
}
|
|
if (NULL != strStorageLocation)
|
|
{
|
|
SysFreeString(strStorageLocation);
|
|
}
|
|
if (NULL != strPropertyName)
|
|
{
|
|
SysFreeString(strPropertyName);
|
|
}
|
|
VariantClear(&varResult);
|
|
return(hr);
|
|
}
|
|
|
|
HRESULT
|
|
ManageModule_SetProperty(
|
|
IN DISPATCHINTERFACE *pdiManage,
|
|
IN WCHAR const *pwszConfig,
|
|
IN WCHAR const *pwszStorageLocation,
|
|
IN WCHAR const *pwszPropertyName,
|
|
IN DWORD dwFlags,
|
|
IN LONG ColumnType,
|
|
IN VOID* pProperty)
|
|
{
|
|
HRESULT hr;
|
|
BSTR strConfig = NULL;
|
|
BSTR strStorageLocation = NULL;
|
|
BSTR strPropertyName = NULL;
|
|
BOOL fException = FALSE;
|
|
ULONG_PTR ExceptionAddress;
|
|
VARIANT varResult;
|
|
|
|
CSASSERT(NULL != pdiManage && NULL != pdiManage->pDispatchTable);
|
|
|
|
hr = E_OUTOFMEMORY;
|
|
strConfig = SysAllocString(pwszConfig);
|
|
if (NULL == strConfig)
|
|
{
|
|
_JumpError(hr, error, "SysAllocString");
|
|
}
|
|
strStorageLocation = SysAllocString(pwszStorageLocation);
|
|
if (NULL == strStorageLocation)
|
|
{
|
|
_JumpError(hr, error, "SysAllocString");
|
|
}
|
|
strPropertyName = SysAllocString(pwszPropertyName);
|
|
if (NULL == strPropertyName)
|
|
{
|
|
_JumpError(hr, error, "SysAllocString");
|
|
}
|
|
|
|
switch (ColumnType)
|
|
{
|
|
case PROPTYPE_BINARY:
|
|
case PROPTYPE_STRING:
|
|
varResult.vt = VT_BSTR;
|
|
varResult.bstrVal = (BSTR) pProperty;
|
|
break;
|
|
|
|
case PROPTYPE_DATE:
|
|
varResult.vt = VT_DATE;
|
|
CopyMemory(&varResult.date, pProperty, sizeof(DATE));
|
|
break;
|
|
|
|
case PROPTYPE_LONG:
|
|
varResult.vt = VT_I4;
|
|
varResult.lVal = *(LONG *) pProperty;
|
|
break;
|
|
|
|
default:
|
|
hr = E_INVALIDARG;
|
|
_JumpError(hr, error, "PropertyType");
|
|
}
|
|
|
|
__try
|
|
{
|
|
if (NULL != pdiManage->pDispatch)
|
|
{
|
|
VARIANT avar[5];
|
|
|
|
avar[0].vt = VT_BSTR;
|
|
avar[0].bstrVal = strConfig;
|
|
avar[1].vt = VT_BSTR;
|
|
avar[1].bstrVal = strStorageLocation;
|
|
avar[2].vt = VT_BSTR;
|
|
avar[2].bstrVal = strPropertyName;
|
|
avar[3].vt = VT_I4;
|
|
avar[3].lVal = dwFlags;
|
|
avar[4] = varResult;
|
|
|
|
hr = DispatchInvoke(
|
|
pdiManage,
|
|
MANAGEMODULE_SETPROPERTY,
|
|
ARRAYSIZE(avar),
|
|
avar,
|
|
0,
|
|
NULL);
|
|
_JumpIfError(hr, error, "Invoke(GetName)");
|
|
}
|
|
else
|
|
{
|
|
hr = ((ICertManageModule *) pdiManage->pUnknown)->SetProperty(
|
|
strConfig,
|
|
strStorageLocation,
|
|
strPropertyName,
|
|
dwFlags,
|
|
&varResult);
|
|
_JumpIfError(hr, error, "ICertManageModule::SetProperty");
|
|
}
|
|
}
|
|
__except(
|
|
ExceptionAddress = (ULONG_PTR) (GetExceptionInformation())->ExceptionRecord->ExceptionAddress,
|
|
hr = myHEXCEPTIONCODE(),
|
|
EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
_PrintError(hr, "SetProperty: Exception");
|
|
fException = TRUE;
|
|
}
|
|
|
|
error:
|
|
if (NULL != strConfig)
|
|
{
|
|
SysFreeString(strConfig);
|
|
}
|
|
if (NULL != strStorageLocation)
|
|
{
|
|
SysFreeString(strStorageLocation);
|
|
}
|
|
if (NULL != strPropertyName)
|
|
{
|
|
SysFreeString(strPropertyName);
|
|
}
|
|
//VariantInit(&varResult); // this owned no memory
|
|
return(hr);
|
|
}
|
|
|
|
|
|
|
|
|
|
HRESULT
|
|
ManageModule_Configure(
|
|
IN DISPATCHINTERFACE *pdiManage,
|
|
IN WCHAR const *pwszConfig,
|
|
IN WCHAR const *pwszStorageLocation,
|
|
IN DWORD dwFlags)
|
|
{
|
|
HRESULT hr;
|
|
BOOL fException = FALSE;
|
|
ULONG_PTR ExceptionAddress;
|
|
BSTR strConfig = NULL;
|
|
BSTR strStorageLocation = NULL;
|
|
|
|
CSASSERT(NULL != pdiManage && NULL != pdiManage->pDispatchTable);
|
|
|
|
hr = E_OUTOFMEMORY;
|
|
strConfig = SysAllocString(pwszConfig);
|
|
if (NULL == strConfig)
|
|
{
|
|
_JumpError(hr, error, "SysAllocString");
|
|
}
|
|
strStorageLocation = SysAllocString(pwszStorageLocation);
|
|
if (NULL == strStorageLocation)
|
|
{
|
|
_JumpError(hr, error, "SysAllocString");
|
|
}
|
|
|
|
__try
|
|
{
|
|
if (NULL != pdiManage->pDispatch)
|
|
{
|
|
VARIANT avar[3];
|
|
|
|
avar[0].vt = VT_BSTR;
|
|
avar[0].bstrVal = strConfig;
|
|
avar[1].vt = VT_BSTR;
|
|
avar[1].bstrVal = strStorageLocation;
|
|
avar[2].vt = VT_I4;
|
|
avar[2].lVal = dwFlags;
|
|
|
|
hr = DispatchInvoke(
|
|
pdiManage,
|
|
MANAGEMODULE_CONFIGURE,
|
|
ARRAYSIZE(avar),
|
|
avar,
|
|
0,
|
|
NULL);
|
|
_JumpIfError(hr, error, "Invoke(Configure)");
|
|
}
|
|
else
|
|
{
|
|
hr = ((ICertManageModule *) pdiManage->pUnknown)->Configure(
|
|
strConfig,
|
|
strStorageLocation,
|
|
dwFlags);
|
|
_JumpIfError(hr, error, "ICertManageModule::Configure");
|
|
}
|
|
}
|
|
__except(
|
|
ExceptionAddress = (ULONG_PTR) (GetExceptionInformation())->ExceptionRecord->ExceptionAddress,
|
|
hr = myHEXCEPTIONCODE(),
|
|
EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
_PrintError(hr, "Configure: Exception");
|
|
fException = TRUE;
|
|
}
|
|
|
|
error:
|
|
if (NULL != strConfig)
|
|
{
|
|
SysFreeString(strConfig);
|
|
}
|
|
if (NULL != strStorageLocation)
|
|
{
|
|
SysFreeString(strStorageLocation);
|
|
}
|
|
return(hr);
|
|
}
|
|
|
|
|
|
HRESULT
|
|
ManageModule_Init(
|
|
IN DWORD Flags,
|
|
IN TCHAR const *pszProgID, // morph for difft instances of this class
|
|
IN CLSID const *pclsid,
|
|
OUT DISPATCHINTERFACE *pdiManage)
|
|
{
|
|
HRESULT hr;
|
|
|
|
hr = DispatchSetup(
|
|
Flags,
|
|
CLSCTX_INPROC_SERVER,
|
|
pszProgID,
|
|
pclsid,
|
|
&IID_ICertManageModule,
|
|
CMANAGEMODULEDISPATCH,
|
|
g_adtManageModule,
|
|
pdiManage);
|
|
|
|
_JumpIfError(hr, error, "DispatchSetup");
|
|
|
|
pdiManage->pDispatchTable = g_adtManageModule;
|
|
|
|
error:
|
|
return(hr);
|
|
}
|
|
|
|
|
|
HRESULT
|
|
ManageModule_Init2(
|
|
IN BOOL fIDispatch,
|
|
IN ICertManageModule *pManage,
|
|
OUT DISPATCHINTERFACE *pdiManage)
|
|
{
|
|
HRESULT hr;
|
|
IDispatch *pDispatch = NULL;
|
|
|
|
pdiManage->pDispatchTable = NULL;
|
|
pdiManage->pDispatch = NULL;
|
|
pdiManage->pUnknown = NULL;
|
|
if (fIDispatch)
|
|
{
|
|
hr = pManage->QueryInterface(
|
|
IID_IDispatch,
|
|
(VOID **) &pDispatch);
|
|
_JumpIfError(hr, error, "QueryInterface");
|
|
|
|
hr = DispatchGetIds(
|
|
pDispatch,
|
|
CMANAGEMODULEDISPATCH,
|
|
g_adtManageModule,
|
|
pdiManage);
|
|
_JumpIfError(hr, error, "DispatchGetIds");
|
|
|
|
pdiManage->pDispatch = pDispatch;
|
|
pDispatch = NULL;
|
|
}
|
|
else
|
|
{
|
|
pManage->AddRef();
|
|
pdiManage->pUnknown = (IUnknown *) pManage;
|
|
hr = S_OK;
|
|
}
|
|
pdiManage->pDispatchTable = g_adtManageModule;
|
|
|
|
error:
|
|
if (NULL != pDispatch)
|
|
{
|
|
pDispatch->Release();
|
|
}
|
|
return(hr);
|
|
}
|
|
|
|
|
|
VOID
|
|
ManageModule_Release(
|
|
IN OUT DISPATCHINTERFACE *pdiManage)
|
|
{
|
|
DispatchRelease(pdiManage);
|
|
}
|
|
|