845 lines
17 KiB
C++
845 lines
17 KiB
C++
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
//
|
||
|
// Copyright (C) Microsoft Corporation, 1995 - 1999
|
||
|
//
|
||
|
// File: request.cpp
|
||
|
//
|
||
|
// Contents: ICertRequest IDispatch helper functions
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
#include <pch.cpp>
|
||
|
|
||
|
#pragma hdrstop
|
||
|
|
||
|
#include <stdlib.h>
|
||
|
#include "csdisp.h"
|
||
|
|
||
|
|
||
|
//+------------------------------------------------------------------------
|
||
|
// ICertRequest dispatch support
|
||
|
|
||
|
//TCHAR szRegKeyRequestClsid[] = wszCLASS_CERTREQUEST TEXT("\\Clsid");
|
||
|
|
||
|
//+------------------------------------
|
||
|
// Submit method:
|
||
|
|
||
|
static OLECHAR *_apszSubmit[] = {
|
||
|
TEXT("Submit"),
|
||
|
TEXT("Flags"),
|
||
|
TEXT("strRequest"),
|
||
|
TEXT("strAttributes"),
|
||
|
TEXT("strConfig"),
|
||
|
};
|
||
|
|
||
|
//+------------------------------------
|
||
|
// RetrievePending method:
|
||
|
|
||
|
static OLECHAR *_apszRetrievePending[] = {
|
||
|
TEXT("RetrievePending"),
|
||
|
TEXT("RequestId"),
|
||
|
TEXT("strConfig"),
|
||
|
};
|
||
|
|
||
|
//+------------------------------------
|
||
|
// GetLastStatus method:
|
||
|
|
||
|
static OLECHAR *_apszGetLastStatus[] = {
|
||
|
TEXT("GetLastStatus"),
|
||
|
};
|
||
|
|
||
|
//+------------------------------------
|
||
|
// GetRequestId method:
|
||
|
|
||
|
static OLECHAR *_apszGetRequestId[] = {
|
||
|
TEXT("GetRequestId"),
|
||
|
};
|
||
|
|
||
|
//+------------------------------------
|
||
|
// GetDispositionMessage method:
|
||
|
|
||
|
static OLECHAR *_apszGetDispositionMessage[] = {
|
||
|
TEXT("GetDispositionMessage"),
|
||
|
};
|
||
|
|
||
|
//+------------------------------------
|
||
|
// GetCACertificate method:
|
||
|
|
||
|
static OLECHAR *_apszGetCACertificate[] = {
|
||
|
TEXT("GetCACertificate"),
|
||
|
TEXT("fExchangeCertificate"),
|
||
|
TEXT("strConfig"),
|
||
|
TEXT("Flags"),
|
||
|
};
|
||
|
|
||
|
//+------------------------------------
|
||
|
// GetCertificate method:
|
||
|
|
||
|
static OLECHAR *_apszGetCertificate[] = {
|
||
|
TEXT("GetCertificate"),
|
||
|
TEXT("Flags"),
|
||
|
};
|
||
|
|
||
|
//+------------------------------------
|
||
|
// GetIssuedCertificate method:
|
||
|
|
||
|
static OLECHAR *_apszGetIssuedCertificate[] = {
|
||
|
TEXT("GetIssuedCertificate"),
|
||
|
TEXT("strConfig"),
|
||
|
TEXT("RequestId"),
|
||
|
TEXT("strSerialNumber"),
|
||
|
};
|
||
|
|
||
|
//+------------------------------------
|
||
|
// GetErrorMessageText method:
|
||
|
|
||
|
static OLECHAR *_apszGetErrorMessageText[] = {
|
||
|
TEXT("GetErrorMessageText"),
|
||
|
TEXT("hrMessage"),
|
||
|
TEXT("Flags"),
|
||
|
};
|
||
|
|
||
|
//+------------------------------------
|
||
|
// GetCAProperty method:
|
||
|
|
||
|
static OLECHAR *_apszGetCAProperty[] = {
|
||
|
TEXT("GetCAProperty"),
|
||
|
TEXT("strConfig"),
|
||
|
TEXT("PropId"),
|
||
|
TEXT("PropIndex"),
|
||
|
TEXT("PropType"),
|
||
|
TEXT("Flags"),
|
||
|
};
|
||
|
|
||
|
//+------------------------------------
|
||
|
// GetCAPropertyFlags method:
|
||
|
|
||
|
static OLECHAR *_apszGetCAPropertyFlags[] = {
|
||
|
TEXT("GetCAPropertyFlags"),
|
||
|
TEXT("strConfig"),
|
||
|
TEXT("PropId"),
|
||
|
};
|
||
|
|
||
|
//+------------------------------------
|
||
|
// GetCAPropertyDisplayName method:
|
||
|
|
||
|
static OLECHAR *_apszGetCAPropertyDisplayName[] = {
|
||
|
TEXT("GetCAPropertyDisplayName"),
|
||
|
TEXT("strConfig"),
|
||
|
TEXT("PropId"),
|
||
|
};
|
||
|
|
||
|
|
||
|
//+------------------------------------
|
||
|
// GetFullResponseProperty method:
|
||
|
|
||
|
static OLECHAR *_apszGetFullResponseProperty[] = {
|
||
|
TEXT("GetFullResponseProperty"),
|
||
|
TEXT("PropId"),
|
||
|
TEXT("PropIndex"),
|
||
|
TEXT("PropType"),
|
||
|
TEXT("Flags"),
|
||
|
};
|
||
|
|
||
|
|
||
|
//+------------------------------------
|
||
|
// Dispatch Table:
|
||
|
|
||
|
DISPATCHTABLE s_adtRequest[] =
|
||
|
{
|
||
|
#define REQUEST_SUBMIT 0
|
||
|
DECLARE_DISPATCH_ENTRY(_apszSubmit)
|
||
|
|
||
|
#define REQUEST_RETRIEVEPENDING 1
|
||
|
DECLARE_DISPATCH_ENTRY(_apszRetrievePending)
|
||
|
|
||
|
#define REQUEST_GETLASTSTATUS 2
|
||
|
DECLARE_DISPATCH_ENTRY(_apszGetLastStatus)
|
||
|
|
||
|
#define REQUEST_GETREQUESTID 3
|
||
|
DECLARE_DISPATCH_ENTRY(_apszGetRequestId)
|
||
|
|
||
|
#define REQUEST_GETDISPOSITIONMESSAGE 4
|
||
|
DECLARE_DISPATCH_ENTRY(_apszGetDispositionMessage)
|
||
|
|
||
|
#define REQUEST_GETCACERTIFICATE 5
|
||
|
DECLARE_DISPATCH_ENTRY(_apszGetCACertificate)
|
||
|
|
||
|
#define REQUEST_GETCERTIFICATE 6
|
||
|
DECLARE_DISPATCH_ENTRY(_apszGetCertificate)
|
||
|
|
||
|
#define REQUEST2_GETISSUEDCERTIFICATE 7
|
||
|
DECLARE_DISPATCH_ENTRY(_apszGetIssuedCertificate)
|
||
|
|
||
|
#define REQUEST2_GETERRORMESSAGETEXT 8
|
||
|
DECLARE_DISPATCH_ENTRY(_apszGetErrorMessageText)
|
||
|
|
||
|
#define REQUEST2_GETCAPROPERTY 9
|
||
|
DECLARE_DISPATCH_ENTRY(_apszGetCAProperty)
|
||
|
|
||
|
#define REQUEST2_GETCAPROPERTYFLAGS 10
|
||
|
DECLARE_DISPATCH_ENTRY(_apszGetCAPropertyFlags)
|
||
|
|
||
|
#define REQUEST2_GETCAPROPERTYDISPLAYNAME 11
|
||
|
DECLARE_DISPATCH_ENTRY(_apszGetCAPropertyDisplayName)
|
||
|
|
||
|
#define REQUEST2_GETFULLRESPONSEPROPERTY 12
|
||
|
DECLARE_DISPATCH_ENTRY(_apszGetFullResponseProperty)
|
||
|
};
|
||
|
#define CREQUESTDISPATCH (ARRAYSIZE(s_adtRequest))
|
||
|
#define CREQUESTDISPATCH_V1 REQUEST2_GETISSUEDCERTIFICATE
|
||
|
#define CREQUESTDISPATCH_V2 CREQUESTDISPATCH
|
||
|
|
||
|
|
||
|
DWORD s_acRequestDispatch[] = {
|
||
|
CREQUESTDISPATCH_V2,
|
||
|
CREQUESTDISPATCH_V1,
|
||
|
};
|
||
|
|
||
|
IID const *s_apRequestiid[] = {
|
||
|
&IID_ICertRequest2,
|
||
|
&IID_ICertRequest,
|
||
|
};
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
Request_Init(
|
||
|
IN DWORD Flags,
|
||
|
OUT DISPATCHINTERFACE *pdiRequest)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
|
||
|
hr = DispatchSetup2(
|
||
|
Flags,
|
||
|
CLSCTX_INPROC_SERVER,
|
||
|
wszCLASS_CERTREQUEST,
|
||
|
&CLSID_CCertRequest,
|
||
|
ARRAYSIZE(s_acRequestDispatch), // cver
|
||
|
s_apRequestiid,
|
||
|
s_acRequestDispatch,
|
||
|
s_adtRequest,
|
||
|
pdiRequest);
|
||
|
_JumpIfError(hr, error, "DispatchSetup2(ICertRequest)");
|
||
|
|
||
|
error:
|
||
|
return(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
VOID
|
||
|
Request_Release(
|
||
|
IN OUT DISPATCHINTERFACE *pdiRequest)
|
||
|
{
|
||
|
DispatchRelease(pdiRequest);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
RequestVerifyVersion(
|
||
|
IN DISPATCHINTERFACE *pdiRequest,
|
||
|
IN DWORD RequiredVersion)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
|
||
|
CSASSERT(NULL != pdiRequest && NULL != pdiRequest->pDispatchTable);
|
||
|
|
||
|
switch (pdiRequest->m_dwVersion)
|
||
|
{
|
||
|
case 1:
|
||
|
CSASSERT(
|
||
|
NULL == pdiRequest->pDispatch ||
|
||
|
CREQUESTDISPATCH_V1 == pdiRequest->m_cDispatchTable);
|
||
|
break;
|
||
|
|
||
|
case 2:
|
||
|
CSASSERT(
|
||
|
NULL == pdiRequest->pDispatch ||
|
||
|
CREQUESTDISPATCH_V2 == pdiRequest->m_cDispatchTable);
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
hr = HRESULT_FROM_WIN32(ERROR_INTERNAL_ERROR);
|
||
|
_JumpError(hr, error, "m_dwVersion");
|
||
|
}
|
||
|
if (pdiRequest->m_dwVersion < RequiredVersion)
|
||
|
{
|
||
|
hr = E_NOTIMPL;
|
||
|
_JumpError(hr, error, "old interface");
|
||
|
}
|
||
|
hr = S_OK;
|
||
|
|
||
|
error:
|
||
|
return(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
Request_Submit(
|
||
|
IN DISPATCHINTERFACE *pdiRequest,
|
||
|
IN LONG Flags,
|
||
|
IN WCHAR const *pwszRequest,
|
||
|
IN DWORD cbRequest,
|
||
|
IN WCHAR const *pwszAttributes,
|
||
|
IN WCHAR const *pwszConfig,
|
||
|
OUT LONG *pDisposition)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
BSTR strRequest = NULL;
|
||
|
BSTR strAttributes = NULL;
|
||
|
BSTR strConfig = NULL;
|
||
|
|
||
|
CSASSERT(NULL != pdiRequest && NULL != pdiRequest->pDispatchTable);
|
||
|
|
||
|
if (NULL == pwszRequest || NULL == pwszConfig)
|
||
|
{
|
||
|
hr = E_INVALIDARG;
|
||
|
_JumpError(hr, error, "NULL parm");
|
||
|
}
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
if (!ConvertWszToBstr(&strRequest, pwszRequest, cbRequest))
|
||
|
{
|
||
|
_JumpError(hr, error, "ConvertWszToBstr");
|
||
|
}
|
||
|
if (!ConvertWszToBstr(&strAttributes, pwszAttributes, -1))
|
||
|
{
|
||
|
_JumpError(hr, error, "ConvertWszToBstr");
|
||
|
}
|
||
|
if (!ConvertWszToBstr(&strConfig, pwszConfig, -1))
|
||
|
{
|
||
|
_JumpError(hr, error, "ConvertWszToBstr");
|
||
|
}
|
||
|
|
||
|
if (NULL != pdiRequest->pDispatch)
|
||
|
{
|
||
|
VARIANT avar[4];
|
||
|
|
||
|
avar[0].vt = VT_I4;
|
||
|
avar[0].lVal = Flags;
|
||
|
|
||
|
avar[1].vt = VT_BSTR;
|
||
|
avar[1].bstrVal = strRequest;
|
||
|
|
||
|
avar[2].vt = VT_BSTR;
|
||
|
avar[2].bstrVal = strAttributes;
|
||
|
|
||
|
avar[3].vt = VT_BSTR;
|
||
|
avar[3].bstrVal = strConfig;
|
||
|
|
||
|
hr = DispatchInvoke(
|
||
|
pdiRequest,
|
||
|
REQUEST_SUBMIT,
|
||
|
ARRAYSIZE(avar),
|
||
|
avar,
|
||
|
VT_I4,
|
||
|
pDisposition);
|
||
|
_JumpIfError(hr, error, "Invoke(Submit)");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = ((ICertRequest *) pdiRequest->pUnknown)->Submit(
|
||
|
Flags,
|
||
|
strRequest,
|
||
|
strAttributes,
|
||
|
strConfig,
|
||
|
pDisposition);
|
||
|
_JumpIfError2(
|
||
|
hr,
|
||
|
error,
|
||
|
"ICertRequest::Submit",
|
||
|
HRESULT_FROM_WIN32(ERROR_INVALID_DATA));
|
||
|
}
|
||
|
|
||
|
error:
|
||
|
if (NULL != strRequest)
|
||
|
{
|
||
|
SysFreeString(strRequest);
|
||
|
}
|
||
|
if (NULL != strAttributes)
|
||
|
{
|
||
|
SysFreeString(strAttributes);
|
||
|
}
|
||
|
if (NULL != strConfig)
|
||
|
{
|
||
|
SysFreeString(strConfig);
|
||
|
}
|
||
|
return(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
Request_RetrievePending(
|
||
|
IN DISPATCHINTERFACE *pdiRequest,
|
||
|
IN LONG RequestId,
|
||
|
IN WCHAR const *pwszConfig,
|
||
|
OUT LONG *pDisposition)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
BSTR strConfig = NULL;
|
||
|
|
||
|
CSASSERT(NULL != pdiRequest && NULL != pdiRequest->pDispatchTable);
|
||
|
|
||
|
if (!ConvertWszToBstr(&strConfig, pwszConfig, -1))
|
||
|
{
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
_JumpError(hr, error, "ConvertWszToBstr");
|
||
|
}
|
||
|
|
||
|
if (NULL != pdiRequest->pDispatch)
|
||
|
{
|
||
|
VARIANT avar[2];
|
||
|
|
||
|
avar[0].vt = VT_I4;
|
||
|
avar[0].lVal = RequestId;
|
||
|
|
||
|
avar[1].vt = VT_BSTR;
|
||
|
avar[1].bstrVal = strConfig;
|
||
|
|
||
|
hr = DispatchInvoke(
|
||
|
pdiRequest,
|
||
|
REQUEST_RETRIEVEPENDING,
|
||
|
ARRAYSIZE(avar),
|
||
|
avar,
|
||
|
VT_I4,
|
||
|
pDisposition);
|
||
|
_JumpIfError(hr, error, "Invoke(RetrievePending)");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = ((ICertRequest *) pdiRequest->pUnknown)->RetrievePending(
|
||
|
RequestId,
|
||
|
strConfig,
|
||
|
pDisposition);
|
||
|
_JumpIfError(hr, error, "ICertRequest::RetrievePending");
|
||
|
}
|
||
|
|
||
|
error:
|
||
|
if (NULL != strConfig)
|
||
|
{
|
||
|
SysFreeString(strConfig);
|
||
|
}
|
||
|
return(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
Request_GetLastStatus(
|
||
|
IN DISPATCHINTERFACE *pdiRequest,
|
||
|
OUT LONG *pLastStatus)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
|
||
|
CSASSERT(NULL != pdiRequest && NULL != pdiRequest->pDispatchTable);
|
||
|
|
||
|
if (NULL != pdiRequest->pDispatch)
|
||
|
{
|
||
|
hr = DispatchInvoke(
|
||
|
pdiRequest,
|
||
|
REQUEST_GETLASTSTATUS,
|
||
|
0,
|
||
|
NULL,
|
||
|
VT_I4,
|
||
|
pLastStatus);
|
||
|
_JumpIfError(hr, error, "Invoke(GetLastStatus)");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = ((ICertRequest *) pdiRequest->pUnknown)->GetLastStatus(
|
||
|
pLastStatus);
|
||
|
_JumpIfError(hr, error, "ICertRequest::GetLastStatus");
|
||
|
}
|
||
|
|
||
|
error:
|
||
|
return(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
Request_GetRequestId(
|
||
|
IN DISPATCHINTERFACE *pdiRequest,
|
||
|
OUT LONG *pRequestId)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
|
||
|
CSASSERT(NULL != pdiRequest && NULL != pdiRequest->pDispatchTable);
|
||
|
|
||
|
if (NULL != pdiRequest->pDispatch)
|
||
|
{
|
||
|
hr = DispatchInvoke(
|
||
|
pdiRequest,
|
||
|
REQUEST_GETREQUESTID,
|
||
|
0,
|
||
|
NULL,
|
||
|
VT_I4,
|
||
|
pRequestId);
|
||
|
_JumpIfError(hr, error, "Invoke(GetRequestId)");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = ((ICertRequest *) pdiRequest->pUnknown)->GetRequestId(pRequestId);
|
||
|
_JumpIfError(hr, error, "ICertRequest::GetRequestId");
|
||
|
}
|
||
|
|
||
|
error:
|
||
|
return(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
Request_GetDispositionMessage(
|
||
|
IN DISPATCHINTERFACE *pdiRequest,
|
||
|
OUT BSTR *pstrMessage)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
|
||
|
CSASSERT(NULL != pdiRequest && NULL != pdiRequest->pDispatchTable);
|
||
|
|
||
|
if (NULL != pdiRequest->pDispatch)
|
||
|
{
|
||
|
hr = DispatchInvoke(
|
||
|
pdiRequest,
|
||
|
REQUEST_GETDISPOSITIONMESSAGE,
|
||
|
0,
|
||
|
NULL,
|
||
|
VT_BSTR,
|
||
|
pstrMessage);
|
||
|
_JumpIfError(hr, error, "Invoke(GetDispositionMessage)");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = ((ICertRequest *) pdiRequest->pUnknown)->GetDispositionMessage(
|
||
|
pstrMessage);
|
||
|
_JumpIfError(hr, error, "ICertRequest::GetDispositionMessage");
|
||
|
}
|
||
|
|
||
|
error:
|
||
|
return(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
Request_GetCertificate(
|
||
|
IN DISPATCHINTERFACE *pdiRequest,
|
||
|
IN DWORD Flags,
|
||
|
OUT BSTR *pstrCert)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
|
||
|
CSASSERT(NULL != pdiRequest && NULL != pdiRequest->pDispatchTable);
|
||
|
|
||
|
if (NULL != pdiRequest->pDispatch)
|
||
|
{
|
||
|
VARIANT avar[1];
|
||
|
|
||
|
avar[0].vt = VT_I4;
|
||
|
avar[0].lVal = Flags;
|
||
|
|
||
|
hr = DispatchInvoke(
|
||
|
pdiRequest,
|
||
|
REQUEST_GETCERTIFICATE,
|
||
|
ARRAYSIZE(avar),
|
||
|
avar,
|
||
|
VT_BSTR,
|
||
|
pstrCert);
|
||
|
_JumpIfError(hr, error, "Invoke(GetCertificate)");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = ((ICertRequest *) pdiRequest->pUnknown)->GetCertificate(
|
||
|
Flags,
|
||
|
pstrCert);
|
||
|
_JumpIfError(hr, error, "ICertRequest::GetCertificate");
|
||
|
}
|
||
|
|
||
|
error:
|
||
|
return(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
Request_GetCACertificate(
|
||
|
IN DISPATCHINTERFACE *pdiRequest,
|
||
|
IN LONG fExchangeCertificate,
|
||
|
IN WCHAR const *pwszConfig,
|
||
|
IN DWORD Flags,
|
||
|
OUT BSTR *pstrCert)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
BSTR strConfig = NULL;
|
||
|
|
||
|
CSASSERT(NULL != pdiRequest && NULL != pdiRequest->pDispatchTable);
|
||
|
|
||
|
if (!ConvertWszToBstr(&strConfig, pwszConfig, -1))
|
||
|
{
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
_JumpError(hr, error, "ConvertWszToBstr");
|
||
|
}
|
||
|
|
||
|
if (NULL != pdiRequest->pDispatch)
|
||
|
{
|
||
|
VARIANT avar[3];
|
||
|
|
||
|
avar[0].vt = VT_I4;
|
||
|
avar[0].lVal = fExchangeCertificate;
|
||
|
|
||
|
avar[1].vt = VT_BSTR;
|
||
|
avar[1].bstrVal = strConfig;
|
||
|
|
||
|
avar[2].vt = VT_I4;
|
||
|
avar[2].lVal = Flags;
|
||
|
|
||
|
hr = DispatchInvoke(
|
||
|
pdiRequest,
|
||
|
REQUEST_GETCACERTIFICATE,
|
||
|
ARRAYSIZE(avar),
|
||
|
avar,
|
||
|
VT_BSTR,
|
||
|
pstrCert);
|
||
|
_JumpIfError(hr, error, "Invoke(GetCACertificate)");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = ((ICertRequest *) pdiRequest->pUnknown)->GetCACertificate(
|
||
|
fExchangeCertificate,
|
||
|
strConfig,
|
||
|
Flags,
|
||
|
pstrCert);
|
||
|
_JumpIfError2(
|
||
|
hr,
|
||
|
error,
|
||
|
"ICertRequest::GetCACertificate",
|
||
|
HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND));
|
||
|
}
|
||
|
|
||
|
error:
|
||
|
if (NULL != strConfig)
|
||
|
{
|
||
|
SysFreeString(strConfig);
|
||
|
}
|
||
|
return(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
Request2_GetIssuedCertificate(
|
||
|
IN DISPATCHINTERFACE *pdiRequest,
|
||
|
IN WCHAR const *pwszConfig,
|
||
|
IN LONG RequestId,
|
||
|
IN WCHAR const *pwszSerialNumber,
|
||
|
OUT LONG *pDisposition)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
BSTR strConfig = NULL;
|
||
|
BSTR strSerialNumber = NULL;
|
||
|
|
||
|
CSASSERT(NULL != pdiRequest && NULL != pdiRequest->pDispatchTable);
|
||
|
|
||
|
hr = RequestVerifyVersion(pdiRequest, 2);
|
||
|
_JumpIfError(hr, error, "RequestVerifyVersion");
|
||
|
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
if (!ConvertWszToBstr(&strConfig, pwszConfig, -1))
|
||
|
{
|
||
|
_JumpError(hr, error, "ConvertWszToBstr");
|
||
|
}
|
||
|
if (NULL != pwszSerialNumber &&
|
||
|
!ConvertWszToBstr(&strSerialNumber, pwszSerialNumber, -1))
|
||
|
{
|
||
|
_JumpError(hr, error, "ConvertWszToBstr");
|
||
|
}
|
||
|
|
||
|
if (NULL != pdiRequest->pDispatch)
|
||
|
{
|
||
|
VARIANT avar[3];
|
||
|
|
||
|
avar[0].vt = VT_BSTR;
|
||
|
avar[0].bstrVal = strConfig;
|
||
|
|
||
|
avar[1].vt = VT_I4;
|
||
|
avar[1].lVal = RequestId;
|
||
|
|
||
|
avar[2].vt = VT_BSTR;
|
||
|
avar[2].bstrVal = strSerialNumber;
|
||
|
|
||
|
hr = DispatchInvoke(
|
||
|
pdiRequest,
|
||
|
REQUEST2_GETISSUEDCERTIFICATE,
|
||
|
ARRAYSIZE(avar),
|
||
|
avar,
|
||
|
VT_I4,
|
||
|
pDisposition);
|
||
|
_JumpIfError(hr, error, "Invoke(GetIssuedCertificate)");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = ((ICertRequest2 *) pdiRequest->pUnknown)->GetIssuedCertificate(
|
||
|
strConfig,
|
||
|
RequestId,
|
||
|
strSerialNumber,
|
||
|
pDisposition);
|
||
|
_JumpIfError(hr, error, "ICertRequest2::GetIssuedCertificate");
|
||
|
}
|
||
|
|
||
|
error:
|
||
|
if (NULL != strConfig)
|
||
|
{
|
||
|
SysFreeString(strConfig);
|
||
|
}
|
||
|
if (NULL != strSerialNumber)
|
||
|
{
|
||
|
SysFreeString(strSerialNumber);
|
||
|
}
|
||
|
return(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
Request2_GetErrorMessageText(
|
||
|
IN DISPATCHINTERFACE *pdiRequest,
|
||
|
IN LONG hrMessage,
|
||
|
IN LONG Flags,
|
||
|
OUT BSTR *pstrErrorMessageText)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
|
||
|
CSASSERT(NULL != pdiRequest && NULL != pdiRequest->pDispatchTable);
|
||
|
|
||
|
hr = RequestVerifyVersion(pdiRequest, 2);
|
||
|
_JumpIfError(hr, error, "RequestVerifyVersion");
|
||
|
|
||
|
if (NULL != pdiRequest->pDispatch)
|
||
|
{
|
||
|
VARIANT avar[2];
|
||
|
|
||
|
avar[0].vt = VT_I4;
|
||
|
avar[0].lVal = hrMessage;
|
||
|
|
||
|
avar[1].vt = VT_I4;
|
||
|
avar[1].lVal = Flags;
|
||
|
|
||
|
hr = DispatchInvoke(
|
||
|
pdiRequest,
|
||
|
REQUEST2_GETERRORMESSAGETEXT,
|
||
|
ARRAYSIZE(avar),
|
||
|
avar,
|
||
|
VT_BSTR,
|
||
|
pstrErrorMessageText);
|
||
|
_JumpIfError(hr, error, "Invoke(GetErrorMessageText)");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = ((ICertRequest2 *) pdiRequest->pUnknown)->GetErrorMessageText(
|
||
|
hrMessage,
|
||
|
Flags,
|
||
|
pstrErrorMessageText);
|
||
|
_JumpIfError(hr, error, "ICertRequest2::GetErrorMessageText");
|
||
|
}
|
||
|
|
||
|
error:
|
||
|
return(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
Request2_GetFullResponseProperty(
|
||
|
IN DISPATCHINTERFACE *pdiRequest,
|
||
|
IN LONG PropId,
|
||
|
IN LONG PropIndex,
|
||
|
IN LONG PropType,
|
||
|
IN LONG Flags, // CR_OUT_*
|
||
|
OUT VOID *pPropertyValue)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
LONG RetType;
|
||
|
VARIANT varResult;
|
||
|
|
||
|
VariantInit(&varResult);
|
||
|
CSASSERT(NULL != pdiRequest && NULL != pdiRequest->pDispatchTable);
|
||
|
|
||
|
switch (PropType)
|
||
|
{
|
||
|
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, "PropType");
|
||
|
}
|
||
|
|
||
|
if (NULL != pdiRequest->pDispatch)
|
||
|
{
|
||
|
VARIANT avar[4];
|
||
|
|
||
|
avar[0].vt = VT_I4;
|
||
|
avar[0].lVal = PropId;
|
||
|
|
||
|
avar[1].vt = VT_I4;
|
||
|
avar[1].lVal = PropIndex;
|
||
|
|
||
|
avar[2].vt = VT_I4;
|
||
|
avar[2].lVal = PropType;
|
||
|
|
||
|
avar[3].vt = VT_I4;
|
||
|
avar[3].lVal = Flags;
|
||
|
|
||
|
hr = DispatchInvoke(
|
||
|
pdiRequest,
|
||
|
REQUEST2_GETFULLRESPONSEPROPERTY,
|
||
|
ARRAYSIZE(avar),
|
||
|
avar,
|
||
|
RetType,
|
||
|
pPropertyValue);
|
||
|
if (S_OK != hr)
|
||
|
{
|
||
|
DBGPRINT((
|
||
|
DBG_SS_CERTLIB,
|
||
|
"GetFullResponseProperty: PropId=%x Index=%x Type=%x Flags=%x\n",
|
||
|
PropId,
|
||
|
PropIndex,
|
||
|
PropType,
|
||
|
Flags));
|
||
|
}
|
||
|
_JumpIfError2(
|
||
|
hr,
|
||
|
error,
|
||
|
"GetFullResponseProperty",
|
||
|
CERTSRV_E_PROPERTY_EMPTY);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = ((ICertRequest2 *) pdiRequest->pUnknown)->GetFullResponseProperty(
|
||
|
PropId,
|
||
|
PropIndex,
|
||
|
PropType,
|
||
|
Flags,
|
||
|
&varResult);
|
||
|
_JumpIfError2(
|
||
|
hr,
|
||
|
error,
|
||
|
"ICertRequest2::GetFullResponseProperty",
|
||
|
CERTSRV_E_PROPERTY_EMPTY);
|
||
|
|
||
|
hr = DispatchGetReturnValue(&varResult, RetType, pPropertyValue);
|
||
|
_JumpIfError(hr, error, "DispatchGetReturnValue");
|
||
|
}
|
||
|
|
||
|
error:
|
||
|
VariantClear(&varResult);
|
||
|
return(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
#define CCERTREQUEST
|
||
|
#include "prop2.cpp"
|