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

1913 lines
47 KiB
C

#include "precomp.h"
LPWSTR gpszIpsecRegContainer = L"SOFTWARE\\Policies\\Microsoft\\Windows\\IPSec\\Policy\\Local";
DWORD
OpenRegistryIPSECRootKey(
LPWSTR pszServerName,
LPWSTR pszIpsecRegRootContainer,
HKEY * phRegistryKey
)
{
DWORD dwError = 0;
dwError = RegOpenKeyExW(
HKEY_LOCAL_MACHINE,
(LPCWSTR) pszIpsecRegRootContainer,
0,
KEY_ALL_ACCESS,
phRegistryKey
);
BAIL_ON_WIN32_ERROR(dwError);
error:
return(dwError);
}
DWORD
ReadPolicyObjectFromRegistry(
HKEY hRegistryKey,
LPWSTR pszPolicyDN,
LPWSTR pszIpsecRegRootContainer,
PIPSEC_POLICY_OBJECT * ppIpsecPolicyObject
)
{
DWORD dwError = 0;
PIPSEC_POLICY_OBJECT pIpsecPolicyObject = NULL;
DWORD dwNumNFAObjectsReturned = 0;
PIPSEC_NFA_OBJECT * ppIpsecNFAObjects = NULL;
LPWSTR * ppszFilterReferences = NULL;
DWORD dwNumFilterReferences = 0;
LPWSTR * ppszNegPolReferences = NULL;
DWORD dwNumNegPolReferences = 0;
PIPSEC_FILTER_OBJECT * ppIpsecFilterObjects = NULL;
DWORD dwNumFilterObjects = 0;
PIPSEC_NEGPOL_OBJECT * ppIpsecNegPolObjects = NULL;
DWORD dwNumNegPolObjects = 0;
PIPSEC_ISAKMP_OBJECT * ppIpsecISAKMPObjects = NULL;
DWORD dwNumISAKMPObjects = 0;
dwError = UnMarshallRegistryPolicyObject(
hRegistryKey,
pszIpsecRegRootContainer,
pszPolicyDN,
REG_FULLY_QUALIFIED_NAME,
&pIpsecPolicyObject
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = ReadNFAObjectsFromRegistry(
hRegistryKey,
pszIpsecRegRootContainer,
pIpsecPolicyObject->pszIpsecOwnersReference,
pIpsecPolicyObject->ppszIpsecNFAReferences,
pIpsecPolicyObject->NumberofRules,
&ppIpsecNFAObjects,
&dwNumNFAObjectsReturned,
&ppszFilterReferences,
&dwNumFilterReferences,
&ppszNegPolReferences,
&dwNumNegPolReferences
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = ReadFilterObjectsFromRegistry(
hRegistryKey,
pszIpsecRegRootContainer,
ppszFilterReferences,
dwNumFilterReferences,
&ppIpsecFilterObjects,
&dwNumFilterObjects
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = ReadNegPolObjectsFromRegistry(
hRegistryKey,
pszIpsecRegRootContainer,
ppszNegPolReferences,
dwNumNegPolReferences,
&ppIpsecNegPolObjects,
&dwNumNegPolObjects
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = ReadISAKMPObjectsFromRegistry(
hRegistryKey,
pszIpsecRegRootContainer,
&pIpsecPolicyObject->pszIpsecISAKMPReference,
1,
&ppIpsecISAKMPObjects,
&dwNumISAKMPObjects
);
BAIL_ON_WIN32_ERROR(dwError);
pIpsecPolicyObject->ppIpsecNFAObjects = ppIpsecNFAObjects;
pIpsecPolicyObject->NumberofRulesReturned = dwNumNFAObjectsReturned;
pIpsecPolicyObject->NumberofFilters = dwNumFilterObjects;
pIpsecPolicyObject->ppIpsecFilterObjects = ppIpsecFilterObjects;
pIpsecPolicyObject->ppIpsecNegPolObjects = ppIpsecNegPolObjects;
pIpsecPolicyObject->NumberofNegPols = dwNumNegPolObjects;
pIpsecPolicyObject->NumberofISAKMPs = dwNumISAKMPObjects;
pIpsecPolicyObject->ppIpsecISAKMPObjects = ppIpsecISAKMPObjects;
*ppIpsecPolicyObject = pIpsecPolicyObject;
cleanup:
if (ppszFilterReferences) {
FreeFilterReferences(
ppszFilterReferences,
dwNumFilterReferences
);
}
if (ppszNegPolReferences) {
FreeNegPolReferences(
ppszNegPolReferences,
dwNumNegPolReferences
);
}
return(dwError);
error:
if (pIpsecPolicyObject) {
FreeIpsecPolicyObject(
pIpsecPolicyObject
);
}
*ppIpsecPolicyObject = NULL;
goto cleanup;
}
DWORD
ReadNFAObjectsFromRegistry(
HKEY hRegistryKey,
LPWSTR pszIpsecRootContainer,
LPWSTR pszIpsecOwnerReference,
LPWSTR * ppszNFADNs,
DWORD dwNumNfaObjects,
PIPSEC_NFA_OBJECT ** pppIpsecNFAObjects,
PDWORD pdwNumNfaObjects,
LPWSTR ** pppszFilterReferences,
PDWORD pdwNumFilterReferences,
LPWSTR ** pppszNegPolReferences,
PDWORD pdwNumNegPolReferences
)
{
DWORD dwError = 0;
DWORD i = 0;
PIPSEC_NFA_OBJECT pIpsecNFAObject = NULL;
PIPSEC_NFA_OBJECT * ppIpsecNFAObjects = NULL;
LPWSTR * ppszFilterReferences = NULL;
LPWSTR * ppszNegPolReferences = NULL;
LPWSTR pszFilterReference = NULL;
LPWSTR pszNegPolReference = NULL;
DWORD dwNumFilterReferences = 0;
DWORD dwNumNegPolReferences = 0;
DWORD dwNumNFAObjectsReturned = 0;
*pppszNegPolReferences = NULL;
*pdwNumFilterReferences = 0;
*pppszFilterReferences = NULL;
*pdwNumNegPolReferences = 0;
*pppIpsecNFAObjects = NULL;
*pdwNumNfaObjects = 0;
ppIpsecNFAObjects = (PIPSEC_NFA_OBJECT *)AllocPolMem(
sizeof(PIPSEC_NFA_OBJECT)*dwNumNfaObjects
);
if (!ppIpsecNFAObjects) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
ppszFilterReferences = (LPWSTR *)AllocPolMem(
sizeof(LPWSTR)*dwNumNfaObjects
);
if (!ppszFilterReferences) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
ppszNegPolReferences = (LPWSTR *)AllocPolMem(
sizeof(LPWSTR)*dwNumNfaObjects
);
if (!ppszNegPolReferences) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
for (i = 0; i < dwNumNfaObjects; i++) {
dwError =UnMarshallRegistryNFAObject(
hRegistryKey,
pszIpsecRootContainer,
*(ppszNFADNs + i),
&pIpsecNFAObject,
&pszFilterReference,
&pszNegPolReference
);
if (dwError == ERROR_SUCCESS) {
*(ppIpsecNFAObjects + dwNumNFAObjectsReturned) = pIpsecNFAObject;
if (pszFilterReference) {
*(ppszFilterReferences + dwNumFilterReferences) = pszFilterReference;
dwNumFilterReferences++;
}
if (pszNegPolReference) {
*(ppszNegPolReferences + dwNumNegPolReferences) = pszNegPolReference;
dwNumNegPolReferences++;
}
dwNumNFAObjectsReturned++;
}
}
if (dwNumNFAObjectsReturned == 0) {
dwError = ERROR_INVALID_DATA;
BAIL_ON_WIN32_ERROR(dwError);
}
*pppszFilterReferences = ppszFilterReferences;
*pppszNegPolReferences = ppszNegPolReferences;
*pppIpsecNFAObjects = ppIpsecNFAObjects;
*pdwNumNfaObjects = dwNumNFAObjectsReturned;
*pdwNumNegPolReferences = dwNumNegPolReferences;
*pdwNumFilterReferences = dwNumFilterReferences;
dwError = ERROR_SUCCESS;
cleanup:
return(dwError);
error:
if (ppszNegPolReferences) {
FreeNegPolReferences(
ppszNegPolReferences,
dwNumNFAObjectsReturned
);
}
if (ppszFilterReferences) {
FreeFilterReferences(
ppszFilterReferences,
dwNumNFAObjectsReturned
);
}
if (ppIpsecNFAObjects) {
FreeIpsecNFAObjects(
ppIpsecNFAObjects,
dwNumNFAObjectsReturned
);
}
*pppszNegPolReferences = NULL;
*pppszFilterReferences = NULL;
*pppIpsecNFAObjects = NULL;
*pdwNumNfaObjects = 0;
*pdwNumNegPolReferences = 0;
*pdwNumFilterReferences = 0;
goto cleanup;
}
DWORD
ReadFilterObjectsFromRegistry(
HKEY hRegistryKey,
LPWSTR pszIpsecRootContainer,
LPWSTR * ppszFilterDNs,
DWORD dwNumFilterObjects,
PIPSEC_FILTER_OBJECT ** pppIpsecFilterObjects,
PDWORD pdwNumFilterObjects
)
{
DWORD dwError = 0;
DWORD i = 0;
DWORD dwCount = 0;
PIPSEC_FILTER_OBJECT pIpsecFilterObject = NULL;
PIPSEC_FILTER_OBJECT * ppIpsecFilterObjects = NULL;
DWORD dwNumFilterObjectsReturned = 0;
*pppIpsecFilterObjects = NULL;
*pdwNumFilterObjects = 0;
ppIpsecFilterObjects = (PIPSEC_FILTER_OBJECT *)AllocPolMem(
sizeof(PIPSEC_FILTER_OBJECT)*dwNumFilterObjects
);
if (!ppIpsecFilterObjects) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
for (i = 0; i < dwNumFilterObjects; i++) {
dwError =UnMarshallRegistryFilterObject(
hRegistryKey,
pszIpsecRootContainer,
*(ppszFilterDNs + i),
REG_FULLY_QUALIFIED_NAME,
&pIpsecFilterObject
);
if (dwError == ERROR_SUCCESS) {
*(ppIpsecFilterObjects + dwNumFilterObjectsReturned) = pIpsecFilterObject;
dwNumFilterObjectsReturned++;
}
}
*pppIpsecFilterObjects = ppIpsecFilterObjects;
*pdwNumFilterObjects = dwNumFilterObjectsReturned;
dwError = ERROR_SUCCESS;
return(dwError);
error:
if (ppIpsecFilterObjects) {
FreeIpsecFilterObjects(
ppIpsecFilterObjects,
dwNumFilterObjectsReturned
);
}
*pppIpsecFilterObjects = NULL;
*pdwNumFilterObjects = 0;
return(dwError);
}
DWORD
ReadNegPolObjectsFromRegistry(
HKEY hRegistryKey,
LPWSTR pszIpsecRootContainer,
LPWSTR * ppszNegPolDNs,
DWORD dwNumNegPolObjects,
PIPSEC_NEGPOL_OBJECT ** pppIpsecNegPolObjects,
PDWORD pdwNumNegPolObjects
)
{
DWORD dwError = 0;
DWORD i = 0;
DWORD dwCount = 0;
PIPSEC_NEGPOL_OBJECT pIpsecNegPolObject = NULL;
PIPSEC_NEGPOL_OBJECT * ppIpsecNegPolObjects = NULL;
DWORD dwNumNegPolObjectsReturned = 0;
*pppIpsecNegPolObjects = NULL;
*pdwNumNegPolObjects = 0;
ppIpsecNegPolObjects = (PIPSEC_NEGPOL_OBJECT *)AllocPolMem(
sizeof(PIPSEC_NEGPOL_OBJECT)*dwNumNegPolObjects
);
if (!ppIpsecNegPolObjects) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
for (i = 0; i < dwNumNegPolObjects; i++) {
dwError =UnMarshallRegistryNegPolObject(
hRegistryKey,
pszIpsecRootContainer,
*(ppszNegPolDNs + i),
REG_FULLY_QUALIFIED_NAME,
&pIpsecNegPolObject
);
if (dwError == ERROR_SUCCESS) {
*(ppIpsecNegPolObjects + dwNumNegPolObjectsReturned) = pIpsecNegPolObject;
dwNumNegPolObjectsReturned++;
}
}
if (dwNumNegPolObjectsReturned == 0) {
dwError = ERROR_INVALID_DATA;
BAIL_ON_WIN32_ERROR(dwError);
}
*pppIpsecNegPolObjects = ppIpsecNegPolObjects;
*pdwNumNegPolObjects = dwNumNegPolObjectsReturned;
dwError = ERROR_SUCCESS;
return(dwError);
error:
if (ppIpsecNegPolObjects) {
FreeIpsecNegPolObjects(
ppIpsecNegPolObjects,
dwNumNegPolObjectsReturned
);
}
*pppIpsecNegPolObjects = NULL;
*pdwNumNegPolObjects = 0;
return(dwError);
}
DWORD
ReadISAKMPObjectsFromRegistry(
HKEY hRegistryKey,
LPWSTR pszIpsecRootContainer,
LPWSTR * ppszISAKMPDNs,
DWORD dwNumISAKMPObjects,
PIPSEC_ISAKMP_OBJECT ** pppIpsecISAKMPObjects,
PDWORD pdwNumISAKMPObjects
)
{
DWORD dwError = 0;
DWORD i = 0;
DWORD dwCount = 0;
PIPSEC_ISAKMP_OBJECT pIpsecISAKMPObject = NULL;
PIPSEC_ISAKMP_OBJECT * ppIpsecISAKMPObjects = NULL;
DWORD dwNumISAKMPObjectsReturned = 0;
*pppIpsecISAKMPObjects = NULL;
*pdwNumISAKMPObjects = 0;
ppIpsecISAKMPObjects = (PIPSEC_ISAKMP_OBJECT *)AllocPolMem(
sizeof(PIPSEC_ISAKMP_OBJECT)*dwNumISAKMPObjects
);
if (!ppIpsecISAKMPObjects) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
for (i = 0; i < dwNumISAKMPObjects; i++) {
dwError =UnMarshallRegistryISAKMPObject(
hRegistryKey,
pszIpsecRootContainer,
*(ppszISAKMPDNs + i),
REG_FULLY_QUALIFIED_NAME,
&pIpsecISAKMPObject
);
if (dwError == ERROR_SUCCESS) {
*(ppIpsecISAKMPObjects + dwNumISAKMPObjectsReturned) = pIpsecISAKMPObject;
dwNumISAKMPObjectsReturned++;
}
}
if (dwNumISAKMPObjectsReturned == 0) {
dwError = ERROR_INVALID_DATA;
BAIL_ON_WIN32_ERROR(dwError);
}
*pppIpsecISAKMPObjects = ppIpsecISAKMPObjects;
*pdwNumISAKMPObjects = dwNumISAKMPObjectsReturned;
dwError = ERROR_SUCCESS;
return(dwError);
error:
if (ppIpsecISAKMPObjects) {
FreeIpsecISAKMPObjects(
ppIpsecISAKMPObjects,
dwNumISAKMPObjectsReturned
);
}
*pppIpsecISAKMPObjects = NULL;
*pdwNumISAKMPObjects = 0;
return(dwError);
}
DWORD
UnMarshallRegistryPolicyObject(
HKEY hRegistryKey,
LPWSTR pszIpsecRegRootContainer,
LPWSTR pszIpsecPolicyDN,
DWORD dwNameType,
PIPSEC_POLICY_OBJECT * ppIpsecPolicyObject
)
{
PIPSEC_POLICY_OBJECT pIpsecPolicyObject = NULL;
HKEY hRegKey = NULL;
DWORD dwType = 0;
DWORD dwSize = 0;
DWORD dwIpsecDataType = 0;
DWORD dwWhenChanged = 0;
LPBYTE pBuffer = NULL;
DWORD i = 0;
DWORD dwCount = 0;
DWORD dwError = 0;
LPWSTR * ppszIpsecNFANames = NULL;
LPWSTR pszIpsecNFAName = NULL;
LPWSTR pszTemp = NULL;
LPWSTR pszString = NULL;
LPWSTR pszIpsecNFAReference = NULL;
LPWSTR pszRelativeName = NULL;
DWORD dwRootPathLen = 0;
if (!pszIpsecPolicyDN || !*pszIpsecPolicyDN) {
dwError = ERROR_INVALID_DATA;
BAIL_ON_WIN32_ERROR(dwError);
}
if (dwNameType == REG_FULLY_QUALIFIED_NAME) {
dwRootPathLen = wcslen(pszIpsecRegRootContainer);
if (wcslen(pszIpsecPolicyDN) <= (dwRootPathLen+1)) {
dwError = ERROR_INVALID_DATA;
BAIL_ON_WIN32_ERROR(dwError);
}
pszRelativeName = pszIpsecPolicyDN + dwRootPathLen + 1;
}else {
pszRelativeName = pszIpsecPolicyDN;
}
dwError = RegOpenKeyExW(
hRegistryKey,
pszRelativeName,
0,
KEY_ALL_ACCESS,
&hRegKey
);
BAIL_ON_WIN32_ERROR(dwError);
pIpsecPolicyObject = (PIPSEC_POLICY_OBJECT)AllocPolMem(
sizeof(IPSEC_POLICY_OBJECT)
);
if (!pIpsecPolicyObject) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
/*
dwError = RegstoreQueryValue(
hRegKey,
L"distinguishedName",
REG_SZ,
(LPBYTE *)&pIpsecPolicyObject->pszIpsecOwnersReference,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
*/
pIpsecPolicyObject->pszIpsecOwnersReference = AllocPolStr(
pszIpsecPolicyDN
);
if (!pIpsecPolicyObject->pszIpsecOwnersReference) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
dwError = RegstoreQueryValue(
hRegKey,
L"ipsecName",
REG_SZ,
(LPBYTE *)&pIpsecPolicyObject->pszIpsecName,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegstoreQueryValue(
hRegKey,
L"description",
REG_SZ,
(LPBYTE *)&pIpsecPolicyObject->pszDescription,
&dwSize
);
// BAIL_ON_WIN32_ERROR(dwError);
dwError = RegstoreQueryValue(
hRegKey,
L"ipsecID",
REG_SZ,
(LPBYTE *)&pIpsecPolicyObject->pszIpsecID,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
dwType = REG_DWORD;
dwSize = sizeof(DWORD);
dwError = RegQueryValueExW(
hRegKey,
L"ipsecDataType",
NULL,
&dwType,
(LPBYTE)&dwIpsecDataType,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
pIpsecPolicyObject->dwIpsecDataType = dwIpsecDataType;
dwError = RegstoreQueryValue(
hRegKey,
L"ipsecData",
REG_BINARY,
&pIpsecPolicyObject->pIpsecData,
&pIpsecPolicyObject->dwIpsecDataLen
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegstoreQueryValue(
hRegKey,
L"ipsecISAKMPReference",
REG_SZ,
(LPBYTE *)&pIpsecPolicyObject->pszIpsecISAKMPReference,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegstoreQueryValue(
hRegKey,
L"ipsecNFAReference",
REG_MULTI_SZ,
(LPBYTE *)&pszIpsecNFAReference,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
pszTemp = pszIpsecNFAReference;
while (*pszTemp != L'\0') {
pszTemp += wcslen(pszTemp) + 1;
dwCount++;
}
ppszIpsecNFANames = (LPWSTR *)AllocPolMem(
sizeof(LPWSTR)*dwCount
);
if (!ppszIpsecNFANames) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
pszTemp = pszIpsecNFAReference;
for (i = 0; i < dwCount; i++) {
pszString = AllocPolStr(pszTemp);
if (!pszString) {
dwError = ERROR_OUTOFMEMORY;
pIpsecPolicyObject->ppszIpsecNFAReferences = ppszIpsecNFANames;
pIpsecPolicyObject->NumberofRules = i;
BAIL_ON_WIN32_ERROR(dwError);
}
*(ppszIpsecNFANames + i) = pszString;
pszTemp += wcslen(pszTemp) + 1; //for the null terminator;
}
if (pszIpsecNFAReference) {
FreePolStr(pszIpsecNFAReference);
}
pIpsecPolicyObject->ppszIpsecNFAReferences = ppszIpsecNFANames;
pIpsecPolicyObject->NumberofRules = dwCount;
dwType = REG_DWORD;
dwSize = sizeof(DWORD);
dwError = RegQueryValueExW(
hRegKey,
L"whenChanged",
NULL,
&dwType,
(LPBYTE)&dwWhenChanged,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
pIpsecPolicyObject->dwWhenChanged = dwWhenChanged;
*ppIpsecPolicyObject = pIpsecPolicyObject;
if (hRegKey) {
RegCloseKey(hRegKey);
}
return(dwError);
error:
*ppIpsecPolicyObject = NULL;
if (pszIpsecNFAReference) {
FreePolStr(pszIpsecNFAReference);
}
if (pIpsecPolicyObject) {
FreeIpsecPolicyObject(pIpsecPolicyObject);
}
if (hRegKey) {
RegCloseKey(hRegKey);
}
return(dwError);
}
DWORD
UnMarshallRegistryNFAObject(
HKEY hRegistryKey,
LPWSTR pszIpsecRegRootContainer,
LPWSTR pszIpsecNFAReference,
PIPSEC_NFA_OBJECT * ppIpsecNFAObject,
LPWSTR * ppszFilterReference,
LPWSTR * ppszNegPolReference
)
{
PIPSEC_NFA_OBJECT pIpsecNFAObject = NULL;
HKEY hRegKey = NULL;
DWORD dwType = 0;
DWORD dwSize = 0;
DWORD dwIpsecDataType = 0;
DWORD dwWhenChanged = 0;
LPBYTE pBuffer = NULL;
DWORD i = 0;
DWORD dwCount = 0;
DWORD dwError = 0;
LPWSTR pszTempFilterReference = NULL;
LPWSTR pszTempNegPolReference = NULL;
LPWSTR pszRelativeName = NULL;
DWORD dwRootPathLen = 0;
dwRootPathLen = wcslen(pszIpsecRegRootContainer);
if (!pszIpsecNFAReference || !*pszIpsecNFAReference) {
dwError = ERROR_INVALID_DATA;
BAIL_ON_WIN32_ERROR(dwError);
}
if (wcslen(pszIpsecNFAReference) <= (dwRootPathLen+1)) {
dwError = ERROR_INVALID_DATA;
BAIL_ON_WIN32_ERROR(dwError);
}
pszRelativeName = pszIpsecNFAReference + dwRootPathLen + 1;
dwError = RegOpenKeyExW(
hRegistryKey,
pszRelativeName,
0,
KEY_ALL_ACCESS,
&hRegKey
);
BAIL_ON_WIN32_ERROR(dwError);
pIpsecNFAObject = (PIPSEC_NFA_OBJECT)AllocPolMem(
sizeof(IPSEC_NFA_OBJECT)
);
if (!pIpsecNFAObject) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
/*
dwError = RegstoreQueryValue(
hRegKey,
L"distinguishedName",
REG_SZ,
(LPBYTE *)&pIpsecNFAObject->pszDistinguishedName,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
*/
pIpsecNFAObject->pszDistinguishedName = AllocPolStr(
pszIpsecNFAReference
);
if (!pIpsecNFAObject->pszDistinguishedName) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
//
// Client does not always write the Name for an NFA
//
dwError = RegstoreQueryValue(
hRegKey,
L"ipsecName",
REG_SZ,
(LPBYTE *)&pIpsecNFAObject->pszIpsecName,
&dwSize
);
// BAIL_ON_WIN32_ERROR(dwError);
dwError = RegstoreQueryValue(
hRegKey,
L"description",
REG_SZ,
(LPBYTE *)&pIpsecNFAObject->pszDescription,
&dwSize
);
// BAIL_ON_WIN32_ERROR(dwError);
dwError = RegstoreQueryValue(
hRegKey,
L"ipsecID",
REG_SZ,
(LPBYTE *)&pIpsecNFAObject->pszIpsecID,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
dwType = REG_DWORD;
dwSize = sizeof(DWORD);
dwError = RegQueryValueExW(
hRegKey,
L"ipsecDataType",
NULL,
&dwType,
(LPBYTE)&dwIpsecDataType,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
pIpsecNFAObject->dwIpsecDataType = dwIpsecDataType;
//
// unmarshall the ipsecData blob
//
dwError = RegstoreQueryValue(
hRegKey,
L"ipsecData",
REG_BINARY,
&pIpsecNFAObject->pIpsecData,
&pIpsecNFAObject->dwIpsecDataLen
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegstoreQueryValue(
hRegKey,
L"ipsecOwnersReference",
REG_SZ,
(LPBYTE *)&pIpsecNFAObject->pszIpsecOwnersReference,
&dwSize
);
// BAIL_ON_WIN32_ERROR(dwError);
dwError = RegstoreQueryValue(
hRegKey,
L"ipsecNegotiationPolicyReference",
REG_SZ,
(LPBYTE *)&pIpsecNFAObject->pszIpsecNegPolReference,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegstoreQueryValue(
hRegKey,
L"ipsecFilterReference",
REG_SZ,
(LPBYTE *)&pIpsecNFAObject->pszIpsecFilterReference,
&dwSize
);
// BAIL_ON_WIN32_ERROR(dwError);
dwType = REG_DWORD;
dwSize = sizeof(DWORD);
dwError = RegQueryValueExW(
hRegKey,
L"whenChanged",
NULL,
&dwType,
(LPBYTE)&dwWhenChanged,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
pIpsecNFAObject->dwWhenChanged = dwWhenChanged;
if (pIpsecNFAObject->pszIpsecFilterReference && *(pIpsecNFAObject->pszIpsecFilterReference)) {
pszTempFilterReference = AllocPolStr(
pIpsecNFAObject->pszIpsecFilterReference
);
if (!pszTempFilterReference) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
}
pszTempNegPolReference = AllocPolStr(
pIpsecNFAObject->pszIpsecNegPolReference
);
if (!pszTempNegPolReference) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
*ppszFilterReference = pszTempFilterReference;
*ppszNegPolReference = pszTempNegPolReference;
*ppIpsecNFAObject = pIpsecNFAObject;
cleanup:
if (hRegKey) {
RegCloseKey(hRegKey);
}
return(dwError);
error:
if (pIpsecNFAObject) {
FreeIpsecNFAObject(pIpsecNFAObject);
}
if (pszTempFilterReference) {
FreePolStr(pszTempFilterReference);
}
if (pszTempNegPolReference) {
FreePolStr(pszTempNegPolReference);
}
*ppIpsecNFAObject = NULL;
*ppszFilterReference = NULL;
*ppszNegPolReference = NULL;
goto cleanup;
}
DWORD
UnMarshallRegistryFilterObject(
HKEY hRegistryKey,
LPWSTR pszIpsecRegRootContainer,
LPWSTR pszIpsecFilterReference,
DWORD dwNameType,
PIPSEC_FILTER_OBJECT * ppIpsecFilterObject
)
{
PIPSEC_FILTER_OBJECT pIpsecFilterObject = NULL;
HKEY hRegKey = NULL;
DWORD dwType = 0;
DWORD dwSize = 0;
DWORD dwIpsecDataType = 0;
DWORD dwWhenChanged = 0;
LPBYTE pBuffer = NULL;
DWORD dwCount = 0;
DWORD i = 0;
LPWSTR * ppszIpsecNFANames = NULL;
LPWSTR pszString = NULL;
LPWSTR pszIpsecNFAReference = NULL;
LPWSTR pszTemp = NULL;
DWORD dwError = 0;
LPWSTR pszRelativeName = NULL;
DWORD dwRootPathLen = 0;
if (!pszIpsecFilterReference || !*pszIpsecFilterReference) {
dwError = ERROR_INVALID_DATA;
BAIL_ON_WIN32_ERROR(dwError);
}
if (dwNameType == REG_FULLY_QUALIFIED_NAME) {
dwRootPathLen = wcslen(pszIpsecRegRootContainer);
if (wcslen(pszIpsecFilterReference) <= (dwRootPathLen+1)) {
dwError = ERROR_INVALID_DATA;
BAIL_ON_WIN32_ERROR(dwError);
}
pszRelativeName = pszIpsecFilterReference + dwRootPathLen + 1;
}else {
pszRelativeName = pszIpsecFilterReference;
}
dwError = RegOpenKeyExW(
hRegistryKey,
pszRelativeName,
0,
KEY_ALL_ACCESS,
&hRegKey
);
BAIL_ON_WIN32_ERROR(dwError);
pIpsecFilterObject = (PIPSEC_FILTER_OBJECT)AllocPolMem(
sizeof(IPSEC_FILTER_OBJECT)
);
if (!pIpsecFilterObject) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
/*
dwError = RegstoreQueryValue(
hRegKey,
L"distinguishedName",
REG_SZ,
(LPBYTE *)&pIpsecFilterObject->pszDistinguishedName,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
*/
pIpsecFilterObject->pszDistinguishedName = AllocPolStr(
pszIpsecFilterReference
);
if (!pIpsecFilterObject->pszDistinguishedName) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
dwError = RegstoreQueryValue(
hRegKey,
L"description",
REG_SZ,
(LPBYTE *)&pIpsecFilterObject->pszDescription,
&dwSize
);
//BAIL_ON_WIN32_ERROR(dwError);
dwError = RegstoreQueryValue(
hRegKey,
L"ipsecName",
REG_SZ,
(LPBYTE *)&pIpsecFilterObject->pszIpsecName,
&dwSize
);
//BAIL_ON_WIN32_ERROR(dwError);
dwError = RegstoreQueryValue(
hRegKey,
L"ipsecID",
REG_SZ,
(LPBYTE *)&pIpsecFilterObject->pszIpsecID,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
dwType = REG_DWORD,
dwSize = sizeof(DWORD);
dwError = RegQueryValueExW(
hRegKey,
L"ipsecDataType",
NULL,
&dwType,
(LPBYTE)&dwIpsecDataType,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
pIpsecFilterObject->dwIpsecDataType = dwIpsecDataType;
//
// unmarshall the ipsecData blob
//
dwError = RegstoreQueryValue(
hRegKey,
L"ipsecData",
dwType,
&pIpsecFilterObject->pIpsecData,
&pIpsecFilterObject->dwIpsecDataLen
);
BAIL_ON_WIN32_ERROR(dwError);
//
// Owner's reference
//
dwError = RegstoreQueryValue(
hRegKey,
L"ipsecOwnersReference",
REG_MULTI_SZ,
(LPBYTE *)&pszIpsecNFAReference,
&dwSize
);
//BAIL_ON_WIN32_ERROR(dwError);
if (!dwError) {
pszTemp = pszIpsecNFAReference;
while (*pszTemp != L'\0') {
pszTemp += wcslen(pszTemp) + 1;
dwCount++;
}
ppszIpsecNFANames = (LPWSTR *)AllocPolMem(
sizeof(LPWSTR)*dwCount
);
if (!ppszIpsecNFANames) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
pszTemp = pszIpsecNFAReference;
for (i = 0; i < dwCount; i++) {
pszString = AllocPolStr(pszTemp);
if (!pszString) {
dwError = ERROR_OUTOFMEMORY;
pIpsecFilterObject->ppszIpsecNFAReferences = ppszIpsecNFANames;
pIpsecFilterObject->dwNFACount = i;
if (pszIpsecNFAReference) {
FreePolStr(pszIpsecNFAReference);
}
BAIL_ON_WIN32_ERROR(dwError);
}
*(ppszIpsecNFANames + i) = pszString;
pszTemp += wcslen(pszTemp) + 1; //for the null terminator;
}
if (pszIpsecNFAReference) {
FreePolStr(pszIpsecNFAReference);
}
pIpsecFilterObject->ppszIpsecNFAReferences = ppszIpsecNFANames;
pIpsecFilterObject->dwNFACount = dwCount;
}
dwType = REG_DWORD;
dwSize = sizeof(DWORD);
dwError = RegQueryValueExW(
hRegKey,
L"whenChanged",
NULL,
&dwType,
(LPBYTE)&dwWhenChanged,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
pIpsecFilterObject->dwWhenChanged = dwWhenChanged;
*ppIpsecFilterObject = pIpsecFilterObject;
cleanup:
if (hRegKey) {
RegCloseKey(hRegKey);
}
return(dwError);
error:
if (pIpsecFilterObject) {
FreeIpsecFilterObject(pIpsecFilterObject);
}
*ppIpsecFilterObject = NULL;
goto cleanup;
}
DWORD
UnMarshallRegistryNegPolObject(
HKEY hRegistryKey,
LPWSTR pszIpsecRegRootContainer,
LPWSTR pszIpsecNegPolReference,
DWORD dwNameType,
PIPSEC_NEGPOL_OBJECT * ppIpsecNegPolObject
)
{
PIPSEC_NEGPOL_OBJECT pIpsecNegPolObject = NULL;
HKEY hRegKey = NULL;
DWORD dwType = 0;
DWORD dwSize = 0;
DWORD dwIpsecDataType = 0;
DWORD dwWhenChanged = 0;
LPBYTE pBuffer = NULL;
DWORD dwCount = 0;
DWORD i = 0;
LPWSTR * ppszIpsecNFANames = NULL;
LPWSTR pszString = NULL;
LPWSTR pszIpsecNFAReference = NULL;
LPWSTR pszTemp = NULL;
DWORD dwError = 0;
LPWSTR pszRelativeName = NULL;
DWORD dwRootPathLen = 0;
if (!pszIpsecNegPolReference || !*pszIpsecNegPolReference) {
dwError = ERROR_INVALID_DATA;
BAIL_ON_WIN32_ERROR(dwError);
}
if (dwNameType == REG_FULLY_QUALIFIED_NAME) {
dwRootPathLen = wcslen(pszIpsecRegRootContainer);
if (wcslen(pszIpsecNegPolReference) <= (dwRootPathLen+1)) {
dwError = ERROR_INVALID_DATA;
BAIL_ON_WIN32_ERROR(dwError);
}
pszRelativeName = pszIpsecNegPolReference + dwRootPathLen + 1;
}else {
pszRelativeName = pszIpsecNegPolReference;
}
dwError = RegOpenKeyExW(
hRegistryKey,
pszRelativeName,
0,
KEY_ALL_ACCESS,
&hRegKey
);
BAIL_ON_WIN32_ERROR(dwError);
pIpsecNegPolObject = (PIPSEC_NEGPOL_OBJECT)AllocPolMem(
sizeof(IPSEC_NEGPOL_OBJECT)
);
if (!pIpsecNegPolObject) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
/*
dwError = RegstoreQueryValue(
hRegKey,
L"distinguishedName",
REG_SZ,
(LPBYTE *)&pIpsecNegPolObject->pszDistinguishedName,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
*/
pIpsecNegPolObject->pszDistinguishedName = AllocPolStr(
pszIpsecNegPolReference
);
if (!pIpsecNegPolObject->pszDistinguishedName) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
//
// Names do not get written on an NegPol Object
//
dwError = RegstoreQueryValue(
hRegKey,
L"ipsecName",
REG_SZ,
(LPBYTE *)&pIpsecNegPolObject->pszIpsecName,
&dwSize
);
// BAIL_ON_WIN32_ERROR(dwError);
dwError = RegstoreQueryValue(
hRegKey,
L"description",
REG_SZ,
(LPBYTE *)&pIpsecNegPolObject->pszDescription,
&dwSize
);
// BAIL_ON_WIN32_ERROR(dwError);
dwError = RegstoreQueryValue(
hRegKey,
L"ipsecID",
REG_SZ,
(LPBYTE *)&pIpsecNegPolObject->pszIpsecID,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegstoreQueryValue(
hRegKey,
L"ipsecNegotiationPolicyAction",
REG_SZ,
(LPBYTE *)&pIpsecNegPolObject->pszIpsecNegPolAction,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegstoreQueryValue(
hRegKey,
L"ipsecNegotiationPolicyType",
REG_SZ,
(LPBYTE *)&pIpsecNegPolObject->pszIpsecNegPolType,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
dwType = REG_DWORD;
dwSize = sizeof(DWORD);
dwError = RegQueryValueExW(
hRegKey,
L"ipsecDataType",
NULL,
&dwType,
(LPBYTE)&dwIpsecDataType,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
pIpsecNegPolObject->dwIpsecDataType = dwIpsecDataType;
dwError = RegstoreQueryValue(
hRegKey,
L"ipsecData",
REG_BINARY,
&pIpsecNegPolObject->pIpsecData,
&pIpsecNegPolObject->dwIpsecDataLen
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegstoreQueryValue(
hRegKey,
L"ipsecOwnersReference",
REG_MULTI_SZ,
(LPBYTE *)&pszIpsecNFAReference,
&dwSize
);
// BAIL_ON_WIN32_ERROR(dwError);
if (!dwError) {
pszTemp = pszIpsecNFAReference;
while (*pszTemp != L'\0') {
pszTemp += wcslen(pszTemp) + 1;
dwCount++;
}
ppszIpsecNFANames = (LPWSTR *)AllocPolMem(
sizeof(LPWSTR)*dwCount
);
if (!ppszIpsecNFANames) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
pszTemp = pszIpsecNFAReference;
for (i = 0; i < dwCount; i++) {
pszString = AllocPolStr(pszTemp);
if (!pszString) {
dwError = ERROR_OUTOFMEMORY;
pIpsecNegPolObject->ppszIpsecNFAReferences = ppszIpsecNFANames;
pIpsecNegPolObject->dwNFACount = i;
if (pszIpsecNFAReference) {
FreePolStr(pszIpsecNFAReference);
}
BAIL_ON_WIN32_ERROR(dwError);
}
*(ppszIpsecNFANames + i) = pszString;
pszTemp += wcslen(pszTemp) + 1; //for the null terminator;
}
if (pszIpsecNFAReference) {
FreePolStr(pszIpsecNFAReference);
}
pIpsecNegPolObject->ppszIpsecNFAReferences = ppszIpsecNFANames;
pIpsecNegPolObject->dwNFACount = dwCount;
}
dwType = REG_DWORD;
dwSize = sizeof(DWORD);
dwError = RegQueryValueExW(
hRegKey,
L"whenChanged",
NULL,
&dwType,
(LPBYTE)&dwWhenChanged,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
pIpsecNegPolObject->dwWhenChanged = dwWhenChanged;
*ppIpsecNegPolObject = pIpsecNegPolObject;
cleanup:
if (hRegKey) {
RegCloseKey(hRegKey);
}
return(dwError);
error:
if (pIpsecNegPolObject) {
FreeIpsecNegPolObject(pIpsecNegPolObject);
}
*ppIpsecNegPolObject = NULL;
goto cleanup;
}
DWORD
UnMarshallRegistryISAKMPObject(
HKEY hRegistryKey,
LPWSTR pszIpsecRegRootContainer,
LPWSTR pszIpsecISAKMPReference,
DWORD dwNameType,
PIPSEC_ISAKMP_OBJECT * ppIpsecISAKMPObject
)
{
PIPSEC_ISAKMP_OBJECT pIpsecISAKMPObject = NULL;
HKEY hRegKey = NULL;
DWORD dwType = 0;
DWORD dwSize = 0;
DWORD dwIpsecDataType = 0;
DWORD dwWhenChanged = 0;
LPBYTE pBuffer = NULL;
DWORD dwCount = 0;
DWORD i = 0;
LPWSTR * ppszIpsecNFANames = NULL;
LPWSTR pszString = NULL;
LPWSTR pszIpsecNFAReference = NULL;
LPWSTR pszTemp = NULL;
DWORD dwError = 0;
LPWSTR pszRelativeName = NULL;
DWORD dwRootPathLen = 0;
if (!pszIpsecISAKMPReference || !*pszIpsecISAKMPReference) {
dwError = ERROR_INVALID_DATA;
BAIL_ON_WIN32_ERROR(dwError);
}
if (dwNameType == REG_FULLY_QUALIFIED_NAME) {
dwRootPathLen = wcslen(pszIpsecRegRootContainer);
if (wcslen(pszIpsecISAKMPReference) <= (dwRootPathLen+1)) {
dwError = ERROR_INVALID_DATA;
BAIL_ON_WIN32_ERROR(dwError);
}
pszRelativeName = pszIpsecISAKMPReference + dwRootPathLen + 1;
}else {
pszRelativeName = pszIpsecISAKMPReference;
}
dwError = RegOpenKeyExW(
hRegistryKey,
pszRelativeName,
0,
KEY_ALL_ACCESS,
&hRegKey
);
BAIL_ON_WIN32_ERROR(dwError);
pIpsecISAKMPObject = (PIPSEC_ISAKMP_OBJECT)AllocPolMem(
sizeof(IPSEC_ISAKMP_OBJECT)
);
if (!pIpsecISAKMPObject) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
/*
dwError = RegstoreQueryValue(
hRegKey,
L"distinguishedName",
REG_SZ,
(LPBYTE *)&pIpsecISAKMPObject->pszDistinguishedName,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
*/
pIpsecISAKMPObject->pszDistinguishedName = AllocPolStr(
pszIpsecISAKMPReference
);
if (!pIpsecISAKMPObject->pszDistinguishedName) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
//
// Names are not set for ISAKMP objects
//
dwError = RegstoreQueryValue(
hRegKey,
L"ipsecName",
REG_SZ,
(LPBYTE *)&pIpsecISAKMPObject->pszIpsecName,
&dwSize
);
// BAIL_ON_WIN32_ERROR(dwError);
dwError = RegstoreQueryValue(
hRegKey,
L"ipsecID",
REG_SZ,
(LPBYTE *)&pIpsecISAKMPObject->pszIpsecID,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
dwType = REG_DWORD,
dwSize = sizeof(DWORD);
dwError = RegQueryValueExW(
hRegKey,
L"ipsecDataType",
NULL,
&dwType,
(LPBYTE)&dwIpsecDataType,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
pIpsecISAKMPObject->dwIpsecDataType = dwIpsecDataType;
//
// unmarshall the ipsecData blob
//
dwError = RegstoreQueryValue(
hRegKey,
L"ipsecData",
REG_BINARY,
&pIpsecISAKMPObject->pIpsecData,
&pIpsecISAKMPObject->dwIpsecDataLen
);
BAIL_ON_WIN32_ERROR(dwError);
//
// ipsecOwnersReference not written
//
dwError = RegstoreQueryValue(
hRegKey,
L"ipsecOwnersReference",
REG_MULTI_SZ,
(LPBYTE *)&pszIpsecNFAReference,
&dwSize
);
// BAIL_ON_WIN32_ERROR(dwError);
if (!dwError) {
pszTemp = pszIpsecNFAReference;
while (*pszTemp != L'\0') {
pszTemp += wcslen(pszTemp) + 1;
dwCount++;
}
ppszIpsecNFANames = (LPWSTR *)AllocPolMem(
sizeof(LPWSTR)*dwCount
);
if (!ppszIpsecNFANames) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
pszTemp = pszIpsecNFAReference;
for (i = 0; i < dwCount; i++) {
pszString = AllocPolStr(pszTemp);
if (!pszString) {
dwError = ERROR_OUTOFMEMORY;
pIpsecISAKMPObject->ppszIpsecNFAReferences = ppszIpsecNFANames;
pIpsecISAKMPObject->dwNFACount = i;
if (pszIpsecNFAReference) {
FreePolStr(pszIpsecNFAReference);
}
BAIL_ON_WIN32_ERROR(dwError);
}
*(ppszIpsecNFANames + i) = pszString;
pszTemp += wcslen(pszTemp) + 1; //for the null terminator;
}
if (pszIpsecNFAReference) {
FreePolStr(pszIpsecNFAReference);
}
pIpsecISAKMPObject->ppszIpsecNFAReferences = ppszIpsecNFANames;
pIpsecISAKMPObject->dwNFACount = dwCount;
}
dwType = REG_DWORD;
dwSize = sizeof(DWORD);
dwError = RegQueryValueExW(
hRegKey,
L"whenChanged",
NULL,
&dwType,
(LPBYTE)&dwWhenChanged,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
pIpsecISAKMPObject->dwWhenChanged = dwWhenChanged;
*ppIpsecISAKMPObject = pIpsecISAKMPObject;
cleanup:
if (hRegKey) {
RegCloseKey(hRegKey);
}
return(dwError);
error:
if (pIpsecISAKMPObject) {
FreeIpsecISAKMPObject(pIpsecISAKMPObject);
}
*ppIpsecISAKMPObject = NULL;
goto cleanup;
}
DWORD
RegstoreQueryValue(
HKEY hRegKey,
LPWSTR pszValueName,
DWORD dwType,
LPBYTE * ppValueData,
LPDWORD pdwSize
)
{
DWORD dwSize = 0;
LPWSTR pszValueData = NULL;
DWORD dwError = 0;
LPBYTE pBuffer = NULL;
LPWSTR pszBuf = NULL;
dwError = RegQueryValueExW(
hRegKey,
pszValueName,
NULL,
&dwType,
NULL,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
if (dwSize == 0) {
dwError = ERROR_INVALID_DATA;
BAIL_ON_WIN32_ERROR(dwError);
}
pBuffer = (LPBYTE)AllocPolMem(dwSize);
if (!pBuffer) {
dwError = ERROR_OUTOFMEMORY;
BAIL_ON_WIN32_ERROR(dwError);
}
dwError = RegQueryValueExW(
hRegKey,
pszValueName,
NULL,
&dwType,
pBuffer,
&dwSize
);
BAIL_ON_WIN32_ERROR(dwError);
switch (dwType) {
case REG_SZ:
pszBuf = (LPWSTR) pBuffer;
if (!pszBuf || !*pszBuf) {
dwError = ERROR_INVALID_DATA;
BAIL_ON_WIN32_ERROR(dwError);
}
break;
default:
break;
}
*ppValueData = pBuffer;
*pdwSize = dwSize;
return(dwError);
error:
if (pBuffer) {
FreePolMem(pBuffer);
}
*ppValueData = NULL;
*pdwSize = 0;
return(dwError);
}
VOID
FlushRegSaveKey(
HKEY hRegistryKey
)
{
DWORD dwError = 0;
WCHAR lpszName[MAX_PATH];
DWORD dwSize = 0;
memset(lpszName, 0, sizeof(WCHAR)*MAX_PATH);
dwSize = MAX_PATH;
while((RegEnumKeyExW(
hRegistryKey,
0,
lpszName,
&dwSize,
NULL,
NULL,
NULL,
NULL)) == ERROR_SUCCESS) {
dwError = RegDeleteKeyW(
hRegistryKey,
lpszName
);
if (dwError != ERROR_SUCCESS) {
break;
}
memset(lpszName, 0, sizeof(WCHAR)*MAX_PATH);
dwSize = MAX_PATH;
}
return;
}