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

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