|
|
#include "precomp.h"
DWORD LoadPersistedQMPolicies( HKEY hParentRegKey ) { DWORD dwError = 0; HKEY hRegKey = NULL; DWORD dwSize = 0; WCHAR szQMPolicyUniqueID[MAX_PATH]; DWORD dwIndex = 0; PIPSEC_QM_POLICY pQMPolicy = NULL; LPWSTR pszServerName = NULL; DWORD dwPersist = 0;
dwPersist |= PERSIST_SPD_OBJECT;
dwError = RegOpenKeyExW( hParentRegKey, L"QM Policies", 0, KEY_ALL_ACCESS, &hRegKey ); BAIL_ON_WIN32_ERROR(dwError);
while (1) {
dwSize = MAX_PATH; szQMPolicyUniqueID[0] = L'\0';
dwError = RegEnumKeyExW( hRegKey, dwIndex, szQMPolicyUniqueID, &dwSize, NULL, NULL, 0, 0 );
if (dwError == ERROR_NO_MORE_ITEMS) { dwError = ERROR_SUCCESS; break; }
BAIL_ON_WIN32_ERROR(dwError);
dwError = SPDReadQMPolicy( hRegKey, szQMPolicyUniqueID, &pQMPolicy );
if (dwError) { dwIndex++; continue; }
dwError = AddQMPolicy( pszServerName, dwPersist, pQMPolicy );
if (pQMPolicy) { FreeQMPolicies( 1, pQMPolicy ); }
dwIndex++;
}
error:
if (hRegKey) { RegCloseKey(hRegKey); }
return (dwError); }
DWORD SPDReadQMPolicy( HKEY hParentRegKey, LPWSTR pszQMPolicyUniqueID, PIPSEC_QM_POLICY * ppQMPolicy ) { DWORD dwError = 0; HKEY hRegKey = NULL; PIPSEC_QM_POLICY pQMPolicy = NULL; LPWSTR pszPolicyID = NULL; DWORD dwSize = 0; DWORD dwType = 0; LPBYTE pBuffer = NULL; DWORD dwBufferSize = 0;
dwError = RegOpenKeyExW( hParentRegKey, pszQMPolicyUniqueID, 0, KEY_ALL_ACCESS, &hRegKey ); BAIL_ON_WIN32_ERROR(dwError);
pQMPolicy = (PIPSEC_QM_POLICY) AllocSPDMem( sizeof(IPSEC_QM_POLICY) ); if (!pQMPolicy) { dwError = ERROR_OUTOFMEMORY; BAIL_ON_WIN32_ERROR(dwError); }
dwError = RegstoreQueryValue( hRegKey, L"PolicyID", REG_SZ, (LPBYTE *)&pszPolicyID, &dwSize ); BAIL_ON_WIN32_ERROR(dwError);
wGUIDFromString( pszPolicyID, &pQMPolicy->gPolicyID );
dwError = RegstoreQueryValue( hRegKey, L"PolicyName", REG_SZ, (LPBYTE *)&pQMPolicy->pszPolicyName, &dwSize ); BAIL_ON_WIN32_ERROR(dwError);
dwType = REG_DWORD; dwSize = sizeof(DWORD); dwError = RegQueryValueExW( hRegKey, L"Flags", NULL, &dwType, (LPBYTE)&pQMPolicy->dwFlags, &dwSize ); BAIL_ON_WIN32_ERROR(dwError);
dwError = RegstoreQueryValue( hRegKey, L"Offers", REG_BINARY, (LPBYTE *)&pBuffer, &dwBufferSize ); BAIL_ON_WIN32_ERROR(dwError);
dwError = UnMarshallQMOffers( pBuffer, dwBufferSize, &pQMPolicy->pOffers, &pQMPolicy->dwOfferCount ); BAIL_ON_WIN32_ERROR(dwError);
*ppQMPolicy = pQMPolicy;
cleanup:
if (hRegKey) { RegCloseKey(hRegKey); }
if (pszPolicyID) { FreeSPDStr(pszPolicyID); }
if (pBuffer) { FreeSPDMem(pBuffer); }
return (dwError);
error:
*ppQMPolicy = NULL;
if (pQMPolicy) { FreeQMPolicies( 1, pQMPolicy ); }
goto cleanup; }
DWORD UnMarshallQMOffers( LPBYTE pBuffer, DWORD dwBufferSize, PIPSEC_QM_OFFER * ppOffers, PDWORD pdwOfferCount ) { DWORD dwError = 0; LPBYTE pMem = NULL; PIPSEC_QM_OFFER pOffers = NULL; DWORD dwOfferCount = 0;
pMem = pBuffer;
pMem += sizeof(GUID); pMem += sizeof(DWORD);
memcpy( (LPBYTE) &dwOfferCount, pMem, sizeof(DWORD) ); pMem += sizeof(DWORD);
pOffers = (PIPSEC_QM_OFFER) AllocSPDMem( sizeof(IPSEC_QM_OFFER)*dwOfferCount ); if (!pOffers) { dwError = ERROR_OUTOFMEMORY; BAIL_ON_WIN32_ERROR(dwError); }
memcpy( (LPBYTE) pOffers, pMem, sizeof(IPSEC_QM_OFFER)*dwOfferCount );
*ppOffers = pOffers; *pdwOfferCount = dwOfferCount; return (dwError);
error:
*ppOffers = NULL; *pdwOfferCount = 0; return (dwError); }
|