mirror of https://github.com/tongzx/nt5src
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.
222 lines
7.0 KiB
222 lines
7.0 KiB
/////////////////////////////////////////////////////////////
|
|
// Copyright(c) 2000, Microsoft Corporation
|
|
//
|
|
// guidgen.cpp
|
|
//
|
|
// Created on 3/1/00 by DKalin (Dennis Kalinichenko)
|
|
// Revisions:
|
|
//
|
|
// Implementation for the guid/name generation routines
|
|
//
|
|
/////////////////////////////////////////////////////////////
|
|
|
|
#include "ipseccmd.h"
|
|
|
|
/*********************************************************************
|
|
FUNCTION: GenerateGuidNamePair
|
|
PURPOSE: Generates GUID and name for the object using specified prefix
|
|
PARAMS:
|
|
pszPrefix - prefix to use, can be NULL (then default prefix will be used)
|
|
gID - reference to GUID
|
|
ppszName - address of name pointer, memory will be allocated inside this function
|
|
RETURNS: none, will assert if memory cannot be allocated
|
|
COMMENTS:
|
|
caller is responsible for freeing the memory allocated
|
|
(see also DeleteGuidsNames routine)
|
|
*********************************************************************/
|
|
void GenerateGuidNamePair (IN LPWSTR pszPrefix, OUT GUID& gID, OUT LPWSTR* ppszName)
|
|
{
|
|
WCHAR StringTxt[POTF_MAX_STRLEN];
|
|
RPC_STATUS RpcStat;
|
|
int iReturn;
|
|
|
|
// cleanup first
|
|
assert(ppszName != 0);
|
|
if (*ppszName != 0)
|
|
{
|
|
delete[] *ppszName;
|
|
}
|
|
|
|
// set the prefix
|
|
if (pszPrefix == 0 || pszPrefix[0] == 0)
|
|
{
|
|
wcscpy(StringTxt, L"text2pol ");
|
|
}
|
|
else
|
|
{
|
|
wcscpy(StringTxt, pszPrefix);
|
|
}
|
|
|
|
RpcStat = UuidCreate(&gID);
|
|
assert(RpcStat == RPC_S_OK || RpcStat == RPC_S_UUID_LOCAL_ONLY);
|
|
|
|
// set the name to be equal to the prefix + GUID
|
|
iReturn = StringFromGUID2(gID, StringTxt+wcslen(StringTxt), POTF_MAX_STRLEN-wcslen(StringTxt));
|
|
assert(iReturn != 0);
|
|
*ppszName = new WCHAR[wcslen(StringTxt)+1];
|
|
assert(*ppszName != NULL);
|
|
wcscpy(*ppszName, StringTxt);
|
|
} /* GenerateGuidNamePair */
|
|
|
|
/*********************************************************************
|
|
FUNCTION: GenerateGuidsNames
|
|
PURPOSE: Generates all necessary GUIDs and names for IPSEC_IKE_POLICY
|
|
PARAMS:
|
|
pszPrefix - prefix to use, can be NULL (then default prefix will be used)
|
|
IPSecIkePol - reference to IPSEC_IKE_POLICY structure
|
|
RETURNS: none, will assert if memory cannot be allocated
|
|
COMMENTS:
|
|
caller is responsible for freeing the memory allocated
|
|
(see also DeleteGuidsNames routine)
|
|
*********************************************************************/
|
|
void GenerateGuidsNames (IN LPWSTR pszPrefix, IN OUT IPSEC_IKE_POLICY& IPSecIkePol)
|
|
{
|
|
int i;
|
|
IPSEC_IKE_POLICY TmpPol; // for checks
|
|
RPC_STATUS RpcStat;
|
|
|
|
// set TmpPol to 0's
|
|
memset(&TmpPol, 0, sizeof(TmpPol));
|
|
|
|
// walk through all the substructures and call GenerateGuidNamePair
|
|
for (i = 0; i < (int) IPSecIkePol.dwNumMMFilters; i++)
|
|
{
|
|
GenerateGuidNamePair(pszPrefix, IPSecIkePol.pMMFilters[i].gFilterID, &IPSecIkePol.pMMFilters[i].pszFilterName);
|
|
}
|
|
for (i = 0; i < (int) IPSecIkePol.dwNumFilters; i++)
|
|
{
|
|
// printf("GenerateGuidsNames i is %d", i);
|
|
if (IPSecIkePol.QMFilterType == QM_TRANSPORT_FILTER)
|
|
{
|
|
GenerateGuidNamePair(pszPrefix, IPSecIkePol.pTransportFilters[i].gFilterID, &IPSecIkePol.pTransportFilters[i].pszFilterName);
|
|
}
|
|
else
|
|
{
|
|
// tunnel
|
|
GenerateGuidNamePair(pszPrefix, IPSecIkePol.pTunnelFilters[i].gFilterID, &IPSecIkePol.pTunnelFilters[i].pszFilterName);
|
|
}
|
|
}
|
|
|
|
if (memcmp(&IPSecIkePol.IkePol, &TmpPol.IkePol, sizeof(TmpPol.IkePol)) != 0)
|
|
{
|
|
// IkePol is not 0's
|
|
GenerateGuidNamePair(pszPrefix, IPSecIkePol.IkePol.gPolicyID, &IPSecIkePol.IkePol.pszPolicyName);
|
|
}
|
|
|
|
if (memcmp(&IPSecIkePol.IpsPol, &TmpPol.IpsPol, sizeof(TmpPol.IpsPol)) != 0)
|
|
{
|
|
// IkePol is not 0's
|
|
GenerateGuidNamePair(pszPrefix, IPSecIkePol.IpsPol.gPolicyID, &IPSecIkePol.IpsPol.pszPolicyName);
|
|
}
|
|
|
|
// go for auth methods
|
|
if (memcmp(&IPSecIkePol.AuthInfos, &TmpPol.AuthInfos, sizeof(TmpPol.AuthInfos)) != 0)
|
|
{
|
|
RpcStat = UuidCreate(&IPSecIkePol.AuthInfos.gMMAuthID);
|
|
assert(RpcStat == RPC_S_OK || RpcStat == RPC_S_UUID_LOCAL_ONLY);
|
|
}
|
|
|
|
/* now fixup guid links */
|
|
/* mainmode filters */
|
|
for (i = 0; i < (int) IPSecIkePol.dwNumMMFilters; i++)
|
|
{
|
|
if (UuidIsNil(&IPSecIkePol.pMMFilters[i].gPolicyID, &RpcStat))
|
|
{
|
|
IPSecIkePol.pMMFilters[i].gPolicyID = IPSecIkePol.IkePol.gPolicyID;
|
|
}
|
|
if (UuidIsNil(&IPSecIkePol.pMMFilters[i].gMMAuthID, &RpcStat))
|
|
{
|
|
IPSecIkePol.pMMFilters[i].gMMAuthID = IPSecIkePol.AuthInfos.gMMAuthID;
|
|
}
|
|
assert(RpcStat == RPC_S_OK || RpcStat == RPC_S_UUID_LOCAL_ONLY);
|
|
}
|
|
/* quickmode filters */
|
|
for (i = 0; i < (int) IPSecIkePol.dwNumFilters; i++)
|
|
{
|
|
if (IPSecIkePol.QMFilterType == QM_TRANSPORT_FILTER)
|
|
{
|
|
if (UuidIsNil(&IPSecIkePol.pTransportFilters[i].gPolicyID, &RpcStat))
|
|
{
|
|
IPSecIkePol.pTransportFilters[i].gPolicyID = IPSecIkePol.IpsPol.gPolicyID;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// tunnel
|
|
if (UuidIsNil(&IPSecIkePol.pTunnelFilters[i].gPolicyID, &RpcStat))
|
|
{
|
|
IPSecIkePol.pTunnelFilters[i].gPolicyID = IPSecIkePol.IpsPol.gPolicyID;
|
|
}
|
|
}
|
|
assert(RpcStat == RPC_S_OK || RpcStat == RPC_S_UUID_LOCAL_ONLY);
|
|
}
|
|
|
|
} /* GenerateGuidsNames */
|
|
|
|
/*********************************************************************
|
|
FUNCTION: DeleteGuidsNames
|
|
PURPOSE: Deletes all GUIDs and names from IPSEC_IKE_POLICY (used for cleanup)
|
|
PARAMS:
|
|
IPSecIkePol - reference to IPSEC_IKE_POLICY structure
|
|
RETURNS: none
|
|
COMMENTS:
|
|
*********************************************************************/
|
|
void DeleteGuidsNames (IN OUT IPSEC_IKE_POLICY& IPSecIkePol)
|
|
{
|
|
int i;
|
|
|
|
// walk through all the substructures and call GenerateGuidNamePair
|
|
for (i = 0; i < (int) IPSecIkePol.dwNumMMFilters; i++)
|
|
{
|
|
UuidCreateNil(&IPSecIkePol.pMMFilters[i].gFilterID);
|
|
UuidCreateNil(&IPSecIkePol.pMMFilters[i].gPolicyID);
|
|
UuidCreateNil(&IPSecIkePol.pMMFilters[i].gMMAuthID);
|
|
if (IPSecIkePol.pMMFilters[i].pszFilterName != 0)
|
|
{
|
|
delete[] IPSecIkePol.pMMFilters[i].pszFilterName;
|
|
IPSecIkePol.pMMFilters[i].pszFilterName = 0;
|
|
}
|
|
}
|
|
|
|
for (i = 0; i < (int) IPSecIkePol.dwNumFilters; i++)
|
|
{
|
|
if (IPSecIkePol.QMFilterType == QM_TRANSPORT_FILTER)
|
|
{
|
|
UuidCreateNil(&IPSecIkePol.pTransportFilters[i].gFilterID);
|
|
UuidCreateNil(&IPSecIkePol.pTransportFilters[i].gPolicyID);
|
|
if (IPSecIkePol.pTransportFilters[i].pszFilterName != 0)
|
|
{
|
|
delete[] IPSecIkePol.pTransportFilters[i].pszFilterName;
|
|
IPSecIkePol.pTransportFilters[i].pszFilterName = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// tunnel
|
|
UuidCreateNil(&IPSecIkePol.pTunnelFilters[i].gFilterID);
|
|
UuidCreateNil(&IPSecIkePol.pTunnelFilters[i].gPolicyID);
|
|
if (IPSecIkePol.pTunnelFilters[i].pszFilterName != 0)
|
|
{
|
|
delete[] IPSecIkePol.pTunnelFilters[i].pszFilterName;
|
|
IPSecIkePol.pTunnelFilters[i].pszFilterName = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
UuidCreateNil(&IPSecIkePol.IkePol.gPolicyID);
|
|
if (IPSecIkePol.IkePol.pszPolicyName != 0)
|
|
{
|
|
delete[] IPSecIkePol.IkePol.pszPolicyName;
|
|
IPSecIkePol.IkePol.pszPolicyName = 0;
|
|
}
|
|
|
|
UuidCreateNil(&IPSecIkePol.IpsPol.gPolicyID);
|
|
if (IPSecIkePol.IpsPol.pszPolicyName != 0)
|
|
{
|
|
delete[] IPSecIkePol.IpsPol.pszPolicyName;
|
|
IPSecIkePol.IpsPol.pszPolicyName = 0;
|
|
}
|
|
|
|
UuidCreateNil(&IPSecIkePol.AuthInfos.gMMAuthID);
|
|
} /* DeleteGuidsNames */
|
|
|