187 lines
4 KiB
C
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);
|
|
}
|
|
|