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

187 lines
4 KiB
C

#include "precomp.h"
#define COUNTOF(x) (sizeof x/sizeof *x)
DWORD
DllRegisterServer(
)
{
DWORD dwError = 0;
HKEY hRegistryKey = NULL;
HKEY hOakleyKey = NULL;
DWORD dwDisposition = 0;
DWORD dwTypesSupported = 7;
HKEY hPolicyLocationKey = NULL;
HANDLE hPolicyStore = NULL;
dwError = RegOpenKeyExW(
HKEY_LOCAL_MACHINE,
(LPCWSTR) L"SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application",
0,
KEY_ALL_ACCESS,
&hRegistryKey
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegCreateKeyExW(
hRegistryKey,
L"Oakley",
0,
NULL,
0,
KEY_ALL_ACCESS,
NULL,
&hOakleyKey,
&dwDisposition
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegSetValueExW(
hOakleyKey,
L"EventMessageFile",
0,
REG_SZ,
(LPBYTE) L"%SystemRoot%\\System32\\oakley.dll",
(wcslen(L"%SystemRoot%\\System32\\oakley.dll") + 1)*sizeof(WCHAR)
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = RegSetValueExW(
hOakleyKey,
L"TypesSupported",
0,
REG_DWORD,
(LPBYTE) &dwTypesSupported,
sizeof(DWORD)
);
BAIL_ON_WIN32_ERROR(dwError);
if (IsCleanInstall()) {
dwError = RegCreateKeyExW(
HKEY_LOCAL_MACHINE,
L"SOFTWARE\\Policies\\Microsoft\\Windows\\IPSec\\Policy\\Local",
0,
NULL,
0,
KEY_ALL_ACCESS,
NULL,
&hPolicyLocationKey,
&dwDisposition
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = IPSecOpenPolicyStore(
NULL,
IPSEC_REGISTRY_PROVIDER,
NULL,
&hPolicyStore
);
BAIL_ON_WIN32_ERROR(dwError);
dwError = GenerateDefaultInformation(
hPolicyStore
);
BAIL_ON_WIN32_ERROR(dwError);
}
error:
if (hPolicyStore) {
(VOID) IPSecClosePolicyStore(
hPolicyStore
);
}
if (hPolicyLocationKey) {
RegCloseKey(hPolicyLocationKey);
}
if (hOakleyKey) {
RegCloseKey(hOakleyKey);
}
if (hRegistryKey) {
RegCloseKey(hRegistryKey);
}
return (dwError);
}
DWORD
DllUnregisterServer(
)
{
return (ERROR_SUCCESS);
}
BOOL
IsCleanInstall(
)
{
BOOL bStatus = FALSE;
bStatus = LocalIpsecInfoExists(
HKEY_LOCAL_MACHINE,
L"SOFTWARE\\Policies\\Microsoft\\Windows\\IPSec\\Policy\\Local"
);
return (!bStatus);
}
BOOL
LocalIpsecInfoExists(
HKEY hSourceParentKey,
LPWSTR pszSourceKey
)
{
DWORD dwError = 0;
HKEY hSourceKey = NULL;
BOOL bStatus = FALSE;
WCHAR lpszName[MAX_PATH];
DWORD dwSize = 0;
DWORD dwCount = 0;
dwError = RegOpenKeyExW(
hSourceParentKey,
pszSourceKey,
0,
KEY_ALL_ACCESS,
&hSourceKey
);
if (dwError != ERROR_SUCCESS) {
return (bStatus);
}
memset(lpszName, 0, sizeof(WCHAR)*MAX_PATH);
dwSize = COUNTOF(lpszName);
if ((RegEnumKeyExW(
hSourceKey,
dwCount,
lpszName,
&dwSize,
NULL,
NULL,
NULL,
NULL)) == ERROR_SUCCESS) {
bStatus = TRUE;
}
else {
bStatus = FALSE;
}
RegCloseKey(hSourceKey);
return (bStatus);
}