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