windows-nt/Source/XPSP1/NT/net/ipsec/polstore/refer-r.c
2020-09-26 16:20:57 +08:00

1161 lines
25 KiB
C

//----------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 2000.
//
// File: refer-r.c
//
// Contents: Reference management for registry.
//
//
// History: KrishnaG.
// AbhisheV.
//
//----------------------------------------------------------------------------
#include "precomp.h"
//
// Policy Object References
//
DWORD
RegAddNFAReferenceToPolicyObject(
HKEY hRegistryKey,
LPWSTR pszIpsecPolicyName,
LPWSTR pszIpsecNFADistinguishedName
)
{
DWORD dwError = ERROR_SUCCESS;
HKEY hKey = NULL;
LPBYTE pValueData = NULL;
LPBYTE pNewValueData = NULL;
DWORD dwSize = 0;
DWORD dwNewSize = 0;
dwError = RegOpenKeyExW(
hRegistryKey,
pszIpsecPolicyName,
0,
KEY_ALL_ACCESS,
&hKey
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegstoreQueryValue(
hKey,
L"ipsecNFAReference",
REG_MULTI_SZ,
&pValueData,
&dwSize
);
// BAIL_ON_WIN32_ERROR(dwError);
dwError = AddValueToMultiSz(
pValueData,
dwSize,
pszIpsecNFADistinguishedName,
&pNewValueData,
&dwNewSize
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegSetValueExW(
hKey,
L"ipsecNFAReference",
0,
REG_MULTI_SZ,
(LPBYTE)pNewValueData,
dwNewSize
);
BAIL_ON_WIN32_ERROR(dwError);
error:
if (hKey) {
RegCloseKey(hKey);
}
if (pValueData) {
FreePolMem(pValueData);
}
if (pNewValueData) {
FreePolMem(pNewValueData);
}
return(dwError);
}
DWORD
RegRemoveNFAReferenceFromPolicyObject(
HKEY hRegistryKey,
LPWSTR pszIpsecPolicyName,
LPWSTR pszIpsecNFAName
)
{
DWORD dwError = ERROR_SUCCESS;
HKEY hKey = NULL;
LPBYTE pValueData = NULL;
LPBYTE pNewValueData = NULL;
DWORD dwSize = 0;
DWORD dwNewSize = 0;
dwError = RegOpenKeyExW(
hRegistryKey,
pszIpsecPolicyName,
0,
KEY_ALL_ACCESS,
&hKey
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegstoreQueryValue(
hKey,
L"ipsecNFAReference",
REG_MULTI_SZ,
&pValueData,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = DeleteValueFromMultiSz(
pValueData,
dwSize,
pszIpsecNFAName,
&pNewValueData,
&dwNewSize
);
BAIL_ON_WIN32_ERROR(dwError);
if (pNewValueData && *pNewValueData) {
dwError = RegSetValueExW(
hKey,
L"ipsecNFAReference",
0,
REG_MULTI_SZ,
(LPBYTE)pNewValueData,
dwNewSize
);
BAIL_ON_WIN32_ERROR(dwError);
}
else {
dwError = RegDeleteValueW(
hKey,
L"ipsecNFAReference"
);
BAIL_ON_WIN32_ERROR(dwError);
}
error:
if (hKey) {
RegCloseKey(hKey);
}
if (pValueData) {
FreePolMem(pValueData);
}
if (pNewValueData) {
FreePolMem(pNewValueData);
}
return(dwError);
}
//
// NFA Object References
//
DWORD
RegAddPolicyReferenceToNFAObject(
HKEY hRegistryKey,
LPWSTR pszIpsecNFAName,
LPWSTR pszIpsecPolicyName
)
{
DWORD dwError = ERROR_SUCCESS;
HKEY hKey = NULL;
LPBYTE pValueData = NULL;
LPBYTE pNewValueData = NULL;
DWORD dwSize = 0;
DWORD dwNewSize = 0;
dwError = RegOpenKeyExW(
hRegistryKey,
pszIpsecNFAName,
0,
KEY_ALL_ACCESS,
&hKey
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegstoreQueryValue(
hKey,
L"ipsecOwnersReference",
REG_MULTI_SZ,
&pValueData,
&dwSize
);
// BAIL_ON_WIN32_ERROR(dwError);
dwError = AddValueToMultiSz(
pValueData,
dwSize,
pszIpsecPolicyName,
&pNewValueData,
&dwNewSize
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegSetValueExW(
hKey,
L"ipsecOwnersReference",
0,
REG_MULTI_SZ,
(LPBYTE)pNewValueData,
dwNewSize
);
BAIL_ON_WIN32_ERROR(dwError);
error:
if (hKey) {
RegCloseKey(hKey);
}
if (pValueData) {
FreePolMem(pValueData);
}
if (pNewValueData) {
FreePolMem(pNewValueData);
}
return(dwError);
}
DWORD
RegAddNegPolReferenceToNFAObject(
HKEY hRegistryKey,
LPWSTR pszIpsecNFAName,
LPWSTR pszIpsecNegPolName
)
{
DWORD dwError = ERROR_SUCCESS;
HKEY hKey = NULL;
dwError = RegOpenKeyExW(
hRegistryKey,
pszIpsecNFAName,
0,
KEY_ALL_ACCESS,
&hKey
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegSetValueExW(
hKey,
L"ipsecNegotiationPolicyReference",
0,
REG_SZ,
(LPBYTE)pszIpsecNegPolName,
(wcslen(pszIpsecNegPolName) + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
error:
if (hKey) {
RegCloseKey(hKey);
}
return(dwError);
}
DWORD
RegUpdateNegPolReferenceInNFAObject(
HKEY hRegistryKey,
LPWSTR pszIpsecNFAName,
LPWSTR pszOldIpsecNegPolName,
LPWSTR pszNewIpsecNegPolName
)
{
DWORD dwError = ERROR_SUCCESS;
HKEY hKey = NULL;
dwError = RegOpenKeyExW(
hRegistryKey,
pszIpsecNFAName,
0,
KEY_ALL_ACCESS,
&hKey
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegSetValueExW(
hKey,
L"ipsecNegotiationPolicyReference",
0,
REG_SZ,
(LPBYTE)pszNewIpsecNegPolName,
(wcslen(pszNewIpsecNegPolName) + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
error:
if (hKey) {
RegCloseKey(hKey);
}
return(dwError);
}
DWORD
RegAddFilterReferenceToNFAObject(
HKEY hRegistryKey,
LPWSTR pszIpsecNFAName,
LPWSTR pszIpsecFilterName
)
{
DWORD dwError = ERROR_SUCCESS;
HKEY hKey = NULL;
LPBYTE pMem = NULL;
pMem = AllocPolMem(
(wcslen(pszIpsecFilterName) + 1 + 1)*sizeof(WCHAR)
);
if (!pMem) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
memcpy(
pMem,
(LPBYTE) pszIpsecFilterName,
(wcslen(pszIpsecFilterName) + 1)*sizeof(WCHAR)
);
dwError = RegOpenKeyExW(
hRegistryKey,
pszIpsecNFAName,
0,
KEY_ALL_ACCESS,
&hKey
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegSetValueExW(
hKey,
L"ipsecFilterReference",
0,
REG_MULTI_SZ,
pMem,
(wcslen(pszIpsecFilterName) + 1 + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
error:
if (pMem) {
FreePolMem(pMem);
}
if (hKey) {
RegCloseKey(hKey);
}
return(dwError);
}
DWORD
RegUpdateFilterReferenceInNFAObject(
HKEY hRegistryKey,
LPWSTR pszIpsecNFAName,
LPWSTR pszOldIpsecFilterName,
LPWSTR pszNewIpsecFilterName
)
{
DWORD dwError = ERROR_SUCCESS;
HKEY hKey = NULL;
LPBYTE pMem = NULL;
pMem = AllocPolMem(
(wcslen(pszNewIpsecFilterName) + 1 + 1)*sizeof(WCHAR)
);
if (!pMem) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
memcpy(
pMem,
(LPBYTE) pszNewIpsecFilterName,
(wcslen(pszNewIpsecFilterName) + 1)*sizeof(WCHAR)
);
dwError = RegOpenKeyExW(
hRegistryKey,
pszIpsecNFAName,
0,
KEY_ALL_ACCESS,
&hKey
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegSetValueExW(
hKey,
L"ipsecFilterReference",
0,
REG_MULTI_SZ,
pMem,
(wcslen(pszNewIpsecFilterName) + 1 + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
error:
if (pMem) {
FreePolMem(pMem);
}
if (hKey) {
RegCloseKey(hKey);
}
return(dwError);
}
//
// Filter Object References
//
DWORD
RegAddNFAReferenceToFilterObject(
HKEY hRegistryKey,
LPWSTR pszIpsecFilterName,
LPWSTR pszIpsecNFAName
)
{
DWORD dwError = ERROR_SUCCESS;
HKEY hKey = NULL;
LPBYTE pValueData = NULL;
LPBYTE pNewValueData = NULL;
DWORD dwSize = 0;
DWORD dwNewSize = 0;
dwError = RegOpenKeyExW(
hRegistryKey,
pszIpsecFilterName,
0,
KEY_ALL_ACCESS,
&hKey
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegstoreQueryValue(
hKey,
L"ipsecOwnersReference",
REG_MULTI_SZ,
&pValueData,
&dwSize
);
// BAIL_ON_WIN32_ERROR(dwError);
dwError = AddValueToMultiSz(
pValueData,
dwSize,
pszIpsecNFAName,
&pNewValueData,
&dwNewSize
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegSetValueExW(
hKey,
L"ipsecOwnersReference",
0,
REG_MULTI_SZ,
(LPBYTE)pNewValueData,
dwNewSize
);
BAIL_ON_WIN32_ERROR(dwError);
error:
if (hKey) {
RegCloseKey(hKey);
}
if (pValueData) {
FreePolMem(pValueData);
}
if (pNewValueData) {
FreePolMem(pNewValueData);
}
return(dwError);
}
DWORD
RegDeleteNFAReferenceInFilterObject(
HKEY hRegistryKey,
LPWSTR pszIpsecFilterName,
LPWSTR pszIpsecNFAName
)
{
DWORD dwError = ERROR_SUCCESS;
HKEY hKey = NULL;
LPBYTE pValueData = NULL;
LPBYTE pNewValueData = NULL;
DWORD dwSize = 0;
DWORD dwNewSize = 0;
dwError = RegOpenKeyExW(
hRegistryKey,
pszIpsecFilterName,
0,
KEY_ALL_ACCESS,
&hKey
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegstoreQueryValue(
hKey,
L"ipsecOwnersReference",
REG_MULTI_SZ,
&pValueData,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = DeleteValueFromMultiSz(
pValueData,
dwSize,
pszIpsecNFAName,
&pNewValueData,
&dwNewSize
);
BAIL_ON_WIN32_ERROR(dwError);
if (pNewValueData && *pNewValueData) {
dwError = RegSetValueExW(
hKey,
L"ipsecOwnersReference",
0,
REG_MULTI_SZ,
(LPBYTE)pNewValueData,
dwNewSize
);
BAIL_ON_WIN32_ERROR(dwError);
}
else {
dwError = RegDeleteValueW(
hKey,
L"ipsecOwnersReference"
);
BAIL_ON_WIN32_ERROR(dwError);
}
error:
if (hKey) {
RegCloseKey(hKey);
}
if (pValueData) {
FreePolMem(pValueData);
}
if (pNewValueData) {
FreePolMem(pNewValueData);
}
return(dwError);
}
//
// NegPol Object References
//
DWORD
RegAddNFAReferenceToNegPolObject(
HKEY hRegistryKey,
LPWSTR pszIpsecNegPolName,
LPWSTR pszIpsecNFAName
)
{
DWORD dwError = ERROR_SUCCESS;
HKEY hKey = NULL;
LPBYTE pValueData = NULL;
LPBYTE pNewValueData = NULL;
DWORD dwSize = 0;
DWORD dwNewSize = 0;
dwError = RegOpenKeyExW(
hRegistryKey,
pszIpsecNegPolName,
0,
KEY_ALL_ACCESS,
&hKey
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegstoreQueryValue(
hKey,
L"ipsecOwnersReference",
REG_MULTI_SZ,
&pValueData,
&dwSize
);
// BAIL_ON_WIN32_ERROR(dwError);
dwError = AddValueToMultiSz(
pValueData,
dwSize,
pszIpsecNFAName,
&pNewValueData,
&dwNewSize
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegSetValueExW(
hKey,
L"ipsecOwnersReference",
0,
REG_MULTI_SZ,
(LPBYTE)pNewValueData,
dwNewSize
);
BAIL_ON_WIN32_ERROR(dwError);
error:
if (hKey) {
RegCloseKey(hKey);
}
if (pValueData) {
FreePolMem(pValueData);
}
if (pNewValueData) {
FreePolMem(pNewValueData);
}
return(dwError);
}
DWORD
RegDeleteNFAReferenceInNegPolObject(
HKEY hRegistryKey,
LPWSTR pszIpsecNegPolName,
LPWSTR pszIpsecNFAName
)
{
DWORD dwError = ERROR_SUCCESS;
HKEY hKey = NULL;
LPBYTE pValueData = NULL;
LPBYTE pNewValueData = NULL;
DWORD dwSize = 0;
DWORD dwNewSize = 0;
dwError = RegOpenKeyExW(
hRegistryKey,
pszIpsecNegPolName,
0,
KEY_ALL_ACCESS,
&hKey
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegstoreQueryValue(
hKey,
L"ipsecOwnersReference",
REG_MULTI_SZ,
&pValueData,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = DeleteValueFromMultiSz(
pValueData,
dwSize,
pszIpsecNFAName,
&pNewValueData,
&dwNewSize
);
BAIL_ON_WIN32_ERROR(dwError);
if (pNewValueData && *pNewValueData) {
dwError = RegSetValueExW(
hKey,
L"ipsecOwnersReference",
0,
REG_MULTI_SZ,
(LPBYTE)pNewValueData,
dwNewSize
);
BAIL_ON_WIN32_ERROR(dwError);
}
else {
dwError = RegDeleteValueW(
hKey,
L"ipsecOwnersReference"
);
BAIL_ON_WIN32_ERROR(dwError);
}
error:
if (hKey) {
RegCloseKey(hKey);
}
if (pValueData) {
FreePolMem(pValueData);
}
if (pNewValueData) {
FreePolMem(pNewValueData);
}
return(dwError);
}
DWORD
AddValueToMultiSz(
LPBYTE pValueData,
DWORD dwSize,
LPWSTR pszValuetoAdd,
LPBYTE * ppNewValueData,
DWORD * pdwNewSize
)
{
DWORD dwError = ERROR_SUCCESS;
LPBYTE pNewValueData = NULL;
LPBYTE pNewPtr = NULL;
DWORD dwLen = 0;
DWORD dwAddSize = 0;
DWORD dwNewSize = 0;
BOOL bFound = FALSE;
LPWSTR pszTemp = NULL;
*ppNewValueData = NULL;
*pdwNewSize = 0;
dwLen = wcslen(pszValuetoAdd);
dwLen ++;
dwAddSize = dwLen*sizeof(WCHAR);
if (pValueData) {
pszTemp = (LPWSTR) pValueData;
while (*pszTemp != L'\0') {
if (!_wcsicmp(pszTemp, pszValuetoAdd)) {
bFound = TRUE;
break;
}
pszTemp += wcslen(pszTemp) + 1;
}
if (bFound) {
dwNewSize = dwSize;
}
else {
dwNewSize = dwSize + dwAddSize;
}
}
else {
dwNewSize = dwAddSize + sizeof(WCHAR);
}
pNewValueData = (LPBYTE)AllocPolMem(dwNewSize);
if (!pNewValueData) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
if (!bFound) {
wcscpy((LPWSTR)pNewValueData, pszValuetoAdd);
pNewPtr = pNewValueData + dwAddSize;
}
else {
pNewPtr = pNewValueData;
}
if (pValueData) {
memcpy(pNewPtr, pValueData, dwSize);
}
*ppNewValueData = pNewValueData;
*pdwNewSize = dwNewSize;
error:
return(dwError);
}
DWORD
DeleteValueFromMultiSz(
LPBYTE pValueData,
DWORD dwSize,
LPWSTR pszValuetoDel,
LPBYTE * ppNewValueData,
DWORD * pdwNewSize
)
{
DWORD dwError = ERROR_SUCCESS;
LPBYTE pNewValueData = NULL;
LPBYTE pNew = NULL;
DWORD dwLen = 0;
DWORD dwDelSize = 0;
DWORD dwNewSize = 0;
BOOL bFound = FALSE;
LPWSTR pszTemp = NULL;
*ppNewValueData = NULL;
*pdwNewSize = 0;
if (!pValueData || !dwSize) {
return (ERROR_INVALID_PARAMETER);
}
pszTemp = (LPWSTR) pValueData;
while (*pszTemp != L'\0') {
if (!_wcsicmp(pszTemp, pszValuetoDel)) {
bFound = TRUE;
break;
}
pszTemp += wcslen(pszTemp) + 1;
}
if (!bFound) {
return (ERROR_INVALID_PARAMETER);
}
dwLen = wcslen(pszValuetoDel);
dwLen ++;
dwDelSize = dwLen*sizeof(WCHAR);
if (dwSize == dwDelSize) {
return (ERROR_SUCCESS);
}
dwNewSize = dwSize - dwDelSize;
pNewValueData = (LPBYTE)AllocPolMem(dwNewSize);
if (!pNewValueData) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
pszTemp = (LPWSTR) pValueData;
pNew = pNewValueData;
while (*pszTemp != L'\0') {
if (!_wcsicmp(pszTemp, pszValuetoDel)) {
pszTemp += wcslen(pszTemp) + 1;
}
else {
memcpy(pNew, (LPBYTE) pszTemp, (wcslen(pszTemp)+1)*sizeof(WCHAR));
pNew += (wcslen(pszTemp)+1)*sizeof(WCHAR);
pszTemp += wcslen(pszTemp) + 1;
}
}
*ppNewValueData = pNewValueData;
*pdwNewSize = dwNewSize;
error:
return(dwError);
}
DWORD
RegDelFilterRefValueOfNFAObject(
HKEY hRegistryKey,
LPWSTR pszIpsecNFAName
)
{
DWORD dwError = ERROR_SUCCESS;
HKEY hKey = NULL;
dwError = RegOpenKeyExW(
hRegistryKey,
pszIpsecNFAName,
0,
KEY_ALL_ACCESS,
&hKey
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegDeleteValueW(
hKey,
L"ipsecFilterReference"
);
BAIL_ON_WIN32_ERROR(dwError);
error:
if (hKey) {
RegCloseKey(hKey);
}
return(dwError);
}
//
// ISAKMP Object References.
//
DWORD
RegAddPolicyReferenceToISAKMPObject(
HKEY hRegistryKey,
LPWSTR pszIpsecISAKMPName,
LPWSTR pszIpsecPolicyDistinguishedName
)
{
DWORD dwError = ERROR_SUCCESS;
HKEY hKey = NULL;
LPBYTE pValueData = NULL;
LPBYTE pNewValueData = NULL;
DWORD dwSize = 0;
DWORD dwNewSize = 0;
dwError = RegOpenKeyExW(
hRegistryKey,
pszIpsecISAKMPName,
0,
KEY_ALL_ACCESS,
&hKey
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegstoreQueryValue(
hKey,
L"ipsecOwnersReference",
REG_MULTI_SZ,
&pValueData,
&dwSize
);
// BAIL_ON_WIN32_ERROR(dwError);
dwError = AddValueToMultiSz(
pValueData,
dwSize,
pszIpsecPolicyDistinguishedName,
&pNewValueData,
&dwNewSize
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegSetValueExW(
hKey,
L"ipsecOwnersReference",
0,
REG_MULTI_SZ,
(LPBYTE)pNewValueData,
dwNewSize
);
BAIL_ON_WIN32_ERROR(dwError);
error:
if (hKey) {
RegCloseKey(hKey);
}
if (pValueData) {
FreePolMem(pValueData);
}
if (pNewValueData) {
FreePolMem(pNewValueData);
}
return(dwError);
}
DWORD
RegRemovePolicyReferenceFromISAKMPObject(
HKEY hRegistryKey,
LPWSTR pszIpsecISAKMPName,
LPWSTR pszIpsecPolicyName
)
{
DWORD dwError = ERROR_SUCCESS;
HKEY hKey = NULL;
LPBYTE pValueData = NULL;
LPBYTE pNewValueData = NULL;
DWORD dwSize = 0;
DWORD dwNewSize = 0;
dwError = RegOpenKeyExW(
hRegistryKey,
pszIpsecISAKMPName,
0,
KEY_ALL_ACCESS,
&hKey
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegstoreQueryValue(
hKey,
L"ipsecOwnersReference",
REG_MULTI_SZ,
&pValueData,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = DeleteValueFromMultiSz(
pValueData,
dwSize,
pszIpsecPolicyName,
&pNewValueData,
&dwNewSize
);
BAIL_ON_WIN32_ERROR(dwError);
if (pNewValueData && *pNewValueData) {
dwError = RegSetValueExW(
hKey,
L"ipsecOwnersReference",
0,
REG_MULTI_SZ,
(LPBYTE)pNewValueData,
dwNewSize
);
BAIL_ON_WIN32_ERROR(dwError);
}
else {
dwError = RegDeleteValueW(
hKey,
L"ipsecOwnersReference"
);
BAIL_ON_WIN32_ERROR(dwError);
}
error:
if (hKey) {
RegCloseKey(hKey);
}
if (pValueData) {
FreePolMem(pValueData);
}
if (pNewValueData) {
FreePolMem(pNewValueData);
}
return(dwError);
}
//
// Policy Object Reference to the ISAKMP object.
//
DWORD
RegAddISAKMPReferenceToPolicyObject(
HKEY hRegistryKey,
LPWSTR pszIpsecPolicyName,
LPWSTR pszIpsecISAKMPName
)
{
DWORD dwError = ERROR_SUCCESS;
HKEY hKey = NULL;
dwError = RegOpenKeyExW(
hRegistryKey,
pszIpsecPolicyName,
0,
KEY_ALL_ACCESS,
&hKey
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegSetValueExW(
hKey,
L"ipsecISAKMPReference",
0,
REG_SZ,
(LPBYTE)pszIpsecISAKMPName,
(wcslen(pszIpsecISAKMPName) + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
error:
if (hKey) {
RegCloseKey(hKey);
}
return(dwError);
}
DWORD
RegUpdateISAKMPReferenceInPolicyObject(
HKEY hRegistryKey,
LPWSTR pszIpsecPolicyName,
LPWSTR pszOldIpsecISAKMPName,
LPWSTR pszNewIpsecISAKMPName
)
{
DWORD dwError = ERROR_SUCCESS;
HKEY hKey = NULL;
dwError = RegOpenKeyExW(
hRegistryKey,
pszIpsecPolicyName,
0,
KEY_ALL_ACCESS,
&hKey
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegSetValueExW(
hKey,
L"ipsecISAKMPReference",
0,
REG_SZ,
(LPBYTE)pszNewIpsecISAKMPName,
(wcslen(pszNewIpsecISAKMPName) + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
error:
if (hKey) {
RegCloseKey(hKey);
}
return(dwError);
}