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.
1155 lines
26 KiB
1155 lines
26 KiB
////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Module : Dynamic/dyanamicDelete.cpp
|
|
//
|
|
// Purpose : Dynamic Delete Implementation.
|
|
//
|
|
//
|
|
// Developers Name : Bharat/Radhika
|
|
//
|
|
//
|
|
// History :
|
|
//
|
|
// Date Author Comments
|
|
// 9-13-2001 Radhika Initial Version. V1.0
|
|
//
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "nshipsec.h"
|
|
|
|
extern HINSTANCE g_hModule;
|
|
extern _TCHAR* g_szDynamicMachine;
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: DeleteMMPolicy
|
|
//
|
|
//Date of Creation: 9-3-2001
|
|
//
|
|
//Parameters: IN LPTSTR pszPolicyName
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description: This function deletes Mainmode Policy for the given name or
|
|
// deletes all main mode policies if name is not given.
|
|
//Revision History:
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
DeleteMMPolicy(
|
|
IN LPTSTR pszPolicyName
|
|
)
|
|
{
|
|
DWORD dwCount = 0; // counting objects here
|
|
DWORD dwResumeHandle = 0;
|
|
DWORD dwOldResumeHandle = 0; // handle for continuation calls
|
|
DWORD dwVersion = 0;
|
|
DWORD i=0, j=0;
|
|
DWORD dwReturn = ERROR_SUCCESS; // assume success
|
|
BOOL bNameFin = FALSE;
|
|
BOOL bRemoved = FALSE;
|
|
|
|
PIPSEC_MM_POLICY pIPSecMMP = NULL; // for MM policy calls
|
|
|
|
for (i = 0; ;i+=dwCount)
|
|
{
|
|
bRemoved = FALSE;
|
|
dwOldResumeHandle = dwResumeHandle;
|
|
dwReturn = EnumMMPolicies(g_szDynamicMachine, dwVersion, NULL, 0, 0,
|
|
&pIPSecMMP, &dwCount, &dwResumeHandle, NULL);
|
|
|
|
//If there is no data Bail out.
|
|
if (dwReturn == ERROR_NO_DATA || dwCount == 0)
|
|
{
|
|
dwReturn = ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if(!(pIPSecMMP && dwCount > 0))
|
|
{
|
|
BAIL_OUT; // not required to continue.
|
|
}
|
|
// Policy name is not given, hence delete all policies
|
|
if(pszPolicyName == NULL)
|
|
{
|
|
for (j = 0; j < dwCount; j++)
|
|
{
|
|
dwReturn = DeleteMMPolicy(g_szDynamicMachine, dwVersion, pIPSecMMP[j].pszPolicyName, NULL);
|
|
if (dwReturn == ERROR_SUCCESS)
|
|
{
|
|
bRemoved = TRUE;
|
|
}
|
|
bNameFin = TRUE;
|
|
}
|
|
}
|
|
// Delete policy with the given name
|
|
else if(pszPolicyName)
|
|
{
|
|
for (j = 0; j < dwCount; j++)
|
|
{
|
|
if(_tcsicmp(pIPSecMMP[j].pszPolicyName,pszPolicyName) == 0)
|
|
{
|
|
dwReturn = DeleteMMPolicy(g_szDynamicMachine, dwVersion, pIPSecMMP[j].pszPolicyName, NULL);
|
|
|
|
if (dwReturn == ERROR_SUCCESS)
|
|
{
|
|
bRemoved = TRUE;
|
|
}
|
|
bNameFin = TRUE;
|
|
BAIL_OUT; // found the policy, come out from the loop
|
|
}
|
|
}
|
|
}
|
|
SPDApiBufferFree(pIPSecMMP);
|
|
pIPSecMMP=NULL;
|
|
if(bRemoved)
|
|
{
|
|
dwResumeHandle = dwOldResumeHandle; // need to restart enumeration for deleting all
|
|
}
|
|
if(dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
|
|
error:
|
|
|
|
//functionality errors are displayed here and ERROR_SUCCESS is passed to parent function.
|
|
if(pszPolicyName && !bNameFin)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_ADD_MMF_NO_MMPOLICY);
|
|
dwReturn = ERROR_SUCCESS;
|
|
}
|
|
else if(!bNameFin)
|
|
{
|
|
//Error Message printed in parent function
|
|
//as this is also called by delete all function
|
|
//where the error message should not be displayed
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
}
|
|
if(pIPSecMMP)
|
|
{
|
|
//error path clean up
|
|
SPDApiBufferFree(pIPSecMMP);
|
|
pIPSecMMP=NULL;
|
|
}
|
|
|
|
return dwReturn;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: DeleteQMPolicy
|
|
//
|
|
//Date of Creation: 9-3-2001
|
|
//
|
|
//Parameters: IN LPTSTR pszPolicyName
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description: This function deletes quickmode Policy for the given name
|
|
// or deletes all the policies if the name is not given.
|
|
//
|
|
//Revision History:
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
DeleteQMPolicy(
|
|
IN LPTSTR pszPolicyName
|
|
)
|
|
{
|
|
DWORD dwCount = 0; // counting objects here
|
|
DWORD dwResumeHandle = 0;
|
|
DWORD dwOldResumeHandle = 0; // handle for continuation calls
|
|
DWORD i=0, j=0;
|
|
DWORD dwReturn = ERROR_SUCCESS; // assume success
|
|
DWORD dwVersion = 0;
|
|
BOOL bNameFin = FALSE;
|
|
BOOL bRemoved = FALSE;
|
|
PIPSEC_QM_POLICY pIPSecQMP = NULL; // for QM policy calls
|
|
|
|
for (i = 0; ;i+=dwCount)
|
|
{
|
|
bRemoved = FALSE;
|
|
dwOldResumeHandle = dwResumeHandle;
|
|
dwReturn = EnumQMPolicies(g_szDynamicMachine, dwVersion, NULL, 0, 0,
|
|
&pIPSecQMP, &dwCount, &dwResumeHandle, NULL);
|
|
//If there is no data Bail out.
|
|
if (dwReturn == ERROR_NO_DATA || dwCount == 0)
|
|
{
|
|
dwReturn = ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
if(!(pIPSecQMP && dwCount > 0))
|
|
{
|
|
BAIL_OUT; // not required to continue.
|
|
}
|
|
// Deletes all the policies
|
|
if(pszPolicyName == NULL)
|
|
{
|
|
for (j = 0; j < dwCount; j++)
|
|
{
|
|
dwReturn = DeleteQMPolicy(g_szDynamicMachine, dwVersion, pIPSecQMP[j].pszPolicyName, NULL);
|
|
if (dwReturn == ERROR_SUCCESS)
|
|
{
|
|
bRemoved = TRUE;
|
|
}
|
|
bNameFin = TRUE;
|
|
}
|
|
}
|
|
// Deletes the policy for the given name
|
|
else if(pszPolicyName)
|
|
{
|
|
for (j = 0; j < dwCount; j++)
|
|
{
|
|
if(_tcsicmp(pIPSecQMP[j].pszPolicyName,pszPolicyName) == 0)
|
|
{
|
|
dwReturn = DeleteQMPolicy(g_szDynamicMachine, dwVersion, pIPSecQMP[j].pszPolicyName, NULL);
|
|
if (dwReturn == ERROR_SUCCESS)
|
|
{
|
|
bRemoved = TRUE;
|
|
}
|
|
bNameFin = TRUE;
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
}
|
|
SPDApiBufferFree(pIPSecQMP);
|
|
pIPSecQMP=NULL;
|
|
if (bRemoved)
|
|
{
|
|
dwResumeHandle = dwOldResumeHandle; // need to restart enumeration!
|
|
}
|
|
if(dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
|
|
error:
|
|
//functionality errors are displayed here and ERROR_SUCCESS is passed to parent function.
|
|
if(pszPolicyName && !bNameFin)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_ADD_QMF_NO_QMPOLICY);
|
|
dwReturn = ERROR_SUCCESS;
|
|
}
|
|
else if(!bNameFin)
|
|
{
|
|
//Error Message printed in parent function
|
|
//as this is also called by delete all function
|
|
//where the error message should not be displayed
|
|
dwReturn = ERROR_NO_DISPLAY;
|
|
}
|
|
|
|
if(pIPSecQMP)
|
|
{
|
|
//error path clean up
|
|
SPDApiBufferFree(pIPSecQMP);
|
|
pIPSecQMP=NULL;
|
|
}
|
|
|
|
return dwReturn;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: DeleteMMFilters
|
|
//
|
|
//Date of Creation: 9-3-2001
|
|
//
|
|
//Parameters: VOID
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description: This function deletes all the mainmode filters and
|
|
// corresponding authentication methods.
|
|
//
|
|
//Revision History:
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
DeleteMMFilters(
|
|
VOID
|
|
)
|
|
{
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
DWORD dwResumeHandle = 0;
|
|
DWORD dwOldResumeHandle = 0; // handle for continuation calls
|
|
DWORD dwCount = 0; // counting objects here
|
|
DWORD dwMaxCount = 0; // Max objects count
|
|
DWORD dwLocalCount = 0; // local total count
|
|
DWORD dwVersion = 0;
|
|
DWORD dwTmpCount1 = 0, dwTmpCount2 = 0;
|
|
GUID gDefaultGUID = {0}; // NULL GUID value
|
|
DWORD i=0, j=0;
|
|
BOOL bRemoved = FALSE;
|
|
PMM_FILTER pMMFilter = NULL;
|
|
HANDLE hFilter = NULL;
|
|
|
|
dwReturn = GetMaxCountMMFilters(dwMaxCount);
|
|
if((dwReturn != ERROR_SUCCESS) || (dwMaxCount == 0))
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
for (i = 0; ;i+=dwCount)
|
|
{
|
|
bRemoved = FALSE;
|
|
dwOldResumeHandle = dwResumeHandle;
|
|
dwReturn = EnumMMFilters(g_szDynamicMachine, dwVersion, NULL, ENUM_GENERIC_FILTERS,
|
|
gDefaultGUID, 0, &pMMFilter, &dwCount, &dwResumeHandle, NULL);
|
|
//If there is no data Bail out.
|
|
if (dwReturn == ERROR_NO_DATA || dwCount == 0)
|
|
{
|
|
dwReturn = ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if(!(pMMFilter && dwCount > 0))
|
|
{
|
|
BAIL_OUT; // not required to continue.
|
|
}
|
|
|
|
dwReturn = GetMaxCountMMFilters(dwTmpCount1);
|
|
if(dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
// Deletes all Main Mode filters and the corresponding authentication methods.
|
|
for (j = 0; j < dwCount; j++)
|
|
{
|
|
dwReturn = OpenMMFilterHandle(g_szDynamicMachine, dwVersion, &(pMMFilter[j]), NULL, &hFilter);
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
dwReturn = DeleteMMFilter(hFilter);
|
|
if(dwReturn == ERROR_SUCCESS)
|
|
{
|
|
dwReturn = DeleteMMAuthMethods(g_szDynamicMachine, dwVersion,
|
|
pMMFilter[j].gMMAuthID, NULL);
|
|
}
|
|
else
|
|
{
|
|
dwReturn = CloseMMFilterHandle(hFilter);
|
|
if(dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
}
|
|
|
|
SPDApiBufferFree(pMMFilter);
|
|
pMMFilter = NULL;
|
|
|
|
dwLocalCount += dwCount;
|
|
if(dwLocalCount >= dwMaxCount)
|
|
{
|
|
break;
|
|
}
|
|
|
|
//
|
|
//DeleteMMFilter api returns success for if try to delete Policyagent Objects,
|
|
//even though those are not deleted.
|
|
//This code mitigates by comparing current objects count with old objects count in SPD.
|
|
//
|
|
dwReturn = GetMaxCountMMFilters(dwTmpCount2);
|
|
if(dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if(dwTmpCount2 != dwTmpCount1)
|
|
{
|
|
bRemoved = TRUE;
|
|
}
|
|
else
|
|
{
|
|
bRemoved = FALSE;
|
|
}
|
|
|
|
if (bRemoved)
|
|
{
|
|
dwResumeHandle = dwOldResumeHandle; // need to restart enumeration to delete all the filters!
|
|
}
|
|
}
|
|
|
|
dwReturn = GetMaxCountMMFilters(dwMaxCount);
|
|
if(dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if(dwMaxCount > 0)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DELETE_MMF_OBJ_NOTDEL, dwMaxCount);
|
|
}
|
|
|
|
|
|
error:
|
|
//error path clean up
|
|
if(pMMFilter)
|
|
{
|
|
SPDApiBufferFree(pMMFilter);
|
|
pMMFilter = NULL;
|
|
}
|
|
|
|
return dwReturn;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: DeleteTransportFilters
|
|
//
|
|
//Date of Creation: 9-3-2001
|
|
//
|
|
//Parameters: VOID
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description: This function deletes all the quickmode Transport filters.
|
|
//
|
|
//
|
|
//Revision History:
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
DWORD
|
|
DeleteTransportFilters(
|
|
VOID
|
|
)
|
|
{
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
DWORD dwResumeHandle = 0;
|
|
DWORD dwOldResumeHandle = 0; // handle for continuation calls
|
|
DWORD dwCount = 0; // counting objects here
|
|
DWORD dwMaxCount = 0; // Max objects count
|
|
DWORD dwLocalCount = 0; // local total count
|
|
GUID gDefaultGUID = {0}; // NULL GUID value
|
|
DWORD i=0, j=0;
|
|
DWORD dwVersion = 0;
|
|
DWORD dwTmpCount1 = 0, dwTmpCount2 = 0;
|
|
BOOL bRemoved = FALSE;
|
|
PTRANSPORT_FILTER pTransF = NULL;
|
|
HANDLE hFilter = NULL;
|
|
|
|
dwReturn = GetMaxCountTransportFilters(dwMaxCount);
|
|
if((dwReturn != ERROR_SUCCESS) || (dwMaxCount == 0))
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
for (i = 0; ;i+=dwCount)
|
|
{
|
|
bRemoved = FALSE;
|
|
dwOldResumeHandle = dwResumeHandle;
|
|
|
|
dwReturn = GetMaxCountTransportFilters(dwTmpCount1);
|
|
if((dwReturn != ERROR_SUCCESS) || (dwTmpCount1 == 0))
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
dwReturn = EnumTransportFilters(g_szDynamicMachine, dwVersion, NULL, ENUM_GENERIC_FILTERS, gDefaultGUID, 0,
|
|
&pTransF, &dwCount, &dwResumeHandle, NULL);
|
|
//If there is no data Bail out.
|
|
if (dwReturn == ERROR_NO_DATA || dwCount == 0)
|
|
{
|
|
dwReturn = ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if(!(pTransF && dwCount > 0))
|
|
{
|
|
BAIL_OUT; // no need continue.
|
|
}
|
|
|
|
//GetMaxCountTransportFilters(dwTmpCount1);
|
|
// Deletes all the Transport filters.
|
|
for (j = 0; j < dwCount; j++)
|
|
{
|
|
dwReturn = OpenTransportFilterHandle(g_szDynamicMachine, dwVersion, &(pTransF[j]), NULL, &hFilter);
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
dwReturn = DeleteTransportFilter(hFilter);
|
|
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
dwReturn = CloseTransportFilterHandle(hFilter);
|
|
if(dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
}
|
|
|
|
SPDApiBufferFree(pTransF);
|
|
pTransF = NULL;
|
|
|
|
dwLocalCount += dwCount;
|
|
if(dwLocalCount >= dwMaxCount)
|
|
{
|
|
break;
|
|
}
|
|
|
|
//
|
|
//DeleteTransportFilter api returns success for if try to delete Policyagent Objects,
|
|
//even though those are not deleted.
|
|
//This code mitigates by comparing current objects count with old objects count in SPD.
|
|
//
|
|
|
|
dwReturn = GetMaxCountTransportFilters(dwTmpCount2);
|
|
if(dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if(dwTmpCount1 != dwTmpCount2)
|
|
{
|
|
bRemoved = TRUE;
|
|
}
|
|
else
|
|
{
|
|
bRemoved = FALSE;
|
|
}
|
|
|
|
if (bRemoved)
|
|
{
|
|
dwResumeHandle = dwOldResumeHandle; // need to restart enumeration to delete all the filters!
|
|
}
|
|
}
|
|
|
|
dwReturn = GetMaxCountTransportFilters(dwMaxCount);
|
|
if(dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if(dwMaxCount > 0)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DELETE_TRANSPORT_OBJ_NOTDEL, dwMaxCount);
|
|
}
|
|
|
|
error:
|
|
if(pTransF)
|
|
{
|
|
//error path clean up
|
|
SPDApiBufferFree(pTransF);
|
|
pTransF = NULL;
|
|
}
|
|
|
|
return dwReturn;
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: DeleteTunnelFilters
|
|
//
|
|
//Date of Creation: 9-3-2001
|
|
//
|
|
//Parameters: VOID
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description: This function deletes all the quickmode Tunnel filters.
|
|
//
|
|
//
|
|
//Revision History:
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
DWORD
|
|
DeleteTunnelFilters(
|
|
VOID
|
|
)
|
|
{
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
DWORD dwResumeHandle = 0;
|
|
DWORD dwOldResumeHandle = 0; // handle for continuation calls
|
|
DWORD dwCount = 0; // counting objects here
|
|
DWORD dwMaxCount = 0; // Max objects count
|
|
DWORD dwLocalCount = 0; // local total count
|
|
DWORD dwTmpCount1 = 0, dwTmpCount2 = 0;
|
|
GUID gDefaultGUID = {0}; // NULL GUID value
|
|
DWORD i=0, j=0;
|
|
DWORD dwVersion = 0;
|
|
BOOL bRemoved = FALSE;
|
|
HANDLE hFilter = NULL;
|
|
PTUNNEL_FILTER pTunnelF = NULL;
|
|
|
|
dwReturn = GetMaxCountTunnelFilters(dwMaxCount);
|
|
if((dwReturn != ERROR_SUCCESS) || (dwMaxCount == 0))
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
for (i = 0; ;i+=dwCount)
|
|
{
|
|
bRemoved = FALSE;
|
|
dwOldResumeHandle = dwResumeHandle;
|
|
|
|
dwReturn = EnumTunnelFilters(g_szDynamicMachine, dwVersion, NULL, ENUM_GENERIC_FILTERS, gDefaultGUID, 0, &pTunnelF, &dwCount, &dwResumeHandle, NULL);
|
|
//If there is no data Bail out.
|
|
if (dwReturn == ERROR_NO_DATA || dwCount == 0)
|
|
{
|
|
dwReturn = ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if(!(pTunnelF && dwCount > 0))
|
|
{
|
|
BAIL_OUT; // not required to continue.
|
|
}
|
|
|
|
dwReturn = GetMaxCountTunnelFilters(dwTmpCount1);
|
|
if(dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
for (j = 0; j < dwCount; j++)
|
|
{
|
|
// Deletes all the Tunnel filters.
|
|
dwReturn = OpenTunnelFilterHandle(g_szDynamicMachine, dwVersion, &(pTunnelF[j]), NULL, &hFilter);
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
dwReturn = DeleteTunnelFilter(hFilter);
|
|
if (dwReturn == ERROR_SUCCESS)
|
|
{
|
|
|
|
}
|
|
else
|
|
{
|
|
dwReturn = CloseTunnelFilterHandle(hFilter);
|
|
if(dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
}
|
|
|
|
SPDApiBufferFree(pTunnelF);
|
|
pTunnelF = NULL;
|
|
|
|
dwLocalCount += dwCount;
|
|
if(dwLocalCount >= dwMaxCount)
|
|
{
|
|
break;
|
|
}
|
|
|
|
//
|
|
//DeleteTunnelFilter api returns success for if try to delete Policyagent Objects,
|
|
//even though those are not deleted.
|
|
//This code mitigates by comparing current objects count with old objects count in SPD.
|
|
//
|
|
dwReturn = GetMaxCountTunnelFilters(dwTmpCount2);
|
|
if(dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if(dwTmpCount2 != dwTmpCount1)
|
|
{
|
|
bRemoved = TRUE;
|
|
}
|
|
else
|
|
{
|
|
bRemoved = FALSE;
|
|
}
|
|
|
|
if (bRemoved)
|
|
{
|
|
dwResumeHandle = dwOldResumeHandle; // need to restart enumeration!
|
|
}
|
|
}
|
|
|
|
dwReturn = GetMaxCountTunnelFilters(dwMaxCount);
|
|
if(dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if(dwMaxCount > 0)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DELETE_TUNNEL_OBJ_NOTDEL, dwMaxCount);
|
|
}
|
|
|
|
error:
|
|
//error path clean up
|
|
if(pTunnelF)
|
|
{
|
|
SPDApiBufferFree(pTunnelF);
|
|
pTunnelF = NULL;
|
|
}
|
|
|
|
return dwReturn;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: DeleteAuthMethods
|
|
//
|
|
//Date of Creation: 9-3-2001
|
|
//
|
|
//Parameters: VOID
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description: This function deletes all the remaining authentication methods.
|
|
//
|
|
//
|
|
//Revision History:
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
DeleteAuthMethods(
|
|
VOID
|
|
)
|
|
{
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
DWORD dwAuthResumeHandle = 0;
|
|
DWORD dwOldResumeHandle = 0; // handle for continuation calls
|
|
DWORD dwCountAuth = 0; // counting Authentication objects here
|
|
DWORD k=0, l=0;
|
|
DWORD dwVersion = 0;
|
|
BOOL bAuthRemoved = FALSE;
|
|
PMM_AUTH_METHODS pAuthMeth = NULL;
|
|
|
|
for (k = 0; ;k+=dwCountAuth)
|
|
{
|
|
bAuthRemoved = FALSE;
|
|
dwOldResumeHandle = dwAuthResumeHandle;
|
|
|
|
dwReturn = EnumMMAuthMethods(g_szDynamicMachine, dwVersion, NULL, 0, 0, &pAuthMeth, &dwCountAuth, &dwAuthResumeHandle, NULL);
|
|
//If there is no data Bail out.
|
|
if (dwReturn == ERROR_NO_DATA || dwCountAuth == 0)
|
|
{
|
|
dwReturn = ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
//Deletes all the auth methods. Called by delete all handle.
|
|
for(l=0; l<dwCountAuth; l++)
|
|
{
|
|
dwReturn = DeleteMMAuthMethods(g_szDynamicMachine, dwVersion, pAuthMeth[l].gMMAuthID, NULL);
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
bAuthRemoved = TRUE;
|
|
|
|
}
|
|
SPDApiBufferFree(pAuthMeth);
|
|
pAuthMeth = NULL;
|
|
|
|
if (bAuthRemoved)
|
|
{
|
|
dwAuthResumeHandle = dwOldResumeHandle; // need to restart enumeration!
|
|
|
|
}
|
|
}
|
|
|
|
error:
|
|
//error path clean up
|
|
if(pAuthMeth)
|
|
{
|
|
SPDApiBufferFree(pAuthMeth);
|
|
pAuthMeth = NULL;
|
|
}
|
|
|
|
return dwReturn;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: DeleteMMFilterRule
|
|
//
|
|
//Date of Creation: 9-3-2001
|
|
//
|
|
//Parameters: MM_FILTER& MMFilter
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description: This function deletes the mmfilter for matched rule.
|
|
//
|
|
//
|
|
//Revision History:
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
DWORD
|
|
DeleteMMFilterRule(
|
|
MM_FILTER& MMFilter
|
|
)
|
|
{
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
DWORD dwVersion = 0;
|
|
HANDLE hFilter = NULL;
|
|
|
|
dwReturn = OpenMMFilterHandle(g_szDynamicMachine, dwVersion, &MMFilter, NULL, &hFilter);
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
//Delete the matched filter which is passed from the parent function
|
|
dwReturn = DeleteMMFilter(hFilter);
|
|
|
|
if(dwReturn != ERROR_SUCCESS)
|
|
{
|
|
PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
|
|
dwReturn = CloseMMFilterHandle(hFilter);
|
|
BAIL_OUT;
|
|
}
|
|
|
|
dwReturn = DeleteMMAuthMethods(g_szDynamicMachine, dwVersion, MMFilter.gMMAuthID, NULL);
|
|
|
|
error:
|
|
return dwReturn;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: DeleteTransportRule
|
|
//
|
|
//Date of Creation: 9-3-2001
|
|
//
|
|
//Parameters: TRANSPORT_FILTER& TransportFilter
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description: This function deletes the Transport filter for matched rule.
|
|
//
|
|
//
|
|
//Revision History:
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
DeleteTransportRule(
|
|
TRANSPORT_FILTER& TransportFilter
|
|
)
|
|
{
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
DWORD dwVersion = 0;
|
|
HANDLE hFilter = NULL;
|
|
|
|
dwReturn = OpenTransportFilterHandle(g_szDynamicMachine, dwVersion, &TransportFilter, NULL, &hFilter);
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
//Delete the matched filter which is passed from the parent function
|
|
dwReturn = DeleteTransportFilter(hFilter);
|
|
|
|
if(dwReturn != ERROR_SUCCESS)
|
|
{
|
|
PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
|
|
dwReturn = CloseTransportFilterHandle(hFilter);
|
|
}
|
|
|
|
error:
|
|
return dwReturn;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: DeleteTunnelRule
|
|
//
|
|
//Date of Creation: 9-3-2001
|
|
//
|
|
//Parameters: TUNNEL_FILTER& TunnelFilter
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description: This function deletes the tunnel filter for matched rule.
|
|
//
|
|
//
|
|
//Revision History:
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
DeleteTunnelRule(
|
|
TUNNEL_FILTER& TunnelFilter
|
|
)
|
|
{
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
DWORD dwVersion = 0;
|
|
HANDLE hFilter = NULL;
|
|
|
|
dwReturn = OpenTunnelFilterHandle(g_szDynamicMachine, dwVersion, &TunnelFilter, NULL, &hFilter);
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
//Delete the matched filter which is passed from the parent function
|
|
dwReturn = DeleteTunnelFilter(hFilter);
|
|
|
|
if(dwReturn != ERROR_SUCCESS)
|
|
{
|
|
PrintErrorMessage(WIN32_ERR, dwReturn, NULL);
|
|
dwReturn = CloseTunnelFilterHandle(hFilter);
|
|
}
|
|
|
|
error:
|
|
return dwReturn;
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: GetMaxCountMMFilters
|
|
//
|
|
//Date of Creation: 1-31-2002
|
|
//
|
|
//Parameters: DWORD& dwMaxCount
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description: Gets the maximum MMFilters count.
|
|
//
|
|
//
|
|
//Revision History:
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
DWORD
|
|
GetMaxCountMMFilters(
|
|
DWORD& dwMaxCount
|
|
)
|
|
{
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
DWORD dwResumeHandle = 0;
|
|
DWORD dwCount = 0; // counting objects here
|
|
DWORD dwVersion = 0;
|
|
GUID gDefaultGUID = {0}; // NULL GUID value
|
|
DWORD i=0;
|
|
PMM_FILTER pMMFilter = NULL;
|
|
|
|
dwMaxCount = 0;
|
|
|
|
for (i = 0; ;i+=dwCount)
|
|
{
|
|
|
|
dwReturn = EnumMMFilters(g_szDynamicMachine, dwVersion, NULL, ENUM_GENERIC_FILTERS,
|
|
gDefaultGUID, 0, &pMMFilter, &dwCount, &dwResumeHandle, NULL);
|
|
//If there is no data Bail out.
|
|
if (dwReturn == ERROR_NO_DATA || dwCount == 0)
|
|
{
|
|
dwReturn = ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if(!(pMMFilter && dwCount > 0))
|
|
{
|
|
BAIL_OUT; // not required to continue.
|
|
}
|
|
|
|
dwMaxCount += dwCount;
|
|
SPDApiBufferFree(pMMFilter);
|
|
pMMFilter = NULL;
|
|
|
|
}
|
|
|
|
error:
|
|
if(pMMFilter)
|
|
{
|
|
SPDApiBufferFree(pMMFilter);
|
|
pMMFilter = NULL;
|
|
}
|
|
return dwReturn;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: GetMaxCountTransportFilters
|
|
//
|
|
//Date of Creation: 1-31-2002
|
|
//
|
|
//Parameters: DWORD& dwMaxCount
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description: Gets the maximum TransportFilters count.
|
|
//
|
|
//
|
|
//Revision History:
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
DWORD
|
|
GetMaxCountTransportFilters(
|
|
DWORD& dwMaxCount
|
|
)
|
|
{
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
DWORD dwResumeHandle = 0;
|
|
DWORD dwCount = 0; // counting objects here
|
|
GUID gDefaultGUID = {0}; // NULL GUID value
|
|
DWORD i=0;
|
|
DWORD dwVersion = 0;
|
|
PTRANSPORT_FILTER pTransF = NULL;
|
|
|
|
dwMaxCount = 0;
|
|
|
|
for (i = 0; ;i+=dwCount)
|
|
{
|
|
dwReturn = EnumTransportFilters(g_szDynamicMachine, dwVersion, NULL, ENUM_GENERIC_FILTERS, gDefaultGUID, 0,
|
|
&pTransF, &dwCount, &dwResumeHandle, NULL);
|
|
//If there is no data Bail out.
|
|
if (dwReturn == ERROR_NO_DATA || dwCount == 0)
|
|
{
|
|
dwReturn = ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if(!(pTransF && dwCount > 0))
|
|
{
|
|
BAIL_OUT; // no need continue.
|
|
}
|
|
|
|
dwMaxCount += dwCount;
|
|
SPDApiBufferFree(pTransF);
|
|
pTransF = NULL;
|
|
}
|
|
error:
|
|
if(pTransF)
|
|
{
|
|
SPDApiBufferFree(pTransF);
|
|
pTransF = NULL;
|
|
}
|
|
return dwReturn;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: GetMaxCountTunnelFilters
|
|
//
|
|
//Date of Creation: 1-31-2002
|
|
//
|
|
//Parameters: DWORD& dwMaxCount
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description: Gets the maximum TunnelFilters count.
|
|
//
|
|
//
|
|
//Revision History:
|
|
//
|
|
// Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
DWORD
|
|
GetMaxCountTunnelFilters(
|
|
DWORD& dwMaxCount
|
|
)
|
|
{
|
|
DWORD dwReturn = ERROR_SUCCESS;
|
|
DWORD dwResumeHandle = 0;
|
|
DWORD dwCount = 0; // counting objects here
|
|
GUID gDefaultGUID = {0}; // NULL GUID value
|
|
DWORD i=0;
|
|
DWORD dwVersion = 0;
|
|
PTUNNEL_FILTER pTunnelF = NULL;
|
|
|
|
dwMaxCount = 0;
|
|
|
|
for (i = 0; ;i+=dwCount)
|
|
{
|
|
dwReturn = EnumTunnelFilters(g_szDynamicMachine, dwVersion, NULL, ENUM_GENERIC_FILTERS, gDefaultGUID,
|
|
0, &pTunnelF, &dwCount, &dwResumeHandle, NULL);
|
|
//If there is no data Bail out.
|
|
if (dwReturn == ERROR_NO_DATA || dwCount == 0)
|
|
{
|
|
dwReturn = ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if (dwReturn != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if(!(pTunnelF && dwCount > 0))
|
|
{
|
|
BAIL_OUT; // not required to continue.
|
|
}
|
|
|
|
dwMaxCount += dwCount;
|
|
SPDApiBufferFree(pTunnelF);
|
|
pTunnelF = NULL;
|
|
}
|
|
error:
|
|
if(pTunnelF)
|
|
{
|
|
SPDApiBufferFree(pTunnelF);
|
|
pTunnelF = NULL;
|
|
}
|
|
return dwReturn;
|
|
}
|
|
|