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.
3372 lines
76 KiB
3372 lines
76 KiB
/*++
|
|
|
|
Copyright (c) 1999 Microsoft Corporation
|
|
|
|
|
|
Module Name:
|
|
|
|
winipsec.c
|
|
|
|
Abstract:
|
|
|
|
Contains IPSec WINAPI calls specific code.
|
|
|
|
Author:
|
|
|
|
abhisheV 21-September-1999
|
|
|
|
Environment:
|
|
|
|
User Level: Win32
|
|
|
|
Revision History:
|
|
|
|
|
|
--*/
|
|
|
|
|
|
#include "precomp.h"
|
|
|
|
|
|
DWORD
|
|
SPDApiBufferAllocate(
|
|
DWORD dwByteCount,
|
|
LPVOID * ppBuffer
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
|
|
if (ppBuffer == NULL) {
|
|
dwError = ERROR_INVALID_PARAMETER;
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
}
|
|
|
|
*ppBuffer = NULL;
|
|
*ppBuffer = MIDL_user_allocate(dwByteCount);
|
|
|
|
if (*ppBuffer == NULL) {
|
|
dwError = ERROR_OUTOFMEMORY;
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
}
|
|
else {
|
|
memset((LPBYTE) *ppBuffer, 0, dwByteCount);
|
|
}
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
VOID
|
|
SPDApiBufferFree(
|
|
LPVOID pBuffer
|
|
)
|
|
{
|
|
if (pBuffer) {
|
|
MIDL_user_free(pBuffer);
|
|
}
|
|
}
|
|
|
|
|
|
DWORD
|
|
AddTransportFilter(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
DWORD dwFlags,
|
|
PTRANSPORT_FILTER pTransportFilter,
|
|
LPVOID pvReserved,
|
|
PHANDLE phFilter
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
TRANSPORT_FILTER_CONTAINER FilterContainer;
|
|
PTRANSPORT_FILTER_CONTAINER pFilterContainer = &FilterContainer;
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!phFilter) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
if (pTransportFilter && (pTransportFilter->IpVersion != IPSEC_PROTOCOL_V4)) {
|
|
return (ERROR_INVALID_LEVEL);
|
|
}
|
|
|
|
dwError = ValidateTransportFilter(
|
|
pTransportFilter
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
pFilterContainer->dwNumFilters = 1;
|
|
pFilterContainer->pTransportFilters = pTransportFilter;
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcAddTransportFilter(
|
|
pServerName,
|
|
dwVersion,
|
|
dwFlags,
|
|
pFilterContainer,
|
|
phFilter
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
DeleteTransportFilter(
|
|
HANDLE hFilter
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
|
|
|
|
if (!hFilter) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcDeleteTransportFilter(
|
|
&hFilter
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
if (dwError) {
|
|
dwError = SPDDestroyClientContextHandle(
|
|
dwError,
|
|
hFilter
|
|
);
|
|
}
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
EnumTransportFilters(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
PTRANSPORT_FILTER pTransportTemplateFilter,
|
|
DWORD dwLevel,
|
|
GUID gGenericFilterID,
|
|
DWORD dwPreferredNumEntries,
|
|
PTRANSPORT_FILTER * ppTransportFilters,
|
|
LPDWORD pdwNumFilters,
|
|
LPDWORD pdwResumeHandle,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
TRANSPORT_FILTER_CONTAINER FilterContainer;
|
|
PTRANSPORT_FILTER_CONTAINER pFilterContainer = &FilterContainer;
|
|
TRANSPORT_FILTER_CONTAINER TemplateFilterContainer;
|
|
PTRANSPORT_FILTER_CONTAINER pTemplateFilterContainer = &TemplateFilterContainer;
|
|
|
|
|
|
memset(pFilterContainer, 0, sizeof(TRANSPORT_FILTER_CONTAINER));
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (pTransportTemplateFilter) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!ppTransportFilters || !pdwNumFilters || !pdwResumeHandle) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
switch (dwLevel) {
|
|
|
|
case ENUM_GENERIC_FILTERS:
|
|
case ENUM_SELECT_SPECIFIC_FILTERS:
|
|
case ENUM_SPECIFIC_FILTERS:
|
|
break;
|
|
|
|
default:
|
|
dwError = ERROR_INVALID_LEVEL;
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
break;
|
|
|
|
}
|
|
|
|
pTemplateFilterContainer->dwNumFilters = 0;
|
|
pTemplateFilterContainer->pTransportFilters = NULL;
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcEnumTransportFilters(
|
|
pServerName,
|
|
dwVersion,
|
|
pTemplateFilterContainer,
|
|
dwLevel,
|
|
gGenericFilterID,
|
|
dwPreferredNumEntries,
|
|
&pFilterContainer,
|
|
pdwResumeHandle
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
*ppTransportFilters = pFilterContainer->pTransportFilters;
|
|
*pdwNumFilters = pFilterContainer->dwNumFilters;
|
|
|
|
return (dwError);
|
|
|
|
error:
|
|
|
|
*ppTransportFilters = NULL;
|
|
*pdwNumFilters = 0;
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
SetTransportFilter(
|
|
HANDLE hFilter,
|
|
DWORD dwVersion,
|
|
PTRANSPORT_FILTER pTransportFilter,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
TRANSPORT_FILTER_CONTAINER FilterContainer;
|
|
PTRANSPORT_FILTER_CONTAINER pFilterContainer = &FilterContainer;
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!hFilter) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
if (pTransportFilter && (pTransportFilter->IpVersion != IPSEC_PROTOCOL_V4)) {
|
|
return (ERROR_INVALID_LEVEL);
|
|
}
|
|
|
|
dwError = ValidateTransportFilter(
|
|
pTransportFilter
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
pFilterContainer->dwNumFilters = 1;
|
|
pFilterContainer->pTransportFilters = pTransportFilter;
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcSetTransportFilter(
|
|
hFilter,
|
|
dwVersion,
|
|
pFilterContainer
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
GetTransportFilter(
|
|
HANDLE hFilter,
|
|
DWORD dwVersion,
|
|
PTRANSPORT_FILTER * ppTransportFilter,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
TRANSPORT_FILTER_CONTAINER FilterContainer;
|
|
PTRANSPORT_FILTER_CONTAINER pFilterContainer = &FilterContainer;
|
|
|
|
|
|
memset(pFilterContainer, 0, sizeof(TRANSPORT_FILTER_CONTAINER));
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!hFilter || !ppTransportFilter) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcGetTransportFilter(
|
|
hFilter,
|
|
dwVersion,
|
|
&pFilterContainer
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
|
|
*ppTransportFilter = pFilterContainer->pTransportFilters;
|
|
return (dwError);
|
|
|
|
error:
|
|
|
|
*ppTransportFilter = NULL;
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
AddQMPolicy(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
DWORD dwFlags,
|
|
PIPSEC_QM_POLICY pQMPolicy,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
IPSEC_QM_POLICY_CONTAINER QMPolicyContainer;
|
|
PIPSEC_QM_POLICY_CONTAINER pQMPolicyContainer = &QMPolicyContainer;
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
dwError = ValidateQMPolicy(
|
|
pQMPolicy
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
pQMPolicyContainer->dwNumPolicies = 1;
|
|
pQMPolicyContainer->pPolicies = pQMPolicy;
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcAddQMPolicy(
|
|
pServerName,
|
|
dwVersion,
|
|
dwFlags,
|
|
pQMPolicyContainer
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
DeleteQMPolicy(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
LPWSTR pszPolicyName,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!pszPolicyName || !*pszPolicyName) {
|
|
dwError = ERROR_INVALID_PARAMETER;
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
}
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcDeleteQMPolicy(
|
|
pServerName,
|
|
dwVersion,
|
|
pszPolicyName
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
EnumQMPolicies(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
PIPSEC_QM_POLICY pQMTemplatePolicy,
|
|
DWORD dwFlags,
|
|
DWORD dwPreferredNumEntries,
|
|
PIPSEC_QM_POLICY * ppQMPolicies,
|
|
LPDWORD pdwNumPolicies,
|
|
LPDWORD pdwResumeHandle,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
IPSEC_QM_POLICY_CONTAINER QMPolicyContainer;
|
|
PIPSEC_QM_POLICY_CONTAINER pQMPolicyContainer = &QMPolicyContainer;
|
|
IPSEC_QM_POLICY_CONTAINER QMTempPolicyContainer;
|
|
PIPSEC_QM_POLICY_CONTAINER pQMTempPolicyContainer = &QMTempPolicyContainer;
|
|
|
|
|
|
memset(pQMPolicyContainer, 0, sizeof(IPSEC_QM_POLICY_CONTAINER));
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (pQMTemplatePolicy) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!ppQMPolicies || !pdwNumPolicies || !pdwResumeHandle) {
|
|
//
|
|
// Do not bail to error from here.
|
|
//
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
pQMTempPolicyContainer->dwNumPolicies = 0;
|
|
pQMTempPolicyContainer->pPolicies = NULL;
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcEnumQMPolicies(
|
|
pServerName,
|
|
dwVersion,
|
|
pQMTempPolicyContainer,
|
|
dwFlags,
|
|
dwPreferredNumEntries,
|
|
&pQMPolicyContainer,
|
|
pdwResumeHandle
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
*ppQMPolicies = pQMPolicyContainer->pPolicies;
|
|
*pdwNumPolicies = pQMPolicyContainer->dwNumPolicies;
|
|
|
|
return (dwError);
|
|
|
|
error:
|
|
|
|
*ppQMPolicies = NULL;
|
|
*pdwNumPolicies = 0;
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
SetQMPolicy(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
LPWSTR pszPolicyName,
|
|
PIPSEC_QM_POLICY pQMPolicy,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
IPSEC_QM_POLICY_CONTAINER QMPolicyContainer;
|
|
PIPSEC_QM_POLICY_CONTAINER pQMPolicyContainer = &QMPolicyContainer;
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!pszPolicyName || !*pszPolicyName) {
|
|
dwError = ERROR_INVALID_PARAMETER;
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
}
|
|
|
|
dwError = ValidateQMPolicy(
|
|
pQMPolicy
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
pQMPolicyContainer->dwNumPolicies = 1;
|
|
pQMPolicyContainer->pPolicies = pQMPolicy;
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcSetQMPolicy(
|
|
pServerName,
|
|
dwVersion,
|
|
pszPolicyName,
|
|
pQMPolicyContainer
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
GetQMPolicy(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
LPWSTR pszPolicyName,
|
|
DWORD dwFlags,
|
|
PIPSEC_QM_POLICY * ppQMPolicy,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
IPSEC_QM_POLICY_CONTAINER QMPolicyContainer;
|
|
PIPSEC_QM_POLICY_CONTAINER pQMPolicyContainer = &QMPolicyContainer;
|
|
|
|
|
|
memset(pQMPolicyContainer, 0, sizeof(IPSEC_QM_POLICY_CONTAINER));
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!pszPolicyName || !*pszPolicyName || !ppQMPolicy) {
|
|
//
|
|
// Do not bail to error from here.
|
|
//
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcGetQMPolicy(
|
|
pServerName,
|
|
dwVersion,
|
|
pszPolicyName,
|
|
dwFlags,
|
|
&pQMPolicyContainer
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
|
|
*ppQMPolicy = pQMPolicyContainer->pPolicies;
|
|
return (dwError);
|
|
|
|
error:
|
|
|
|
*ppQMPolicy = NULL;
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
AddMMPolicy(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
DWORD dwFlags,
|
|
PIPSEC_MM_POLICY pMMPolicy,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
IPSEC_MM_POLICY_CONTAINER MMPolicyContainer;
|
|
PIPSEC_MM_POLICY_CONTAINER pMMPolicyContainer = &MMPolicyContainer;
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
dwError = ValidateMMPolicy(
|
|
pMMPolicy
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
pMMPolicyContainer->dwNumPolicies = 1;
|
|
pMMPolicyContainer->pPolicies = pMMPolicy;
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcAddMMPolicy(
|
|
pServerName,
|
|
dwVersion,
|
|
dwFlags,
|
|
pMMPolicyContainer
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
DeleteMMPolicy(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
LPWSTR pszPolicyName,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!pszPolicyName || !*pszPolicyName) {
|
|
dwError = ERROR_INVALID_PARAMETER;
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
}
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcDeleteMMPolicy(
|
|
pServerName,
|
|
dwVersion,
|
|
pszPolicyName
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
EnumMMPolicies(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
PIPSEC_MM_POLICY pMMTemplatePolicy,
|
|
DWORD dwFlags,
|
|
DWORD dwPreferredNumEntries,
|
|
PIPSEC_MM_POLICY * ppMMPolicies,
|
|
LPDWORD pdwNumPolicies,
|
|
LPDWORD pdwResumeHandle,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
IPSEC_MM_POLICY_CONTAINER MMPolicyContainer;
|
|
PIPSEC_MM_POLICY_CONTAINER pMMPolicyContainer = &MMPolicyContainer;
|
|
IPSEC_MM_POLICY_CONTAINER MMTempPolicyContainer;
|
|
PIPSEC_MM_POLICY_CONTAINER pMMTempPolicyContainer = &MMTempPolicyContainer;
|
|
|
|
|
|
memset(pMMPolicyContainer, 0, sizeof(IPSEC_MM_POLICY_CONTAINER));
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (pMMTemplatePolicy) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!ppMMPolicies || !pdwNumPolicies || !pdwResumeHandle) {
|
|
//
|
|
// Do not bail to error from here.
|
|
//
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
pMMTempPolicyContainer->dwNumPolicies = 0;
|
|
pMMTempPolicyContainer->pPolicies = NULL;
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcEnumMMPolicies(
|
|
pServerName,
|
|
dwVersion,
|
|
pMMTempPolicyContainer,
|
|
dwFlags,
|
|
dwPreferredNumEntries,
|
|
&pMMPolicyContainer,
|
|
pdwResumeHandle
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
*ppMMPolicies = pMMPolicyContainer->pPolicies;
|
|
*pdwNumPolicies = pMMPolicyContainer->dwNumPolicies;
|
|
|
|
return (dwError);
|
|
|
|
error:
|
|
|
|
*ppMMPolicies = NULL;
|
|
*pdwNumPolicies = 0;
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
SetMMPolicy(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
LPWSTR pszPolicyName,
|
|
PIPSEC_MM_POLICY pMMPolicy,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
IPSEC_MM_POLICY_CONTAINER MMPolicyContainer;
|
|
PIPSEC_MM_POLICY_CONTAINER pMMPolicyContainer = &MMPolicyContainer;
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!pszPolicyName || !*pszPolicyName) {
|
|
dwError = ERROR_INVALID_PARAMETER;
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
}
|
|
|
|
dwError = ValidateMMPolicy(
|
|
pMMPolicy
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
pMMPolicyContainer->dwNumPolicies = 1;
|
|
pMMPolicyContainer->pPolicies = pMMPolicy;
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcSetMMPolicy(
|
|
pServerName,
|
|
dwVersion,
|
|
pszPolicyName,
|
|
pMMPolicyContainer
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
GetMMPolicy(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
LPWSTR pszPolicyName,
|
|
PIPSEC_MM_POLICY * ppMMPolicy,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
IPSEC_MM_POLICY_CONTAINER MMPolicyContainer;
|
|
PIPSEC_MM_POLICY_CONTAINER pMMPolicyContainer = &MMPolicyContainer;
|
|
|
|
|
|
memset(pMMPolicyContainer, 0, sizeof(IPSEC_MM_POLICY_CONTAINER));
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!pszPolicyName || !*pszPolicyName || !ppMMPolicy) {
|
|
//
|
|
// Do not bail to error from here.
|
|
//
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcGetMMPolicy(
|
|
pServerName,
|
|
dwVersion,
|
|
pszPolicyName,
|
|
&pMMPolicyContainer
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
|
|
*ppMMPolicy = pMMPolicyContainer->pPolicies;
|
|
return (dwError);
|
|
|
|
error:
|
|
|
|
*ppMMPolicy = NULL;
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
AddMMFilter(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
DWORD dwFlags,
|
|
PMM_FILTER pMMFilter,
|
|
LPVOID pvReserved,
|
|
PHANDLE phMMFilter
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
MM_FILTER_CONTAINER MMFilterContainer;
|
|
PMM_FILTER_CONTAINER pMMFilterContainer = &MMFilterContainer;
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!phMMFilter) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
if (pMMFilter && (pMMFilter->IpVersion != IPSEC_PROTOCOL_V4)) {
|
|
return (ERROR_INVALID_LEVEL);
|
|
}
|
|
|
|
dwError = ValidateMMFilter(
|
|
pMMFilter
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
pMMFilterContainer->dwNumFilters = 1;
|
|
pMMFilterContainer->pMMFilters = pMMFilter;
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcAddMMFilter(
|
|
pServerName,
|
|
dwVersion,
|
|
dwFlags,
|
|
pMMFilterContainer,
|
|
phMMFilter
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
DeleteMMFilter(
|
|
HANDLE hMMFilter
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
|
|
|
|
if (!hMMFilter) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcDeleteMMFilter(
|
|
&hMMFilter
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
if (dwError) {
|
|
dwError = SPDDestroyClientContextHandle(
|
|
dwError,
|
|
hMMFilter
|
|
);
|
|
}
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
EnumMMFilters(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
PMM_FILTER pMMTemplateFilter,
|
|
DWORD dwLevel,
|
|
GUID gGenericFilterID,
|
|
DWORD dwPreferredNumEntries,
|
|
PMM_FILTER * ppMMFilters,
|
|
LPDWORD pdwNumMMFilters,
|
|
LPDWORD pdwResumeHandle,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
MM_FILTER_CONTAINER MMFilterContainer;
|
|
PMM_FILTER_CONTAINER pMMFilterContainer = &MMFilterContainer;
|
|
MM_FILTER_CONTAINER TemplateFilterContainer;
|
|
PMM_FILTER_CONTAINER pTemplateFilterContainer = &TemplateFilterContainer;
|
|
|
|
|
|
memset(pMMFilterContainer, 0, sizeof(MM_FILTER_CONTAINER));
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (pMMTemplateFilter) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!ppMMFilters || !pdwNumMMFilters || !pdwResumeHandle) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
switch (dwLevel) {
|
|
|
|
case ENUM_GENERIC_FILTERS:
|
|
case ENUM_SELECT_SPECIFIC_FILTERS:
|
|
case ENUM_SPECIFIC_FILTERS:
|
|
break;
|
|
|
|
default:
|
|
dwError = ERROR_INVALID_LEVEL;
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
break;
|
|
|
|
}
|
|
|
|
pTemplateFilterContainer->dwNumFilters = 0;
|
|
pTemplateFilterContainer->pMMFilters = NULL;
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcEnumMMFilters(
|
|
pServerName,
|
|
dwVersion,
|
|
pTemplateFilterContainer,
|
|
dwLevel,
|
|
gGenericFilterID,
|
|
dwPreferredNumEntries,
|
|
&pMMFilterContainer,
|
|
pdwResumeHandle
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
*ppMMFilters = pMMFilterContainer->pMMFilters;
|
|
*pdwNumMMFilters = pMMFilterContainer->dwNumFilters;
|
|
|
|
return (dwError);
|
|
|
|
error:
|
|
|
|
*ppMMFilters = NULL;
|
|
*pdwNumMMFilters = 0;
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
SetMMFilter(
|
|
HANDLE hMMFilter,
|
|
DWORD dwVersion,
|
|
PMM_FILTER pMMFilter,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
MM_FILTER_CONTAINER MMFilterContainer;
|
|
PMM_FILTER_CONTAINER pMMFilterContainer = &MMFilterContainer;
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!hMMFilter) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
if (pMMFilter && (pMMFilter->IpVersion != IPSEC_PROTOCOL_V4)) {
|
|
return (ERROR_INVALID_LEVEL);
|
|
}
|
|
|
|
dwError = ValidateMMFilter(
|
|
pMMFilter
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
pMMFilterContainer->dwNumFilters = 1;
|
|
pMMFilterContainer->pMMFilters = pMMFilter;
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcSetMMFilter(
|
|
hMMFilter,
|
|
dwVersion,
|
|
pMMFilterContainer
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
GetMMFilter(
|
|
HANDLE hMMFilter,
|
|
DWORD dwVersion,
|
|
PMM_FILTER * ppMMFilter,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
MM_FILTER_CONTAINER MMFilterContainer;
|
|
PMM_FILTER_CONTAINER pMMFilterContainer = &MMFilterContainer;
|
|
|
|
|
|
memset(pMMFilterContainer, 0, sizeof(MM_FILTER_CONTAINER));
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!hMMFilter || !ppMMFilter) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcGetMMFilter(
|
|
hMMFilter,
|
|
dwVersion,
|
|
&pMMFilterContainer
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
|
|
*ppMMFilter = pMMFilterContainer->pMMFilters;
|
|
return (dwError);
|
|
|
|
error:
|
|
|
|
*ppMMFilter = NULL;
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
MatchMMFilter(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
PMM_FILTER pMMFilter,
|
|
DWORD dwFlags,
|
|
DWORD dwPreferredNumEntries,
|
|
PMM_FILTER * ppMatchedMMFilters,
|
|
PIPSEC_MM_POLICY * ppMatchedMMPolicies,
|
|
PMM_AUTH_METHODS * ppMatchedMMAuthMethods,
|
|
LPDWORD pdwNumMatches,
|
|
LPDWORD pdwResumeHandle,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
MM_FILTER_CONTAINER InMMFilterContainer;
|
|
PMM_FILTER_CONTAINER pInMMFilterContainer = &InMMFilterContainer;
|
|
MM_FILTER_CONTAINER OutMMFilterContainer;
|
|
PMM_FILTER_CONTAINER pOutMMFilterContainer = &OutMMFilterContainer;
|
|
IPSEC_MM_POLICY_CONTAINER MMPolicyContainer;
|
|
PIPSEC_MM_POLICY_CONTAINER pMMPolicyContainer = &MMPolicyContainer;
|
|
MM_AUTH_METHODS_CONTAINER MMAuthContainer;
|
|
PMM_AUTH_METHODS_CONTAINER pMMAuthContainer = &MMAuthContainer;
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!pMMFilter || !ppMatchedMMFilters || !ppMatchedMMPolicies ||
|
|
!ppMatchedMMAuthMethods || !pdwNumMatches || !pdwResumeHandle) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
if (pMMFilter && (pMMFilter->IpVersion != IPSEC_PROTOCOL_V4)) {
|
|
return (ERROR_INVALID_LEVEL);
|
|
}
|
|
|
|
dwError = ValidateMMFilterTemplate(
|
|
pMMFilter
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
pInMMFilterContainer->dwNumFilters = 1;
|
|
pInMMFilterContainer->pMMFilters = pMMFilter;
|
|
|
|
memset(pOutMMFilterContainer, 0, sizeof(MM_FILTER_CONTAINER));
|
|
memset(pMMPolicyContainer, 0, sizeof(IPSEC_MM_POLICY_CONTAINER));
|
|
memset(pMMAuthContainer, 0, sizeof(MM_AUTH_METHODS_CONTAINER));
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcMatchMMFilter(
|
|
pServerName,
|
|
dwVersion,
|
|
pInMMFilterContainer,
|
|
dwFlags,
|
|
dwPreferredNumEntries,
|
|
&pOutMMFilterContainer,
|
|
&pMMPolicyContainer,
|
|
&pMMAuthContainer,
|
|
pdwResumeHandle
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
*ppMatchedMMFilters = pOutMMFilterContainer->pMMFilters;
|
|
*ppMatchedMMPolicies = pMMPolicyContainer->pPolicies;
|
|
*ppMatchedMMAuthMethods = pMMAuthContainer->pMMAuthMethods;
|
|
*pdwNumMatches = pOutMMFilterContainer->dwNumFilters;
|
|
|
|
return (dwError);
|
|
|
|
error:
|
|
|
|
*ppMatchedMMFilters = NULL;
|
|
*ppMatchedMMPolicies = NULL;
|
|
*ppMatchedMMAuthMethods = NULL;
|
|
*pdwNumMatches = 0;
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
MatchTransportFilter(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
PTRANSPORT_FILTER pTxFilter,
|
|
DWORD dwFlags,
|
|
DWORD dwPreferredNumEntries,
|
|
PTRANSPORT_FILTER * ppMatchedTxFilters,
|
|
PIPSEC_QM_POLICY * ppMatchedQMPolicies,
|
|
LPDWORD pdwNumMatches,
|
|
LPDWORD pdwResumeHandle,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
TRANSPORT_FILTER_CONTAINER InTxFilterContainer;
|
|
PTRANSPORT_FILTER_CONTAINER pInTxFilterContainer = &InTxFilterContainer;
|
|
TRANSPORT_FILTER_CONTAINER OutTxFilterContainer;
|
|
PTRANSPORT_FILTER_CONTAINER pOutTxFilterContainer = &OutTxFilterContainer;
|
|
IPSEC_QM_POLICY_CONTAINER QMPolicyContainer;
|
|
PIPSEC_QM_POLICY_CONTAINER pQMPolicyContainer = &QMPolicyContainer;
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!pTxFilter || !ppMatchedTxFilters || !ppMatchedQMPolicies ||
|
|
!pdwNumMatches || !pdwResumeHandle) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
if (pTxFilter && (pTxFilter->IpVersion != IPSEC_PROTOCOL_V4)) {
|
|
return (ERROR_INVALID_LEVEL);
|
|
}
|
|
|
|
dwError = ValidateTxFilterTemplate(
|
|
pTxFilter
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
pInTxFilterContainer->dwNumFilters = 1;
|
|
pInTxFilterContainer->pTransportFilters = pTxFilter;
|
|
|
|
memset(pOutTxFilterContainer, 0, sizeof(TRANSPORT_FILTER_CONTAINER));
|
|
memset(pQMPolicyContainer, 0, sizeof(IPSEC_QM_POLICY_CONTAINER));
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcMatchTransportFilter(
|
|
pServerName,
|
|
dwVersion,
|
|
pInTxFilterContainer,
|
|
dwFlags,
|
|
dwPreferredNumEntries,
|
|
&pOutTxFilterContainer,
|
|
&pQMPolicyContainer,
|
|
pdwResumeHandle
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
*ppMatchedTxFilters = pOutTxFilterContainer->pTransportFilters;
|
|
*ppMatchedQMPolicies = pQMPolicyContainer->pPolicies;
|
|
*pdwNumMatches = pOutTxFilterContainer->dwNumFilters;
|
|
|
|
return (dwError);
|
|
|
|
error:
|
|
|
|
*ppMatchedTxFilters = NULL;
|
|
*ppMatchedQMPolicies = NULL;
|
|
*pdwNumMatches = 0;
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
GetQMPolicyByID(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
GUID gQMPolicyID,
|
|
DWORD dwFlags,
|
|
PIPSEC_QM_POLICY * ppQMPolicy,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
IPSEC_QM_POLICY_CONTAINER QMPolicyContainer;
|
|
PIPSEC_QM_POLICY_CONTAINER pQMPolicyContainer = &QMPolicyContainer;
|
|
|
|
|
|
memset(pQMPolicyContainer, 0, sizeof(IPSEC_QM_POLICY_CONTAINER));
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!ppQMPolicy) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcGetQMPolicyByID(
|
|
pServerName,
|
|
dwVersion,
|
|
gQMPolicyID,
|
|
dwFlags,
|
|
&pQMPolicyContainer
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
|
|
*ppQMPolicy = pQMPolicyContainer->pPolicies;
|
|
return (dwError);
|
|
|
|
error:
|
|
|
|
*ppQMPolicy = NULL;
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
GetMMPolicyByID(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
GUID gMMPolicyID,
|
|
PIPSEC_MM_POLICY * ppMMPolicy,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
IPSEC_MM_POLICY_CONTAINER MMPolicyContainer;
|
|
PIPSEC_MM_POLICY_CONTAINER pMMPolicyContainer = &MMPolicyContainer;
|
|
|
|
|
|
memset(pMMPolicyContainer, 0, sizeof(IPSEC_MM_POLICY_CONTAINER));
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!ppMMPolicy) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcGetMMPolicyByID(
|
|
pServerName,
|
|
dwVersion,
|
|
gMMPolicyID,
|
|
&pMMPolicyContainer
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
|
|
*ppMMPolicy = pMMPolicyContainer->pPolicies;
|
|
return (dwError);
|
|
|
|
error:
|
|
|
|
*ppMMPolicy = NULL;
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
AddMMAuthMethods(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
DWORD dwFlags,
|
|
PMM_AUTH_METHODS pMMAuthMethods,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
MM_AUTH_METHODS_CONTAINER MMAuthContainer;
|
|
PMM_AUTH_METHODS_CONTAINER pMMAuthContainer = &MMAuthContainer;
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
dwError = ValidateMMAuthMethods(
|
|
pMMAuthMethods
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
pMMAuthContainer->dwNumAuthMethods = 1;
|
|
pMMAuthContainer->pMMAuthMethods = pMMAuthMethods;
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcAddMMAuthMethods(
|
|
pServerName,
|
|
dwVersion,
|
|
dwFlags,
|
|
pMMAuthContainer
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
DeleteMMAuthMethods(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
GUID gMMAuthID,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcDeleteMMAuthMethods(
|
|
pServerName,
|
|
dwVersion,
|
|
gMMAuthID
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
EnumMMAuthMethods(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
PMM_AUTH_METHODS pMMTemplateAuthMethods,
|
|
DWORD dwFlags,
|
|
DWORD dwPreferredNumEntries,
|
|
PMM_AUTH_METHODS * ppMMAuthMethods,
|
|
LPDWORD pdwNumAuthMethods,
|
|
LPDWORD pdwResumeHandle,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
MM_AUTH_METHODS_CONTAINER MMAuthContainer;
|
|
PMM_AUTH_METHODS_CONTAINER pMMAuthContainer = &MMAuthContainer;
|
|
MM_AUTH_METHODS_CONTAINER MMTempAuthContainer;
|
|
PMM_AUTH_METHODS_CONTAINER pMMTempAuthContainer = &MMTempAuthContainer;
|
|
|
|
|
|
memset(pMMAuthContainer, 0, sizeof(MM_AUTH_METHODS_CONTAINER));
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (pMMTemplateAuthMethods) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!ppMMAuthMethods || !pdwNumAuthMethods || !pdwResumeHandle) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
pMMTempAuthContainer->dwNumAuthMethods = 0;
|
|
pMMTempAuthContainer->pMMAuthMethods = NULL;
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcEnumMMAuthMethods(
|
|
pServerName,
|
|
dwVersion,
|
|
pMMTempAuthContainer,
|
|
dwFlags,
|
|
dwPreferredNumEntries,
|
|
&pMMAuthContainer,
|
|
pdwResumeHandle
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
*ppMMAuthMethods = pMMAuthContainer->pMMAuthMethods;
|
|
*pdwNumAuthMethods = pMMAuthContainer->dwNumAuthMethods;
|
|
|
|
return (dwError);
|
|
|
|
error:
|
|
|
|
*ppMMAuthMethods = NULL;
|
|
*pdwNumAuthMethods = 0;
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
SetMMAuthMethods(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
GUID gMMAuthID,
|
|
PMM_AUTH_METHODS pMMAuthMethods,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
MM_AUTH_METHODS_CONTAINER MMAuthContainer;
|
|
PMM_AUTH_METHODS_CONTAINER pMMAuthContainer = &MMAuthContainer;
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
dwError = ValidateMMAuthMethods(
|
|
pMMAuthMethods
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
pMMAuthContainer->dwNumAuthMethods = 1;
|
|
pMMAuthContainer->pMMAuthMethods = pMMAuthMethods;
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcSetMMAuthMethods(
|
|
pServerName,
|
|
dwVersion,
|
|
gMMAuthID,
|
|
pMMAuthContainer
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
GetMMAuthMethods(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
GUID gMMAuthID,
|
|
PMM_AUTH_METHODS * ppMMAuthMethods,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
MM_AUTH_METHODS_CONTAINER MMAuthContainer;
|
|
PMM_AUTH_METHODS_CONTAINER pMMAuthContainer = &MMAuthContainer;
|
|
|
|
|
|
memset(pMMAuthContainer, 0, sizeof(MM_AUTH_METHODS_CONTAINER));
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!ppMMAuthMethods) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcGetMMAuthMethods(
|
|
pServerName,
|
|
dwVersion,
|
|
gMMAuthID,
|
|
&pMMAuthContainer
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
|
|
*ppMMAuthMethods = pMMAuthContainer->pMMAuthMethods;
|
|
return (dwError);
|
|
|
|
error:
|
|
|
|
*ppMMAuthMethods = NULL;
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
InitiateIKENegotiation(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
PIPSEC_QM_FILTER pQMFilter,
|
|
DWORD dwClientProcessId,
|
|
HANDLE hClientEvent,
|
|
DWORD dwFlags,
|
|
IPSEC_UDP_ENCAP_CONTEXT UdpEncapContext,
|
|
LPVOID pvReserved,
|
|
PHANDLE phNegotiation
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
QM_FILTER_CONTAINER FilterContainer;
|
|
PQM_FILTER_CONTAINER pFilterContainer = &FilterContainer;
|
|
ULONG uhClientEvent = 0;
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
pFilterContainer->dwNumFilters = 1;
|
|
pFilterContainer->pQMFilters = pQMFilter;
|
|
uhClientEvent = HandleToUlong(hClientEvent);
|
|
|
|
if (phNegotiation) {
|
|
*phNegotiation = NULL;
|
|
}
|
|
|
|
if (pQMFilter && (pQMFilter->IpVersion != IPSEC_PROTOCOL_V4)) {
|
|
return (ERROR_INVALID_LEVEL);
|
|
}
|
|
|
|
dwError=ValidateInitiateIKENegotiation(
|
|
pServerName,
|
|
pFilterContainer,
|
|
dwClientProcessId,
|
|
uhClientEvent,
|
|
dwFlags,
|
|
UdpEncapContext,
|
|
phNegotiation
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcInitiateIKENegotiation(
|
|
pServerName,
|
|
dwVersion,
|
|
pFilterContainer,
|
|
dwClientProcessId,
|
|
uhClientEvent,
|
|
dwFlags,
|
|
UdpEncapContext,
|
|
phNegotiation
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
QueryIKENegotiationStatus(
|
|
HANDLE hNegotiation,
|
|
DWORD dwVersion,
|
|
PSA_NEGOTIATION_STATUS_INFO pNegotiationStatus,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
dwError = ValidateQueryIKENegotiationStatus(
|
|
hNegotiation,
|
|
pNegotiationStatus
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcQueryIKENegotiationStatus(
|
|
hNegotiation,
|
|
dwVersion,
|
|
pNegotiationStatus
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
CloseIKENegotiationHandle(
|
|
HANDLE hNegotiation
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
|
|
|
|
dwError = ValidateCloseIKENegotiationHandle(hNegotiation);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcCloseIKENegotiationHandle(
|
|
&hNegotiation
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
EnumMMSAs(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
PIPSEC_MM_SA pMMTemplate,
|
|
DWORD dwFlags,
|
|
DWORD dwPreferredNumEntries,
|
|
PIPSEC_MM_SA * ppMMSAs,
|
|
LPDWORD pdwNumEntries,
|
|
LPDWORD pdwTotalMMsAvailable,
|
|
LPDWORD pdwEnumHandle,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
MM_SA_CONTAINER MMSAContainer, MMSAContainerTemplate;
|
|
PMM_SA_CONTAINER pContainer = &MMSAContainer;
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (pMMTemplate && (pMMTemplate->IpVersion != IPSEC_PROTOCOL_V4)) {
|
|
return (ERROR_INVALID_LEVEL);
|
|
}
|
|
|
|
MMSAContainerTemplate.dwNumMMSAs = 1;
|
|
MMSAContainerTemplate.pMMSAs = pMMTemplate;
|
|
|
|
memset(&MMSAContainer, 0, sizeof(MM_SA_CONTAINER));
|
|
|
|
if (ppMMSAs == NULL) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
dwError = ValidateEnumMMSAs(
|
|
pServerName,
|
|
&MMSAContainerTemplate,
|
|
&pContainer,
|
|
pdwNumEntries,
|
|
pdwTotalMMsAvailable,
|
|
pdwEnumHandle,
|
|
dwFlags
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcEnumMMSAs(
|
|
pServerName,
|
|
dwVersion,
|
|
&MMSAContainerTemplate,
|
|
dwFlags,
|
|
dwPreferredNumEntries,
|
|
&pContainer,
|
|
pdwNumEntries,
|
|
pdwTotalMMsAvailable,
|
|
pdwEnumHandle
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
*ppMMSAs = pContainer->pMMSAs;
|
|
|
|
return (dwError);
|
|
|
|
error:
|
|
|
|
*ppMMSAs = NULL;
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
DeleteMMSAs(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
PIPSEC_MM_SA pMMTemplate,
|
|
DWORD dwFlags,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
MM_SA_CONTAINER MMSAContainerTemplate;
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (pMMTemplate && (pMMTemplate->IpVersion != IPSEC_PROTOCOL_V4)) {
|
|
return (ERROR_INVALID_LEVEL);
|
|
}
|
|
|
|
MMSAContainerTemplate.dwNumMMSAs = 1;
|
|
MMSAContainerTemplate.pMMSAs = pMMTemplate;
|
|
|
|
dwError = ValidateDeleteMMSAs(
|
|
pServerName,
|
|
&MMSAContainerTemplate,
|
|
dwFlags
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcDeleteMMSAs(
|
|
pServerName,
|
|
dwVersion,
|
|
&MMSAContainerTemplate,
|
|
dwFlags
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
DeleteQMSAs(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
PIPSEC_QM_SA pIpsecQMSA,
|
|
DWORD dwFlags,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
QM_SA_CONTAINER QMSATempContainer;
|
|
PQM_SA_CONTAINER pQMSATempContainer = &QMSATempContainer;
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (pIpsecQMSA && (pIpsecQMSA->IpsecQMFilter.IpVersion != IPSEC_PROTOCOL_V4)) {
|
|
return (ERROR_INVALID_LEVEL);
|
|
}
|
|
|
|
memset(pQMSATempContainer, 0, sizeof(QM_SA_CONTAINER));
|
|
|
|
if (!pIpsecQMSA) {
|
|
dwError = ERROR_INVALID_PARAMETER;
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
}
|
|
|
|
pQMSATempContainer->dwNumQMSAs = 1;
|
|
pQMSATempContainer->pQMSAs = pIpsecQMSA;
|
|
|
|
dwError = ValidateQMFilterAddresses(
|
|
&pQMSATempContainer->pQMSAs->IpsecQMFilter
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcDeleteQMSAs(
|
|
pServerName,
|
|
dwVersion,
|
|
pQMSATempContainer,
|
|
dwFlags
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
QueryIKEStatistics(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
PIKE_STATISTICS pIKEStatistics,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
dwError = ValidateQueryIKEStatistics(
|
|
pServerName,
|
|
pIKEStatistics
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcQueryIKEStatistics(
|
|
pServerName,
|
|
dwVersion,
|
|
pIKEStatistics
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
RegisterIKENotifyClient(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
DWORD dwClientProcessId,
|
|
HANDLE hClientEvent,
|
|
IPSEC_QM_SA QMTemplate,
|
|
DWORD dwFlags,
|
|
LPVOID pvReserved,
|
|
PHANDLE phNotifyHandle
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
ULONG uhClientEvent = 0;
|
|
QM_SA_CONTAINER QMSAContainer;
|
|
PQM_SA_CONTAINER pQMSAContainer = &QMSAContainer;
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (QMTemplate.IpsecQMFilter.IpVersion != IPSEC_PROTOCOL_V4) {
|
|
return (ERROR_INVALID_LEVEL);
|
|
}
|
|
|
|
QMSAContainer.dwNumQMSAs = 1;
|
|
QMSAContainer.pQMSAs = &QMTemplate;
|
|
|
|
uhClientEvent = HandleToUlong(hClientEvent);
|
|
|
|
dwError = ValidateRegisterIKENotifyClient(
|
|
pServerName,
|
|
dwClientProcessId,
|
|
uhClientEvent,
|
|
pQMSAContainer,
|
|
phNotifyHandle,
|
|
dwFlags
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcRegisterIKENotifyClient(
|
|
pServerName,
|
|
dwVersion,
|
|
dwClientProcessId,
|
|
uhClientEvent,
|
|
pQMSAContainer,
|
|
dwFlags,
|
|
phNotifyHandle
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
QueryIKENotifyData(
|
|
HANDLE hNotifyHandle,
|
|
DWORD dwVersion,
|
|
DWORD dwFlags,
|
|
PIPSEC_QM_SA * ppQMSAs,
|
|
PDWORD pdwNumEntries,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
QM_SA_CONTAINER QMSAContainer;
|
|
PQM_SA_CONTAINER pContainer = &QMSAContainer;
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
memset(&QMSAContainer, 0, sizeof(QM_SA_CONTAINER));
|
|
|
|
if ((ppQMSAs == NULL) || (pdwNumEntries == NULL)) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
dwError = ValidateQueryNotifyData(
|
|
hNotifyHandle,
|
|
pdwNumEntries,
|
|
&pContainer,
|
|
dwFlags
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcQueryIKENotifyData(
|
|
hNotifyHandle,
|
|
dwVersion,
|
|
dwFlags,
|
|
&pContainer,
|
|
pdwNumEntries
|
|
);
|
|
|
|
if (dwError && dwError != ERROR_MORE_DATA) {
|
|
goto error;
|
|
}
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
*ppQMSAs = pContainer->pQMSAs;
|
|
*pdwNumEntries = pContainer->dwNumQMSAs;
|
|
|
|
return (dwError);
|
|
|
|
error:
|
|
|
|
*ppQMSAs = NULL;
|
|
*pdwNumEntries = 0;
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
CloseIKENotifyHandle(
|
|
HANDLE hNotifyHandle
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
|
|
|
|
dwError = ValidateCloseNotifyHandle(hNotifyHandle);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcCloseIKENotifyHandle(
|
|
&hNotifyHandle
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
QueryIPSecStatistics(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
PIPSEC_STATISTICS * ppIpsecStatistics,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
IPSEC_STATISTICS_CONTAINER IpsecStatsContainer;
|
|
PIPSEC_STATISTICS_CONTAINER pIpsecStatsContainer = &IpsecStatsContainer;
|
|
|
|
|
|
memset(pIpsecStatsContainer, 0, sizeof(IPSEC_STATISTICS_CONTAINER));
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!ppIpsecStatistics) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcQueryIPSecStatistics(
|
|
pServerName,
|
|
dwVersion,
|
|
&pIpsecStatsContainer
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
|
|
*ppIpsecStatistics = pIpsecStatsContainer->pIpsecStatistics;
|
|
return (dwError);
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
EnumQMSAs(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
PIPSEC_QM_SA pQMSATemplate,
|
|
DWORD dwFlags,
|
|
DWORD dwPreferredNumEntries,
|
|
PIPSEC_QM_SA * ppQMSAs,
|
|
LPDWORD pdwNumQMSAs,
|
|
LPDWORD pdwNumTotalQMSAs,
|
|
LPDWORD pdwResumeHandle,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
QM_SA_CONTAINER QMSATempContainer;
|
|
PQM_SA_CONTAINER pQMSATempContainer = &QMSATempContainer;
|
|
QM_SA_CONTAINER QMSAContainer;
|
|
PQM_SA_CONTAINER pQMSAContainer = &QMSAContainer;
|
|
|
|
|
|
memset(pQMSAContainer, 0, sizeof(QM_SA_CONTAINER));
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (pQMSATemplate) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!ppQMSAs || !pdwNumQMSAs ||
|
|
!pdwNumTotalQMSAs || !pdwResumeHandle) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
pQMSATempContainer->dwNumQMSAs = 0;
|
|
pQMSATempContainer->pQMSAs = NULL;
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcEnumQMSAs(
|
|
pServerName,
|
|
dwVersion,
|
|
pQMSATempContainer,
|
|
dwFlags,
|
|
dwPreferredNumEntries,
|
|
&pQMSAContainer,
|
|
pdwNumTotalQMSAs,
|
|
pdwResumeHandle
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
*ppQMSAs = pQMSAContainer->pQMSAs;
|
|
*pdwNumQMSAs = pQMSAContainer->dwNumQMSAs;
|
|
|
|
return (dwError);
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
AddTunnelFilter(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
DWORD dwFlags,
|
|
PTUNNEL_FILTER pTunnelFilter,
|
|
LPVOID pvReserved,
|
|
PHANDLE phFilter
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
TUNNEL_FILTER_CONTAINER FilterContainer;
|
|
PTUNNEL_FILTER_CONTAINER pFilterContainer = &FilterContainer;
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!phFilter) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
if (pTunnelFilter && (pTunnelFilter->IpVersion != IPSEC_PROTOCOL_V4)) {
|
|
return (ERROR_INVALID_LEVEL);
|
|
}
|
|
|
|
dwError = ValidateTunnelFilter(
|
|
pTunnelFilter
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
pFilterContainer->dwNumFilters = 1;
|
|
pFilterContainer->pTunnelFilters = pTunnelFilter;
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcAddTunnelFilter(
|
|
pServerName,
|
|
dwVersion,
|
|
dwFlags,
|
|
pFilterContainer,
|
|
phFilter
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
DeleteTunnelFilter(
|
|
HANDLE hFilter
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
|
|
|
|
if (!hFilter) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcDeleteTunnelFilter(
|
|
&hFilter
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
if (dwError) {
|
|
dwError = SPDDestroyClientContextHandle(
|
|
dwError,
|
|
hFilter
|
|
);
|
|
}
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
EnumTunnelFilters(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
PTUNNEL_FILTER pTunnelTemplateFilter,
|
|
DWORD dwLevel,
|
|
GUID gGenericFilterID,
|
|
DWORD dwPreferredNumEntries,
|
|
PTUNNEL_FILTER * ppTunnelFilters,
|
|
LPDWORD pdwNumFilters,
|
|
LPDWORD pdwResumeHandle,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
TUNNEL_FILTER_CONTAINER FilterContainer;
|
|
PTUNNEL_FILTER_CONTAINER pFilterContainer = &FilterContainer;
|
|
TUNNEL_FILTER_CONTAINER TemplateFilterContainer;
|
|
PTUNNEL_FILTER_CONTAINER pTemplateFilterContainer = &TemplateFilterContainer;
|
|
|
|
|
|
memset(pFilterContainer, 0, sizeof(TUNNEL_FILTER_CONTAINER));
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (pTunnelTemplateFilter) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!ppTunnelFilters || !pdwNumFilters || !pdwResumeHandle) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
switch (dwLevel) {
|
|
|
|
case ENUM_GENERIC_FILTERS:
|
|
case ENUM_SELECT_SPECIFIC_FILTERS:
|
|
case ENUM_SPECIFIC_FILTERS:
|
|
break;
|
|
|
|
default:
|
|
dwError = ERROR_INVALID_LEVEL;
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
break;
|
|
|
|
}
|
|
|
|
pTemplateFilterContainer->dwNumFilters = 0;
|
|
pTemplateFilterContainer->pTunnelFilters = NULL;
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcEnumTunnelFilters(
|
|
pServerName,
|
|
dwVersion,
|
|
pTemplateFilterContainer,
|
|
dwLevel,
|
|
gGenericFilterID,
|
|
dwPreferredNumEntries,
|
|
&pFilterContainer,
|
|
pdwResumeHandle
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
*ppTunnelFilters = pFilterContainer->pTunnelFilters;
|
|
*pdwNumFilters = pFilterContainer->dwNumFilters;
|
|
|
|
return (dwError);
|
|
|
|
error:
|
|
|
|
*ppTunnelFilters = NULL;
|
|
*pdwNumFilters = 0;
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
SetTunnelFilter(
|
|
HANDLE hFilter,
|
|
DWORD dwVersion,
|
|
PTUNNEL_FILTER pTunnelFilter,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
TUNNEL_FILTER_CONTAINER FilterContainer;
|
|
PTUNNEL_FILTER_CONTAINER pFilterContainer = &FilterContainer;
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!hFilter) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
if (pTunnelFilter && (pTunnelFilter->IpVersion != IPSEC_PROTOCOL_V4)) {
|
|
return (ERROR_INVALID_LEVEL);
|
|
}
|
|
|
|
dwError = ValidateTunnelFilter(
|
|
pTunnelFilter
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
pFilterContainer->dwNumFilters = 1;
|
|
pFilterContainer->pTunnelFilters = pTunnelFilter;
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcSetTunnelFilter(
|
|
hFilter,
|
|
dwVersion,
|
|
pFilterContainer
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
GetTunnelFilter(
|
|
HANDLE hFilter,
|
|
DWORD dwVersion,
|
|
PTUNNEL_FILTER * ppTunnelFilter,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
TUNNEL_FILTER_CONTAINER FilterContainer;
|
|
PTUNNEL_FILTER_CONTAINER pFilterContainer = &FilterContainer;
|
|
|
|
|
|
memset(pFilterContainer, 0, sizeof(TUNNEL_FILTER_CONTAINER));
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!hFilter || !ppTunnelFilter) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcGetTunnelFilter(
|
|
hFilter,
|
|
dwVersion,
|
|
&pFilterContainer
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
|
|
*ppTunnelFilter = pFilterContainer->pTunnelFilters;
|
|
return (dwError);
|
|
|
|
error:
|
|
|
|
*ppTunnelFilter = NULL;
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
MatchTunnelFilter(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
PTUNNEL_FILTER pTnFilter,
|
|
DWORD dwFlags,
|
|
DWORD dwPreferredNumEntries,
|
|
PTUNNEL_FILTER * ppMatchedTnFilters,
|
|
PIPSEC_QM_POLICY * ppMatchedQMPolicies,
|
|
LPDWORD pdwNumMatches,
|
|
LPDWORD pdwResumeHandle,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
TUNNEL_FILTER_CONTAINER InTnFilterContainer;
|
|
PTUNNEL_FILTER_CONTAINER pInTnFilterContainer = &InTnFilterContainer;
|
|
TUNNEL_FILTER_CONTAINER OutTnFilterContainer;
|
|
PTUNNEL_FILTER_CONTAINER pOutTnFilterContainer = &OutTnFilterContainer;
|
|
IPSEC_QM_POLICY_CONTAINER QMPolicyContainer;
|
|
PIPSEC_QM_POLICY_CONTAINER pQMPolicyContainer = &QMPolicyContainer;
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!pTnFilter || !ppMatchedTnFilters || !ppMatchedQMPolicies ||
|
|
!pdwNumMatches || !pdwResumeHandle) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
if (pTnFilter && (pTnFilter->IpVersion != IPSEC_PROTOCOL_V4)) {
|
|
return (ERROR_INVALID_LEVEL);
|
|
}
|
|
|
|
dwError = ValidateTnFilterTemplate(
|
|
pTnFilter
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
pInTnFilterContainer->dwNumFilters = 1;
|
|
pInTnFilterContainer->pTunnelFilters = pTnFilter;
|
|
|
|
memset(pOutTnFilterContainer, 0, sizeof(TUNNEL_FILTER_CONTAINER));
|
|
memset(pQMPolicyContainer, 0, sizeof(IPSEC_QM_POLICY_CONTAINER));
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcMatchTunnelFilter(
|
|
pServerName,
|
|
dwVersion,
|
|
pInTnFilterContainer,
|
|
dwFlags,
|
|
dwPreferredNumEntries,
|
|
&pOutTnFilterContainer,
|
|
&pQMPolicyContainer,
|
|
pdwResumeHandle
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
*ppMatchedTnFilters = pOutTnFilterContainer->pTunnelFilters;
|
|
*ppMatchedQMPolicies = pQMPolicyContainer->pPolicies;
|
|
*pdwNumMatches = pOutTnFilterContainer->dwNumFilters;
|
|
|
|
return (dwError);
|
|
|
|
error:
|
|
|
|
*ppMatchedTnFilters = NULL;
|
|
*ppMatchedQMPolicies = NULL;
|
|
*pdwNumMatches = 0;
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
OpenMMFilterHandle(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
PMM_FILTER pMMFilter,
|
|
LPVOID pvReserved,
|
|
PHANDLE phMMFilter
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
MM_FILTER_CONTAINER MMFilterContainer;
|
|
PMM_FILTER_CONTAINER pMMFilterContainer = &MMFilterContainer;
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!phMMFilter) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
if (pMMFilter && (pMMFilter->IpVersion != IPSEC_PROTOCOL_V4)) {
|
|
return (ERROR_INVALID_LEVEL);
|
|
}
|
|
|
|
dwError = ValidateMMFilter(
|
|
pMMFilter
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
pMMFilterContainer->dwNumFilters = 1;
|
|
pMMFilterContainer->pMMFilters = pMMFilter;
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcOpenMMFilterHandle(
|
|
pServerName,
|
|
dwVersion,
|
|
pMMFilterContainer,
|
|
phMMFilter
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
CloseMMFilterHandle(
|
|
HANDLE hMMFilter
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
|
|
|
|
if (!hMMFilter) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcCloseMMFilterHandle(
|
|
&hMMFilter
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
if (dwError) {
|
|
dwError = SPDDestroyClientContextHandle(
|
|
dwError,
|
|
hMMFilter
|
|
);
|
|
}
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
OpenTransportFilterHandle(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
PTRANSPORT_FILTER pTransportFilter,
|
|
LPVOID pvReserved,
|
|
PHANDLE phTxFilter
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
TRANSPORT_FILTER_CONTAINER FilterContainer;
|
|
PTRANSPORT_FILTER_CONTAINER pFilterContainer = &FilterContainer;
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!phTxFilter) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
if (pTransportFilter && (pTransportFilter->IpVersion != IPSEC_PROTOCOL_V4)) {
|
|
return (ERROR_INVALID_LEVEL);
|
|
}
|
|
|
|
dwError = ValidateTransportFilter(
|
|
pTransportFilter
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
pFilterContainer->dwNumFilters = 1;
|
|
pFilterContainer->pTransportFilters = pTransportFilter;
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcOpenTransportFilterHandle(
|
|
pServerName,
|
|
dwVersion,
|
|
pFilterContainer,
|
|
phTxFilter
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
CloseTransportFilterHandle(
|
|
HANDLE hTxFilter
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
|
|
|
|
if (!hTxFilter) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcCloseTransportFilterHandle(
|
|
&hTxFilter
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
if (dwError) {
|
|
dwError = SPDDestroyClientContextHandle(
|
|
dwError,
|
|
hTxFilter
|
|
);
|
|
}
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
OpenTunnelFilterHandle(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
PTUNNEL_FILTER pTunnelFilter,
|
|
LPVOID pvReserved,
|
|
PHANDLE phTnFilter
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
TUNNEL_FILTER_CONTAINER FilterContainer;
|
|
PTUNNEL_FILTER_CONTAINER pFilterContainer = &FilterContainer;
|
|
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!phTnFilter) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
if (pTunnelFilter && (pTunnelFilter->IpVersion != IPSEC_PROTOCOL_V4)) {
|
|
return (ERROR_INVALID_LEVEL);
|
|
}
|
|
|
|
dwError = ValidateTunnelFilter(
|
|
pTunnelFilter
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
pFilterContainer->dwNumFilters = 1;
|
|
pFilterContainer->pTunnelFilters = pTunnelFilter;
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcOpenTunnelFilterHandle(
|
|
pServerName,
|
|
dwVersion,
|
|
pFilterContainer,
|
|
phTnFilter
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
CloseTunnelFilterHandle(
|
|
HANDLE hTnFilter
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
|
|
|
|
if (!hTnFilter) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcCloseTunnelFilterHandle(
|
|
&hTnFilter
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
if (dwError) {
|
|
dwError = SPDDestroyClientContextHandle(
|
|
dwError,
|
|
hTnFilter
|
|
);
|
|
}
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
EnumIPSecInterfaces(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
PIPSEC_INTERFACE_INFO pIpsecIfTemplate,
|
|
DWORD dwFlags,
|
|
DWORD dwPreferredNumEntries,
|
|
PIPSEC_INTERFACE_INFO * ppIpsecInterfaces,
|
|
LPDWORD pdwNumInterfaces,
|
|
LPDWORD pdwNumTotalInterfaces,
|
|
LPDWORD pdwResumeHandle,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
IPSEC_INTERFACE_CONTAINER IpsecIfTempContainer;
|
|
PIPSEC_INTERFACE_CONTAINER pIpsecIfTempContainer = &IpsecIfTempContainer;
|
|
IPSEC_INTERFACE_CONTAINER IpsecIfContainer;
|
|
PIPSEC_INTERFACE_CONTAINER pIpsecIfContainer = &IpsecIfContainer;
|
|
|
|
|
|
memset(pIpsecIfContainer, 0, sizeof(IPSEC_INTERFACE_CONTAINER));
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (pIpsecIfTemplate) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!ppIpsecInterfaces || !pdwNumInterfaces ||
|
|
!pdwNumTotalInterfaces || !pdwResumeHandle) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
pIpsecIfTempContainer->dwNumInterfaces = 0;
|
|
pIpsecIfTempContainer->pIpsecInterfaces = NULL;
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcEnumIpsecInterfaces(
|
|
pServerName,
|
|
dwVersion,
|
|
pIpsecIfTempContainer,
|
|
dwFlags,
|
|
dwPreferredNumEntries,
|
|
&pIpsecIfContainer,
|
|
pdwNumTotalInterfaces,
|
|
pdwResumeHandle
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
*ppIpsecInterfaces = pIpsecIfContainer->pIpsecInterfaces;
|
|
*pdwNumInterfaces = pIpsecIfContainer->dwNumInterfaces;
|
|
|
|
return (dwError);
|
|
|
|
error:
|
|
|
|
*ppIpsecInterfaces = NULL;
|
|
*pdwNumInterfaces = 0;
|
|
*pdwNumTotalInterfaces = 0;
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
AddSAs(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
IPSEC_SA_DIRECTION SADirection,
|
|
PIPSEC_QM_OFFER pQMOffer,
|
|
PIPSEC_QM_FILTER pQMFilter,
|
|
HANDLE * phLarvalContext,
|
|
DWORD dwInboundKeyMatLen,
|
|
BYTE * pInboundKeyMat,
|
|
DWORD dwOutboundKeyMatLen,
|
|
BYTE * pOutboundKeyMat,
|
|
BYTE * pContextInfo,
|
|
UDP_ENCAP_INFO EncapInfo,
|
|
LPVOID pvReserved,
|
|
DWORD dwFlags
|
|
)
|
|
|
|
{
|
|
DWORD dwError = 0;
|
|
QM_FILTER_CONTAINER FilterContainer;
|
|
PQM_FILTER_CONTAINER pFilterContainer = &FilterContainer;
|
|
IPSEC_QM_POLICY_CONTAINER QMPolicyContainer;
|
|
PIPSEC_QM_POLICY_CONTAINER pQMPolicyContainer = &QMPolicyContainer;
|
|
IPSEC_QM_POLICY QMPolicy;
|
|
ULONG uhLarvalContext = 0;
|
|
|
|
|
|
memset(&QMPolicy, 0, sizeof(IPSEC_QM_POLICY));
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (phLarvalContext == NULL) {
|
|
dwError = ERROR_INVALID_PARAMETER;
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
}
|
|
|
|
if (pQMFilter && (pQMFilter->IpVersion != IPSEC_PROTOCOL_V4)) {
|
|
return (ERROR_INVALID_LEVEL);
|
|
}
|
|
|
|
uhLarvalContext = HandleToUlong(*phLarvalContext);
|
|
|
|
pFilterContainer->dwNumFilters = 1;
|
|
pFilterContainer->pQMFilters = pQMFilter;
|
|
|
|
pQMPolicyContainer->dwNumPolicies = 1;
|
|
QMPolicy.pOffers = pQMOffer;
|
|
QMPolicy.dwOfferCount = 1;
|
|
pQMPolicyContainer->pPolicies = &QMPolicy;
|
|
|
|
dwError=ValidateIPSecAddSA(
|
|
pServerName,
|
|
SADirection,
|
|
pQMPolicyContainer,
|
|
pFilterContainer,
|
|
&uhLarvalContext,
|
|
dwInboundKeyMatLen,
|
|
pInboundKeyMat,
|
|
dwOutboundKeyMatLen,
|
|
pOutboundKeyMat,
|
|
pContextInfo,
|
|
EncapInfo,
|
|
dwFlags);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcAddSAs(
|
|
pServerName,
|
|
dwVersion,
|
|
SADirection,
|
|
pQMPolicyContainer,
|
|
pFilterContainer,
|
|
&uhLarvalContext,
|
|
dwInboundKeyMatLen,
|
|
pInboundKeyMat,
|
|
dwOutboundKeyMatLen,
|
|
pOutboundKeyMat,
|
|
pContextInfo,
|
|
EncapInfo,
|
|
dwFlags);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
*phLarvalContext = LongToHandle(uhLarvalContext);
|
|
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
WINAPI
|
|
SetConfigurationVariables(
|
|
LPWSTR pServerName,
|
|
IKE_CONFIG IKEConfig
|
|
)
|
|
{
|
|
|
|
DWORD dwError = 0;
|
|
|
|
dwError=ValidateSetConfigurationVariables(
|
|
pServerName,
|
|
IKEConfig
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcSetConfigurationVariables(
|
|
pServerName,
|
|
IKEConfig
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
DWORD
|
|
WINAPI
|
|
GetConfigurationVariables(
|
|
LPWSTR pServerName,
|
|
PIKE_CONFIG pIKEConfig
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
|
|
dwError=ValidateGetConfigurationVariables(
|
|
pServerName,
|
|
pIKEConfig
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcGetConfigurationVariables(
|
|
pServerName,
|
|
pIKEConfig
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
error:
|
|
|
|
return (dwError);
|
|
}
|
|
|
|
|
|
DWORD
|
|
WINAPI
|
|
QuerySpdPolicyState(
|
|
LPWSTR pServerName,
|
|
DWORD dwVersion,
|
|
PSPD_POLICY_STATE * ppSpdPolicyState,
|
|
LPVOID pvReserved
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
SPD_POLICY_STATE_CONTAINER SpdPolicyStateContainer;
|
|
PSPD_POLICY_STATE_CONTAINER pSpdPolicyStateContainer = &SpdPolicyStateContainer;
|
|
|
|
memset(pSpdPolicyStateContainer, 0, sizeof(SPD_POLICY_STATE_CONTAINER));
|
|
|
|
if (dwVersion) {
|
|
return (ERROR_NOT_SUPPORTED);
|
|
}
|
|
|
|
if (!ppSpdPolicyState) {
|
|
return (ERROR_INVALID_PARAMETER);
|
|
}
|
|
|
|
RpcTryExcept {
|
|
|
|
dwError = RpcQuerySpdPolicyState(
|
|
pServerName,
|
|
dwVersion,
|
|
&pSpdPolicyStateContainer
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcExcept(I_RpcExceptionFilter(RpcExceptionCode())) {
|
|
|
|
dwError = TranslateExceptionCode(RpcExceptionCode());
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
} RpcEndExcept
|
|
|
|
|
|
*ppSpdPolicyState = pSpdPolicyStateContainer->pSpdPolicyStates;
|
|
return (dwError);
|
|
|
|
error:
|
|
*ppSpdPolicyState = NULL;
|
|
|
|
return (dwError);
|
|
}
|