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

2592 lines
66 KiB
C

#include "precomp.h"
LPWSTR gpszIpsecCacheKey = L"SOFTWARE\\Policies\\Microsoft\\Windows\\IPSec\\Policy\\Cache";
DWORD
CacheDirectorytoRegistry(
PIPSEC_POLICY_OBJECT pIpsecPolicyObject
)
{
DWORD dwError = 0;
PIPSEC_POLICY_OBJECT pIpsecRegPolicyObject = NULL;
//
// Delete the existing cache.
//
DeleteRegistryCache();
//
// Create a copy of the directory policy in registry terms
//
dwError = CloneDirectoryPolicyObject(
pIpsecPolicyObject,
&pIpsecRegPolicyObject
);
BAIL_ON_WIN32_ERROR(dwError);
//
// Write the registry policy
//
dwError = PersistRegistryObject(
pIpsecRegPolicyObject
);
BAIL_ON_WIN32_ERROR(dwError);
cleanup:
if (pIpsecRegPolicyObject) {
FreeIpsecPolicyObject(
pIpsecRegPolicyObject
);
}
return(dwError);
error:
DeleteRegistryCache();
goto cleanup;
}
DWORD
PersistRegistryObject(
PIPSEC_POLICY_OBJECT pIpsecRegPolicyObject
)
{
DWORD dwError = 0;
HKEY hRegistryKey = NULL;
DWORD dwDisposition = 0;
dwError = RegCreateKeyExW(
HKEY_LOCAL_MACHINE,
gpszIpsecCacheKey,
0,
NULL,
0,
KEY_ALL_ACCESS,
NULL,
&hRegistryKey,
&dwDisposition
);
BAIL_ON_WIN32_ERROR(dwError);
if (pIpsecRegPolicyObject->ppIpsecFilterObjects) {
dwError = PersistFilterObjects(
hRegistryKey,
pIpsecRegPolicyObject->ppIpsecFilterObjects,
pIpsecRegPolicyObject->NumberofFilters
);
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecRegPolicyObject->ppIpsecNegPolObjects) {
dwError = PersistNegPolObjects(
hRegistryKey,
pIpsecRegPolicyObject->ppIpsecNegPolObjects,
pIpsecRegPolicyObject->NumberofNegPols
);
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecRegPolicyObject->ppIpsecNFAObjects) {
dwError = PersistNFAObjects(
hRegistryKey,
pIpsecRegPolicyObject->ppIpsecNFAObjects,
pIpsecRegPolicyObject->NumberofRulesReturned
);
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecRegPolicyObject->ppIpsecISAKMPObjects) {
dwError = PersistISAKMPObjects(
hRegistryKey,
pIpsecRegPolicyObject->ppIpsecISAKMPObjects,
pIpsecRegPolicyObject->NumberofISAKMPs
);
BAIL_ON_WIN32_ERROR(dwError);
}
dwError = PersistPolicyObject(
hRegistryKey,
pIpsecRegPolicyObject
);
error:
if (hRegistryKey) {
RegCloseKey(hRegistryKey);
}
return(dwError);
}
DWORD
PersistNegPolObjects(
HKEY hRegistryKey,
PIPSEC_NEGPOL_OBJECT *ppIpsecNegPolObjects,
DWORD dwNumNegPolObjects
)
{
DWORD i = 0;
DWORD dwError = 0;
for (i = 0; i < dwNumNegPolObjects; i++) {
dwError = PersistNegPolObject(
hRegistryKey,
*(ppIpsecNegPolObjects + i)
);
BAIL_ON_WIN32_ERROR(dwError);
}
error:
return(dwError);
}
DWORD
PersistFilterObjects(
HKEY hRegistryKey,
PIPSEC_FILTER_OBJECT * ppIpsecFilterObjects,
DWORD dwNumFilterObjects
)
{
DWORD i = 0;
DWORD dwError = 0;
for (i = 0; i < dwNumFilterObjects; i++) {
dwError = PersistFilterObject(
hRegistryKey,
*(ppIpsecFilterObjects + i)
);
BAIL_ON_WIN32_ERROR(dwError);
}
error:
return(dwError);
}
DWORD
PersistNFAObjects(
HKEY hRegistryKey,
PIPSEC_NFA_OBJECT * ppIpsecNFAObjects,
DWORD dwNumNFAObjects
)
{
DWORD i = 0;
DWORD dwError = 0;
for (i = 0; i < dwNumNFAObjects; i++) {
dwError = PersistNFAObject(
hRegistryKey,
*(ppIpsecNFAObjects + i)
);
BAIL_ON_WIN32_ERROR(dwError);
}
error:
return(dwError);
}
DWORD
PersistISAKMPObjects(
HKEY hRegistryKey,
PIPSEC_ISAKMP_OBJECT * ppIpsecISAKMPObjects,
DWORD dwNumISAKMPObjects
)
{
DWORD i = 0;
DWORD dwError = 0;
for (i = 0; i < dwNumISAKMPObjects; i++) {
dwError = PersistISAKMPObject(
hRegistryKey,
*(ppIpsecISAKMPObjects + i)
);
BAIL_ON_WIN32_ERROR(dwError);
}
error:
return(dwError);
}
DWORD
PersistPolicyObject(
HKEY hRegistryKey,
PIPSEC_POLICY_OBJECT pIpsecPolicyObject
)
{
DWORD dwError = 0;
HKEY hRegKey = NULL;
DWORD dwDisposition = 0;
dwError = RegCreateKeyExW(
hRegistryKey,
pIpsecPolicyObject->pszIpsecOwnersReference,
0,
NULL,
0,
KEY_ALL_ACCESS,
NULL,
&hRegKey,
&dwDisposition
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegSetValueExW(
hRegKey,
L"ClassName",
0,
REG_SZ,
(LPBYTE) L"ipsecPolicy",
(wcslen(L"ipsecPolicy") + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
if (pIpsecPolicyObject->pszDescription) {
dwError = RegSetValueExW(
hRegKey,
L"description",
0,
REG_SZ,
(LPBYTE)pIpsecPolicyObject->pszDescription,
(wcslen(pIpsecPolicyObject->pszDescription) + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
}
else {
(VOID) RegDeleteValueW(
hRegKey,
L"description"
);
}
if (pIpsecPolicyObject->pszIpsecOwnersReference) {
dwError = RegSetValueExW(
hRegKey,
L"name",
0,
REG_SZ,
(LPBYTE)pIpsecPolicyObject->pszIpsecOwnersReference,
(wcslen(pIpsecPolicyObject->pszIpsecOwnersReference) + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecPolicyObject->pszIpsecName) {
dwError = RegSetValueExW(
hRegKey,
L"ipsecName",
0,
REG_SZ,
(LPBYTE)pIpsecPolicyObject->pszIpsecName,
(wcslen(pIpsecPolicyObject->pszIpsecName) + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecPolicyObject->pszIpsecID) {
dwError = RegSetValueExW(
hRegKey,
L"ipsecID",
0,
REG_SZ,
(LPBYTE)pIpsecPolicyObject->pszIpsecID,
(wcslen(pIpsecPolicyObject->pszIpsecID) + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
}
dwError = RegSetValueExW(
hRegKey,
L"ipsecDataType",
0,
REG_DWORD,
(LPBYTE)&pIpsecPolicyObject->dwIpsecDataType,
sizeof(DWORD)
);
BAIL_ON_WIN32_ERROR(dwError);
if (pIpsecPolicyObject->pIpsecData) {
dwError = RegSetValueExW(
hRegKey,
L"ipsecData",
0,
REG_BINARY,
pIpsecPolicyObject->pIpsecData,
pIpsecPolicyObject->dwIpsecDataLen
);
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecPolicyObject->pszIpsecISAKMPReference) {
dwError = RegSetValueExW(
hRegKey,
L"ipsecISAKMPReference",
0,
REG_SZ,
(LPBYTE)pIpsecPolicyObject->pszIpsecISAKMPReference,
(wcslen(pIpsecPolicyObject->pszIpsecISAKMPReference) + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecPolicyObject->ppszIpsecNFAReferences) {
dwError = RegWriteMultiValuedString(
hRegKey,
L"ipsecNFAReference",
pIpsecPolicyObject->ppszIpsecNFAReferences,
pIpsecPolicyObject->NumberofRules
);
BAIL_ON_WIN32_ERROR(dwError);
}
dwError = RegSetValueExW(
hRegKey,
L"whenChanged",
0,
REG_DWORD,
(LPBYTE)&pIpsecPolicyObject->dwWhenChanged,
sizeof(DWORD)
);
BAIL_ON_WIN32_ERROR(dwError);
error:
if (hRegKey) {
RegCloseKey(hRegKey);
}
return(dwError);
}
DWORD
PersistNFAObject(
HKEY hRegistryKey,
PIPSEC_NFA_OBJECT pIpsecNFAObject
)
{
HKEY hRegKey = NULL;
DWORD dwError = 0;
DWORD dwDisposition = 0;
LPBYTE pMem = NULL;
dwError = RegCreateKeyExW(
hRegistryKey,
pIpsecNFAObject->pszDistinguishedName,
0,
NULL,
0,
KEY_ALL_ACCESS,
NULL,
&hRegKey,
&dwDisposition
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegSetValueExW(
hRegKey,
L"ClassName",
0,
REG_SZ,
(LPBYTE) L"ipsecNFA",
(wcslen(L"ipsecNFA") + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
if (pIpsecNFAObject->pszDistinguishedName) {
dwError = RegSetValueExW(
hRegKey,
L"name",
0,
REG_SZ,
(LPBYTE)pIpsecNFAObject->pszDistinguishedName,
(wcslen(pIpsecNFAObject->pszDistinguishedName) + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecNFAObject->pszIpsecName) {
dwError = RegSetValueExW(
hRegKey,
L"ipsecName",
0,
REG_SZ,
(LPBYTE)pIpsecNFAObject->pszIpsecName,
(wcslen(pIpsecNFAObject->pszIpsecName) + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecNFAObject->pszDescription) {
dwError = RegSetValueExW(
hRegKey,
L"description",
0,
REG_SZ,
(LPBYTE)pIpsecNFAObject->pszDescription,
(wcslen(pIpsecNFAObject->pszDescription) + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
}
else {
(VOID) RegDeleteValueW(
hRegKey,
L"description"
);
}
if (pIpsecNFAObject->pszIpsecID) {
dwError = RegSetValueExW(
hRegKey,
L"ipsecID",
0,
REG_SZ,
(LPBYTE)pIpsecNFAObject->pszIpsecID,
(wcslen(pIpsecNFAObject->pszIpsecID) + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
}
dwError = RegSetValueExW(
hRegKey,
L"ipsecDataType",
0,
REG_DWORD,
(LPBYTE)&pIpsecNFAObject->dwIpsecDataType,
sizeof(DWORD)
);
BAIL_ON_WIN32_ERROR(dwError);
if (pIpsecNFAObject->pIpsecData) {
dwError = RegSetValueExW(
hRegKey,
L"ipsecData",
0,
REG_BINARY,
pIpsecNFAObject->pIpsecData,
pIpsecNFAObject->dwIpsecDataLen
);
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecNFAObject->pszIpsecOwnersReference) {
dwError = RegSetValueExW(
hRegKey,
L"ipsecOwnersReference",
0,
REG_SZ,
(LPBYTE)pIpsecNFAObject->pszIpsecOwnersReference,
(wcslen(pIpsecNFAObject->pszIpsecOwnersReference) + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecNFAObject->pszIpsecNegPolReference) {
dwError = RegSetValueExW(
hRegKey,
L"ipsecNegotiationPolicyReference",
0,
REG_SZ,
(LPBYTE)pIpsecNFAObject->pszIpsecNegPolReference,
(wcslen(pIpsecNFAObject->pszIpsecNegPolReference) + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecNFAObject->pszIpsecFilterReference) {
pMem = AllocPolMem(
(wcslen(pIpsecNFAObject->pszIpsecFilterReference) + 1 + 1)*sizeof(WCHAR)
);
if (!pMem) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
memcpy(
pMem,
(LPBYTE) pIpsecNFAObject->pszIpsecFilterReference,
(wcslen(pIpsecNFAObject->pszIpsecFilterReference) + 1)*sizeof(WCHAR)
);
dwError = RegSetValueExW(
hRegKey,
L"ipsecFilterReference",
0,
REG_MULTI_SZ,
pMem,
(wcslen(pIpsecNFAObject->pszIpsecFilterReference) + 1 + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
if (pMem) {
FreePolMem(pMem);
}
}
dwError = RegSetValueExW(
hRegKey,
L"whenChanged",
0,
REG_DWORD,
(LPBYTE)&pIpsecNFAObject->dwWhenChanged,
sizeof(DWORD)
);
BAIL_ON_WIN32_ERROR(dwError);
error:
if (hRegKey) {
RegCloseKey(hRegKey);
}
return(dwError);
}
DWORD
PersistFilterObject(
HKEY hRegistryKey,
PIPSEC_FILTER_OBJECT pIpsecFilterObject
)
{
HKEY hRegKey = NULL;
DWORD dwError = 0;
DWORD dwDisposition = 0;
dwError = RegCreateKeyExW(
hRegistryKey,
pIpsecFilterObject->pszDistinguishedName,
0,
NULL,
0,
KEY_ALL_ACCESS,
NULL,
&hRegKey,
&dwDisposition
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegSetValueExW(
hRegKey,
L"ClassName",
0,
REG_SZ,
(LPBYTE) L"ipsecFilter",
(wcslen(L"ipsecFilter") + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
if (pIpsecFilterObject->pszDescription) {
dwError = RegSetValueExW(
hRegKey,
L"description",
0,
REG_SZ,
(LPBYTE)pIpsecFilterObject->pszDescription,
(wcslen(pIpsecFilterObject->pszDescription) + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
}
else {
(VOID) RegDeleteValueW(
hRegKey,
L"description"
);
}
if (pIpsecFilterObject->pszDistinguishedName) {
dwError = RegSetValueExW(
hRegKey,
L"name",
0,
REG_SZ,
(LPBYTE)pIpsecFilterObject->pszDistinguishedName,
(wcslen(pIpsecFilterObject->pszDistinguishedName) + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecFilterObject->pszIpsecName) {
dwError = RegSetValueExW(
hRegKey,
L"ipsecName",
0,
REG_SZ,
(LPBYTE)pIpsecFilterObject->pszIpsecName,
(wcslen(pIpsecFilterObject->pszIpsecName) + 1)* sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecFilterObject->pszIpsecID) {
dwError = RegSetValueExW(
hRegKey,
L"ipsecID",
0,
REG_SZ,
(LPBYTE)pIpsecFilterObject->pszIpsecID,
(wcslen(pIpsecFilterObject->pszIpsecID) + 1)* sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
}
dwError = RegSetValueExW(
hRegKey,
L"ipsecDataType",
0,
REG_DWORD,
(LPBYTE)&pIpsecFilterObject->dwIpsecDataType,
sizeof(DWORD)
);
BAIL_ON_WIN32_ERROR(dwError);
if (pIpsecFilterObject->pIpsecData) {
dwError = RegSetValueExW(
hRegKey,
L"ipsecData",
0,
REG_BINARY,
pIpsecFilterObject->pIpsecData,
pIpsecFilterObject->dwIpsecDataLen
);
BAIL_ON_WIN32_ERROR(dwError);
}
dwError = RegSetValueExW(
hRegKey,
L"whenChanged",
0,
REG_DWORD,
(LPBYTE)&pIpsecFilterObject->dwWhenChanged,
sizeof(DWORD)
);
BAIL_ON_WIN32_ERROR(dwError);
if (pIpsecFilterObject->ppszIpsecNFAReferences) {
dwError = RegWriteMultiValuedString(
hRegKey,
L"ipsecOwnersReference",
pIpsecFilterObject->ppszIpsecNFAReferences,
pIpsecFilterObject->dwNFACount
);
BAIL_ON_WIN32_ERROR(dwError);
}
error:
if (hRegKey) {
RegCloseKey(hRegKey);
}
return(dwError);
}
DWORD
PersistNegPolObject(
HKEY hRegistryKey,
PIPSEC_NEGPOL_OBJECT pIpsecNegPolObject
)
{
DWORD dwError = 0;
DWORD dwDisposition = 0;
HKEY hRegKey = NULL;
dwError = RegCreateKeyExW(
hRegistryKey,
pIpsecNegPolObject->pszDistinguishedName,
0,
NULL,
0,
KEY_ALL_ACCESS,
NULL,
&hRegKey,
&dwDisposition
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegSetValueExW(
hRegKey,
L"ClassName",
0,
REG_SZ,
(LPBYTE) L"ipsecNegotiationPolicy",
(wcslen(L"ipsecNegotiationPolicy") + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
if (pIpsecNegPolObject->pszDescription) {
dwError = RegSetValueExW(
hRegKey,
L"description",
0,
REG_SZ,
(LPBYTE)pIpsecNegPolObject->pszDescription,
(wcslen(pIpsecNegPolObject->pszDescription) + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
}
else {
(VOID) RegDeleteValueW(
hRegKey,
L"description"
);
}
if (pIpsecNegPolObject->pszDistinguishedName) {
dwError = RegSetValueExW(
hRegKey,
L"name",
0,
REG_SZ,
(LPBYTE)pIpsecNegPolObject->pszDistinguishedName,
(wcslen(pIpsecNegPolObject->pszDistinguishedName) + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecNegPolObject->pszIpsecName) {
dwError = RegSetValueExW(
hRegKey,
L"ipsecName",
0,
REG_SZ,
(LPBYTE)pIpsecNegPolObject->pszIpsecName,
(wcslen(pIpsecNegPolObject->pszIpsecName) + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecNegPolObject->pszIpsecID) {
dwError = RegSetValueExW(
hRegKey,
L"ipsecID",
0,
REG_SZ,
(LPBYTE)pIpsecNegPolObject->pszIpsecID,
(wcslen(pIpsecNegPolObject->pszIpsecID) + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecNegPolObject->pszIpsecNegPolAction) {
dwError = RegSetValueExW(
hRegKey,
L"ipsecNegotiationPolicyAction",
0,
REG_SZ,
(LPBYTE)pIpsecNegPolObject->pszIpsecNegPolAction,
(wcslen(pIpsecNegPolObject->pszIpsecNegPolAction) + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecNegPolObject->pszIpsecNegPolType) {
dwError = RegSetValueExW(
hRegKey,
L"ipsecNegotiationPolicyType",
0,
REG_SZ,
(LPBYTE)pIpsecNegPolObject->pszIpsecNegPolType,
(wcslen(pIpsecNegPolObject->pszIpsecNegPolType) + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
}
dwError = RegSetValueExW(
hRegKey,
L"ipsecDataType",
0,
REG_DWORD,
(LPBYTE)&pIpsecNegPolObject->dwIpsecDataType,
sizeof(DWORD)
);
BAIL_ON_WIN32_ERROR(dwError);
if (pIpsecNegPolObject->pIpsecData) {
dwError = RegSetValueExW(
hRegKey,
L"ipsecData",
0,
REG_BINARY,
pIpsecNegPolObject->pIpsecData,
pIpsecNegPolObject->dwIpsecDataLen
);
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecNegPolObject->ppszIpsecNFAReferences) {
dwError = RegWriteMultiValuedString(
hRegKey,
L"ipsecOwnersReference",
pIpsecNegPolObject->ppszIpsecNFAReferences,
pIpsecNegPolObject->dwNFACount
);
BAIL_ON_WIN32_ERROR(dwError);
}
dwError = RegSetValueExW(
hRegKey,
L"whenChanged",
0,
REG_DWORD,
(LPBYTE)&pIpsecNegPolObject->dwWhenChanged,
sizeof(DWORD)
);
BAIL_ON_WIN32_ERROR(dwError);
error:
if (hRegKey) {
RegCloseKey(hRegKey);
}
return(dwError);
}
DWORD
PersistISAKMPObject(
HKEY hRegistryKey,
PIPSEC_ISAKMP_OBJECT pIpsecISAKMPObject
)
{
HKEY hRegKey = NULL;
DWORD dwError = 0;
DWORD dwDisposition = 0;
dwError = RegCreateKeyExW(
hRegistryKey,
pIpsecISAKMPObject->pszDistinguishedName,
0,
NULL,
0,
KEY_ALL_ACCESS,
NULL,
&hRegKey,
&dwDisposition
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegSetValueExW(
hRegKey,
L"ClassName",
0,
REG_SZ,
(LPBYTE) L"ipsecISAKMPPolicy",
(wcslen(L"ipsecISAKMPPolicy") + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
if (pIpsecISAKMPObject->pszDistinguishedName) {
dwError = RegSetValueExW(
hRegKey,
L"name",
0,
REG_SZ,
(LPBYTE)pIpsecISAKMPObject->pszDistinguishedName,
(wcslen(pIpsecISAKMPObject->pszDistinguishedName) + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecISAKMPObject->pszIpsecName) {
dwError = RegSetValueExW(
hRegKey,
L"ipsecName",
0,
REG_SZ,
(LPBYTE)pIpsecISAKMPObject->pszIpsecName,
(wcslen(pIpsecISAKMPObject->pszIpsecName) + 1)* sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecISAKMPObject->pszIpsecID) {
dwError = RegSetValueExW(
hRegKey,
L"ipsecID",
0,
REG_SZ,
(LPBYTE)pIpsecISAKMPObject->pszIpsecID,
(wcslen(pIpsecISAKMPObject->pszIpsecID) + 1)* sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
}
dwError = RegSetValueExW(
hRegKey,
L"ipsecDataType",
0,
REG_DWORD,
(LPBYTE)&pIpsecISAKMPObject->dwIpsecDataType,
sizeof(DWORD)
);
BAIL_ON_WIN32_ERROR(dwError);
if (pIpsecISAKMPObject->pIpsecData) {
dwError = RegSetValueExW(
hRegKey,
L"ipsecData",
0,
REG_BINARY,
pIpsecISAKMPObject->pIpsecData,
pIpsecISAKMPObject->dwIpsecDataLen
);
BAIL_ON_WIN32_ERROR(dwError);
}
dwError = RegSetValueExW(
hRegKey,
L"whenChanged",
0,
REG_DWORD,
(LPBYTE)&pIpsecISAKMPObject->dwWhenChanged,
sizeof(DWORD)
);
BAIL_ON_WIN32_ERROR(dwError);
if (pIpsecISAKMPObject->ppszIpsecNFAReferences) {
dwError = RegWriteMultiValuedString(
hRegKey,
L"ipsecOwnersReference",
pIpsecISAKMPObject->ppszIpsecNFAReferences,
pIpsecISAKMPObject->dwNFACount
);
BAIL_ON_WIN32_ERROR(dwError);
}
error:
if (hRegKey) {
RegCloseKey(hRegKey);
}
return(dwError);
}
DWORD
CloneDirectoryPolicyObject(
PIPSEC_POLICY_OBJECT pIpsecPolicyObject,
PIPSEC_POLICY_OBJECT * ppIpsecRegPolicyObject
)
{
DWORD dwError = 0;
PIPSEC_POLICY_OBJECT pIpsecRegPolicyObject = NULL;
//
// Clone Filter Objects
//
pIpsecRegPolicyObject = (PIPSEC_POLICY_OBJECT)AllocPolMem(
sizeof(IPSEC_POLICY_OBJECT)
);
if (!pIpsecRegPolicyObject) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecPolicyObject->ppIpsecFilterObjects) {
dwError = CloneDirectoryFilterObjects(
pIpsecPolicyObject->ppIpsecFilterObjects,
pIpsecPolicyObject->NumberofFilters,
&pIpsecRegPolicyObject->ppIpsecFilterObjects
);
BAIL_ON_WIN32_ERROR(dwError);
pIpsecRegPolicyObject->NumberofFilters = pIpsecPolicyObject->NumberofFilters;
}
//
// Clone NegPol Objects
//
if (pIpsecPolicyObject->ppIpsecNegPolObjects) {
dwError = CloneDirectoryNegPolObjects(
pIpsecPolicyObject->ppIpsecNegPolObjects,
pIpsecPolicyObject->NumberofNegPols,
&pIpsecRegPolicyObject->ppIpsecNegPolObjects
);
BAIL_ON_WIN32_ERROR(dwError);
pIpsecRegPolicyObject->NumberofNegPols = pIpsecPolicyObject->NumberofNegPols;
}
//
// Clone NFA Objects
//
if (pIpsecPolicyObject->ppIpsecNFAObjects) {
dwError = CloneDirectoryNFAObjects(
pIpsecPolicyObject->ppIpsecNFAObjects,
pIpsecPolicyObject->NumberofRulesReturned,
&pIpsecRegPolicyObject->ppIpsecNFAObjects
);
BAIL_ON_WIN32_ERROR(dwError);
pIpsecRegPolicyObject->NumberofRules = pIpsecPolicyObject->NumberofRules;
pIpsecRegPolicyObject->NumberofRulesReturned = pIpsecPolicyObject->NumberofRulesReturned;
}
//
// Clone ISAKMP Objects
//
if (pIpsecPolicyObject->ppIpsecISAKMPObjects) {
dwError = CloneDirectoryISAKMPObjects(
pIpsecPolicyObject->ppIpsecISAKMPObjects,
pIpsecPolicyObject->NumberofISAKMPs,
&pIpsecRegPolicyObject->ppIpsecISAKMPObjects
);
BAIL_ON_WIN32_ERROR(dwError);
pIpsecRegPolicyObject->NumberofISAKMPs = pIpsecPolicyObject->NumberofISAKMPs;
}
//
// Now copy the rest of the data in the object
//
if (pIpsecPolicyObject->pszIpsecOwnersReference) {
dwError = CopyPolicyDSToRegString(
pIpsecPolicyObject->pszIpsecOwnersReference,
&pIpsecRegPolicyObject->pszIpsecOwnersReference
);
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecPolicyObject->pszIpsecName) {
pIpsecRegPolicyObject->pszIpsecName = AllocPolStr(
pIpsecPolicyObject->pszIpsecName
);
if (!pIpsecRegPolicyObject->pszIpsecName) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
}
if (pIpsecPolicyObject->pszIpsecID) {
pIpsecRegPolicyObject->pszIpsecID = AllocPolStr(
pIpsecPolicyObject->pszIpsecID
);
if (!pIpsecRegPolicyObject->pszIpsecID) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
}
if (pIpsecPolicyObject->pszIpsecISAKMPReference) {
dwError = CopyISAKMPDSToFQRegString(
pIpsecPolicyObject->pszIpsecISAKMPReference,
&pIpsecRegPolicyObject->pszIpsecISAKMPReference
);
BAIL_ON_WIN32_ERROR(dwError);
}
pIpsecRegPolicyObject->dwIpsecDataType = pIpsecPolicyObject->dwIpsecDataType;
if (pIpsecPolicyObject->pIpsecData) {
dwError = CopyBinaryValue(
pIpsecPolicyObject->pIpsecData,
pIpsecPolicyObject->dwIpsecDataLen,
&pIpsecRegPolicyObject->pIpsecData
);
BAIL_ON_WIN32_ERROR(dwError);
pIpsecRegPolicyObject->dwIpsecDataLen = pIpsecPolicyObject->dwIpsecDataLen;
}
if (pIpsecPolicyObject->ppszIpsecNFAReferences) {
dwError = CloneNFAReferencesDSToRegistry(
pIpsecPolicyObject->ppszIpsecNFAReferences,
pIpsecPolicyObject->NumberofRules,
&(pIpsecRegPolicyObject->ppszIpsecNFAReferences),
&(pIpsecRegPolicyObject->NumberofRules)
);
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecPolicyObject->pszDescription) {
pIpsecRegPolicyObject->pszDescription = AllocPolStr(
pIpsecPolicyObject->pszDescription
);
if (!pIpsecRegPolicyObject->pszDescription) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
}
pIpsecRegPolicyObject->dwWhenChanged = pIpsecPolicyObject->dwWhenChanged;
*ppIpsecRegPolicyObject = pIpsecRegPolicyObject;
return(dwError);
error:
if (pIpsecRegPolicyObject) {
FreeIpsecPolicyObject(
pIpsecRegPolicyObject
);
}
*ppIpsecRegPolicyObject = NULL;
return(dwError);
}
DWORD
CloneDirectoryNFAObjects(
PIPSEC_NFA_OBJECT * ppIpsecNFAObjects,
DWORD dwNumNFAObjects,
PIPSEC_NFA_OBJECT ** pppIpsecRegNFAObjects
)
{
DWORD dwError = 0;
DWORD i = 0;
PIPSEC_NFA_OBJECT * ppIpsecRegNFAObjects = NULL;
PIPSEC_NFA_OBJECT pIpsecRegNFAObject = NULL;
if (dwNumNFAObjects) {
ppIpsecRegNFAObjects = (PIPSEC_NFA_OBJECT *)AllocPolMem(
dwNumNFAObjects*sizeof(PIPSEC_NFA_OBJECT)
);
if (!ppIpsecRegNFAObjects) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
}
for (i = 0; i < dwNumNFAObjects; i++) {
dwError = CloneDirectoryNFAObject(
*(ppIpsecNFAObjects + i),
&pIpsecRegNFAObject
);
BAIL_ON_WIN32_ERROR(dwError);
*(ppIpsecRegNFAObjects + i) = pIpsecRegNFAObject;
}
*pppIpsecRegNFAObjects = ppIpsecRegNFAObjects;
return(dwError);
error:
if (ppIpsecRegNFAObjects) {
FreeIpsecNFAObjects(
ppIpsecRegNFAObjects,
i
);
}
*pppIpsecRegNFAObjects = NULL;
return(dwError);
}
DWORD
CloneDirectoryFilterObjects(
PIPSEC_FILTER_OBJECT * ppIpsecFilterObjects,
DWORD dwNumFilterObjects,
PIPSEC_FILTER_OBJECT ** pppIpsecRegFilterObjects
)
{
DWORD dwError = 0;
DWORD i = 0;
PIPSEC_FILTER_OBJECT * ppIpsecRegFilterObjects = NULL;
PIPSEC_FILTER_OBJECT pIpsecRegFilterObject = NULL;
if (dwNumFilterObjects) {
ppIpsecRegFilterObjects = (PIPSEC_FILTER_OBJECT *)AllocPolMem(
dwNumFilterObjects*sizeof(PIPSEC_FILTER_OBJECT)
);
if (!ppIpsecRegFilterObjects) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
}
for (i = 0; i < dwNumFilterObjects; i++) {
dwError = CloneDirectoryFilterObject(
*(ppIpsecFilterObjects + i),
&pIpsecRegFilterObject
);
BAIL_ON_WIN32_ERROR(dwError);
*(ppIpsecRegFilterObjects + i) = pIpsecRegFilterObject;
}
*pppIpsecRegFilterObjects = ppIpsecRegFilterObjects;
return(dwError);
error:
if (ppIpsecRegFilterObjects) {
FreeIpsecFilterObjects(
ppIpsecRegFilterObjects,
i
);
}
*pppIpsecRegFilterObjects = NULL;
return(dwError);
}
DWORD
CloneDirectoryISAKMPObjects(
PIPSEC_ISAKMP_OBJECT * ppIpsecISAKMPObjects,
DWORD dwNumISAKMPObjects,
PIPSEC_ISAKMP_OBJECT ** pppIpsecRegISAKMPObjects
)
{
DWORD dwError = 0;
DWORD i = 0;
PIPSEC_ISAKMP_OBJECT * ppIpsecRegISAKMPObjects = NULL;
PIPSEC_ISAKMP_OBJECT pIpsecRegISAKMPObject = NULL;
if (dwNumISAKMPObjects) {
ppIpsecRegISAKMPObjects = (PIPSEC_ISAKMP_OBJECT *)AllocPolMem(
dwNumISAKMPObjects*sizeof(PIPSEC_ISAKMP_OBJECT)
);
if (!ppIpsecRegISAKMPObjects) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
}
for (i = 0; i < dwNumISAKMPObjects; i++) {
dwError = CloneDirectoryISAKMPObject(
*(ppIpsecISAKMPObjects + i),
&pIpsecRegISAKMPObject
);
BAIL_ON_WIN32_ERROR(dwError);
*(ppIpsecRegISAKMPObjects + i) = pIpsecRegISAKMPObject;
}
*pppIpsecRegISAKMPObjects = ppIpsecRegISAKMPObjects;
return(dwError);
error:
if (ppIpsecRegISAKMPObjects) {
FreeIpsecISAKMPObjects(
ppIpsecRegISAKMPObjects,
i
);
}
*pppIpsecRegISAKMPObjects = NULL;
return(dwError);
}
DWORD
CloneDirectoryNegPolObjects(
PIPSEC_NEGPOL_OBJECT * ppIpsecNegPolObjects,
DWORD dwNumNegPolObjects,
PIPSEC_NEGPOL_OBJECT ** pppIpsecRegNegPolObjects
)
{
DWORD dwError = 0;
DWORD i = 0;
PIPSEC_NEGPOL_OBJECT * ppIpsecRegNegPolObjects = NULL;
PIPSEC_NEGPOL_OBJECT pIpsecRegNegPolObject = NULL;
if (dwNumNegPolObjects) {
ppIpsecRegNegPolObjects = (PIPSEC_NEGPOL_OBJECT *)AllocPolMem(
dwNumNegPolObjects*sizeof(PIPSEC_NEGPOL_OBJECT)
);
if (!ppIpsecRegNegPolObjects) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
}
for (i = 0; i < dwNumNegPolObjects; i++) {
dwError = CloneDirectoryNegPolObject(
*(ppIpsecNegPolObjects + i),
&pIpsecRegNegPolObject
);
BAIL_ON_WIN32_ERROR(dwError);
*(ppIpsecRegNegPolObjects + i) = pIpsecRegNegPolObject;
}
*pppIpsecRegNegPolObjects = ppIpsecRegNegPolObjects;
return(dwError);
error:
if (ppIpsecRegNegPolObjects) {
FreeIpsecNegPolObjects(
ppIpsecRegNegPolObjects,
i
);
}
*pppIpsecRegNegPolObjects = NULL;
return(dwError);
}
DWORD
CloneDirectoryFilterObject(
PIPSEC_FILTER_OBJECT pIpsecFilterObject,
PIPSEC_FILTER_OBJECT * ppIpsecRegFilterObject
)
{
DWORD dwError = 0;
PIPSEC_FILTER_OBJECT pIpsecRegFilterObject = NULL;
pIpsecRegFilterObject = (PIPSEC_FILTER_OBJECT)AllocPolMem(
sizeof(IPSEC_FILTER_OBJECT)
);
if (!pIpsecRegFilterObject) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecFilterObject->pszDistinguishedName) {
dwError = CopyFilterDSToRegString(
pIpsecFilterObject->pszDistinguishedName,
&pIpsecRegFilterObject->pszDistinguishedName
);
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecFilterObject->pszDescription) {
pIpsecRegFilterObject->pszDescription = AllocPolStr(
pIpsecFilterObject->pszDescription
);
if (!pIpsecRegFilterObject->pszDescription) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
}
if (pIpsecFilterObject->pszIpsecName) {
pIpsecRegFilterObject->pszIpsecName = AllocPolStr(
pIpsecFilterObject->pszIpsecName
);
if (!pIpsecRegFilterObject->pszIpsecName) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
}
if (pIpsecFilterObject->pszIpsecID) {
pIpsecRegFilterObject->pszIpsecID = AllocPolStr(
pIpsecFilterObject->pszIpsecID
);
if (!pIpsecRegFilterObject->pszIpsecID) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
}
pIpsecRegFilterObject->dwIpsecDataType = pIpsecFilterObject->dwIpsecDataType;
if (pIpsecFilterObject->pIpsecData) {
dwError = CopyBinaryValue(
pIpsecFilterObject->pIpsecData,
pIpsecFilterObject->dwIpsecDataLen,
&pIpsecRegFilterObject->pIpsecData
);
BAIL_ON_WIN32_ERROR(dwError);
pIpsecRegFilterObject->dwIpsecDataLen = pIpsecFilterObject->dwIpsecDataLen;
}
if (pIpsecFilterObject->ppszIpsecNFAReferences) {
dwError = CloneNFAReferencesDSToRegistry(
pIpsecFilterObject->ppszIpsecNFAReferences,
pIpsecFilterObject->dwNFACount,
&pIpsecRegFilterObject->ppszIpsecNFAReferences,
&pIpsecRegFilterObject->dwNFACount
);
BAIL_ON_WIN32_ERROR(dwError);
}
pIpsecRegFilterObject->dwWhenChanged = pIpsecFilterObject->dwWhenChanged;
*ppIpsecRegFilterObject = pIpsecRegFilterObject;
return(dwError);
error:
if (pIpsecRegFilterObject) {
FreeIpsecFilterObject(pIpsecRegFilterObject);
}
*ppIpsecRegFilterObject = NULL;
return(dwError);
}
DWORD
CloneDirectoryNegPolObject(
PIPSEC_NEGPOL_OBJECT pIpsecNegPolObject,
PIPSEC_NEGPOL_OBJECT * ppIpsecRegNegPolObject
)
{
DWORD dwError = 0;
PIPSEC_NEGPOL_OBJECT pIpsecRegNegPolObject = NULL;
pIpsecRegNegPolObject = (PIPSEC_NEGPOL_OBJECT)AllocPolMem(
sizeof(IPSEC_NEGPOL_OBJECT)
);
if (!pIpsecRegNegPolObject) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecNegPolObject->pszDistinguishedName) {
dwError = CopyNegPolDSToRegString(
pIpsecNegPolObject->pszDistinguishedName,
&pIpsecRegNegPolObject->pszDistinguishedName
);
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecNegPolObject->pszIpsecName) {
pIpsecRegNegPolObject->pszIpsecName = AllocPolStr(
pIpsecNegPolObject->pszIpsecName
);
if (!pIpsecRegNegPolObject->pszIpsecName) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
}
if (pIpsecNegPolObject->pszDescription) {
pIpsecRegNegPolObject->pszDescription = AllocPolStr(
pIpsecNegPolObject->pszDescription
);
if (!pIpsecRegNegPolObject->pszDescription) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
}
if (pIpsecNegPolObject->pszIpsecID) {
pIpsecRegNegPolObject->pszIpsecID = AllocPolStr(
pIpsecNegPolObject->pszIpsecID
);
if (!pIpsecRegNegPolObject->pszIpsecID) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
}
pIpsecRegNegPolObject->dwIpsecDataType = pIpsecNegPolObject->dwIpsecDataType;
if (pIpsecNegPolObject->pIpsecData) {
dwError = CopyBinaryValue(
pIpsecNegPolObject->pIpsecData,
pIpsecNegPolObject->dwIpsecDataLen,
&pIpsecRegNegPolObject->pIpsecData
);
BAIL_ON_WIN32_ERROR(dwError);
pIpsecRegNegPolObject->dwIpsecDataLen = pIpsecNegPolObject->dwIpsecDataLen;
}
if (pIpsecNegPolObject->pszIpsecNegPolAction) {
pIpsecRegNegPolObject->pszIpsecNegPolAction = AllocPolStr(
pIpsecNegPolObject->pszIpsecNegPolAction
);
if (!pIpsecRegNegPolObject->pszIpsecNegPolAction) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
}
if (pIpsecNegPolObject->pszIpsecNegPolType) {
pIpsecRegNegPolObject->pszIpsecNegPolType = AllocPolStr(
pIpsecNegPolObject->pszIpsecNegPolType
);
if (!pIpsecRegNegPolObject->pszIpsecNegPolType) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
}
if (pIpsecNegPolObject->ppszIpsecNFAReferences) {
dwError = CloneNFAReferencesDSToRegistry(
pIpsecNegPolObject->ppszIpsecNFAReferences,
pIpsecNegPolObject->dwNFACount,
&pIpsecRegNegPolObject->ppszIpsecNFAReferences,
&pIpsecRegNegPolObject->dwNFACount
);
BAIL_ON_WIN32_ERROR(dwError);
}
pIpsecRegNegPolObject->dwWhenChanged = pIpsecNegPolObject->dwWhenChanged;
*ppIpsecRegNegPolObject = pIpsecRegNegPolObject;
return(dwError);
error:
if (pIpsecRegNegPolObject) {
FreeIpsecNegPolObject(pIpsecRegNegPolObject);
}
*ppIpsecRegNegPolObject = NULL;
return(dwError);
}
DWORD
CloneDirectoryNFAObject(
PIPSEC_NFA_OBJECT pIpsecNFAObject,
PIPSEC_NFA_OBJECT * ppIpsecRegNFAObject
)
{
DWORD dwError = 0;
PIPSEC_NFA_OBJECT pIpsecRegNFAObject = NULL;
pIpsecRegNFAObject = (PIPSEC_NFA_OBJECT)AllocPolMem(
sizeof(IPSEC_NFA_OBJECT)
);
if (!pIpsecRegNFAObject) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecNFAObject->pszDistinguishedName) {
dwError = CopyNFADSToRegString(
pIpsecNFAObject->pszDistinguishedName,
&pIpsecRegNFAObject->pszDistinguishedName
);
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecNFAObject->pszIpsecName) {
pIpsecRegNFAObject->pszIpsecName = AllocPolStr(
pIpsecNFAObject->pszIpsecName
);
if (!pIpsecRegNFAObject->pszIpsecName) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
}
if (pIpsecNFAObject->pszDescription) {
pIpsecRegNFAObject->pszDescription = AllocPolStr(
pIpsecNFAObject->pszDescription
);
if (!pIpsecRegNFAObject->pszDescription) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
}
if (pIpsecNFAObject->pszIpsecID) {
pIpsecRegNFAObject->pszIpsecID = AllocPolStr(
pIpsecNFAObject->pszIpsecID
);
if (!pIpsecRegNFAObject->pszIpsecID) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
}
pIpsecRegNFAObject->dwIpsecDataType = pIpsecNFAObject->dwIpsecDataType;
if (pIpsecNFAObject->pIpsecData) {
dwError = CopyBinaryValue(
pIpsecNFAObject->pIpsecData,
pIpsecNFAObject->dwIpsecDataLen,
&pIpsecRegNFAObject->pIpsecData
);
BAIL_ON_WIN32_ERROR(dwError);
pIpsecRegNFAObject->dwIpsecDataLen = pIpsecNFAObject->dwIpsecDataLen;
}
if (pIpsecNFAObject->pszIpsecOwnersReference) {
dwError = CopyPolicyDSToFQRegString(
pIpsecNFAObject->pszIpsecOwnersReference,
&pIpsecRegNFAObject->pszIpsecOwnersReference
);
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecNFAObject->pszIpsecFilterReference) {
dwError = CopyFilterDSToFQRegString(
pIpsecNFAObject->pszIpsecFilterReference,
&pIpsecRegNFAObject->pszIpsecFilterReference
);
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecNFAObject->pszIpsecNegPolReference) {
dwError = CopyNegPolDSToFQRegString(
pIpsecNFAObject->pszIpsecNegPolReference,
&pIpsecRegNFAObject->pszIpsecNegPolReference
);
BAIL_ON_WIN32_ERROR(dwError);
}
pIpsecRegNFAObject->dwWhenChanged = pIpsecNFAObject->dwWhenChanged;
*ppIpsecRegNFAObject = pIpsecRegNFAObject;
return(dwError);
error:
if (pIpsecRegNFAObject) {
FreeIpsecNFAObject(pIpsecRegNFAObject);
}
*ppIpsecRegNFAObject = NULL;
return(dwError);
}
DWORD
CloneDirectoryISAKMPObject(
PIPSEC_ISAKMP_OBJECT pIpsecISAKMPObject,
PIPSEC_ISAKMP_OBJECT * ppIpsecRegISAKMPObject
)
{
DWORD dwError = 0;
PIPSEC_ISAKMP_OBJECT pIpsecRegISAKMPObject = NULL;
pIpsecRegISAKMPObject = (PIPSEC_ISAKMP_OBJECT)AllocPolMem(
sizeof(IPSEC_ISAKMP_OBJECT)
);
if (!pIpsecRegISAKMPObject) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecISAKMPObject->pszDistinguishedName) {
dwError = CopyISAKMPDSToRegString(
pIpsecISAKMPObject->pszDistinguishedName,
&pIpsecRegISAKMPObject->pszDistinguishedName
);
BAIL_ON_WIN32_ERROR(dwError);
}
if (pIpsecISAKMPObject->pszIpsecName) {
pIpsecRegISAKMPObject->pszIpsecName = AllocPolStr(
pIpsecISAKMPObject->pszIpsecName
);
if (!pIpsecRegISAKMPObject->pszIpsecName) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
}
if (pIpsecISAKMPObject->pszIpsecID) {
pIpsecRegISAKMPObject->pszIpsecID = AllocPolStr(
pIpsecISAKMPObject->pszIpsecID
);
if (!pIpsecRegISAKMPObject->pszIpsecID) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
}
pIpsecRegISAKMPObject->dwIpsecDataType = pIpsecISAKMPObject->dwIpsecDataType;
if (pIpsecISAKMPObject->pIpsecData) {
dwError = CopyBinaryValue(
pIpsecISAKMPObject->pIpsecData,
pIpsecISAKMPObject->dwIpsecDataLen,
&pIpsecRegISAKMPObject->pIpsecData
);
BAIL_ON_WIN32_ERROR(dwError);
}
pIpsecRegISAKMPObject->dwIpsecDataLen = pIpsecISAKMPObject->dwIpsecDataLen;
if (pIpsecISAKMPObject->ppszIpsecNFAReferences) {
dwError = CloneNFAReferencesDSToRegistry(
pIpsecISAKMPObject->ppszIpsecNFAReferences,
pIpsecISAKMPObject->dwNFACount,
&pIpsecRegISAKMPObject->ppszIpsecNFAReferences,
&pIpsecRegISAKMPObject->dwNFACount
);
BAIL_ON_WIN32_ERROR(dwError);
}
pIpsecRegISAKMPObject->dwWhenChanged = pIpsecISAKMPObject->dwWhenChanged;
*ppIpsecRegISAKMPObject = pIpsecRegISAKMPObject;
return(dwError);
error:
if (pIpsecRegISAKMPObject) {
FreeIpsecISAKMPObject(pIpsecRegISAKMPObject);
}
*ppIpsecRegISAKMPObject = NULL;
return(dwError);
}
DWORD
CopyBinaryValue(
LPBYTE pMem,
DWORD dwMemSize,
LPBYTE * ppNewMem
)
{
LPBYTE pNewMem = NULL;
DWORD dwError = 0;
pNewMem = (LPBYTE)AllocPolMem(dwMemSize);
if (!pNewMem) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
memcpy(pNewMem, pMem, dwMemSize);
*ppNewMem = pNewMem;
return(dwError);
error:
if (pNewMem) {
FreePolMem(pNewMem);
}
*ppNewMem = NULL;
return(dwError);
}
DWORD
CopyFilterDSToFQRegString(
LPWSTR pszFilterDN,
LPWSTR * ppszFilterName
)
{
DWORD dwError = 0;
WCHAR szCommonName[MAX_PATH];
LPWSTR pszGuidName = NULL;
LPWSTR pszFilterName = NULL;
DWORD dwStringSize = 0;
dwError = ComputePrelimCN(
pszFilterDN,
szCommonName
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = ComputeGUIDName(
szCommonName,
&pszGuidName
);
BAIL_ON_WIN32_ERROR(dwError);
dwStringSize = wcslen(gpszIpsecCacheKey);
dwStringSize += 1;
dwStringSize += wcslen(pszGuidName);
dwStringSize += 1;
pszFilterName = (LPWSTR)AllocPolMem(dwStringSize*sizeof(WCHAR));
if (!pszFilterName) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
wcscpy(pszFilterName, gpszIpsecCacheKey);
wcscat(pszFilterName, L"\\");
wcscat(pszFilterName, pszGuidName);
*ppszFilterName = pszFilterName;
return(dwError);
error:
*ppszFilterName = NULL;
return(dwError);
}
DWORD
CopyNFADSToFQRegString(
LPWSTR pszNFADN,
LPWSTR * ppszNFAName
)
{
DWORD dwError = 0;
WCHAR szCommonName[MAX_PATH];
LPWSTR pszGuidName = NULL;
LPWSTR pszNFAName = NULL;
DWORD dwStringSize = 0;
dwError = ComputePrelimCN(
pszNFADN,
szCommonName
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = ComputeGUIDName(
szCommonName,
&pszGuidName
);
BAIL_ON_WIN32_ERROR(dwError);
dwStringSize = wcslen(gpszIpsecCacheKey);
dwStringSize += 1;
dwStringSize += wcslen(pszGuidName);
dwStringSize += 1;
pszNFAName = (LPWSTR)AllocPolMem(dwStringSize*sizeof(WCHAR));
if (!pszNFAName) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
wcscpy(pszNFAName, gpszIpsecCacheKey);
wcscat(pszNFAName, L"\\");
wcscat(pszNFAName, pszGuidName);
*ppszNFAName = pszNFAName;
return(dwError);
error:
*ppszNFAName = NULL;
return(dwError);
}
DWORD
CopyNegPolDSToFQRegString(
LPWSTR pszNegPolDN,
LPWSTR * ppszNegPolName
)
{
DWORD dwError = 0;
WCHAR szCommonName[MAX_PATH];
LPWSTR pszGuidName = NULL;
LPWSTR pszNegPolName = NULL;
DWORD dwStringSize = 0;
dwError = ComputePrelimCN(
pszNegPolDN,
szCommonName
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = ComputeGUIDName(
szCommonName,
&pszGuidName
);
BAIL_ON_WIN32_ERROR(dwError);
dwStringSize = wcslen(gpszIpsecCacheKey);
dwStringSize += 1;
dwStringSize += wcslen(pszGuidName);
dwStringSize += 1;
pszNegPolName = (LPWSTR)AllocPolMem(dwStringSize*sizeof(WCHAR));
if (!pszNegPolName) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
wcscpy(pszNegPolName, gpszIpsecCacheKey);
wcscat(pszNegPolName, L"\\");
wcscat(pszNegPolName, pszGuidName);
*ppszNegPolName = pszNegPolName;
return(dwError);
error:
*ppszNegPolName = NULL;
return(dwError);
}
DWORD
CopyPolicyDSToFQRegString(
LPWSTR pszPolicyDN,
LPWSTR * ppszPolicyName
)
{
DWORD dwError = 0;
WCHAR szCommonName[MAX_PATH];
LPWSTR pszGuidName = NULL;
LPWSTR pszPolicyName = NULL;
DWORD dwStringSize = 0;
dwError = ComputePrelimCN(
pszPolicyDN,
szCommonName
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = ComputeGUIDName(
szCommonName,
&pszGuidName
);
BAIL_ON_WIN32_ERROR(dwError);
dwStringSize = wcslen(gpszIpsecCacheKey);
dwStringSize += 1;
dwStringSize += wcslen(pszGuidName);
dwStringSize += 1;
pszPolicyName = (LPWSTR)AllocPolMem(dwStringSize*sizeof(WCHAR));
if (!pszPolicyName) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
wcscpy(pszPolicyName, gpszIpsecCacheKey);
wcscat(pszPolicyName, L"\\");
wcscat(pszPolicyName, pszGuidName);
*ppszPolicyName = pszPolicyName;
return(dwError);
error:
*ppszPolicyName = NULL;
return(dwError);
}
DWORD
CopyISAKMPDSToFQRegString(
LPWSTR pszISAKMPDN,
LPWSTR * ppszISAKMPName
)
{
DWORD dwError = 0;
WCHAR szCommonName[MAX_PATH];
LPWSTR pszGuidName = NULL;
LPWSTR pszISAKMPName = NULL;
DWORD dwStringSize = 0;
dwError = ComputePrelimCN(
pszISAKMPDN,
szCommonName
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = ComputeGUIDName(
szCommonName,
&pszGuidName
);
BAIL_ON_WIN32_ERROR(dwError);
dwStringSize = wcslen(gpszIpsecCacheKey);
dwStringSize += 1;
dwStringSize += wcslen(pszGuidName);
dwStringSize += 1;
pszISAKMPName = (LPWSTR)AllocPolMem(dwStringSize*sizeof(WCHAR));
if (!pszISAKMPName) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
wcscpy(pszISAKMPName, gpszIpsecCacheKey);
wcscat(pszISAKMPName, L"\\");
wcscat(pszISAKMPName, pszGuidName);
*ppszISAKMPName = pszISAKMPName;
return(dwError);
error:
*ppszISAKMPName = NULL;
return(dwError);
}
DWORD
ComputeGUIDName(
LPWSTR szCommonName,
LPWSTR * ppszGuidName
)
{
LPWSTR pszGuidName = NULL;
DWORD dwError = 0;
pszGuidName = wcschr(szCommonName, L'=');
if (!pszGuidName) {
dwError = ERROR_INVALID_PARAMETER;
BAIL_ON_WIN32_ERROR(dwError);
}
*ppszGuidName = (pszGuidName + 1);
return(dwError);
error:
*ppszGuidName = NULL;
return(dwError);
}
DWORD
CloneNFAReferencesDSToRegistry(
LPWSTR * ppszIpsecNFAReferences,
DWORD dwNFACount,
LPWSTR * * pppszIpsecRegNFAReferences,
PDWORD pdwRegNFACount
)
{
DWORD dwError = 0;
DWORD i = 0;
LPWSTR * ppszIpsecRegNFAReferences = NULL;
ppszIpsecRegNFAReferences = (LPWSTR *)AllocPolMem(
sizeof(LPWSTR)*dwNFACount
);
if (!ppszIpsecRegNFAReferences) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
for (i = 0; i < dwNFACount; i++) {
dwError = CopyNFADSToFQRegString(
*(ppszIpsecNFAReferences + i),
(ppszIpsecRegNFAReferences + i)
);
BAIL_ON_WIN32_ERROR(dwError);
}
*pppszIpsecRegNFAReferences = ppszIpsecRegNFAReferences;
*pdwRegNFACount = dwNFACount;
return(dwError);
error:
if (ppszIpsecRegNFAReferences) {
FreeNFAReferences(
ppszIpsecRegNFAReferences,
i
);
}
*pppszIpsecRegNFAReferences = NULL;
*pdwRegNFACount = 0;
return(dwError);
}
DWORD
DeleteRegistryCache(
)
{
DWORD dwError = 0;
HKEY hParentKey = NULL;
WCHAR lpszName[MAX_PATH];
DWORD dwSize = 0;
dwError = RegOpenKeyExW(
HKEY_LOCAL_MACHINE,
gpszIpsecCacheKey,
0,
KEY_ALL_ACCESS,
&hParentKey
);
BAIL_ON_WIN32_ERROR(dwError);
memset(lpszName, 0, sizeof(WCHAR)*MAX_PATH);
dwSize = MAX_PATH;
while((RegEnumKeyExW(hParentKey, 0, lpszName,
&dwSize, NULL,
NULL, NULL,NULL)) == ERROR_SUCCESS) {
dwError = RegDeleteKeyW(
hParentKey,
lpszName
);
if (dwError != ERROR_SUCCESS) {
break;
}
memset(lpszName, 0, sizeof(WCHAR)*MAX_PATH);
dwSize = MAX_PATH;
}
error:
if (hParentKey) {
RegCloseKey(hParentKey);
}
return(dwError);
}
DWORD
RegWriteMultiValuedString(
HKEY hRegKey,
LPWSTR pszValueName,
LPWSTR * ppszStringReferences,
DWORD dwNumStringReferences
)
{
DWORD dwError = 0;
DWORD i = 0;
LPWSTR pMem = NULL;
LPWSTR pszTemp = NULL;
DWORD dwSize = 0;
if (!ppszStringReferences) {
dwError = ERROR_INVALID_PARAMETER;
BAIL_ON_WIN32_ERROR(dwError);
}
for (i = 0; i < dwNumStringReferences; i++) {
dwSize += wcslen (*(ppszStringReferences + i));
dwSize ++;
}
dwSize ++;
pMem = (LPWSTR) AllocPolMem(dwSize*sizeof(WCHAR));
if (!pMem) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
pszTemp = pMem;
for (i = 0; i < dwNumStringReferences; i++) {
memcpy(pszTemp, *(ppszStringReferences + i), wcslen(*(ppszStringReferences + i))*sizeof(WCHAR));
pszTemp += wcslen(pszTemp) + 1;
}
//*pszTemp = L'\0';
dwError = RegSetValueExW(
hRegKey,
pszValueName,
0,
REG_MULTI_SZ,
(LPBYTE)pMem,
dwSize * sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
error:
if (pMem) {
FreePolMem(pMem);
}
return(dwError);
}
DWORD
CopyFilterDSToRegString(
LPWSTR pszFilterDN,
LPWSTR * ppszFilterName
)
{
DWORD dwError = 0;
WCHAR szCommonName[MAX_PATH];
LPWSTR pszGuidName = NULL;
LPWSTR pszFilterName = NULL;
dwError = ComputePrelimCN(
pszFilterDN,
szCommonName
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = ComputeGUIDName(
szCommonName,
&pszGuidName
);
BAIL_ON_WIN32_ERROR(dwError);
pszFilterName = AllocPolStr(pszGuidName);
if (!pszFilterName) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
*ppszFilterName = pszFilterName;
return(dwError);
error:
*ppszFilterName = NULL;
return(dwError);
}
DWORD
CopyNFADSToRegString(
LPWSTR pszNFADN,
LPWSTR * ppszNFAName
)
{
DWORD dwError = 0;
WCHAR szCommonName[MAX_PATH];
LPWSTR pszGuidName = NULL;
LPWSTR pszNFAName = NULL;
dwError = ComputePrelimCN(
pszNFADN,
szCommonName
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = ComputeGUIDName(
szCommonName,
&pszGuidName
);
BAIL_ON_WIN32_ERROR(dwError);
pszNFAName = AllocPolStr(pszGuidName);
if (!pszNFAName) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
*ppszNFAName = pszNFAName;
return(dwError);
error:
*ppszNFAName = NULL;
return(dwError);
}
DWORD
CopyNegPolDSToRegString(
LPWSTR pszNegPolDN,
LPWSTR * ppszNegPolName
)
{
DWORD dwError = 0;
WCHAR szCommonName[MAX_PATH];
LPWSTR pszGuidName = NULL;
LPWSTR pszNegPolName = NULL;
dwError = ComputePrelimCN(
pszNegPolDN,
szCommonName
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = ComputeGUIDName(
szCommonName,
&pszGuidName
);
BAIL_ON_WIN32_ERROR(dwError);
pszNegPolName = AllocPolStr(pszGuidName);
if (!pszNegPolName) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
*ppszNegPolName = pszNegPolName;
return(dwError);
error:
*ppszNegPolName = NULL;
return(dwError);
}
DWORD
CopyPolicyDSToRegString(
LPWSTR pszPolicyDN,
LPWSTR * ppszPolicyName
)
{
DWORD dwError = 0;
WCHAR szCommonName[MAX_PATH];
LPWSTR pszGuidName = NULL;
LPWSTR pszPolicyName = NULL;
dwError = ComputePrelimCN(
pszPolicyDN,
szCommonName
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = ComputeGUIDName(
szCommonName,
&pszGuidName
);
BAIL_ON_WIN32_ERROR(dwError);
pszPolicyName = AllocPolStr(pszGuidName);
if (!pszPolicyName) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
*ppszPolicyName = pszPolicyName;
return(dwError);
error:
*ppszPolicyName = NULL;
return(dwError);
}
DWORD
CopyISAKMPDSToRegString(
LPWSTR pszISAKMPDN,
LPWSTR * ppszISAKMPName
)
{
DWORD dwError = 0;
WCHAR szCommonName[MAX_PATH];
LPWSTR pszGuidName = NULL;
LPWSTR pszISAKMPName = NULL;
dwError = ComputePrelimCN(
pszISAKMPDN,
szCommonName
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = ComputeGUIDName(
szCommonName,
&pszGuidName
);
BAIL_ON_WIN32_ERROR(dwError);
pszISAKMPName = AllocPolStr(pszGuidName);
if (!pszISAKMPName) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
*ppszISAKMPName = pszISAKMPName;
return(dwError);
error:
*ppszISAKMPName = NULL;
return(dwError);
}