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.
 
 
 
 
 
 

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;
}