1161 lines
25 KiB
C
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);
|
|
}
|
|
|