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.
2292 lines
61 KiB
2292 lines
61 KiB
////////////////////////////////////////////////////////////
|
|
// Module: Static/Staticdelete.cpp
|
|
//
|
|
// Purpose: Static Module Implementation.
|
|
//
|
|
// Developers Name: surya
|
|
//
|
|
// History:
|
|
//
|
|
// Date Author Comments
|
|
// 10-8-2001 Bharat Initial Version.
|
|
// 21-8-2001 Surya
|
|
////////////////////////////////////////////////////////////
|
|
|
|
#include "nshipsec.h"
|
|
|
|
extern HINSTANCE g_hModule;
|
|
extern STORAGELOCATION g_StorageLocation;
|
|
extern CNshPolStore g_NshPolStoreHandle;
|
|
extern CNshPolNegFilData g_NshPolNegFilData;
|
|
|
|
////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: HandleStaticDeletePolicy()
|
|
//
|
|
//Date of Creation: 21st Aug 2001
|
|
//
|
|
//Parameters:
|
|
// IN LPCWSTR pwszMachine,
|
|
// IN OUT LPWSTR *ppwcArguments,
|
|
// IN DWORD dwCurrentIndex,
|
|
// IN DWORD dwArgCount,
|
|
// IN DWORD dwFlags,
|
|
// IN LPCVOID pvData,
|
|
// OUT BOOL *pbDone
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description:
|
|
// Implementation for the command "Delete Policy"
|
|
//
|
|
//Revision History:
|
|
//
|
|
//Date Author Comments
|
|
//
|
|
////////////////////////////////////////////////////////////
|
|
|
|
DWORD WINAPI
|
|
HandleStaticDeletePolicy(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
{
|
|
BOOL bExists=FALSE;
|
|
BOOL bAll=FALSE,bAssigned=FALSE,bCompleteDelete=FALSE;
|
|
LPTSTR pszPolicyName=NULL;
|
|
PIPSEC_POLICY_DATA *ppPolicyEnum = NULL,pPolicy=NULL;
|
|
DWORD dwNumPolicies = 0,dwRet = ERROR_SHOW_USAGE,dwCount=0,i=0;
|
|
HANDLE hPolicyStorage=NULL;
|
|
_TCHAR szUserInput[STRING_SIZE]={0};
|
|
DWORD dwReturnCode = ERROR_SUCCESS,dwStrLength = 0;
|
|
PARSER_PKT parser;
|
|
ZeroMemory(&parser, sizeof(parser));
|
|
|
|
const TAG_TYPE vcmdStaticDeletePolicy[] =
|
|
{
|
|
{ CMD_TOKEN_STR_NAME, NS_REQ_ZERO, FALSE },
|
|
{ CMD_TOKEN_STR_ALL, NS_REQ_ZERO, FALSE }
|
|
};
|
|
|
|
const TOKEN_VALUE vtokStaticDeletePolicy[] =
|
|
{
|
|
{ CMD_TOKEN_STR_NAME, CMD_TOKEN_NAME },
|
|
{ CMD_TOKEN_STR_ALL, CMD_TOKEN_ALL }
|
|
};
|
|
|
|
//if the user asked for usage, delegate the responsibility to netsh
|
|
|
|
if(dwArgCount <= 3)
|
|
{
|
|
dwRet = ERROR_SHOW_USAGE;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
parser.ValidTok = vtokStaticDeletePolicy;
|
|
parser.MaxTok = SIZEOF_TOKEN_VALUE(vtokStaticDeletePolicy);
|
|
|
|
parser.ValidCmd = vcmdStaticDeletePolicy;
|
|
parser.MaxCmd = SIZEOF_TAG_TYPE(vcmdStaticDeletePolicy);
|
|
|
|
dwRet = Parser(pwszMachine,ppwcArguments,dwCurrentIndex,dwArgCount,&parser);
|
|
|
|
if(dwRet != ERROR_SUCCESS)
|
|
{
|
|
CleanUp();
|
|
if (dwRet==RETURN_NO_ERROR)
|
|
{
|
|
dwRet = ERROR_SUCCESS;
|
|
}
|
|
BAIL_OUT;
|
|
}
|
|
|
|
//get the user input
|
|
|
|
for(dwCount=0;dwCount<parser.MaxTok;dwCount++)
|
|
{
|
|
switch(vtokStaticDeletePolicy[parser.Cmd[dwCount].dwCmdToken].dwValue)
|
|
{
|
|
case CMD_TOKEN_NAME:
|
|
if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
|
|
{
|
|
dwStrLength = _tcslen((LPTSTR )parser.Cmd[dwCount].pArg);
|
|
|
|
pszPolicyName= new _TCHAR[dwStrLength+1];
|
|
if(pszPolicyName == NULL)
|
|
{
|
|
PrintErrorMessage(WIN32_ERR,ERROR_OUTOFMEMORY,NULL);
|
|
dwRet=ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
_tcsncpy(pszPolicyName,(LPTSTR)parser.Cmd[dwCount].pArg,dwStrLength+1);
|
|
}
|
|
break;
|
|
case CMD_TOKEN_ALL :
|
|
if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
|
|
{
|
|
bAll= *(BOOL *)parser.Cmd[dwCount].pArg;
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
CleanUp();
|
|
|
|
bCompleteDelete = TRUE;
|
|
dwReturnCode = OpenPolicyStore(&hPolicyStorage);
|
|
|
|
if (dwReturnCode != ERROR_SUCCESS)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_FAILED_POLSTORE_OPEN);
|
|
dwRet=ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
dwReturnCode = IPSecEnumPolicyData(hPolicyStorage, &ppPolicyEnum, &dwNumPolicies);
|
|
|
|
if (!(dwReturnCode == ERROR_SUCCESS && dwNumPolicies > 0 && ppPolicyEnum != NULL))
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_NO_POLICY);
|
|
dwRet= ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
//check for the required policy
|
|
|
|
for (i = 0; i < dwNumPolicies; i++)
|
|
{
|
|
if ( bAll || (pszPolicyName && (_tcscmp(ppPolicyEnum[i]->pszIpsecName, pszPolicyName) == 0)))
|
|
{
|
|
bExists=TRUE;
|
|
dwReturnCode = IPSecCopyPolicyData(ppPolicyEnum[i], &pPolicy);
|
|
if (dwReturnCode != ERROR_SUCCESS)
|
|
{
|
|
dwRet = dwReturnCode;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
dwReturnCode = IPSecEnumNFAData(hPolicyStorage, pPolicy->PolicyIdentifier
|
|
, &(pPolicy->ppIpsecNFAData), &(pPolicy->dwNumNFACount));
|
|
|
|
if (dwReturnCode == ERROR_SUCCESS)
|
|
{
|
|
dwReturnCode=IPSecGetISAKMPData(hPolicyStorage, pPolicy->ISAKMPIdentifier, &(pPolicy->pIpsecISAKMPData));
|
|
}
|
|
|
|
if((dwReturnCode == ERROR_SUCCESS)&& !bAssigned )
|
|
{
|
|
if(g_StorageLocation.dwLocation!=IPSEC_DIRECTORY_PROVIDER)
|
|
{
|
|
dwReturnCode=IsAssigned(pPolicy,hPolicyStorage,bAssigned);
|
|
}
|
|
if(((dwReturnCode == ERROR_SUCCESS)||(dwReturnCode == ERROR_FILE_NOT_FOUND))&& bAssigned)
|
|
{
|
|
dwReturnCode=IPSecUnassignPolicy(hPolicyStorage, pPolicy->PolicyIdentifier);
|
|
}
|
|
}
|
|
if (((dwReturnCode == ERROR_SUCCESS)||(dwReturnCode == ERROR_FILE_NOT_FOUND)))
|
|
{
|
|
// if found, proceed deleting
|
|
|
|
dwReturnCode = DeletePolicy(pPolicy,hPolicyStorage,bCompleteDelete);
|
|
if (dwReturnCode != ERROR_SUCCESS)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DEL_STATIC_POLICY_3,pPolicy->pszIpsecName);
|
|
}
|
|
}
|
|
|
|
}
|
|
if((!bAll && bExists)||(dwReturnCode != ERROR_SUCCESS))
|
|
break;
|
|
}
|
|
|
|
//incase due to some thing deletion failed, tell it to the user
|
|
|
|
if((!bExists)&& (!bAll) && (dwReturnCode == ERROR_SUCCESS))
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SHW_STATIC_POLICY_2,pszPolicyName);
|
|
}
|
|
if (dwNumPolicies > 0 && ppPolicyEnum != NULL)
|
|
{
|
|
IPSecFreeMulPolicyData(ppPolicyEnum, dwNumPolicies);
|
|
}
|
|
dwRet= ERROR_SUCCESS;
|
|
|
|
if (pPolicy)
|
|
{
|
|
IPSecFreePolicyData(pPolicy);
|
|
}
|
|
ClosePolicyStore(hPolicyStorage);
|
|
|
|
error:
|
|
if (pszPolicyName)
|
|
{
|
|
delete [] pszPolicyName;
|
|
}
|
|
return dwRet;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: HandleStaticDeleteFilterList()
|
|
//
|
|
//Date of Creation: 21st Aug 2001
|
|
//
|
|
//Parameters:
|
|
// IN LPCWSTR pwszMachine,
|
|
// IN OUT LPWSTR *ppwcArguments,
|
|
// IN DWORD dwCurrentIndex,
|
|
// IN DWORD dwArgCount,
|
|
// IN DWORD dwFlags,
|
|
// IN LPCVOID pvData,
|
|
// OUT BOOL *pbDone
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description:
|
|
// Implementation for the command "Delete FilterList"
|
|
//
|
|
//Revision History:
|
|
//
|
|
//Date Author Comments
|
|
//
|
|
////////////////////////////////////////////////////////////
|
|
|
|
DWORD WINAPI
|
|
HandleStaticDeleteFilterList(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
|
|
{
|
|
|
|
LPTSTR pszFListName=NULL;
|
|
DWORD dwCount=0;
|
|
PIPSEC_FILTER_DATA *ppFilterEnum = NULL,pFilter=NULL;
|
|
DWORD dwNumFilters=0,cnt=0,dwRet = ERROR_SHOW_USAGE;
|
|
HANDLE hPolicyStorage=NULL;
|
|
_TCHAR szUserInput[STRING_SIZE]={0};
|
|
BOOL bExists=FALSE,bAll=FALSE;
|
|
DWORD dwReturnCode = ERROR_SUCCESS,dwStrLength = 0;
|
|
PARSER_PKT parser;
|
|
ZeroMemory(&parser, sizeof(parser));
|
|
|
|
const TAG_TYPE vcmdStaticDeleteFilterList[] =
|
|
{
|
|
{ CMD_TOKEN_STR_NAME, NS_REQ_ZERO, FALSE },
|
|
{ CMD_TOKEN_STR_ALL, NS_REQ_ZERO, FALSE }
|
|
};
|
|
|
|
const TOKEN_VALUE vtokStaticDeleteFilterList[] =
|
|
{
|
|
{ CMD_TOKEN_STR_NAME, CMD_TOKEN_NAME },
|
|
{ CMD_TOKEN_STR_ALL, CMD_TOKEN_ALL }
|
|
};
|
|
|
|
//if the user asked for usage, delegate the responsibility to netsh
|
|
|
|
if(dwArgCount <= 3)
|
|
{
|
|
dwRet = ERROR_SHOW_USAGE;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
parser.ValidTok = vtokStaticDeleteFilterList;
|
|
parser.MaxTok = SIZEOF_TOKEN_VALUE(vtokStaticDeleteFilterList);
|
|
|
|
parser.ValidCmd = vcmdStaticDeleteFilterList;
|
|
parser.MaxCmd = SIZEOF_TAG_TYPE(vcmdStaticDeleteFilterList);
|
|
|
|
dwRet = Parser(pwszMachine,ppwcArguments,dwCurrentIndex,dwArgCount,&parser);
|
|
|
|
if(dwRet !=ERROR_SUCCESS)
|
|
{
|
|
CleanUp();
|
|
if (dwRet==RETURN_NO_ERROR)
|
|
{
|
|
dwRet = ERROR_SUCCESS;
|
|
}
|
|
BAIL_OUT;
|
|
}
|
|
|
|
// get the parsed user input
|
|
|
|
for(dwCount=0;dwCount<parser.MaxTok;dwCount++)
|
|
{
|
|
switch(vtokStaticDeleteFilterList[parser.Cmd[dwCount].dwCmdToken].dwValue)
|
|
{
|
|
case CMD_TOKEN_NAME:
|
|
if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
|
|
{
|
|
dwStrLength = _tcslen((LPTSTR )parser.Cmd[dwCount].pArg);
|
|
|
|
pszFListName= new _TCHAR[dwStrLength+1];
|
|
if(pszFListName == NULL)
|
|
{
|
|
PrintErrorMessage(WIN32_ERR,ERROR_OUTOFMEMORY,NULL);
|
|
dwRet=ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
_tcsncpy(pszFListName,(LPTSTR)parser.Cmd[dwCount].pArg,dwStrLength+1);
|
|
}
|
|
break;
|
|
case CMD_TOKEN_ALL :
|
|
if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
|
|
{
|
|
bAll= *(BOOL *)parser.Cmd[dwCount].pArg;
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
CleanUp();
|
|
|
|
dwReturnCode = OpenPolicyStore(&hPolicyStorage);
|
|
|
|
if (dwReturnCode != ERROR_SUCCESS)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_FAILED_POLSTORE_OPEN);
|
|
dwRet=ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
dwReturnCode = IPSecEnumFilterData(hPolicyStorage, &ppFilterEnum, &dwNumFilters);
|
|
|
|
if (!(dwReturnCode == ERROR_SUCCESS && dwNumFilters > 0 && ppFilterEnum != NULL))
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_NO_FILTER_LIST);
|
|
dwRet = ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
// try to look for the specified filter
|
|
|
|
for(cnt=0; cnt < dwNumFilters;cnt++)
|
|
{
|
|
if ( bAll ||((ppFilterEnum[cnt]->pszIpsecName)&&(pszFListName)&&(_tcscmp(ppFilterEnum[cnt]->pszIpsecName,pszFListName)==0)))
|
|
{
|
|
dwReturnCode = IPSecCopyFilterData(ppFilterEnum[cnt], &pFilter);
|
|
|
|
if ((dwReturnCode == ERROR_SUCCESS) && (pFilter != NULL))
|
|
{
|
|
bExists=TRUE;
|
|
dwReturnCode = DeleteFilterList(pFilter,hPolicyStorage);
|
|
|
|
if (dwReturnCode == ERROR_INVALID_DATA)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DEL_STATIC_FILTERLIST_2,pFilter->pszIpsecName);
|
|
|
|
// if cannot delete, tell the user where it is used
|
|
|
|
ShowWhereFLUsed(pFilter,hPolicyStorage);
|
|
}
|
|
else if (dwReturnCode != ERROR_SUCCESS)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DEL_STATIC_FILTERLIST_ALL_FL_DEL_QUERY,pFilter->pszIpsecName);
|
|
}
|
|
}
|
|
}
|
|
if((!bAll && bExists)||((dwReturnCode != ERROR_SUCCESS)&&(dwReturnCode != ERROR_INVALID_DATA)))
|
|
break;
|
|
|
|
}
|
|
|
|
// throw the error messages to the user
|
|
|
|
if ((!bExists)&&(pszFListName)&&(dwReturnCode == ERROR_SUCCESS))
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SHW_STATIC_TAB_PRTALLFL_3,pszFListName);
|
|
}
|
|
|
|
if(ppFilterEnum && dwNumFilters>0)
|
|
{
|
|
IPSecFreeMulFilterData( ppFilterEnum,dwNumFilters);
|
|
}
|
|
if(pFilter)
|
|
{
|
|
IPSecFreeFilterData(pFilter);
|
|
}
|
|
|
|
dwRet = ERROR_SUCCESS;
|
|
ClosePolicyStore(hPolicyStorage);
|
|
|
|
error:
|
|
if(pszFListName)
|
|
{
|
|
delete [] pszFListName;
|
|
}
|
|
|
|
return dwRet;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: HandleStaticDeleteFilter()
|
|
//
|
|
//Date of Creation: 21st Aug 2001
|
|
//
|
|
//Parameters:
|
|
// IN LPCWSTR pwszMachine,
|
|
// IN OUT LPWSTR *ppwcArguments,
|
|
// IN DWORD dwCurrentIndex,
|
|
// IN DWORD dwArgCount,
|
|
// IN DWORD dwFlags,
|
|
// IN LPCVOID pvData,
|
|
// OUT BOOL *pbDone
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description:
|
|
// Implementation for the command "Delete Filter"
|
|
//
|
|
//Revision History:
|
|
//
|
|
//Date Author Comments
|
|
//
|
|
////////////////////////////////////////////////////////////
|
|
|
|
DWORD WINAPI
|
|
HandleStaticDeleteFilter(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
|
|
{
|
|
DWORD dwNumFilters = 0,dwRet = ERROR_SHOW_USAGE,dwReturn=0,i=0;
|
|
PIPSEC_FILTER_DATA *ppFilterEnum = NULL,pFilterData=NULL;
|
|
HANDLE hPolicyStorage=NULL;
|
|
BOOL bFilterExists=FALSE;
|
|
PDELFILTERDATA pFilter=NULL;
|
|
DWORD dwReturnCode = ERROR_SUCCESS;
|
|
PARSER_PKT parser;
|
|
ZeroMemory(&parser, sizeof(parser));
|
|
|
|
const TAG_TYPE vcmdStaticDeleteFilter[] =
|
|
{
|
|
{ CMD_TOKEN_STR_FILTERLIST, NS_REQ_PRESENT, FALSE },
|
|
{ CMD_TOKEN_STR_SRCADDR, NS_REQ_PRESENT, FALSE },
|
|
{ CMD_TOKEN_STR_DSTADDR, NS_REQ_PRESENT, FALSE },
|
|
{ CMD_TOKEN_STR_PROTO, NS_REQ_ZERO, FALSE },
|
|
{ CMD_TOKEN_STR_SRCMASK, NS_REQ_ZERO, FALSE },
|
|
{ CMD_TOKEN_STR_DSTMASK, NS_REQ_ZERO, FALSE },
|
|
{ CMD_TOKEN_STR_SRCPORT, NS_REQ_ZERO, FALSE },
|
|
{ CMD_TOKEN_STR_DSTPORT, NS_REQ_ZERO, FALSE },
|
|
{ CMD_TOKEN_STR_MIRROR, NS_REQ_ZERO, FALSE }
|
|
};
|
|
|
|
const TOKEN_VALUE vtokStaticDeleteFilter[] =
|
|
{
|
|
{ CMD_TOKEN_STR_FILTERLIST, CMD_TOKEN_FILTERLIST },
|
|
{ CMD_TOKEN_STR_SRCADDR, CMD_TOKEN_SRCADDR },
|
|
{ CMD_TOKEN_STR_DSTADDR, CMD_TOKEN_DSTADDR },
|
|
{ CMD_TOKEN_STR_PROTO, CMD_TOKEN_PROTO },
|
|
{ CMD_TOKEN_STR_SRCMASK, CMD_TOKEN_SRCMASK },
|
|
{ CMD_TOKEN_STR_DSTMASK, CMD_TOKEN_DSTMASK },
|
|
{ CMD_TOKEN_STR_SRCPORT, CMD_TOKEN_SRCPORT },
|
|
{ CMD_TOKEN_STR_DSTPORT, CMD_TOKEN_DSTPORT },
|
|
{ CMD_TOKEN_STR_MIRROR, CMD_TOKEN_MIRROR }
|
|
};
|
|
|
|
//if the user asked for usage, delegate the responsibility to netsh
|
|
|
|
if(dwArgCount <= 3)
|
|
{
|
|
dwRet = ERROR_SHOW_USAGE;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
parser.ValidTok = vtokStaticDeleteFilter;
|
|
parser.MaxTok = SIZEOF_TOKEN_VALUE(vtokStaticDeleteFilter);
|
|
|
|
parser.ValidCmd = vcmdStaticDeleteFilter;
|
|
parser.MaxCmd = SIZEOF_TAG_TYPE(vcmdStaticDeleteFilter);
|
|
|
|
dwRet = Parser(pwszMachine,ppwcArguments,dwCurrentIndex,dwArgCount,&parser);
|
|
|
|
if(dwRet!=ERROR_SUCCESS)
|
|
{
|
|
CleanUp();
|
|
if (dwRet==RETURN_NO_ERROR)
|
|
{
|
|
dwRet = ERROR_SUCCESS;
|
|
}
|
|
BAIL_OUT;
|
|
}
|
|
|
|
// get the parsed user input
|
|
|
|
dwRet = FillDelFilterInfo(&pFilter,parser,vtokStaticDeleteFilter);
|
|
|
|
if(dwReturn==ERROR_OUTOFMEMORY)
|
|
{
|
|
PrintErrorMessage(WIN32_ERR,ERROR_OUTOFMEMORY,NULL);
|
|
dwRet=ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if(pFilter->bSrcServerSpecified && pFilter->bDstServerSpecified)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_ADD_STATIC_FILTER_3);
|
|
BAIL_OUT;
|
|
}
|
|
|
|
dwReturnCode = OpenPolicyStore(&hPolicyStorage);
|
|
|
|
if (dwReturnCode != ERROR_SUCCESS)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_FAILED_POLSTORE_OPEN);
|
|
dwRet=ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
dwReturnCode = IPSecEnumFilterData(hPolicyStorage, &ppFilterEnum, &dwNumFilters);
|
|
|
|
if (!(dwReturnCode == ERROR_SUCCESS && dwNumFilters > 0 && ppFilterEnum != NULL))
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_NO_FILTER_LIST);
|
|
dwRet = ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
// check for the specified filterlist
|
|
|
|
for (i = 0; i < dwNumFilters; i++)
|
|
{
|
|
if ((ppFilterEnum[i]->pszIpsecName)&& (pFilter->pszFLName) && ( _tcscmp(ppFilterEnum[i]->pszIpsecName, pFilter->pszFLName) == 0))
|
|
{
|
|
bFilterExists=TRUE;
|
|
dwReturnCode = IPSecCopyFilterData(ppFilterEnum[i], &pFilterData);
|
|
}
|
|
if (bFilterExists)
|
|
break;
|
|
}
|
|
if(!bFilterExists)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SHW_STATIC_TAB_PRTALLFL_3,pFilter->pszFLName);
|
|
}
|
|
if(ppFilterEnum && dwNumFilters>0)
|
|
{
|
|
IPSecFreeMulFilterData( ppFilterEnum,dwNumFilters);
|
|
}
|
|
|
|
// check for the specified filterspec in the found filterlist
|
|
|
|
if ( bFilterExists && dwReturnCode == ERROR_SUCCESS)
|
|
{
|
|
if(pFilterData->dwFlags & POLSTORE_READONLY )
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SET_FL_READ_ONLY_OBJECT,pFilterData->pszIpsecName);
|
|
BAIL_OUT;
|
|
}
|
|
if (!DeleteSpecifiedFilter(pFilterData,pFilter))
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DEL_STATIC_FILTER_1,pFilter->pszFLName);
|
|
}
|
|
else
|
|
{
|
|
dwReturnCode = IPSecSetFilterData(hPolicyStorage, pFilterData);
|
|
if (dwReturnCode != ERROR_SUCCESS)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DEL_STATIC_FILTER_2,pFilter->pszFLName);
|
|
}
|
|
}
|
|
}
|
|
ClosePolicyStore(hPolicyStorage);
|
|
dwRet=ERROR_SUCCESS;
|
|
error:
|
|
CleanUpLocalDelFilterDataStructure(pFilter);
|
|
|
|
return dwRet;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: DeleteSpecifiedFilter()
|
|
//
|
|
//Date of Creation: 21st Aug 2001
|
|
//
|
|
//Parameters:
|
|
// IN OUT PIPSEC_FILTER_DATA pFilterData,
|
|
// IN PDELFILTERDATA pDeleteFilter
|
|
//
|
|
//Return: BOOL
|
|
//
|
|
//Description:
|
|
// This function deletes a specific filter out of the filterlist
|
|
//
|
|
//Revision History:
|
|
//
|
|
//Date Author Comments
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
BOOL
|
|
DeleteSpecifiedFilter(
|
|
IN OUT PIPSEC_FILTER_DATA pFilterData,
|
|
IN PDELFILTERDATA pDeleteFilter
|
|
)
|
|
{
|
|
DWORD i=0;
|
|
BOOL bFilterDeleted=FALSE;
|
|
BOOL bDeletedFilter=FALSE;
|
|
DWORD dwOldNumFilters=pFilterData->dwNumFilterSpecs;
|
|
|
|
while(dwOldNumFilters > i)
|
|
{
|
|
if(
|
|
(
|
|
pDeleteFilter->SourceAddr.puIpAddr && (pFilterData->ppFilterSpecs[i]->Filter.SrcAddr == pDeleteFilter->SourceAddr.puIpAddr[0]) ||
|
|
(
|
|
pDeleteFilter->SourceAddr.pszDomainName && pFilterData->ppFilterSpecs[i]->pszSrcDNSName &&
|
|
(_tcscmp(pFilterData->ppFilterSpecs[i]->pszSrcDNSName,pDeleteFilter->SourceAddr.pszDomainName)==0)
|
|
)
|
|
)
|
|
&&
|
|
(
|
|
pDeleteFilter->DestnAddr.puIpAddr && (pFilterData->ppFilterSpecs[i]->Filter.DestAddr == pDeleteFilter->DestnAddr.puIpAddr[0]) ||
|
|
(
|
|
pDeleteFilter->DestnAddr.pszDomainName && pFilterData->ppFilterSpecs[i]->pszDestDNSName &&
|
|
(_tcscmp(pFilterData->ppFilterSpecs[i]->pszDestDNSName,pDeleteFilter->DestnAddr.pszDomainName)==0)
|
|
)
|
|
)
|
|
)
|
|
{
|
|
bFilterDeleted=TRUE;
|
|
if (pDeleteFilter->bMirrorSpecified) // if mirror specified
|
|
{
|
|
if(pFilterData->ppFilterSpecs[i]->dwMirrorFlag == (DWORD) (pDeleteFilter->bMirrored))
|
|
{
|
|
bFilterDeleted=TRUE;
|
|
}
|
|
else
|
|
{
|
|
bFilterDeleted=FALSE;
|
|
}
|
|
}
|
|
if (bFilterDeleted && pDeleteFilter->bSrcMaskSpecified) // if srcmask specified
|
|
{
|
|
if(pFilterData->ppFilterSpecs[i]->Filter.SrcMask == pDeleteFilter->SourMask)
|
|
{
|
|
bFilterDeleted=TRUE;
|
|
}
|
|
else
|
|
{
|
|
bFilterDeleted=FALSE;
|
|
}
|
|
}
|
|
if (bFilterDeleted && pDeleteFilter->bDstMaskSpecified) // if dstmask specified
|
|
{
|
|
if(pFilterData->ppFilterSpecs[i]->Filter.DestMask == pDeleteFilter->DestMask)
|
|
{
|
|
bFilterDeleted=TRUE;
|
|
}
|
|
else
|
|
{
|
|
bFilterDeleted=FALSE;
|
|
}
|
|
}
|
|
if (bFilterDeleted && pDeleteFilter->bProtocolSpecified)
|
|
{
|
|
if(pFilterData->ppFilterSpecs[i]->Filter.Protocol == pDeleteFilter->dwProtocol)
|
|
{
|
|
bFilterDeleted=TRUE;
|
|
}
|
|
else
|
|
{
|
|
bFilterDeleted=FALSE;
|
|
}
|
|
}
|
|
if (bFilterDeleted && pDeleteFilter->bSrcPortSpecified)
|
|
{
|
|
if(pFilterData->ppFilterSpecs[i]->Filter.SrcPort == pDeleteFilter->SourPort)
|
|
{
|
|
bFilterDeleted=TRUE;
|
|
}
|
|
else
|
|
{
|
|
bFilterDeleted=FALSE;
|
|
}
|
|
}
|
|
if (bFilterDeleted && pDeleteFilter->bDstPortSpecified)
|
|
{
|
|
if(pFilterData->ppFilterSpecs[i]->Filter.DestPort == pDeleteFilter->DestPort)
|
|
{
|
|
bFilterDeleted=TRUE;
|
|
}
|
|
else
|
|
{
|
|
bFilterDeleted=FALSE;
|
|
}
|
|
}
|
|
if (bFilterDeleted && (pDeleteFilter->bSrcServerSpecified || pDeleteFilter->bDstServerSpecified))
|
|
{
|
|
if(pFilterData->ppFilterSpecs[i]->Filter.ExType == pDeleteFilter->ExType)
|
|
{
|
|
bFilterDeleted=TRUE;
|
|
}
|
|
else
|
|
{
|
|
bFilterDeleted=FALSE;
|
|
}
|
|
}
|
|
}
|
|
if(bFilterDeleted) // if found delete and realloc memory
|
|
{
|
|
IPSecFreeFilterSpec(pFilterData->ppFilterSpecs[i]);
|
|
pFilterData->ppFilterSpecs[i]=NULL;
|
|
pFilterData->dwNumFilterSpecs--;
|
|
bDeletedFilter=TRUE;
|
|
bFilterDeleted=FALSE;
|
|
}
|
|
i++;
|
|
}
|
|
if(bDeletedFilter)
|
|
{
|
|
pFilterData->ppFilterSpecs=ReAllocFilterSpecMem(pFilterData->ppFilterSpecs,dwOldNumFilters,pFilterData->dwNumFilterSpecs);
|
|
}
|
|
|
|
return bDeletedFilter;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: HandleStaticDeleteFilterActions()
|
|
//
|
|
//Date of Creation: 21st Aug 2001
|
|
//
|
|
//Parameters:
|
|
// IN LPCWSTR pwszMachine,
|
|
// IN OUT LPWSTR *ppwcArguments,
|
|
// IN DWORD dwCurrentIndex,
|
|
// IN DWORD dwArgCount,
|
|
// IN DWORD dwFlags,
|
|
// IN LPCVOID pvData,
|
|
// OUT BOOL *pbDone
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description:
|
|
// Implementation for the command "Delete FilterActions"
|
|
//
|
|
//Revision History:
|
|
//
|
|
//Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
DWORD WINAPI
|
|
HandleStaticDeleteFilterActions(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
{
|
|
|
|
LPTSTR pszFactName=NULL;
|
|
DWORD dwCount=0;
|
|
PIPSEC_NEGPOL_DATA *ppNegPolEnum = NULL,pNegPol=NULL;
|
|
DWORD dwNumNegPolicies=0,cnt=0,dwRet = ERROR_SHOW_USAGE;
|
|
HANDLE hPolicyStorage=NULL;
|
|
_TCHAR szUserInput[STRING_SIZE]={0};
|
|
BOOL bExists=FALSE,bAll=FALSE;
|
|
DWORD dwReturnCode = ERROR_SUCCESS , dwStrLength = 0;
|
|
PARSER_PKT parser;
|
|
ZeroMemory(&parser, sizeof(parser));
|
|
|
|
const TAG_TYPE vcmdStaticDeleteFilterActions[] =
|
|
{
|
|
{ CMD_TOKEN_STR_NAME, NS_REQ_ZERO, FALSE },
|
|
{ CMD_TOKEN_STR_ALL, NS_REQ_ZERO, FALSE }
|
|
};
|
|
|
|
const TOKEN_VALUE vtokStaticDeleteFilterActions[] =
|
|
{
|
|
{ CMD_TOKEN_STR_NAME, CMD_TOKEN_NAME },
|
|
{ CMD_TOKEN_STR_ALL, CMD_TOKEN_ALL }
|
|
};
|
|
|
|
//if the user asked for usage, delegate the responsibility to netsh
|
|
|
|
if(dwArgCount <= 3)
|
|
{
|
|
dwRet = ERROR_SHOW_USAGE;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
parser.ValidTok = vtokStaticDeleteFilterActions;
|
|
parser.MaxTok = SIZEOF_TOKEN_VALUE(vtokStaticDeleteFilterActions);
|
|
|
|
parser.ValidCmd = vcmdStaticDeleteFilterActions;
|
|
parser.MaxCmd = SIZEOF_TAG_TYPE(vcmdStaticDeleteFilterActions);
|
|
|
|
dwRet = Parser(pwszMachine,ppwcArguments,dwCurrentIndex,dwArgCount,&parser);
|
|
|
|
if(dwRet != ERROR_SUCCESS)
|
|
{
|
|
CleanUp();
|
|
if (dwRet==RETURN_NO_ERROR)
|
|
{
|
|
dwRet = ERROR_SUCCESS;
|
|
}
|
|
BAIL_OUT;
|
|
}
|
|
for(dwCount=0;dwCount<parser.MaxTok;dwCount++)
|
|
{
|
|
switch(vtokStaticDeleteFilterActions[parser.Cmd[dwCount].dwCmdToken].dwValue)
|
|
{
|
|
case CMD_TOKEN_NAME:
|
|
if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
|
|
{
|
|
dwStrLength = _tcslen((LPTSTR )parser.Cmd[dwCount].pArg);
|
|
|
|
pszFactName= new _TCHAR[dwStrLength+1];
|
|
if(pszFactName==NULL)
|
|
{
|
|
PrintErrorMessage(WIN32_ERR,ERROR_OUTOFMEMORY,NULL);
|
|
dwRet=ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
_tcsncpy(pszFactName,(LPTSTR)parser.Cmd[dwCount].pArg,dwStrLength+1);
|
|
}
|
|
break;
|
|
case CMD_TOKEN_ALL :
|
|
if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
|
|
{
|
|
bAll= *(BOOL *)parser.Cmd[dwCount].pArg;
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
CleanUp();
|
|
|
|
dwReturnCode = OpenPolicyStore(&hPolicyStorage);
|
|
if (dwReturnCode != ERROR_SUCCESS)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_FAILED_POLSTORE_OPEN);
|
|
dwRet=ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
dwReturnCode = IPSecEnumNegPolData(hPolicyStorage, &ppNegPolEnum, &dwNumNegPolicies);
|
|
|
|
if (!(dwReturnCode == ERROR_SUCCESS && dwNumNegPolicies > 0 && ppNegPolEnum != NULL))
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_NO_FILTER_ACTION);
|
|
dwRet = ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
// check for the specified filteraction
|
|
|
|
for(cnt=0; cnt < dwNumNegPolicies;cnt++)
|
|
{
|
|
if(IsEqualGUID(ppNegPolEnum[cnt]->NegPolType,GUID_NEGOTIATION_TYPE_DEFAULT) ||(!ppNegPolEnum[cnt]->pszIpsecName))
|
|
{
|
|
DeleteFilterAction(ppNegPolEnum[cnt],hPolicyStorage);
|
|
continue;
|
|
}
|
|
|
|
if (bAll || (pszFactName &&(_tcscmp(ppNegPolEnum[cnt]->pszIpsecName,pszFactName)==0)))
|
|
{
|
|
dwReturnCode = IPSecCopyNegPolData(ppNegPolEnum[cnt], &pNegPol);
|
|
if ((dwReturnCode == ERROR_SUCCESS) && pNegPol)
|
|
{
|
|
bExists=TRUE;
|
|
dwReturnCode = DeleteFilterAction(pNegPol,hPolicyStorage);
|
|
|
|
if (dwReturnCode == ERROR_INVALID_DATA)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DEL_STATIC_FILTERACTION_2,pNegPol->pszIpsecName);
|
|
ShowWhereFAUsed(pNegPol,hPolicyStorage);
|
|
}
|
|
else if (dwReturnCode != ERROR_SUCCESS)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DEL_STATIC_FILTERACTION_ALL_FA_DEL_QUERY,pNegPol->pszIpsecName);
|
|
}
|
|
}
|
|
}
|
|
if((!bAll && bExists)||((dwReturnCode != ERROR_SUCCESS)&&(dwReturnCode != ERROR_INVALID_DATA)))
|
|
break;
|
|
}
|
|
// throw the error messages to the user
|
|
|
|
if ((!bAll)&&(!bExists)&&(dwReturnCode == ERROR_SUCCESS))
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SHW_STATIC_TAB_PRTALLFA_FA_COUNT_LIST,pszFactName);
|
|
}
|
|
|
|
if (dwNumNegPolicies > 0 && ppNegPolEnum != NULL)
|
|
{
|
|
IPSecFreeMulNegPolData(ppNegPolEnum, dwNumNegPolicies);
|
|
}
|
|
|
|
if(pNegPol)
|
|
{
|
|
IPSecFreeNegPolData(pNegPol);
|
|
}
|
|
|
|
ClosePolicyStore(hPolicyStorage);
|
|
dwRet=ERROR_SUCCESS;
|
|
|
|
error:
|
|
if(pszFactName)
|
|
{
|
|
delete [] pszFactName;
|
|
}
|
|
|
|
return dwRet;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: HandleStaticDeleteRule()
|
|
//
|
|
//Date of Creation: 21st Aug 2001
|
|
//
|
|
//Parameters:
|
|
// IN LPCWSTR pwszMachine,
|
|
// IN OUT LPWSTR *ppwcArguments,
|
|
// IN DWORD dwCurrentIndex,
|
|
// IN DWORD dwArgCount,
|
|
// IN DWORD dwFlags,
|
|
// IN LPCVOID pvData,
|
|
// OUT BOOL *pbDone
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description:
|
|
// Implementation for the command "Delete Rule"
|
|
//
|
|
//Revision History:
|
|
//
|
|
//Date Author Comments
|
|
//
|
|
//////////////////////////////////////////////////////////////////
|
|
|
|
DWORD WINAPI
|
|
HandleStaticDeleteRule(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
{
|
|
BOOL bAll=FALSE,bExists=FALSE,bRuleExists=FALSE,bAssigned=FALSE,bCompleteDelete=FALSE;
|
|
LPTSTR pszPolicyName=NULL,pszRuleName=NULL;
|
|
DWORD dwNumPolicies = 0,dwRuleId = 0;
|
|
DWORD dwRet = ERROR_SHOW_USAGE,i=0,dwCount=0;
|
|
PIPSEC_POLICY_DATA *ppPolicyEnum = NULL,pPolicy=NULL;
|
|
HANDLE hPolicyStorage=NULL;
|
|
RPC_STATUS RpcStat =RPC_S_OK;
|
|
_TCHAR szUserInput[STRING_SIZE]={0};
|
|
DWORD dwReturnCode = ERROR_SUCCESS , dwStrLength = 0;
|
|
PARSER_PKT parser;
|
|
ZeroMemory(&parser, sizeof(parser));
|
|
|
|
const TAG_TYPE vcmdStaticDeleteRule[] =
|
|
{
|
|
{ CMD_TOKEN_STR_NAME, NS_REQ_ZERO, FALSE },
|
|
{ CMD_TOKEN_STR_ID, NS_REQ_ZERO, FALSE },
|
|
{ CMD_TOKEN_STR_ALL, NS_REQ_ZERO, FALSE },
|
|
{ CMD_TOKEN_STR_POLICY, NS_REQ_ZERO, FALSE },
|
|
};
|
|
|
|
const TOKEN_VALUE vtokStaticDeleteRule[] =
|
|
{
|
|
{ CMD_TOKEN_STR_NAME, CMD_TOKEN_NAME },
|
|
{ CMD_TOKEN_STR_ID, CMD_TOKEN_ID },
|
|
{ CMD_TOKEN_STR_ALL, CMD_TOKEN_ALL },
|
|
{ CMD_TOKEN_STR_POLICY, CMD_TOKEN_POLICY }
|
|
};
|
|
|
|
//if the user asked for usage, delegate the responsibility to netsh
|
|
|
|
if(dwArgCount <= 3)
|
|
{
|
|
dwRet = ERROR_SHOW_USAGE;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
parser.ValidTok = vtokStaticDeleteRule;
|
|
parser.MaxTok = SIZEOF_TOKEN_VALUE(vtokStaticDeleteRule);
|
|
|
|
parser.ValidCmd = vcmdStaticDeleteRule;
|
|
parser.MaxCmd = SIZEOF_TAG_TYPE(vcmdStaticDeleteRule);
|
|
|
|
dwRet = Parser(pwszMachine,ppwcArguments,dwCurrentIndex,dwArgCount,&parser);
|
|
|
|
if(dwRet != ERROR_SUCCESS)
|
|
{
|
|
CleanUp();
|
|
if (dwRet==RETURN_NO_ERROR)
|
|
{
|
|
dwRet = ERROR_SUCCESS;
|
|
}
|
|
BAIL_OUT;
|
|
}
|
|
|
|
// get the parsed user input
|
|
|
|
for(dwCount=0;dwCount < parser.MaxTok;dwCount++)
|
|
{
|
|
switch(vtokStaticDeleteRule[parser.Cmd[dwCount].dwCmdToken].dwValue)
|
|
{
|
|
case CMD_TOKEN_NAME :
|
|
if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
|
|
{
|
|
dwStrLength = _tcslen((LPTSTR )parser.Cmd[dwCount].pArg);
|
|
|
|
pszRuleName= new _TCHAR[dwStrLength+1];
|
|
if(pszRuleName==NULL)
|
|
{
|
|
PrintErrorMessage(WIN32_ERR,ERROR_OUTOFMEMORY,NULL);
|
|
dwRet=ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
_tcsncpy(pszRuleName,(LPTSTR)parser.Cmd[dwCount].pArg,dwStrLength+1);
|
|
}
|
|
break;
|
|
case CMD_TOKEN_POLICY :
|
|
if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
|
|
{
|
|
dwStrLength = _tcslen((LPTSTR )parser.Cmd[dwCount].pArg);
|
|
|
|
pszPolicyName= new _TCHAR[dwStrLength+1];
|
|
if(pszPolicyName==NULL)
|
|
{
|
|
PrintErrorMessage(WIN32_ERR,ERROR_OUTOFMEMORY,NULL);
|
|
dwRet=ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
_tcsncpy(pszPolicyName,(LPTSTR)parser.Cmd[dwCount].pArg,dwStrLength+1);
|
|
}
|
|
break;
|
|
case CMD_TOKEN_ID :
|
|
if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
|
|
{
|
|
dwRuleId= *(DWORD *)parser.Cmd[dwCount].pArg;
|
|
}
|
|
break;
|
|
case CMD_TOKEN_ALL :
|
|
if (parser.Cmd[dwCount].dwStatus == VALID_TOKEN)
|
|
{
|
|
bAll= *(BOOL *)parser.Cmd[dwCount].pArg;
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
CleanUp();
|
|
|
|
// if no policy name, bail out
|
|
if (!pszPolicyName)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SHW_STATIC_RULE_4);
|
|
return dwRet;
|
|
}
|
|
|
|
dwReturnCode = OpenPolicyStore(&hPolicyStorage);
|
|
if (dwReturnCode != ERROR_SUCCESS)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_FAILED_POLSTORE_OPEN);
|
|
dwRet=ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
dwReturnCode = IPSecEnumPolicyData(hPolicyStorage, &ppPolicyEnum, &dwNumPolicies);
|
|
|
|
if (!(dwReturnCode == ERROR_SUCCESS && dwNumPolicies > 0 && ppPolicyEnum != NULL))
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_NO_POLICY);
|
|
dwRet = ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
// get the required policy
|
|
for (i = 0; i < dwNumPolicies; i++)
|
|
{
|
|
if ((pszPolicyName!=NULL)&&( wcscmp(ppPolicyEnum[i]->pszIpsecName, pszPolicyName) == 0))
|
|
{
|
|
bExists=TRUE;
|
|
|
|
dwReturnCode = IPSecCopyPolicyData(ppPolicyEnum[i], &pPolicy);
|
|
if (dwReturnCode != ERROR_SUCCESS)
|
|
{
|
|
dwRet = dwReturnCode;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
dwReturnCode = IPSecEnumNFAData(hPolicyStorage, pPolicy->PolicyIdentifier
|
|
, &(pPolicy->ppIpsecNFAData), &(pPolicy->dwNumNFACount));
|
|
|
|
if (dwReturnCode == ERROR_SUCCESS)
|
|
{
|
|
DWORD j;
|
|
for (j = 0; j < pPolicy->dwNumNFACount && (dwReturnCode == ERROR_SUCCESS); j++)
|
|
{
|
|
if (!UuidIsNil(&(pPolicy->ppIpsecNFAData[j]->NegPolIdentifier), &RpcStat))
|
|
{
|
|
dwReturnCode=IPSecGetNegPolData(hPolicyStorage, pPolicy->ppIpsecNFAData[j]->NegPolIdentifier,&(pPolicy->ppIpsecNFAData[j]->pIpsecNegPolData));
|
|
}
|
|
if ((!UuidIsNil(&(pPolicy->ppIpsecNFAData[j]->FilterIdentifier), &RpcStat))&&(dwReturnCode == ERROR_SUCCESS))
|
|
{
|
|
dwReturnCode=IPSecGetFilterData(hPolicyStorage, pPolicy->ppIpsecNFAData[j]->FilterIdentifier,&(pPolicy->ppIpsecNFAData[j]->pIpsecFilterData));
|
|
}
|
|
}
|
|
}
|
|
|
|
for (DWORD n = 0; n < pPolicy->dwNumNFACount && (dwReturnCode == ERROR_SUCCESS); n++)
|
|
|
|
if (bAll||((pPolicy->ppIpsecNFAData[n]->pszIpsecName)&& pszRuleName &&(_tcscmp(pPolicy->ppIpsecNFAData[n]->pszIpsecName,pszRuleName)==0))||((dwRuleId-1)==n))
|
|
{
|
|
bRuleExists=TRUE;
|
|
if((dwReturnCode == ERROR_SUCCESS)&&(!bAssigned) && g_StorageLocation.dwLocation != IPSEC_DIRECTORY_PROVIDER)
|
|
{
|
|
dwReturnCode=IsAssigned(pPolicy,hPolicyStorage,bAssigned);
|
|
if(( dwReturnCode == ERROR_SUCCESS || dwReturnCode == ERROR_FILE_NOT_FOUND )&&bAssigned)
|
|
{
|
|
dwReturnCode=IPSecUnassignPolicy(hPolicyStorage, pPolicy->PolicyIdentifier);
|
|
}
|
|
}
|
|
|
|
// if user asked to delete default rule, throw error to the user
|
|
|
|
if(pPolicy->ppIpsecNFAData[n]->pIpsecNegPolData->NegPolType!=GUID_NEGOTIATION_TYPE_DEFAULT)
|
|
{
|
|
if (((dwReturnCode == ERROR_SUCCESS)||(dwReturnCode == ERROR_FILE_NOT_FOUND)))
|
|
{
|
|
dwReturnCode=DeleteRule(pPolicy,pPolicy->ppIpsecNFAData[n],hPolicyStorage,bCompleteDelete);
|
|
|
|
if (dwReturnCode!=ERROR_SUCCESS)
|
|
{
|
|
if (bAll&&(pPolicy->ppIpsecNFAData[n]->pszIpsecName))
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DEL_STATIC_RULE_3,pPolicy->ppIpsecNFAData[n]->pszIpsecName);
|
|
}
|
|
else if (!bAll && pszRuleName)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DEL_STATIC_RULE_3,pszRuleName);
|
|
}
|
|
else
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DEL_STATIC_RULE_4,dwRuleId);
|
|
}
|
|
dwRet = ERROR_SUCCESS;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
PrintMessageFromModule(g_hModule,ERR_DEL_STATIC_RULE_DEF_DEL_NOT_ALLOWED);
|
|
dwRet = ERROR_SUCCESS;
|
|
}
|
|
if(!bAll && bExists)
|
|
break;
|
|
}
|
|
|
|
if (bAssigned && g_StorageLocation.dwLocation != IPSEC_DIRECTORY_PROVIDER)
|
|
{
|
|
IPSecAssignPolicy(hPolicyStorage, pPolicy->PolicyIdentifier);
|
|
}
|
|
|
|
if((!bRuleExists)&& pszRuleName &&(dwReturnCode==ERROR_SUCCESS))
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DEL_STATIC_RULE_10,pszRuleName);
|
|
}
|
|
else if(!bRuleExists)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SHW_STATIC_RULE_3,dwRuleId);
|
|
}
|
|
}
|
|
if(bExists)
|
|
break;
|
|
}
|
|
|
|
if(!bExists )
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SHW_STATIC_POLICY_2,pszPolicyName);
|
|
}
|
|
|
|
if (dwNumPolicies > 0 && ppPolicyEnum != NULL)
|
|
{
|
|
IPSecFreeMulPolicyData(ppPolicyEnum, dwNumPolicies);
|
|
}
|
|
|
|
ClosePolicyStore(hPolicyStorage);
|
|
dwRet=ERROR_SUCCESS;
|
|
if (pPolicy)
|
|
{
|
|
IPSecFreePolicyData(pPolicy);
|
|
}
|
|
|
|
error: // clean up
|
|
if (pszPolicyName)
|
|
{
|
|
delete [] pszPolicyName;
|
|
}
|
|
if (pszRuleName)
|
|
{
|
|
delete [] pszRuleName;
|
|
}
|
|
return dwRet;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: HandleStaticDeleteAll()
|
|
//
|
|
//Date of Creation: 21st Aug 2001
|
|
//
|
|
//Parameters:
|
|
// IN LPCWSTR pwszMachine,
|
|
// IN OUT LPWSTR *ppwcArguments,
|
|
// IN DWORD dwCurrentIndex,
|
|
// IN DWORD dwArgCount,
|
|
// IN DWORD dwFlags,
|
|
// IN LPCVOID pvData,
|
|
// OUT BOOL *pbDone
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description:
|
|
// Implementation for the command "Delete All"
|
|
//
|
|
//Revision History:
|
|
//
|
|
//Date Author Comments
|
|
//
|
|
///////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD WINAPI
|
|
HandleStaticDeleteAll(
|
|
IN LPCWSTR pwszMachine,
|
|
IN OUT LPWSTR *ppwcArguments,
|
|
IN DWORD dwCurrentIndex,
|
|
IN DWORD dwArgCount,
|
|
IN DWORD dwFlags,
|
|
IN LPCVOID pvData,
|
|
OUT BOOL *pbDone
|
|
)
|
|
{
|
|
BOOL bAssigned=FALSE,bCompleteDelete=TRUE;
|
|
DWORD dwNumPolicies = 0,dwRet = ERROR_SUCCESS,i=0;
|
|
PIPSEC_POLICY_DATA *ppPolicyEnum = NULL,pPolicy=NULL;
|
|
HANDLE hPolicyStorage=NULL;
|
|
_TCHAR szUserInput[STRING_SIZE]={0};
|
|
DWORD dwReturnCode = ERROR_SUCCESS;
|
|
|
|
UpdateGetLastError(NULL); // Error Success
|
|
|
|
dwReturnCode = OpenPolicyStore(&hPolicyStorage);
|
|
if (dwReturnCode != ERROR_SUCCESS)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_FAILED_POLSTORE_OPEN);
|
|
dwRet=ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
// enum all policies and delete one by one
|
|
|
|
dwReturnCode = IPSecEnumPolicyData(hPolicyStorage, &ppPolicyEnum, &dwNumPolicies);
|
|
if (dwReturnCode == ERROR_SUCCESS && dwNumPolicies > 0 && ppPolicyEnum != NULL)
|
|
{
|
|
for (i = 0; i < dwNumPolicies; i++)
|
|
{
|
|
dwReturnCode = IPSecCopyPolicyData(ppPolicyEnum[i], &pPolicy);
|
|
if (dwReturnCode != ERROR_SUCCESS)
|
|
{
|
|
dwRet = dwReturnCode;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
dwReturnCode = IPSecEnumNFAData(hPolicyStorage, pPolicy->PolicyIdentifier
|
|
, &(pPolicy->ppIpsecNFAData), &(pPolicy->dwNumNFACount));
|
|
|
|
if (dwReturnCode == ERROR_SUCCESS)
|
|
{
|
|
dwReturnCode=IPSecGetISAKMPData(hPolicyStorage, pPolicy->ISAKMPIdentifier, &(pPolicy->pIpsecISAKMPData));
|
|
}
|
|
|
|
if((dwReturnCode == ERROR_SUCCESS)&&(!bAssigned))
|
|
{
|
|
if(g_StorageLocation.dwLocation!=IPSEC_DIRECTORY_PROVIDER)
|
|
{
|
|
dwReturnCode=IsAssigned(pPolicy,hPolicyStorage,bAssigned);
|
|
}
|
|
if(( dwReturnCode == ERROR_SUCCESS || dwReturnCode == ERROR_FILE_NOT_FOUND )&&bAssigned)
|
|
{
|
|
dwReturnCode=IPSecUnassignPolicy(hPolicyStorage, pPolicy->PolicyIdentifier);
|
|
}
|
|
}
|
|
|
|
dwReturnCode = DeletePolicy(pPolicy,hPolicyStorage,bCompleteDelete);
|
|
|
|
if (dwReturnCode != ERROR_SUCCESS)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DEL_STATIC_POLICY_3,pPolicy->pszIpsecName);
|
|
}
|
|
|
|
if (pPolicy)
|
|
{
|
|
IPSecFreePolicyData(pPolicy);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (dwNumPolicies > 0 && ppPolicyEnum != NULL)
|
|
{
|
|
IPSecFreeMulPolicyData(ppPolicyEnum, dwNumPolicies);
|
|
}
|
|
// delete the left out filterlists and filter action(Standalone)
|
|
dwReturnCode =DeleteStandAloneFL(hPolicyStorage);
|
|
|
|
if( dwReturnCode==ERROR_SUCCESS || dwReturnCode==ERROR_INVALID_DATA)
|
|
{
|
|
dwReturnCode =DeleteStandAloneFA(hPolicyStorage);
|
|
}
|
|
|
|
dwRet= ERROR_SUCCESS;
|
|
|
|
ClosePolicyStore(hPolicyStorage);
|
|
|
|
error:
|
|
return dwRet;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: DeleteStandAloneFL()
|
|
//
|
|
//Date of Creation: 21st Aug 2001
|
|
//
|
|
//Parameters:
|
|
// IN HANDLE hPolicyStorage
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description:
|
|
// This function deletes all the stand alone filter lists
|
|
//
|
|
//Revision History:
|
|
//
|
|
//Date Author Comments
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
DeleteStandAloneFL(
|
|
IN HANDLE hPolicyStorage
|
|
)
|
|
{
|
|
DWORD dwReturnCode=ERROR_SUCCESS;
|
|
PIPSEC_FILTER_DATA *ppFilterEnum = NULL,pFilter=NULL;
|
|
DWORD cnt=0,dwNumFilters=0;
|
|
|
|
dwReturnCode = IPSecEnumFilterData(hPolicyStorage, &ppFilterEnum, &dwNumFilters);
|
|
if (!(dwReturnCode == ERROR_SUCCESS && dwNumFilters > 0 && ppFilterEnum != NULL))
|
|
{
|
|
dwReturnCode=ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
// delete one by one
|
|
for(cnt=0; cnt < dwNumFilters;cnt++)
|
|
{
|
|
dwReturnCode = IPSecCopyFilterData(ppFilterEnum[cnt], &pFilter);
|
|
if ((dwReturnCode == ERROR_SUCCESS) && (pFilter != NULL))
|
|
{
|
|
dwReturnCode = DeleteFilterList(pFilter,hPolicyStorage);
|
|
if (dwReturnCode == ERROR_INVALID_DATA)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DEL_STATIC_FILTERLIST_2,pFilter->pszIpsecName);
|
|
// if cannot be deleted , show where it is used
|
|
ShowWhereFLUsed(pFilter,hPolicyStorage);
|
|
}
|
|
else if (dwReturnCode != ERROR_SUCCESS)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DEL_STATIC_FILTERLIST_ALL_FL_DEL_QUERY,pFilter->pszIpsecName);
|
|
}
|
|
}
|
|
}
|
|
if(ppFilterEnum && dwNumFilters>0)
|
|
{
|
|
IPSecFreeMulFilterData( ppFilterEnum,dwNumFilters);
|
|
}
|
|
if(pFilter)
|
|
{
|
|
IPSecFreeFilterData(pFilter);
|
|
}
|
|
error:
|
|
return dwReturnCode;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: DeleteStandAloneFA()
|
|
//
|
|
//Date of Creation: 21st Aug 2001
|
|
//
|
|
//Parameters:
|
|
// IN HANDLE hPolicyStorage
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description:
|
|
// This function deletes all the stand alone filter actions
|
|
//
|
|
//Revision History:
|
|
//
|
|
//Date Author Comments
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
DeleteStandAloneFA(
|
|
IN HANDLE hPolicyStorage
|
|
)
|
|
{
|
|
DWORD dwReturnCode=ERROR_SUCCESS;
|
|
PIPSEC_NEGPOL_DATA *ppNegPolEnum = NULL,pNegPol=NULL;
|
|
DWORD cnt=0,dwNumNegPolicies=0;
|
|
|
|
dwReturnCode = IPSecEnumNegPolData(hPolicyStorage, &ppNegPolEnum, &dwNumNegPolicies);
|
|
if (!(dwReturnCode == ERROR_SUCCESS && dwNumNegPolicies > 0 && ppNegPolEnum != NULL))
|
|
{
|
|
dwReturnCode = ERROR_SUCCESS;
|
|
BAIL_OUT;
|
|
}
|
|
for(cnt=0; cnt < dwNumNegPolicies;cnt++)
|
|
{
|
|
// ignore the default filteraction
|
|
if(IsEqualGUID(ppNegPolEnum[cnt]->NegPolType,GUID_NEGOTIATION_TYPE_DEFAULT)||(!ppNegPolEnum[cnt]->pszIpsecName))
|
|
{
|
|
DeleteFilterAction(ppNegPolEnum[cnt],hPolicyStorage);
|
|
continue;
|
|
}
|
|
|
|
dwReturnCode = IPSecCopyNegPolData(ppNegPolEnum[cnt], &pNegPol);
|
|
if ((dwReturnCode == ERROR_SUCCESS) && (pNegPol != NULL))
|
|
{
|
|
dwReturnCode = DeleteFilterAction(pNegPol,hPolicyStorage);
|
|
if (dwReturnCode == ERROR_INVALID_DATA)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DEL_STATIC_FILTERACTION_2,pNegPol->pszIpsecName);
|
|
//if delete failed, show where it is used
|
|
ShowWhereFAUsed(pNegPol,hPolicyStorage);
|
|
}
|
|
else if (dwReturnCode != ERROR_SUCCESS)
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_DEL_STATIC_FILTERACTION_ALL_FA_DEL_QUERY,pNegPol->pszIpsecName);
|
|
}
|
|
}
|
|
}
|
|
if (dwNumNegPolicies > 0 && ppNegPolEnum != NULL)
|
|
{
|
|
IPSecFreeMulNegPolData( ppNegPolEnum,dwNumNegPolicies);
|
|
}
|
|
if(pNegPol)
|
|
{
|
|
IPSecFreeNegPolData(pNegPol);
|
|
}
|
|
error:
|
|
return dwReturnCode;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: DeletePolicy()
|
|
//
|
|
//Date of Creation: 21st Aug 2001
|
|
//
|
|
//Parameters:
|
|
// IN PIPSEC_POLICY_DATA pPolicy,
|
|
// IN HANDLE hStore,
|
|
// IN BOOL bCompleteDelete
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description:
|
|
// Deletes a specific policy from the policy store
|
|
//
|
|
//Revision History:
|
|
//
|
|
//Date Author Comments
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
DeletePolicy(
|
|
IN PIPSEC_POLICY_DATA pPolicy,
|
|
IN HANDLE hStore,
|
|
IN BOOL bCompleteDelete
|
|
)
|
|
{
|
|
DWORD dwReturnCode = ERROR_SUCCESS;
|
|
DWORD i=0;
|
|
RPC_STATUS RpcStat=RPC_S_OK;
|
|
GUID guidISAKMP = pPolicy->ISAKMPIdentifier,guidNegPol,guidFilter;
|
|
|
|
//check for read only flag
|
|
|
|
if(pPolicy->dwFlags & POLSTORE_READONLY )
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SET_POL_READ_ONLY_OBJECT,pPolicy->pszIpsecName);
|
|
BAIL_OUT;
|
|
}
|
|
|
|
//delete sequentially the policy data structure
|
|
|
|
for (i = 0; i < pPolicy->dwNumNFACount && ((dwReturnCode == ERROR_SUCCESS)||(dwReturnCode==ERROR_INVALID_DATA)); i++)
|
|
{
|
|
if(bCompleteDelete)
|
|
{
|
|
guidNegPol=pPolicy->ppIpsecNFAData[i]->NegPolIdentifier;
|
|
guidFilter=pPolicy->ppIpsecNFAData[i]->FilterIdentifier;
|
|
}
|
|
dwReturnCode = IPSecDeleteNFAData(hStore, pPolicy->PolicyIdentifier, pPolicy->ppIpsecNFAData[i]);
|
|
|
|
if(bCompleteDelete) // if the user asked, delete the filterlist and filteractions also
|
|
{
|
|
if ((dwReturnCode == ERROR_SUCCESS)||(dwReturnCode==ERROR_INVALID_DATA))
|
|
{
|
|
if (!UuidIsNil(&guidFilter, &RpcStat))
|
|
{
|
|
dwReturnCode = DeleteFilterData(hStore, guidFilter);
|
|
}
|
|
}
|
|
|
|
if ((dwReturnCode == ERROR_SUCCESS)||(dwReturnCode==ERROR_INVALID_DATA))
|
|
{
|
|
if (!UuidIsNil(&guidNegPol, &RpcStat))
|
|
{
|
|
dwReturnCode = DeleteNegPolData(hStore, guidNegPol);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if ((dwReturnCode == ERROR_SUCCESS)||(dwReturnCode==ERROR_INVALID_DATA))
|
|
{
|
|
dwReturnCode = DeletePolicyData(hStore, pPolicy);
|
|
}
|
|
|
|
if (dwReturnCode == ERROR_SUCCESS)
|
|
{
|
|
dwReturnCode = IPSecDeleteISAKMPData(hStore, guidISAKMP);
|
|
}
|
|
error:
|
|
return dwReturnCode;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: DeleteRule()
|
|
//
|
|
//Date of Creation: 21st Aug 2001
|
|
//
|
|
//Parameters:
|
|
// IN PIPSEC_POLICY_DATA pPolicy,
|
|
// IN PIPSEC_NFA_DATA pIpsecNFAData,
|
|
// IN HANDLE hStore,
|
|
// IN BOOL bCompleteDelete
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description:
|
|
// Deletes a specific rule from the policy specified.
|
|
// Note : It will deny to delete the Default response rule.
|
|
//
|
|
//Revision History:
|
|
//
|
|
//Date Author Comments
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
DeleteRule(
|
|
IN PIPSEC_POLICY_DATA pPolicy,
|
|
IN PIPSEC_NFA_DATA pIpsecNFAData,
|
|
IN HANDLE hStore,
|
|
IN BOOL bCompleteDelete
|
|
)
|
|
|
|
{
|
|
DWORD dwReturnCode = ERROR_SUCCESS;
|
|
RPC_STATUS RpcStat=RPC_S_OK;
|
|
GUID guidNegPol,guidFilter;
|
|
|
|
//check for readonly flag
|
|
|
|
if(pPolicy->dwFlags & POLSTORE_READONLY )
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SET_POL_READ_ONLY_OBJECT,pPolicy->pszIpsecName);
|
|
BAIL_OUT;
|
|
}
|
|
|
|
// delete sequentially the NFA data structure
|
|
|
|
if(bCompleteDelete)
|
|
{
|
|
guidNegPol=pIpsecNFAData->NegPolIdentifier;
|
|
guidFilter=pIpsecNFAData->FilterIdentifier;
|
|
}
|
|
|
|
dwReturnCode = IPSecDeleteNFAData(hStore, pPolicy->PolicyIdentifier, pIpsecNFAData);
|
|
|
|
if(bCompleteDelete) // if the user asked, delete the filterlist and filteractions also
|
|
{
|
|
if (dwReturnCode == ERROR_SUCCESS)
|
|
{
|
|
if (!UuidIsNil(&guidFilter, &RpcStat))
|
|
{
|
|
dwReturnCode = DeleteFilterData(hStore, guidFilter);
|
|
}
|
|
}
|
|
if ((dwReturnCode == ERROR_SUCCESS)||(dwReturnCode==ERROR_INVALID_DATA))
|
|
{
|
|
if (!UuidIsNil(&guidNegPol, &RpcStat))
|
|
{
|
|
dwReturnCode = DeleteNegPolData(hStore, guidNegPol);
|
|
}
|
|
}
|
|
}
|
|
|
|
if(g_NshPolStoreHandle.GetBatchmodeStatus())
|
|
{
|
|
g_NshPolNegFilData.DeletePolicyFromCache(pPolicy);
|
|
}
|
|
|
|
if (dwReturnCode==ERROR_INVALID_DATA)
|
|
{
|
|
dwReturnCode = ERROR_SUCCESS;
|
|
}
|
|
|
|
error:
|
|
return dwReturnCode;
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: DeleteFilterAction()
|
|
//
|
|
//Date of Creation: 21st Aug 2001
|
|
//
|
|
//Parameters:
|
|
// IN PIPSEC_NEGPOL_DATA pNegPolData,
|
|
// IN HANDLE hStore
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description:
|
|
// Deletes a specific Filter Action from the policy store
|
|
// Note : It will object to delete the FA attached to some policy/Rule.
|
|
// And it displays the policies/rules which are using it.
|
|
//
|
|
//Revision History:
|
|
//
|
|
//Date Author Comments
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
DeleteFilterAction(
|
|
IN PIPSEC_NEGPOL_DATA pNegPolData,
|
|
IN HANDLE hStore
|
|
)
|
|
{
|
|
DWORD dwReturnCode = ERROR_SUCCESS;
|
|
RPC_STATUS RpcStat=RPC_S_OK;
|
|
|
|
if (!UuidIsNil(&(pNegPolData->NegPolIdentifier), &RpcStat))
|
|
{
|
|
dwReturnCode = DeleteNegPolData(hStore, pNegPolData->NegPolIdentifier);
|
|
}
|
|
return dwReturnCode;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: DeleteFilterList()
|
|
//
|
|
//Date of Creation: 21st Aug 2001
|
|
//
|
|
//Parameters:
|
|
// IN PIPSEC_FILTER_DATA pFilterData,
|
|
// IN HANDLE hStore
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description:
|
|
// Deletes a specific Filter List from the policy store
|
|
// Note : It will object to delete the FL attached to some policy/Rule.
|
|
// And it displays the policies/rules which are using it.
|
|
//
|
|
//Revision History:
|
|
//
|
|
//Date Author Comments
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
DeleteFilterList(
|
|
IN PIPSEC_FILTER_DATA pFilterData,
|
|
IN HANDLE hStore
|
|
)
|
|
{
|
|
DWORD dwReturnCode = ERROR_SUCCESS;
|
|
RPC_STATUS RpcStat=RPC_S_OK;
|
|
|
|
if(pFilterData->dwFlags & POLSTORE_READONLY )
|
|
{
|
|
PrintErrorMessage(IPSEC_ERR,0,ERRCODE_SET_FL_READ_ONLY_OBJECT,pFilterData->pszIpsecName);
|
|
BAIL_OUT;
|
|
}
|
|
|
|
if (!UuidIsNil(&(pFilterData->FilterIdentifier), &RpcStat))
|
|
{
|
|
dwReturnCode = DeleteFilterData(hStore, pFilterData->FilterIdentifier);
|
|
}
|
|
error:
|
|
return dwReturnCode;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: ShowWhereFLUsed()
|
|
//
|
|
//Date of Creation: 21st Aug 2001
|
|
//
|
|
//Parameters:
|
|
// IN PIPSEC_FILTER_DATA pIpsecFilterData,
|
|
// IN HANDLE hPolicyStorage
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description:
|
|
// This function displays the policies/rules which are using a specific Filter list.
|
|
//
|
|
//Revision History:
|
|
//
|
|
//Date Author Comments
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
VOID
|
|
ShowWhereFLUsed(
|
|
IN PIPSEC_FILTER_DATA pIpsecFilterData,
|
|
IN HANDLE hPolicyStorage
|
|
)
|
|
{
|
|
PIPSEC_POLICY_DATA *ppPolicyEnum = NULL,pPolicy=NULL;
|
|
BOOL bPrinted=FALSE;
|
|
DWORD dwNumPolicies = 0 , i=0;
|
|
DWORD dwReturnCode = ERROR_SUCCESS;
|
|
|
|
PrintMessageFromModule(g_hModule,DEL_STATIC_SHWRUSED_TITLE);
|
|
PrintMessageFromModule(g_hModule,DEL_STATIC_SHWRUSED_UNDERLINE);
|
|
|
|
dwReturnCode = IPSecEnumPolicyData(hPolicyStorage, &ppPolicyEnum, &dwNumPolicies);
|
|
|
|
if (!(dwReturnCode == ERROR_SUCCESS && dwNumPolicies > 0 && ppPolicyEnum != NULL))
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
for (i = 0; i < dwNumPolicies; i++)
|
|
{
|
|
bPrinted=FALSE;
|
|
|
|
dwReturnCode = IPSecCopyPolicyData(ppPolicyEnum[i], &pPolicy);
|
|
BAIL_ON_WIN32_ERROR(dwReturnCode);
|
|
|
|
dwReturnCode = IPSecEnumNFAData(hPolicyStorage, pPolicy->PolicyIdentifier
|
|
, &(pPolicy->ppIpsecNFAData), &(pPolicy->dwNumNFACount));
|
|
|
|
for (DWORD n = 0; n < pPolicy->dwNumNFACount && (dwReturnCode == ERROR_SUCCESS); n++)
|
|
{
|
|
//check where this filterlist is used
|
|
|
|
if(IsEqualGUID(pPolicy->ppIpsecNFAData[n]->FilterIdentifier,pIpsecFilterData->FilterIdentifier))
|
|
{
|
|
if ((!bPrinted)&&(pPolicy->pszIpsecName))
|
|
{
|
|
PrintMessageFromModule(g_hModule,SHW_STATIC_FILTERLIST_POL_NAME,pPolicy->pszIpsecName);
|
|
bPrinted=TRUE;
|
|
}
|
|
if (pPolicy->ppIpsecNFAData[n]->pszIpsecName)
|
|
{
|
|
PrintMessageFromModule(g_hModule,DEL_STATIC_SHWRUSED_RULE_NAME_STR,pPolicy->ppIpsecNFAData[n]->pszIpsecName );
|
|
}
|
|
else
|
|
{
|
|
PrintMessageFromModule(g_hModule,DEL_STATIC_SHWRUSED_RULE_NAME_NONE);
|
|
}
|
|
}
|
|
}
|
|
if (pPolicy)
|
|
{
|
|
IPSecFreePolicyData(pPolicy);
|
|
}
|
|
}
|
|
if (dwNumPolicies > 0 && ppPolicyEnum != NULL)
|
|
{
|
|
IPSecFreeMulPolicyData(ppPolicyEnum, dwNumPolicies);
|
|
}
|
|
error:
|
|
return;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: ShowWhereFAUsed()
|
|
//
|
|
//Date of Creation: 21st Aug 2001
|
|
//
|
|
//Parameters:
|
|
// IN PIPSEC_NEGPOL_DATA pIpsecNegPolData,
|
|
// IN HANDLE hPolicyStorage
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description:
|
|
// This function displays the policies/rules which are using a specific Filter Action.
|
|
//
|
|
//Revision History:
|
|
//
|
|
//Date Author Comments
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
VOID
|
|
ShowWhereFAUsed(
|
|
IN PIPSEC_NEGPOL_DATA pIpsecNegPolData,
|
|
IN HANDLE hPolicyStorage
|
|
)
|
|
{
|
|
PIPSEC_POLICY_DATA *ppPolicyEnum = NULL,pPolicy=NULL;
|
|
BOOL bPrinted=FALSE;
|
|
DWORD dwNumPolicies = 0 , i = 0;
|
|
DWORD dwReturnCode = ERROR_SUCCESS;
|
|
|
|
PrintMessageFromModule(g_hModule,DEL_STATIC_SHWRUSED_TITLE);
|
|
PrintMessageFromModule(g_hModule,DEL_STATIC_SHWRUSED_UNDERLINE);
|
|
|
|
dwReturnCode = IPSecEnumPolicyData(hPolicyStorage, &ppPolicyEnum, &dwNumPolicies);
|
|
if (!(dwReturnCode == ERROR_SUCCESS && dwNumPolicies > 0 && ppPolicyEnum != NULL))
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
for (i = 0; i < dwNumPolicies; i++)
|
|
{
|
|
bPrinted=FALSE;
|
|
dwReturnCode = IPSecCopyPolicyData(ppPolicyEnum[i], &pPolicy);
|
|
if (dwReturnCode != ERROR_SUCCESS)
|
|
{
|
|
BAIL_OUT;
|
|
}
|
|
dwReturnCode = IPSecEnumNFAData(hPolicyStorage, pPolicy->PolicyIdentifier
|
|
, &(pPolicy->ppIpsecNFAData), &(pPolicy->dwNumNFACount));
|
|
|
|
for (DWORD n = 0; n < pPolicy->dwNumNFACount && (dwReturnCode == ERROR_SUCCESS); n++)
|
|
{
|
|
//check where this filteraction is used
|
|
|
|
if(IsEqualGUID(pPolicy->ppIpsecNFAData[n]->NegPolIdentifier,pIpsecNegPolData->NegPolIdentifier))
|
|
{
|
|
if (!bPrinted)
|
|
{
|
|
PrintMessageFromModule(g_hModule,SHW_STATIC_FILTERLIST_POL_NAME,pPolicy->pszIpsecName);
|
|
bPrinted=TRUE;
|
|
}
|
|
if (pPolicy->ppIpsecNFAData[n]->pszIpsecName)
|
|
{
|
|
PrintMessageFromModule(g_hModule,DEL_STATIC_SHWRUSED_RULE_NAME_STR,pPolicy->ppIpsecNFAData[n]->pszIpsecName );
|
|
}
|
|
else
|
|
{
|
|
PrintMessageFromModule(g_hModule,DEL_STATIC_SHWRUSED_RULE_NAME_NONE);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (pPolicy)
|
|
{
|
|
IPSecFreePolicyData(pPolicy);
|
|
}
|
|
}
|
|
if (dwNumPolicies > 0 && ppPolicyEnum != NULL)
|
|
{
|
|
IPSecFreeMulPolicyData(ppPolicyEnum, dwNumPolicies);
|
|
}
|
|
error :
|
|
return;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//Function: FillDelFilterInfo( )
|
|
//
|
|
//Date of Creation: 21st Aug 2001
|
|
//
|
|
//Parameters:
|
|
// OUT PDELFILTERDATA* ppFilter,
|
|
// IN PARSER_PKT & parser,
|
|
// IN const TOKEN_VALUE *vtokStaticDeleteFilter
|
|
//
|
|
//Return: DWORD
|
|
//
|
|
//Description:
|
|
// This function fills the local structure with the information got from the parser.
|
|
//
|
|
//Revision History:
|
|
//
|
|
//Date Author Comments
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
DWORD
|
|
FillDelFilterInfo(
|
|
OUT PDELFILTERDATA* ppFilter,
|
|
IN PARSER_PKT & parser,
|
|
IN const TOKEN_VALUE *vtokStaticDeleteFilter
|
|
)
|
|
{
|
|
DWORD dwCount=0,dwReturn=ERROR_SUCCESS , dwStrLength = 0;
|
|
PDELFILTERDATA pFilter=new DELFILTERDATA;
|
|
if(pFilter==NULL)
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
memset(pFilter,0,sizeof(DELFILTERDATA));
|
|
|
|
pFilter->bMirrored=TRUE;
|
|
pFilter->SourMask = MASK_ME;
|
|
pFilter->DestMask = MASK_ME;
|
|
|
|
for(dwCount=0;dwCount < parser.MaxTok;dwCount++)
|
|
{
|
|
switch(vtokStaticDeleteFilter[parser.Cmd[dwCount].dwCmdToken].dwValue)
|
|
{
|
|
case CMD_TOKEN_FILTERLIST :
|
|
if ((parser.Cmd[dwCount].dwStatus == VALID_TOKEN)&&(parser.Cmd[dwCount].pArg))
|
|
{
|
|
dwStrLength = _tcslen((LPTSTR )parser.Cmd[dwCount].pArg);
|
|
|
|
pFilter->pszFLName=new _TCHAR[dwStrLength+1];
|
|
if(pFilter->pszFLName==NULL)
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
_tcsncpy(pFilter->pszFLName,(LPTSTR)parser.Cmd[dwCount].pArg,dwStrLength+1);
|
|
}
|
|
break;
|
|
case CMD_TOKEN_SRCADDR :
|
|
if ((parser.Cmd[dwCount].dwStatus == VALID_TOKEN)&&(parser.Cmd[dwCount].pArg))
|
|
{
|
|
if(((DNSIPADDR *)parser.Cmd[dwCount].pArg)->pszDomainName)
|
|
{
|
|
dwStrLength = _tcslen(((DNSIPADDR *)parser.Cmd[dwCount].pArg)->pszDomainName);
|
|
|
|
pFilter->SourceAddr.pszDomainName = new _TCHAR[dwStrLength+1];
|
|
if(pFilter->SourceAddr.pszDomainName==NULL)
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
_tcsncpy(pFilter->SourceAddr.pszDomainName,((DNSIPADDR *)parser.Cmd[dwCount].pArg)->pszDomainName,dwStrLength+1);
|
|
}
|
|
else
|
|
{
|
|
pFilter->SourceAddr.puIpAddr = new ULONG;
|
|
if(pFilter->SourceAddr.puIpAddr==NULL)
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
memcpy( &(pFilter->SourceAddr.puIpAddr[0]),(&((DNSIPADDR *)parser.Cmd[dwCount].pArg)->puIpAddr[0]),sizeof(ULONG));
|
|
}
|
|
}
|
|
else // deal if special server specified
|
|
{
|
|
|
|
if(parser.Cmd[dwCount].dwStatus == SERVER_DNS)
|
|
{
|
|
pFilter->bSrcServerSpecified=TRUE;
|
|
pFilter->ExType=EXT_DNS_SERVER;
|
|
}
|
|
else if(parser.Cmd[dwCount].dwStatus == SERVER_WINS)
|
|
{
|
|
pFilter->bSrcServerSpecified=TRUE;
|
|
pFilter->ExType=EXT_WINS_SERVER;
|
|
}
|
|
else if(parser.Cmd[dwCount].dwStatus == SERVER_DHCP)
|
|
{
|
|
pFilter->bSrcServerSpecified=TRUE;
|
|
pFilter->ExType=EXT_DHCP_SERVER;
|
|
}
|
|
else if(parser.Cmd[dwCount].dwStatus == SERVER_GATEWAY)
|
|
{
|
|
pFilter->bSrcServerSpecified=TRUE;
|
|
pFilter->ExType=EXT_DEFAULT_GATEWAY;
|
|
}
|
|
else if (parser.Cmd[dwCount].dwStatus == IP_ME)
|
|
{
|
|
pFilter->bSrcMeSpecified=TRUE;
|
|
}
|
|
else if (parser.Cmd[dwCount].dwStatus == IP_ANY)
|
|
{
|
|
pFilter->bSrcAnySpecified=TRUE;
|
|
}
|
|
}
|
|
break;
|
|
case CMD_TOKEN_DSTADDR :
|
|
if ((parser.Cmd[dwCount].dwStatus == VALID_TOKEN)&&(parser.Cmd[dwCount].pArg))
|
|
{
|
|
if(((DNSIPADDR *)parser.Cmd[dwCount].pArg)->pszDomainName)
|
|
{
|
|
dwStrLength = _tcslen(((DNSIPADDR *)parser.Cmd[dwCount].pArg)->pszDomainName);
|
|
|
|
pFilter->DestnAddr.pszDomainName = new _TCHAR[dwStrLength+1];
|
|
if(pFilter->DestnAddr.pszDomainName==NULL)
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
_tcsncpy(pFilter->DestnAddr.pszDomainName,((DNSIPADDR *)parser.Cmd[dwCount].pArg)->pszDomainName,dwStrLength+1);
|
|
}
|
|
else
|
|
{
|
|
pFilter->DestnAddr.puIpAddr = new ULONG;
|
|
if(pFilter->DestnAddr.puIpAddr==NULL)
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
memcpy( &(pFilter->DestnAddr.puIpAddr[0]),(&((DNSIPADDR *)parser.Cmd[dwCount].pArg)->puIpAddr[0]),sizeof(ULONG));
|
|
}
|
|
}
|
|
else // deal if special server specified
|
|
{
|
|
|
|
if(parser.Cmd[dwCount].dwStatus == SERVER_DNS)
|
|
{
|
|
pFilter->bDstServerSpecified=TRUE;
|
|
pFilter->ExType=EXT_DNS_SERVER | EXT_DEST;
|
|
}
|
|
else if(parser.Cmd[dwCount].dwStatus == SERVER_WINS)
|
|
{
|
|
pFilter->bDstServerSpecified=TRUE;
|
|
pFilter->ExType=EXT_WINS_SERVER | EXT_DEST;
|
|
}
|
|
else if(parser.Cmd[dwCount].dwStatus == SERVER_DHCP)
|
|
{
|
|
pFilter->bDstServerSpecified=TRUE;
|
|
pFilter->ExType=EXT_DHCP_SERVER | EXT_DEST;
|
|
}
|
|
else if(parser.Cmd[dwCount].dwStatus == SERVER_GATEWAY)
|
|
{
|
|
pFilter->bDstServerSpecified=TRUE;
|
|
pFilter->ExType=EXT_DEFAULT_GATEWAY | EXT_DEST;
|
|
}
|
|
else if (parser.Cmd[dwCount].dwStatus == IP_ME)
|
|
{
|
|
pFilter->bDstMeSpecified=TRUE;
|
|
}
|
|
else if (parser.Cmd[dwCount].dwStatus == IP_ANY)
|
|
{
|
|
pFilter->bDstAnySpecified=TRUE;
|
|
}
|
|
}
|
|
break;
|
|
case CMD_TOKEN_SRCMASK :
|
|
if ((parser.Cmd[dwCount].dwStatus == VALID_TOKEN)&&(parser.Cmd[dwCount].pArg))
|
|
{
|
|
pFilter->SourMask= *(DWORD *)parser.Cmd[dwCount].pArg;
|
|
pFilter->bSrcMaskSpecified=TRUE;
|
|
}
|
|
break;
|
|
case CMD_TOKEN_DSTMASK :
|
|
if ((parser.Cmd[dwCount].dwStatus == VALID_TOKEN)&&(parser.Cmd[dwCount].pArg))
|
|
{
|
|
pFilter->DestMask= *(DWORD *)parser.Cmd[dwCount].pArg;
|
|
pFilter->bDstMaskSpecified=TRUE;
|
|
}
|
|
break;
|
|
case CMD_TOKEN_MIRROR :
|
|
if ((parser.Cmd[dwCount].dwStatus == VALID_TOKEN)&&(parser.Cmd[dwCount].pArg))
|
|
{
|
|
pFilter->bMirrored= *(BOOL *)parser.Cmd[dwCount].pArg;
|
|
pFilter->bMirrorSpecified=TRUE;
|
|
}
|
|
break;
|
|
case CMD_TOKEN_PROTO :
|
|
if ((parser.Cmd[dwCount].dwStatus == VALID_TOKEN)&&(parser.Cmd[dwCount].pArg))
|
|
{
|
|
pFilter->dwProtocol= *(DWORD *)parser.Cmd[dwCount].pArg;
|
|
pFilter->bProtocolSpecified=TRUE;
|
|
}
|
|
break;
|
|
case CMD_TOKEN_SRCPORT :
|
|
if ((parser.Cmd[dwCount].dwStatus == VALID_TOKEN)&&(parser.Cmd[dwCount].pArg))
|
|
{
|
|
pFilter->SourPort= *(WORD *)parser.Cmd[dwCount].pArg;
|
|
pFilter->bSrcPortSpecified=TRUE;
|
|
}
|
|
break;
|
|
case CMD_TOKEN_DSTPORT :
|
|
if ((parser.Cmd[dwCount].dwStatus == VALID_TOKEN)&&(parser.Cmd[dwCount].pArg))
|
|
{
|
|
pFilter->DestPort= *(WORD *)parser.Cmd[dwCount].pArg;
|
|
pFilter->bDstPortSpecified=TRUE;
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
// deal me and any cases
|
|
|
|
if(pFilter->bSrcMeSpecified)
|
|
{
|
|
pFilter->SourceAddr.dwNumIpAddresses = 1;
|
|
pFilter->SourceAddr.puIpAddr= new ULONG[pFilter->SourceAddr.dwNumIpAddresses];
|
|
if(pFilter->SourceAddr.puIpAddr==NULL)
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
*(pFilter->SourceAddr.puIpAddr)=ADDR_ME;
|
|
pFilter->SourMask = MASK_ME;
|
|
if (pFilter->bDstMeSpecified)
|
|
{
|
|
dwReturn = ERROR_INVALID_PARAMETER;
|
|
BAIL_OUT;
|
|
}
|
|
}
|
|
else if(pFilter->bSrcAnySpecified)
|
|
{
|
|
pFilter->SourceAddr.dwNumIpAddresses = 1;
|
|
pFilter->SourceAddr.puIpAddr= new ULONG[pFilter->SourceAddr.dwNumIpAddresses];
|
|
if(pFilter->SourceAddr.puIpAddr==NULL)
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
*(pFilter->SourceAddr.puIpAddr)=ADDR_ME;
|
|
pFilter->SourMask = ADDR_ME;
|
|
}
|
|
if(pFilter->bDstMeSpecified)
|
|
{
|
|
pFilter->DestnAddr.dwNumIpAddresses = 1;
|
|
pFilter->DestnAddr.puIpAddr= new ULONG[pFilter->DestnAddr.dwNumIpAddresses];
|
|
if(pFilter->DestnAddr.puIpAddr==NULL)
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
*(pFilter->DestnAddr.puIpAddr)=ADDR_ME;
|
|
pFilter->DestMask = MASK_ME;
|
|
}
|
|
else if(pFilter->bDstAnySpecified)
|
|
{
|
|
pFilter->DestnAddr.dwNumIpAddresses = 1;
|
|
pFilter->DestnAddr.puIpAddr= new ULONG[pFilter->DestnAddr.dwNumIpAddresses];
|
|
if(pFilter->DestnAddr.puIpAddr==NULL)
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
*(pFilter->DestnAddr.puIpAddr)=ADDR_ME;
|
|
pFilter->DestMask = ADDR_ME;
|
|
}
|
|
|
|
if (((pFilter->dwProtocol != PROT_ID_TCP) && (pFilter->dwProtocol != PROT_ID_UDP)) &&
|
|
((pFilter->SourPort != 0) || (pFilter->DestPort != 0)))
|
|
{
|
|
dwReturn = ERROR_INVALID_PARAMETER;
|
|
BAIL_OUT;
|
|
}
|
|
|
|
|
|
|
|
if(pFilter->bSrcServerSpecified || pFilter->bDstServerSpecified)
|
|
{
|
|
//deal the special server cases. ignore irrelevant input parameters
|
|
|
|
if(pFilter->SourceAddr.pszDomainName)
|
|
{
|
|
delete [] pFilter->SourceAddr.pszDomainName;
|
|
pFilter->SourceAddr.pszDomainName=NULL;
|
|
}
|
|
if(pFilter->DestnAddr.pszDomainName)
|
|
{
|
|
delete [] pFilter->DestnAddr.pszDomainName;
|
|
pFilter->DestnAddr.pszDomainName=NULL;
|
|
}
|
|
if(pFilter->SourceAddr.puIpAddr)
|
|
{
|
|
delete [] pFilter->SourceAddr.puIpAddr;
|
|
}
|
|
if(pFilter->DestnAddr.puIpAddr)
|
|
{
|
|
delete [] pFilter->DestnAddr.puIpAddr;
|
|
}
|
|
|
|
pFilter->SourceAddr.dwNumIpAddresses = DEF_NUMBER_OF_ADDR;
|
|
pFilter->SourceAddr.puIpAddr= new ULONG[DEF_NUMBER_OF_ADDR];
|
|
if(pFilter->SourceAddr.puIpAddr==NULL)
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
memcpy( &(pFilter->SourceAddr.puIpAddr[0]),&ADDR_ME ,sizeof(ULONG));
|
|
|
|
pFilter->DestnAddr.dwNumIpAddresses = DEF_NUMBER_OF_ADDR;
|
|
pFilter->DestnAddr.puIpAddr= new ULONG[DEF_NUMBER_OF_ADDR];
|
|
if(pFilter->DestnAddr.puIpAddr==NULL)
|
|
{
|
|
dwReturn = ERROR_OUTOFMEMORY;
|
|
BAIL_OUT;
|
|
}
|
|
memcpy( &(pFilter->DestnAddr.puIpAddr[0]),&ADDR_ME ,sizeof(ULONG));
|
|
|
|
pFilter->SourMask = MASK_ME;
|
|
pFilter->DestMask = MASK_ME;
|
|
}
|
|
error:
|
|
*ppFilter=pFilter;
|
|
|
|
CleanUp();
|
|
|
|
return dwReturn;
|
|
}
|