/*++ Copyright (c) 1999 Microsoft Corporation Module Name: spdrpc.c Abstract: This module contains all of the code to service the RPC calls made to the SPD server. Author: abhisheV 30-September-1999 Environment User Level: Win32 Revision History: --*/ #include "precomp.h" VOID TRANSPORTFILTER_HANDLE_rundown( TRANSPORTFILTER_HANDLE hFilter ) { if (!gbSPDRPCServerUp) { return; } if (hFilter) { (VOID) DeleteTransportFilter( hFilter ); } return; } DWORD RpcAddTransportFilter( STRING_HANDLE pServerName, DWORD dwFlags, PTRANSPORT_FILTER_CONTAINER pFilterContainer, TRANSPORTFILTER_HANDLE * phFilter ) { DWORD dwError = 0; PTRANSPORT_FILTER pTransportFilter = NULL; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); BAIL_ON_WIN32_ERROR(dwError); if (!pFilterContainer || !phFilter) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } if (!(pFilterContainer->pTransportFilters) || !(pFilterContainer->dwNumFilters)) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } pTransportFilter = pFilterContainer->pTransportFilters; dwError = AddTransportFilter( pServerName, dwFlags, pTransportFilter, phFilter ); BAIL_ON_WIN32_ERROR(dwError); error: SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcDeleteTransportFilter( TRANSPORTFILTER_HANDLE * phFilter ) { DWORD dwError = 0; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); BAIL_ON_WIN32_ERROR(dwError); if (!phFilter) { SPDRevertToSelf(bImpersonating); return (ERROR_INVALID_PARAMETER); } dwError = DeleteTransportFilter( *phFilter ); BAIL_ON_WIN32_ERROR(dwError); *phFilter = NULL; error: SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcEnumTransportFilters( STRING_HANDLE pServerName, DWORD dwLevel, GUID gGenericFilterID, PTRANSPORT_FILTER_CONTAINER * ppFilterContainer, DWORD dwPreferredNumEntries, LPDWORD pdwResumeHandle ) { DWORD dwError = 0; PTRANSPORT_FILTER pTransportFilters = NULL; DWORD dwNumFilters = 0; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); if (dwError) { return (dwError); } if (!ppFilterContainer || !pdwResumeHandle || !*ppFilterContainer) { SPDRevertToSelf(bImpersonating); 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; } dwError = EnumTransportFilters( pServerName, dwLevel, gGenericFilterID, &pTransportFilters, dwPreferredNumEntries, &dwNumFilters, pdwResumeHandle ); BAIL_ON_WIN32_ERROR(dwError); (*ppFilterContainer)->pTransportFilters = pTransportFilters; (*ppFilterContainer)->dwNumFilters = dwNumFilters; SPDRevertToSelf(bImpersonating); return (dwError); error: (*ppFilterContainer)->pTransportFilters = NULL; (*ppFilterContainer)->dwNumFilters = 0; SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcSetTransportFilter( TRANSPORTFILTER_HANDLE hFilter, PTRANSPORT_FILTER_CONTAINER pFilterContainer ) { DWORD dwError = 0; PTRANSPORT_FILTER pTransportFilter = NULL; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); BAIL_ON_WIN32_ERROR(dwError); if (!hFilter || !pFilterContainer) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } if (!(pFilterContainer->pTransportFilters) || !(pFilterContainer->dwNumFilters)) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } pTransportFilter = pFilterContainer->pTransportFilters; dwError = SetTransportFilter( hFilter, pTransportFilter ); BAIL_ON_WIN32_ERROR(dwError); error: SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcGetTransportFilter( TRANSPORTFILTER_HANDLE hFilter, PTRANSPORT_FILTER_CONTAINER * ppFilterContainer ) { DWORD dwError = 0; PTRANSPORT_FILTER pTransportFilter = NULL; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); if (dwError) { return (dwError); } if (!hFilter || !ppFilterContainer || !*ppFilterContainer) { SPDRevertToSelf(bImpersonating); return (ERROR_INVALID_PARAMETER); } dwError = GetTransportFilter( hFilter, &pTransportFilter ); BAIL_ON_WIN32_ERROR(dwError); (*ppFilterContainer)->pTransportFilters = pTransportFilter; (*ppFilterContainer)->dwNumFilters = 1; SPDRevertToSelf(bImpersonating); return (dwError); error: (*ppFilterContainer)->pTransportFilters = NULL; (*ppFilterContainer)->dwNumFilters = 0; SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcAddQMPolicy( STRING_HANDLE pServerName, DWORD dwFlags, PIPSEC_QM_POLICY_CONTAINER pQMPolicyContainer ) { DWORD dwError = 0; PIPSEC_QM_POLICY pQMPolicy = NULL; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); BAIL_ON_WIN32_ERROR(dwError); if (!pQMPolicyContainer) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } if (!(pQMPolicyContainer->pPolicies) || !(pQMPolicyContainer->dwNumPolicies)) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } pQMPolicy = pQMPolicyContainer->pPolicies; dwError = AddQMPolicy( pServerName, dwFlags, pQMPolicy ); BAIL_ON_WIN32_ERROR(dwError); error: SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcDeleteQMPolicy( STRING_HANDLE pServerName, LPWSTR pszPolicyName ) { DWORD dwError = 0; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); BAIL_ON_WIN32_ERROR(dwError); if (!pszPolicyName || !*pszPolicyName) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } dwError = DeleteQMPolicy( pServerName, pszPolicyName ); BAIL_ON_WIN32_ERROR(dwError); error: SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcEnumQMPolicies( STRING_HANDLE pServerName, PIPSEC_QM_POLICY_CONTAINER * ppQMPolicyContainer, DWORD dwPreferredNumEntries, LPDWORD pdwResumeHandle ) { DWORD dwError = 0; PIPSEC_QM_POLICY pQMPolicies = NULL; DWORD dwNumPolicies = 0; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); if (dwError) { return (dwError); } if (!ppQMPolicyContainer || !pdwResumeHandle || !*ppQMPolicyContainer) { // // Do not bail to error from here. // SPDRevertToSelf(bImpersonating); return (ERROR_INVALID_PARAMETER); } dwError = EnumQMPolicies( pServerName, &pQMPolicies, dwPreferredNumEntries, &dwNumPolicies, pdwResumeHandle ); BAIL_ON_WIN32_ERROR(dwError); (*ppQMPolicyContainer)->pPolicies = pQMPolicies; (*ppQMPolicyContainer)->dwNumPolicies = dwNumPolicies; SPDRevertToSelf(bImpersonating); return (dwError); error: (*ppQMPolicyContainer)->pPolicies = NULL; (*ppQMPolicyContainer)->dwNumPolicies = 0; SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcSetQMPolicy( STRING_HANDLE pServerName, LPWSTR pszPolicyName, PIPSEC_QM_POLICY_CONTAINER pQMPolicyContainer ) { DWORD dwError = 0; PIPSEC_QM_POLICY pQMPolicy = NULL; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); BAIL_ON_WIN32_ERROR(dwError); if (!pszPolicyName || !*pszPolicyName || !pQMPolicyContainer) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } if (!(pQMPolicyContainer->pPolicies) || !(pQMPolicyContainer->dwNumPolicies)) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } pQMPolicy = pQMPolicyContainer->pPolicies; dwError = SetQMPolicy( pServerName, pszPolicyName, pQMPolicy ); BAIL_ON_WIN32_ERROR(dwError); error: SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcGetQMPolicy( STRING_HANDLE pServerName, LPWSTR pszPolicyName, PIPSEC_QM_POLICY_CONTAINER * ppQMPolicyContainer ) { DWORD dwError = 0; PIPSEC_QM_POLICY pQMPolicy = NULL; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); if (dwError) { return (dwError); } if (!pszPolicyName || !*pszPolicyName || !ppQMPolicyContainer || !*ppQMPolicyContainer) { // // Do not bail to error from here. // SPDRevertToSelf(bImpersonating); return (ERROR_INVALID_PARAMETER); } dwError = GetQMPolicy( pServerName, pszPolicyName, &pQMPolicy ); BAIL_ON_WIN32_ERROR(dwError); (*ppQMPolicyContainer)->pPolicies = pQMPolicy; (*ppQMPolicyContainer)->dwNumPolicies = 1; SPDRevertToSelf(bImpersonating); return (dwError); error: (*ppQMPolicyContainer)->pPolicies = NULL; (*ppQMPolicyContainer)->dwNumPolicies = 0; SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcAddMMPolicy( STRING_HANDLE pServerName, DWORD dwFlags, PIPSEC_MM_POLICY_CONTAINER pMMPolicyContainer ) { DWORD dwError = 0; PIPSEC_MM_POLICY pMMPolicy = NULL; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); BAIL_ON_WIN32_ERROR(dwError); if (!pMMPolicyContainer) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } if (!(pMMPolicyContainer->pPolicies) || !(pMMPolicyContainer->dwNumPolicies)) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } pMMPolicy = pMMPolicyContainer->pPolicies; dwError = AddMMPolicy( pServerName, dwFlags, pMMPolicy ); BAIL_ON_WIN32_ERROR(dwError); error: SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcDeleteMMPolicy( STRING_HANDLE pServerName, LPWSTR pszPolicyName ) { DWORD dwError = 0; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); BAIL_ON_WIN32_ERROR(dwError); if (!pszPolicyName || !*pszPolicyName) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } dwError = DeleteMMPolicy( pServerName, pszPolicyName ); BAIL_ON_WIN32_ERROR(dwError); error: SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcEnumMMPolicies( STRING_HANDLE pServerName, PIPSEC_MM_POLICY_CONTAINER * ppMMPolicyContainer, DWORD dwPreferredNumEntries, LPDWORD pdwResumeHandle ) { DWORD dwError = 0; PIPSEC_MM_POLICY pMMPolicies = NULL; DWORD dwNumPolicies = 0; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); if (dwError) { return (dwError); } if (!ppMMPolicyContainer || !pdwResumeHandle || !*ppMMPolicyContainer) { // // Do not bail to error from here. // SPDRevertToSelf(bImpersonating); return (ERROR_INVALID_PARAMETER); } dwError = EnumMMPolicies( pServerName, &pMMPolicies, dwPreferredNumEntries, &dwNumPolicies, pdwResumeHandle ); BAIL_ON_WIN32_ERROR(dwError); (*ppMMPolicyContainer)->pPolicies = pMMPolicies; (*ppMMPolicyContainer)->dwNumPolicies = dwNumPolicies; SPDRevertToSelf(bImpersonating); return (dwError); error: (*ppMMPolicyContainer)->pPolicies = NULL; (*ppMMPolicyContainer)->dwNumPolicies = 0; SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcSetMMPolicy( STRING_HANDLE pServerName, LPWSTR pszPolicyName, PIPSEC_MM_POLICY_CONTAINER pMMPolicyContainer ) { DWORD dwError = 0; PIPSEC_MM_POLICY pMMPolicy = NULL; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); BAIL_ON_WIN32_ERROR(dwError); if (!pszPolicyName || !*pszPolicyName || !pMMPolicyContainer) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } if (!(pMMPolicyContainer->pPolicies) || !(pMMPolicyContainer->dwNumPolicies)) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } pMMPolicy = pMMPolicyContainer->pPolicies; dwError = SetMMPolicy( pServerName, pszPolicyName, pMMPolicy ); BAIL_ON_WIN32_ERROR(dwError); error: SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcGetMMPolicy( STRING_HANDLE pServerName, LPWSTR pszPolicyName, PIPSEC_MM_POLICY_CONTAINER * ppMMPolicyContainer ) { DWORD dwError = 0; PIPSEC_MM_POLICY pMMPolicy = NULL; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); if (dwError) { return (dwError); } if (!pszPolicyName || !*pszPolicyName || !ppMMPolicyContainer || !*ppMMPolicyContainer) { // // Do not bail to error from here. // SPDRevertToSelf(bImpersonating); return (ERROR_INVALID_PARAMETER); } dwError = GetMMPolicy( pServerName, pszPolicyName, &pMMPolicy ); BAIL_ON_WIN32_ERROR(dwError); (*ppMMPolicyContainer)->pPolicies = pMMPolicy; (*ppMMPolicyContainer)->dwNumPolicies = 1; SPDRevertToSelf(bImpersonating); return (dwError); error: (*ppMMPolicyContainer)->pPolicies = NULL; (*ppMMPolicyContainer)->dwNumPolicies = 0; SPDRevertToSelf(bImpersonating); return (dwError); } VOID MMFILTER_HANDLE_rundown( MMFILTER_HANDLE hMMFilter ) { if (!gbSPDRPCServerUp) { return; } if (hMMFilter) { (VOID) DeleteMMFilter( hMMFilter ); } return; } DWORD RpcAddMMFilter( STRING_HANDLE pServerName, DWORD dwFlags, PMM_FILTER_CONTAINER pMMFilterContainer, MMFILTER_HANDLE * phMMFilter ) { DWORD dwError = 0; PMM_FILTER pMMFilter = NULL; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); BAIL_ON_WIN32_ERROR(dwError); if (!pMMFilterContainer || !phMMFilter) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } if (!(pMMFilterContainer->pMMFilters) || !(pMMFilterContainer->dwNumFilters)) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } pMMFilter = pMMFilterContainer->pMMFilters; dwError = AddMMFilter( pServerName, dwFlags, pMMFilter, phMMFilter ); BAIL_ON_WIN32_ERROR(dwError); error: SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcDeleteMMFilter( MMFILTER_HANDLE * phMMFilter ) { DWORD dwError = 0; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); BAIL_ON_WIN32_ERROR(dwError); if (!phMMFilter) { SPDRevertToSelf(bImpersonating); return (ERROR_INVALID_PARAMETER); } dwError = DeleteMMFilter( *phMMFilter ); BAIL_ON_WIN32_ERROR(dwError); *phMMFilter = NULL; error: SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcEnumMMFilters( STRING_HANDLE pServerName, DWORD dwLevel, GUID gGenericFilterID, PMM_FILTER_CONTAINER * ppMMFilterContainer, DWORD dwPreferredNumEntries, LPDWORD pdwResumeHandle ) { DWORD dwError = 0; PMM_FILTER pMMFilters = NULL; DWORD dwNumFilters = 0; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); if (dwError) { return (dwError); } if (!ppMMFilterContainer || !pdwResumeHandle || !*ppMMFilterContainer) { SPDRevertToSelf(bImpersonating); 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; } dwError = EnumMMFilters( pServerName, dwLevel, gGenericFilterID, &pMMFilters, dwPreferredNumEntries, &dwNumFilters, pdwResumeHandle ); BAIL_ON_WIN32_ERROR(dwError); (*ppMMFilterContainer)->pMMFilters = pMMFilters; (*ppMMFilterContainer)->dwNumFilters = dwNumFilters; SPDRevertToSelf(bImpersonating); return (dwError); error: (*ppMMFilterContainer)->pMMFilters = NULL; (*ppMMFilterContainer)->dwNumFilters = 0; SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcSetMMFilter( MMFILTER_HANDLE hMMFilter, PMM_FILTER_CONTAINER pMMFilterContainer ) { DWORD dwError = 0; PMM_FILTER pMMFilter = NULL; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); BAIL_ON_WIN32_ERROR(dwError); if (!hMMFilter || !pMMFilterContainer) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } if (!(pMMFilterContainer->pMMFilters) || !(pMMFilterContainer->dwNumFilters)) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } pMMFilter = pMMFilterContainer->pMMFilters; dwError = SetMMFilter( hMMFilter, pMMFilter ); BAIL_ON_WIN32_ERROR(dwError); error: SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcGetMMFilter( MMFILTER_HANDLE hMMFilter, PMM_FILTER_CONTAINER * ppMMFilterContainer ) { DWORD dwError = 0; PMM_FILTER pMMFilter = NULL; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); if (dwError) { return (dwError); } if (!hMMFilter || !ppMMFilterContainer || !*ppMMFilterContainer) { SPDRevertToSelf(bImpersonating); return (ERROR_INVALID_PARAMETER); } dwError = GetMMFilter( hMMFilter, &pMMFilter ); BAIL_ON_WIN32_ERROR(dwError); (*ppMMFilterContainer)->pMMFilters = pMMFilter; (*ppMMFilterContainer)->dwNumFilters = 1; SPDRevertToSelf(bImpersonating); return (dwError); error: (*ppMMFilterContainer)->pMMFilters = NULL; (*ppMMFilterContainer)->dwNumFilters = 0; SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcMatchMMFilter( STRING_HANDLE pServerName, PMM_FILTER_CONTAINER pMMFilterContainer, DWORD dwFlags, PMM_FILTER_CONTAINER * ppMMFilterContainer, PIPSEC_MM_POLICY_CONTAINER * ppMMPolicyContainer, PMM_AUTH_METHODS_CONTAINER * ppMMAuthContainer, DWORD dwPreferredNumEntries, LPDWORD pdwResumeHandle ) { DWORD dwError = 0; PMM_FILTER pMMFilter = NULL; PMM_FILTER pMatchedMMFilters = NULL; PIPSEC_MM_POLICY pMatchedMMPolicies = NULL; PMM_AUTH_METHODS pMatchedMMAuthMethods = NULL; DWORD dwNumMatches = 0; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); if (dwError) { return (dwError); } if (!pMMFilterContainer || !ppMMFilterContainer || !ppMMPolicyContainer || !ppMMAuthContainer || !pdwResumeHandle || !*ppMMFilterContainer || !*ppMMPolicyContainer || !*ppMMAuthContainer) { SPDRevertToSelf(bImpersonating); return (ERROR_INVALID_PARAMETER); } if (!(pMMFilterContainer->pMMFilters) || !(pMMFilterContainer->dwNumFilters)) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } pMMFilter = pMMFilterContainer->pMMFilters; dwError = MatchMMFilter( pServerName, pMMFilter, dwFlags, &pMatchedMMFilters, &pMatchedMMPolicies, &pMatchedMMAuthMethods, dwPreferredNumEntries, &dwNumMatches, pdwResumeHandle ); BAIL_ON_WIN32_ERROR(dwError); (*ppMMFilterContainer)->pMMFilters = pMatchedMMFilters; (*ppMMFilterContainer)->dwNumFilters = dwNumMatches; (*ppMMPolicyContainer)->pPolicies = pMatchedMMPolicies; (*ppMMPolicyContainer)->dwNumPolicies = dwNumMatches; (*ppMMAuthContainer)->pMMAuthMethods = pMatchedMMAuthMethods; (*ppMMAuthContainer)->dwNumAuthMethods = dwNumMatches; SPDRevertToSelf(bImpersonating); return (dwError); error: (*ppMMFilterContainer)->pMMFilters = NULL; (*ppMMFilterContainer)->dwNumFilters = 0; (*ppMMPolicyContainer)->pPolicies = NULL; (*ppMMPolicyContainer)->dwNumPolicies = 0; (*ppMMAuthContainer)->pMMAuthMethods = NULL; (*ppMMAuthContainer)->dwNumAuthMethods = 0; SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcMatchTransportFilter( STRING_HANDLE pServerName, PTRANSPORT_FILTER_CONTAINER pTxFilterContainer, DWORD dwFlags, PTRANSPORT_FILTER_CONTAINER * ppTxFilterContainer, PIPSEC_QM_POLICY_CONTAINER * ppQMPolicyContainer, DWORD dwPreferredNumEntries, LPDWORD pdwResumeHandle ) { DWORD dwError = 0; PTRANSPORT_FILTER pTxFilter = NULL; PTRANSPORT_FILTER pMatchedTxFilters = NULL; PIPSEC_QM_POLICY pMatchedQMPolicies = NULL; DWORD dwNumMatches = 0; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); if (dwError) { return (dwError); } if (!pTxFilterContainer || !ppTxFilterContainer || !ppQMPolicyContainer || !pdwResumeHandle || !*ppTxFilterContainer || !*ppQMPolicyContainer) { SPDRevertToSelf(bImpersonating); return (ERROR_INVALID_PARAMETER); } if (!(pTxFilterContainer->pTransportFilters) || !(pTxFilterContainer->dwNumFilters)) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } pTxFilter = pTxFilterContainer->pTransportFilters; dwError = MatchTransportFilter( pServerName, pTxFilter, dwFlags, &pMatchedTxFilters, &pMatchedQMPolicies, dwPreferredNumEntries, &dwNumMatches, pdwResumeHandle ); BAIL_ON_WIN32_ERROR(dwError); (*ppTxFilterContainer)->pTransportFilters = pMatchedTxFilters; (*ppTxFilterContainer)->dwNumFilters = dwNumMatches; (*ppQMPolicyContainer)->pPolicies = pMatchedQMPolicies; (*ppQMPolicyContainer)->dwNumPolicies = dwNumMatches; SPDRevertToSelf(bImpersonating); return (dwError); error: (*ppTxFilterContainer)->pTransportFilters = NULL; (*ppTxFilterContainer)->dwNumFilters = 0; (*ppQMPolicyContainer)->pPolicies = NULL; (*ppQMPolicyContainer)->dwNumPolicies = 0; SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcGetQMPolicyByID( STRING_HANDLE pServerName, GUID gQMPolicyID, PIPSEC_QM_POLICY_CONTAINER * ppQMPolicyContainer ) { DWORD dwError = 0; PIPSEC_QM_POLICY pQMPolicy = NULL; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); if (dwError) { return (dwError); } if (!ppQMPolicyContainer || !*ppQMPolicyContainer) { SPDRevertToSelf(bImpersonating); return (ERROR_INVALID_PARAMETER); } dwError = GetQMPolicyByID( pServerName, gQMPolicyID, &pQMPolicy ); BAIL_ON_WIN32_ERROR(dwError); (*ppQMPolicyContainer)->pPolicies = pQMPolicy; (*ppQMPolicyContainer)->dwNumPolicies = 1; SPDRevertToSelf(bImpersonating); return (dwError); error: (*ppQMPolicyContainer)->pPolicies = NULL; (*ppQMPolicyContainer)->dwNumPolicies = 0; SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcGetMMPolicyByID( STRING_HANDLE pServerName, GUID gMMPolicyID, PIPSEC_MM_POLICY_CONTAINER * ppMMPolicyContainer ) { DWORD dwError = 0; PIPSEC_MM_POLICY pMMPolicy = NULL; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); if (dwError) { return (dwError); } if (!ppMMPolicyContainer || !*ppMMPolicyContainer) { SPDRevertToSelf(bImpersonating); return (ERROR_INVALID_PARAMETER); } dwError = GetMMPolicyByID( pServerName, gMMPolicyID, &pMMPolicy ); BAIL_ON_WIN32_ERROR(dwError); (*ppMMPolicyContainer)->pPolicies = pMMPolicy; (*ppMMPolicyContainer)->dwNumPolicies = 1; SPDRevertToSelf(bImpersonating); return (dwError); error: (*ppMMPolicyContainer)->pPolicies = NULL; (*ppMMPolicyContainer)->dwNumPolicies = 0; SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcAddMMAuthMethods( STRING_HANDLE pServerName, DWORD dwFlags, PMM_AUTH_METHODS_CONTAINER pMMAuthContainer ) { DWORD dwError = 0; PMM_AUTH_METHODS pMMAuthMethods = NULL; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); BAIL_ON_WIN32_ERROR(dwError); if (!pMMAuthContainer) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } if (!(pMMAuthContainer->pMMAuthMethods) || !(pMMAuthContainer->dwNumAuthMethods)) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } pMMAuthMethods = pMMAuthContainer->pMMAuthMethods; dwError = AddMMAuthMethods( pServerName, dwFlags, pMMAuthMethods ); BAIL_ON_WIN32_ERROR(dwError); error: SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcDeleteMMAuthMethods( STRING_HANDLE pServerName, GUID gMMAuthID ) { DWORD dwError = 0; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); BAIL_ON_WIN32_ERROR(dwError); dwError = DeleteMMAuthMethods( pServerName, gMMAuthID ); BAIL_ON_WIN32_ERROR(dwError); error: SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcEnumMMAuthMethods( STRING_HANDLE pServerName, PMM_AUTH_METHODS_CONTAINER * ppMMAuthContainer, DWORD dwPreferredNumEntries, LPDWORD pdwResumeHandle ) { DWORD dwError = 0; PMM_AUTH_METHODS pMMAuthMethods = NULL; DWORD dwNumAuthMethods = 0; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); if (dwError) { return (dwError); } if (!ppMMAuthContainer || !pdwResumeHandle || !*ppMMAuthContainer) { SPDRevertToSelf(bImpersonating); return (ERROR_INVALID_PARAMETER); } dwError = EnumMMAuthMethods( pServerName, &pMMAuthMethods, dwPreferredNumEntries, &dwNumAuthMethods, pdwResumeHandle ); BAIL_ON_WIN32_ERROR(dwError); (*ppMMAuthContainer)->pMMAuthMethods = pMMAuthMethods; (*ppMMAuthContainer)->dwNumAuthMethods = dwNumAuthMethods; SPDRevertToSelf(bImpersonating); return (dwError); error: (*ppMMAuthContainer)->pMMAuthMethods = NULL; (*ppMMAuthContainer)->dwNumAuthMethods = 0; SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcSetMMAuthMethods( STRING_HANDLE pServerName, GUID gMMAuthID, PMM_AUTH_METHODS_CONTAINER pMMAuthContainer ) { DWORD dwError = 0; PMM_AUTH_METHODS pMMAuthMethods = NULL; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); BAIL_ON_WIN32_ERROR(dwError); if (!pMMAuthContainer) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } if (!(pMMAuthContainer->pMMAuthMethods) || !(pMMAuthContainer->dwNumAuthMethods)) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } pMMAuthMethods = pMMAuthContainer->pMMAuthMethods; dwError = SetMMAuthMethods( pServerName, gMMAuthID, pMMAuthMethods ); BAIL_ON_WIN32_ERROR(dwError); error: SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcGetMMAuthMethods( STRING_HANDLE pServerName, GUID gMMAuthID, PMM_AUTH_METHODS_CONTAINER * ppMMAuthContainer ) { DWORD dwError = 0; PMM_AUTH_METHODS pMMAuthMethods = NULL; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); if (dwError) { return (dwError); } if (!ppMMAuthContainer || !*ppMMAuthContainer) { SPDRevertToSelf(bImpersonating); return (ERROR_INVALID_PARAMETER); } dwError = GetMMAuthMethods( pServerName, gMMAuthID, &pMMAuthMethods ); BAIL_ON_WIN32_ERROR(dwError); (*ppMMAuthContainer)->pMMAuthMethods = pMMAuthMethods; (*ppMMAuthContainer)->dwNumAuthMethods = 1; SPDRevertToSelf(bImpersonating); return (dwError); error: (*ppMMAuthContainer)->pMMAuthMethods = NULL; (*ppMMAuthContainer)->dwNumAuthMethods = 0; SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcQueryIPSecStatistics( STRING_HANDLE pServerName, PIPSEC_STATISTICS_CONTAINER * ppIpsecStatsContainer ) { DWORD dwError = 0; PIPSEC_STATISTICS pIpsecStatistics = NULL; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); if (dwError) { return (dwError); } if (!ppIpsecStatsContainer || !*ppIpsecStatsContainer) { SPDRevertToSelf(bImpersonating); return (ERROR_INVALID_PARAMETER); } dwError = QueryIPSecStatistics( pServerName, &pIpsecStatistics ); BAIL_ON_WIN32_ERROR(dwError); (*ppIpsecStatsContainer)->pIpsecStatistics = pIpsecStatistics; (*ppIpsecStatsContainer)->dwNumIpsecStats = 1; SPDRevertToSelf(bImpersonating); return (dwError); error: (*ppIpsecStatsContainer)->pIpsecStatistics = NULL; (*ppIpsecStatsContainer)->dwNumIpsecStats = 0; SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcEnumQMSAs( STRING_HANDLE pServerName, PQM_SA_CONTAINER pQMSATempContainer, PQM_SA_CONTAINER * ppQMSAContainer, DWORD dwPreferredNumEntries, LPDWORD pdwNumTotalQMSAs, LPDWORD pdwResumeHandle, DWORD dwFlags ) { DWORD dwError = 0; PIPSEC_QM_SA pQMSATemplate = NULL; PIPSEC_QM_SA pQMSAs = NULL; DWORD dwNumQMSAs = 0; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); if (dwError) { return (dwError); } if (!pQMSATempContainer || !ppQMSAContainer || !pdwNumTotalQMSAs || !pdwResumeHandle || !*ppQMSAContainer) { SPDRevertToSelf(bImpersonating); return (ERROR_INVALID_PARAMETER); } if (!(pQMSATempContainer->dwNumQMSAs)) { pQMSATemplate = NULL; } else { if (!(pQMSATempContainer->pQMSAs)) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } pQMSATemplate = pQMSATempContainer->pQMSAs; } dwError = EnumQMSAs( pServerName, pQMSATemplate, &pQMSAs, dwPreferredNumEntries, &dwNumQMSAs, pdwNumTotalQMSAs, pdwResumeHandle, dwFlags ); BAIL_ON_WIN32_ERROR(dwError); (*ppQMSAContainer)->pQMSAs = pQMSAs; (*ppQMSAContainer)->dwNumQMSAs = dwNumQMSAs; SPDRevertToSelf(bImpersonating); return (dwError); error: (*ppQMSAContainer)->pQMSAs = NULL; (*ppQMSAContainer)->dwNumQMSAs = 0; SPDRevertToSelf(bImpersonating); return (dwError); } VOID TUNNELFILTER_HANDLE_rundown( TUNNELFILTER_HANDLE hFilter ) { if (!gbSPDRPCServerUp) { return; } if (hFilter) { (VOID) DeleteTunnelFilter( hFilter ); } return; } DWORD RpcAddTunnelFilter( STRING_HANDLE pServerName, DWORD dwFlags, PTUNNEL_FILTER_CONTAINER pFilterContainer, TUNNELFILTER_HANDLE * phFilter ) { DWORD dwError = 0; PTUNNEL_FILTER pTunnelFilter = NULL; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); BAIL_ON_WIN32_ERROR(dwError); if (!pFilterContainer || !phFilter) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } if (!(pFilterContainer->pTunnelFilters) || !(pFilterContainer->dwNumFilters)) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } pTunnelFilter = pFilterContainer->pTunnelFilters; dwError = AddTunnelFilter( pServerName, dwFlags, pTunnelFilter, phFilter ); BAIL_ON_WIN32_ERROR(dwError); error: SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcDeleteTunnelFilter( TUNNELFILTER_HANDLE * phFilter ) { DWORD dwError = 0; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); BAIL_ON_WIN32_ERROR(dwError); if (!phFilter) { SPDRevertToSelf(bImpersonating); return (ERROR_INVALID_PARAMETER); } dwError = DeleteTunnelFilter( *phFilter ); BAIL_ON_WIN32_ERROR(dwError); *phFilter = NULL; error: SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcEnumTunnelFilters( STRING_HANDLE pServerName, DWORD dwLevel, GUID gGenericFilterID, PTUNNEL_FILTER_CONTAINER * ppFilterContainer, DWORD dwPreferredNumEntries, LPDWORD pdwResumeHandle ) { DWORD dwError = 0; PTUNNEL_FILTER pTunnelFilters = NULL; DWORD dwNumFilters = 0; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); if (dwError) { return (dwError); } if (!ppFilterContainer || !pdwResumeHandle || !*ppFilterContainer) { SPDRevertToSelf(bImpersonating); 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; } dwError = EnumTunnelFilters( pServerName, dwLevel, gGenericFilterID, &pTunnelFilters, dwPreferredNumEntries, &dwNumFilters, pdwResumeHandle ); BAIL_ON_WIN32_ERROR(dwError); (*ppFilterContainer)->pTunnelFilters = pTunnelFilters; (*ppFilterContainer)->dwNumFilters = dwNumFilters; SPDRevertToSelf(bImpersonating); return (dwError); error: (*ppFilterContainer)->pTunnelFilters = NULL; (*ppFilterContainer)->dwNumFilters = 0; SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcSetTunnelFilter( TUNNELFILTER_HANDLE hFilter, PTUNNEL_FILTER_CONTAINER pFilterContainer ) { DWORD dwError = 0; PTUNNEL_FILTER pTunnelFilter = NULL; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); BAIL_ON_WIN32_ERROR(dwError); if (!hFilter || !pFilterContainer) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } if (!(pFilterContainer->pTunnelFilters) || !(pFilterContainer->dwNumFilters)) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } pTunnelFilter = pFilterContainer->pTunnelFilters; dwError = SetTunnelFilter( hFilter, pTunnelFilter ); BAIL_ON_WIN32_ERROR(dwError); error: SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcGetTunnelFilter( TUNNELFILTER_HANDLE hFilter, PTUNNEL_FILTER_CONTAINER * ppFilterContainer ) { DWORD dwError = 0; PTUNNEL_FILTER pTunnelFilter = NULL; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); if (dwError) { return (dwError); } if (!hFilter || !ppFilterContainer || !*ppFilterContainer) { SPDRevertToSelf(bImpersonating); return (ERROR_INVALID_PARAMETER); } dwError = GetTunnelFilter( hFilter, &pTunnelFilter ); BAIL_ON_WIN32_ERROR(dwError); (*ppFilterContainer)->pTunnelFilters = pTunnelFilter; (*ppFilterContainer)->dwNumFilters = 1; SPDRevertToSelf(bImpersonating); return (dwError); error: (*ppFilterContainer)->pTunnelFilters = NULL; (*ppFilterContainer)->dwNumFilters = 0; SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcMatchTunnelFilter( STRING_HANDLE pServerName, PTUNNEL_FILTER_CONTAINER pTnFilterContainer, DWORD dwFlags, PTUNNEL_FILTER_CONTAINER * ppTnFilterContainer, PIPSEC_QM_POLICY_CONTAINER * ppQMPolicyContainer, DWORD dwPreferredNumEntries, LPDWORD pdwResumeHandle ) { DWORD dwError = 0; PTUNNEL_FILTER pTnFilter = NULL; PTUNNEL_FILTER pMatchedTnFilters = NULL; PIPSEC_QM_POLICY pMatchedQMPolicies = NULL; DWORD dwNumMatches = 0; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); if (dwError) { return (dwError); } if (!pTnFilterContainer || !ppTnFilterContainer || !ppQMPolicyContainer || !pdwResumeHandle || !*ppTnFilterContainer || !*ppQMPolicyContainer) { SPDRevertToSelf(bImpersonating); return (ERROR_INVALID_PARAMETER); } if (!(pTnFilterContainer->pTunnelFilters) || !(pTnFilterContainer->dwNumFilters)) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } pTnFilter = pTnFilterContainer->pTunnelFilters; dwError = MatchTunnelFilter( pServerName, pTnFilter, dwFlags, &pMatchedTnFilters, &pMatchedQMPolicies, dwPreferredNumEntries, &dwNumMatches, pdwResumeHandle ); BAIL_ON_WIN32_ERROR(dwError); (*ppTnFilterContainer)->pTunnelFilters = pMatchedTnFilters; (*ppTnFilterContainer)->dwNumFilters = dwNumMatches; (*ppQMPolicyContainer)->pPolicies = pMatchedQMPolicies; (*ppQMPolicyContainer)->dwNumPolicies = dwNumMatches; SPDRevertToSelf(bImpersonating); return (dwError); error: (*ppTnFilterContainer)->pTunnelFilters = NULL; (*ppTnFilterContainer)->dwNumFilters = 0; (*ppQMPolicyContainer)->pPolicies = NULL; (*ppQMPolicyContainer)->dwNumPolicies = 0; SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcOpenMMFilterHandle( STRING_HANDLE pServerName, PMM_FILTER_CONTAINER pMMFilterContainer, MMFILTER_HANDLE * phMMFilter ) { DWORD dwError = 0; PMM_FILTER pMMFilter = NULL; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); BAIL_ON_WIN32_ERROR(dwError); if (!pMMFilterContainer || !phMMFilter) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } if (!(pMMFilterContainer->pMMFilters) || !(pMMFilterContainer->dwNumFilters)) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } pMMFilter = pMMFilterContainer->pMMFilters; dwError = OpenMMFilterHandle( pServerName, pMMFilter, phMMFilter ); BAIL_ON_WIN32_ERROR(dwError); error: SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcCloseMMFilterHandle( MMFILTER_HANDLE * phMMFilter ) { DWORD dwError = 0; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); BAIL_ON_WIN32_ERROR(dwError); if (!phMMFilter) { SPDRevertToSelf(bImpersonating); return (ERROR_INVALID_PARAMETER); } dwError = CloseMMFilterHandle( *phMMFilter ); BAIL_ON_WIN32_ERROR(dwError); *phMMFilter = NULL; error: SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcOpenTransportFilterHandle( STRING_HANDLE pServerName, PTRANSPORT_FILTER_CONTAINER pFilterContainer, TRANSPORTFILTER_HANDLE * phFilter ) { DWORD dwError = 0; PTRANSPORT_FILTER pTransportFilter = NULL; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); BAIL_ON_WIN32_ERROR(dwError); if (!pFilterContainer || !phFilter) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } if (!(pFilterContainer->pTransportFilters) || !(pFilterContainer->dwNumFilters)) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } pTransportFilter = pFilterContainer->pTransportFilters; dwError = OpenTransportFilterHandle( pServerName, pTransportFilter, phFilter ); BAIL_ON_WIN32_ERROR(dwError); error: SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcCloseTransportFilterHandle( TRANSPORTFILTER_HANDLE * phFilter ) { DWORD dwError = 0; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); BAIL_ON_WIN32_ERROR(dwError); if (!phFilter) { SPDRevertToSelf(bImpersonating); return (ERROR_INVALID_PARAMETER); } dwError = CloseTransportFilterHandle( *phFilter ); BAIL_ON_WIN32_ERROR(dwError); *phFilter = NULL; error: SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcOpenTunnelFilterHandle( STRING_HANDLE pServerName, PTUNNEL_FILTER_CONTAINER pFilterContainer, TUNNELFILTER_HANDLE * phFilter ) { DWORD dwError = 0; PTUNNEL_FILTER pTunnelFilter = NULL; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); BAIL_ON_WIN32_ERROR(dwError); if (!pFilterContainer || !phFilter) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } if (!(pFilterContainer->pTunnelFilters) || !(pFilterContainer->dwNumFilters)) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } pTunnelFilter = pFilterContainer->pTunnelFilters; dwError = OpenTunnelFilterHandle( pServerName, pTunnelFilter, phFilter ); BAIL_ON_WIN32_ERROR(dwError); error: SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcCloseTunnelFilterHandle( TUNNELFILTER_HANDLE * phFilter ) { DWORD dwError = 0; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); BAIL_ON_WIN32_ERROR(dwError); if (!phFilter) { SPDRevertToSelf(bImpersonating); return (ERROR_INVALID_PARAMETER); } dwError = CloseTunnelFilterHandle( *phFilter ); BAIL_ON_WIN32_ERROR(dwError); *phFilter = NULL; error: SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcEnumIpsecInterfaces( STRING_HANDLE pServerName, PIPSEC_INTERFACE_CONTAINER pIpsecIfTempContainer, PIPSEC_INTERFACE_CONTAINER * ppIpsecIfContainer, DWORD dwPreferredNumEntries, LPDWORD pdwNumTotalInterfaces, LPDWORD pdwResumeHandle, DWORD dwFlags ) { DWORD dwError = 0; PIPSEC_INTERFACE_INFO pIpsecIfTemplate = NULL; PIPSEC_INTERFACE_INFO pIpsecInterfaces = NULL; DWORD dwNumInterfaces = 0; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); if (dwError) { return (dwError); } if (!pIpsecIfTempContainer || !ppIpsecIfContainer || !pdwNumTotalInterfaces || !pdwResumeHandle || !*ppIpsecIfContainer) { SPDRevertToSelf(bImpersonating); return (ERROR_INVALID_PARAMETER); } if (!(pIpsecIfTempContainer->dwNumInterfaces)) { pIpsecIfTemplate = NULL; } else { if (!(pIpsecIfTempContainer->pIpsecInterfaces)) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } pIpsecIfTemplate = pIpsecIfTempContainer->pIpsecInterfaces; } dwError = EnumIPSecInterfaces( pServerName, pIpsecIfTemplate, &pIpsecInterfaces, dwPreferredNumEntries, &dwNumInterfaces, pdwNumTotalInterfaces, pdwResumeHandle, dwFlags ); BAIL_ON_WIN32_ERROR(dwError); (*ppIpsecIfContainer)->pIpsecInterfaces = pIpsecInterfaces; (*ppIpsecIfContainer)->dwNumInterfaces = dwNumInterfaces; SPDRevertToSelf(bImpersonating); return (dwError); error: (*ppIpsecIfContainer)->pIpsecInterfaces = NULL; (*ppIpsecIfContainer)->dwNumInterfaces = 0; SPDRevertToSelf(bImpersonating); return (dwError); } DWORD RpcDeleteQMSAs( STRING_HANDLE pServerName, PQM_SA_CONTAINER pQMSAContainer, DWORD dwFlags ) { DWORD dwError = 0; BOOL bImpersonating = FALSE; dwError = SPDImpersonateClient( &bImpersonating ); BAIL_ON_WIN32_ERROR(dwError); if (!pQMSAContainer) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } if (!(pQMSAContainer->pQMSAs) || !(pQMSAContainer->dwNumQMSAs)) { dwError = ERROR_INVALID_PARAMETER; BAIL_ON_WIN32_ERROR(dwError); } dwError= IPSecDeleteQMSAs( pServerName, pQMSAContainer->pQMSAs, dwFlags ); BAIL_ON_WIN32_ERROR(dwError); error: SPDRevertToSelf(bImpersonating); return dwError; }