234 lines
5 KiB
C
234 lines
5 KiB
C
|
|
|
|
#include "precomp.h"
|
|
|
|
|
|
LPWSTR gpszIpsecLocalPolicyKey = L"SOFTWARE\\Policies\\Microsoft\\Windows\\IPSec\\Policy\\Local";
|
|
|
|
LPWSTR gpszIpsecDSPolicyKey = L"SOFTWARE\\Policies\\Microsoft\\Windows\\IPSec\\GPTIPSECPolicy";
|
|
|
|
DWORD
|
|
IPSecIsDomainPolicyAssigned(
|
|
PBOOL pbIsDomainPolicyAssigned
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
BOOL bIsDomainPolicyAssigned = FALSE;
|
|
HKEY hRegistryKey = NULL;
|
|
DWORD dwType = 0;
|
|
DWORD dwDSPolicyPathLength = 0;
|
|
|
|
|
|
dwError = RegOpenKeyExW(
|
|
HKEY_LOCAL_MACHINE,
|
|
(LPCWSTR) gpszIpsecDSPolicyKey,
|
|
0,
|
|
KEY_ALL_ACCESS,
|
|
&hRegistryKey
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
dwError = RegQueryValueExW(
|
|
hRegistryKey,
|
|
L"DSIPSECPolicyPath",
|
|
NULL,
|
|
&dwType,
|
|
NULL,
|
|
&dwDSPolicyPathLength
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
if (dwDSPolicyPathLength > 0) {
|
|
bIsDomainPolicyAssigned = TRUE;
|
|
}
|
|
|
|
*pbIsDomainPolicyAssigned = bIsDomainPolicyAssigned;
|
|
|
|
cleanup:
|
|
|
|
if (hRegistryKey) {
|
|
RegCloseKey(hRegistryKey);
|
|
}
|
|
|
|
return (dwError);
|
|
|
|
error:
|
|
|
|
*pbIsDomainPolicyAssigned = FALSE;
|
|
|
|
goto cleanup;
|
|
}
|
|
|
|
|
|
DWORD
|
|
IPSecIsLocalPolicyAssigned(
|
|
PBOOL pbIsLocalPolicyAssigned
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
BOOL bIsLocalPolicyAssigned = FALSE;
|
|
HKEY hRegistryKey = NULL;
|
|
DWORD dwType = 0;
|
|
DWORD dwLocalPolicyPathLength = 0;
|
|
|
|
|
|
dwError = RegOpenKeyExW(
|
|
HKEY_LOCAL_MACHINE,
|
|
(LPCWSTR) gpszIpsecLocalPolicyKey,
|
|
0,
|
|
KEY_ALL_ACCESS,
|
|
&hRegistryKey
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
dwError = RegQueryValueExW(
|
|
hRegistryKey,
|
|
L"ActivePolicy",
|
|
NULL,
|
|
&dwType,
|
|
NULL,
|
|
&dwLocalPolicyPathLength
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
if (dwLocalPolicyPathLength > 0) {
|
|
bIsLocalPolicyAssigned = TRUE;
|
|
}
|
|
|
|
*pbIsLocalPolicyAssigned = bIsLocalPolicyAssigned;
|
|
|
|
cleanup:
|
|
|
|
if (hRegistryKey) {
|
|
RegCloseKey(hRegistryKey);
|
|
}
|
|
|
|
return (dwError);
|
|
|
|
error:
|
|
|
|
*pbIsLocalPolicyAssigned = FALSE;
|
|
|
|
goto cleanup;
|
|
}
|
|
|
|
|
|
DWORD
|
|
IPSecGetAssignedDomainPolicyName(
|
|
LPWSTR * ppszAssignedDomainPolicyName
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
LPWSTR pszAssignedDomainPolicyName = NULL;
|
|
HKEY hRegistryKey = NULL;
|
|
DWORD dwType = 0;
|
|
DWORD dwSize = 0;
|
|
|
|
|
|
dwError = RegOpenKeyExW(
|
|
HKEY_LOCAL_MACHINE,
|
|
(LPCWSTR) gpszIpsecDSPolicyKey,
|
|
0,
|
|
KEY_ALL_ACCESS,
|
|
&hRegistryKey
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
dwError = RegstoreQueryValue(
|
|
hRegistryKey,
|
|
L"DSIPSECPolicyName",
|
|
REG_SZ,
|
|
(LPBYTE *)&pszAssignedDomainPolicyName,
|
|
&dwSize
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
*ppszAssignedDomainPolicyName = pszAssignedDomainPolicyName;
|
|
|
|
cleanup:
|
|
|
|
if (hRegistryKey) {
|
|
RegCloseKey(hRegistryKey);
|
|
}
|
|
|
|
return (dwError);
|
|
|
|
error:
|
|
|
|
*ppszAssignedDomainPolicyName = NULL;
|
|
|
|
goto cleanup;
|
|
}
|
|
|
|
|
|
DWORD
|
|
RegGetAssignedPolicyData(
|
|
HKEY hRegistryKey,
|
|
LPWSTR pszIpsecRootContainer,
|
|
PIPSEC_POLICY_DATA * ppIpsecPolicyData
|
|
)
|
|
{
|
|
DWORD dwError = 0;
|
|
LPWSTR pszIpsecPolicyName = NULL;
|
|
DWORD dwSize = 0;
|
|
LPWSTR pszRelativeName = NULL;
|
|
PIPSEC_POLICY_OBJECT pIpsecPolicyObject = NULL;
|
|
PIPSEC_POLICY_DATA pIpsecPolicyData = NULL;
|
|
|
|
|
|
dwError = RegstoreQueryValue(
|
|
hRegistryKey,
|
|
L"ActivePolicy",
|
|
REG_SZ,
|
|
(LPBYTE *)&pszIpsecPolicyName,
|
|
&dwSize
|
|
);
|
|
|
|
if (pszIpsecPolicyName && *pszIpsecPolicyName) {
|
|
if (wcslen(pszIpsecPolicyName) >
|
|
(wcslen(pszIpsecRootContainer) + 1)) {
|
|
pszRelativeName = pszIpsecPolicyName
|
|
+ wcslen(pszIpsecRootContainer) + 1;
|
|
|
|
dwError = UnMarshallRegistryPolicyObject(
|
|
hRegistryKey,
|
|
pszIpsecRootContainer,
|
|
pszRelativeName,
|
|
REG_RELATIVE_NAME,
|
|
&pIpsecPolicyObject
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
dwError = RegUnmarshallPolicyData(
|
|
pIpsecPolicyObject,
|
|
&pIpsecPolicyData
|
|
);
|
|
BAIL_ON_WIN32_ERROR(dwError);
|
|
|
|
}
|
|
}
|
|
|
|
*ppIpsecPolicyData = pIpsecPolicyData;
|
|
|
|
cleanup:
|
|
|
|
if (pszIpsecPolicyName) {
|
|
FreePolStr(pszIpsecPolicyName);
|
|
}
|
|
|
|
if (pIpsecPolicyObject) {
|
|
FreeIpsecPolicyObject(
|
|
pIpsecPolicyObject
|
|
);
|
|
}
|
|
|
|
return (dwError);
|
|
|
|
error:
|
|
|
|
*ppIpsecPolicyData = NULL;
|
|
|
|
goto cleanup;
|
|
}
|
|
|