Leaked source code of windows server 2003
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

/*++
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);
}