357 lines
7.4 KiB
C++
357 lines
7.4 KiB
C++
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
//
|
||
|
// Copyright (C) Microsoft Corporation, 1996 - 1999
|
||
|
//
|
||
|
// File: pkireg.cpp
|
||
|
//
|
||
|
// Contents: Microsoft Internet Security Register
|
||
|
//
|
||
|
// Functions: RegisterCryptoDlls
|
||
|
// CleanupRegistry
|
||
|
//
|
||
|
// *** local functions ***
|
||
|
//
|
||
|
// History: 06-Jun-1997 pberkman created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
#include "global.hxx"
|
||
|
#include "cryptreg.h"
|
||
|
|
||
|
char *ppszDlls[] =
|
||
|
{
|
||
|
"wintrust.dll",
|
||
|
"mssign32.dll",
|
||
|
"cryptui.dll",
|
||
|
"cryptnet.dll",
|
||
|
"cryptext.dll",
|
||
|
"xenroll.dll",
|
||
|
|
||
|
NULL
|
||
|
};
|
||
|
|
||
|
POLSET psPolicySettings[] =
|
||
|
{
|
||
|
WTPF_IGNOREREVOKATION, FALSE,
|
||
|
WTPF_IGNOREREVOCATIONONTS, TRUE,
|
||
|
WTPF_OFFLINEOK_IND, TRUE,
|
||
|
WTPF_OFFLINEOK_COM, TRUE,
|
||
|
WTPF_OFFLINEOKNBU_IND, TRUE,
|
||
|
WTPF_OFFLINEOKNBU_COM, TRUE,
|
||
|
|
||
|
0, 0
|
||
|
};
|
||
|
|
||
|
char *ppszOldHKLMRegistryKeys[] =
|
||
|
{
|
||
|
"SOFTWARE\\Microsoft\\Cryptography\\Providers\\Subject",
|
||
|
|
||
|
NULL
|
||
|
};
|
||
|
|
||
|
void DeleteKeys(HKEY hKeyParent, char *pszKey);
|
||
|
|
||
|
|
||
|
#define PKIREG_WINLOGON_EXT_PREFIX \
|
||
|
"Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\Notify\\"
|
||
|
|
||
|
void RegisterWinlogonExtension(
|
||
|
IN LPCSTR pszSubKey,
|
||
|
IN LPCSTR pszDll,
|
||
|
IN LPCSTR pszProc
|
||
|
)
|
||
|
{
|
||
|
HKEY hKey;
|
||
|
DWORD dwDisposition;
|
||
|
DWORD dwValue;
|
||
|
|
||
|
LPSTR pszKey; // _alloca'ed
|
||
|
DWORD cchKey;
|
||
|
|
||
|
|
||
|
if ( FIsWinNT5() == FALSE )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
cchKey = strlen(PKIREG_WINLOGON_EXT_PREFIX) + strlen(pszSubKey) + 1;
|
||
|
__try {
|
||
|
pszKey = (LPSTR) _alloca(cchKey);
|
||
|
} __except(EXCEPTION_EXECUTE_HANDLER) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
strcpy(pszKey, PKIREG_WINLOGON_EXT_PREFIX);
|
||
|
strcat(pszKey, pszSubKey);
|
||
|
|
||
|
if ( RegCreateKeyExA(
|
||
|
HKEY_LOCAL_MACHINE,
|
||
|
pszKey,
|
||
|
0,
|
||
|
NULL,
|
||
|
0,
|
||
|
KEY_ALL_ACCESS,
|
||
|
NULL,
|
||
|
&hKey,
|
||
|
&dwDisposition
|
||
|
) != ERROR_SUCCESS )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
dwValue = 0;
|
||
|
RegSetValueExA( hKey, "Asynchronous", 0, REG_DWORD, (LPBYTE)&dwValue, sizeof( dwValue ) );
|
||
|
RegSetValueExA( hKey, "Impersonate", 0, REG_DWORD, (LPBYTE)&dwValue, sizeof( dwValue ) );
|
||
|
|
||
|
RegSetValueExA( hKey, "DllName", 0, REG_EXPAND_SZ, (LPBYTE) pszDll,
|
||
|
strlen(pszDll) + 1 );
|
||
|
RegSetValueExA( hKey, "Logoff", 0, REG_SZ, (LPBYTE) pszProc,
|
||
|
strlen(pszProc) + 1 );
|
||
|
|
||
|
RegCloseKey( hKey );
|
||
|
}
|
||
|
|
||
|
|
||
|
void RegisterCrypt32EventSource()
|
||
|
{
|
||
|
HKEY hKey;
|
||
|
DWORD dwDisposition;
|
||
|
LPCSTR pszEventMessageFile = "%SystemRoot%\\System32\\crypt32.dll";
|
||
|
DWORD dwTypesSupported;
|
||
|
|
||
|
if ( FIsWinNT5() == FALSE )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if ( RegCreateKeyExA(
|
||
|
HKEY_LOCAL_MACHINE,
|
||
|
"SYSTEM\\CurrentControlSet\\Services\\Eventlog\\Application\\crypt32",
|
||
|
0,
|
||
|
NULL,
|
||
|
0,
|
||
|
KEY_ALL_ACCESS,
|
||
|
NULL,
|
||
|
&hKey,
|
||
|
&dwDisposition
|
||
|
) != ERROR_SUCCESS )
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
RegSetValueExA(
|
||
|
hKey,
|
||
|
"EventMessageFile",
|
||
|
0,
|
||
|
REG_EXPAND_SZ,
|
||
|
(LPBYTE) pszEventMessageFile,
|
||
|
strlen(pszEventMessageFile) + 1
|
||
|
);
|
||
|
|
||
|
dwTypesSupported = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE |
|
||
|
EVENTLOG_INFORMATION_TYPE;
|
||
|
|
||
|
RegSetValueExA(
|
||
|
hKey,
|
||
|
"TypesSupported",
|
||
|
0,
|
||
|
REG_DWORD,
|
||
|
(LPBYTE) &dwTypesSupported,
|
||
|
sizeof(DWORD)
|
||
|
);
|
||
|
|
||
|
RegCloseKey( hKey );
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT RegisterCryptoDlls(BOOL fSetFlags)
|
||
|
{
|
||
|
char **ppszDll;
|
||
|
|
||
|
BOOL fRet;
|
||
|
|
||
|
fRet = TRUE;
|
||
|
ppszDll = ppszDlls;
|
||
|
|
||
|
while (*ppszDll)
|
||
|
{
|
||
|
fRet &= _LoadAndRegister(*ppszDll, FALSE);
|
||
|
|
||
|
ppszDll++;
|
||
|
}
|
||
|
|
||
|
if (fSetFlags)
|
||
|
{
|
||
|
fRet &= _AdjustPolicyFlags(psPolicySettings);
|
||
|
}
|
||
|
|
||
|
// Unregister previously registered DLL's
|
||
|
|
||
|
// vsrevoke.dll
|
||
|
CryptUnregisterDefaultOIDFunction(
|
||
|
X509_ASN_ENCODING,
|
||
|
CRYPT_OID_VERIFY_REVOCATION_FUNC,
|
||
|
L"vsrevoke.dll"
|
||
|
);
|
||
|
|
||
|
// mscrlrev.dll
|
||
|
CryptUnregisterDefaultOIDFunction(
|
||
|
X509_ASN_ENCODING,
|
||
|
CRYPT_OID_VERIFY_REVOCATION_FUNC,
|
||
|
L"mscrlrev.dll"
|
||
|
);
|
||
|
|
||
|
// msctl.dll
|
||
|
CryptUnregisterDefaultOIDFunction(
|
||
|
X509_ASN_ENCODING,
|
||
|
CRYPT_OID_VERIFY_CTL_USAGE_FUNC,
|
||
|
L"msctl.dll"
|
||
|
);
|
||
|
|
||
|
RegisterWinlogonExtension("crypt32chain", "crypt32.dll",
|
||
|
"ChainWlxLogoffEvent");
|
||
|
RegisterWinlogonExtension("cryptnet", "cryptnet.dll",
|
||
|
"CryptnetWlxLogoffEvent");
|
||
|
|
||
|
RegisterCrypt32EventSource();
|
||
|
|
||
|
return((fRet) ? S_OK : S_FALSE);
|
||
|
|
||
|
}
|
||
|
|
||
|
HRESULT UnregisterCryptoDlls(void)
|
||
|
{
|
||
|
char **ppszDll;
|
||
|
|
||
|
BOOL fRet;
|
||
|
|
||
|
fRet = TRUE;
|
||
|
ppszDll = ppszDlls;
|
||
|
|
||
|
while (*ppszDll)
|
||
|
{
|
||
|
fRet &= _LoadAndRegister(*ppszDll, TRUE);
|
||
|
|
||
|
ppszDll++;
|
||
|
}
|
||
|
|
||
|
return((fRet) ? S_OK : S_FALSE);
|
||
|
}
|
||
|
|
||
|
void CleanupRegistry(void)
|
||
|
{
|
||
|
char **ppszKeys;
|
||
|
|
||
|
ppszKeys = ppszOldHKLMRegistryKeys;
|
||
|
|
||
|
while (*ppszKeys)
|
||
|
{
|
||
|
|
||
|
DeleteKeys(HKEY_LOCAL_MACHINE, *ppszKeys);
|
||
|
|
||
|
ppszKeys++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void DeleteKeys(HKEY hKeyParent, char *pszKey)
|
||
|
{
|
||
|
HKEY hKey;
|
||
|
char szSubKey[REG_MAX_KEY_NAME];
|
||
|
|
||
|
if (RegOpenKeyEx(hKeyParent, pszKey, 0, KEY_READ, &hKey) == ERROR_SUCCESS)
|
||
|
{
|
||
|
while (RegEnumKey(hKey, 0, &szSubKey[0], REG_MAX_KEY_NAME) == ERROR_SUCCESS)
|
||
|
{
|
||
|
// WARNING: recursive!
|
||
|
DeleteKeys(hKey, &szSubKey[0]);
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKey);
|
||
|
|
||
|
RegDeleteKey(hKeyParent, pszKey);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
typedef HRESULT (WINAPI *DllRegisterServer)(void);
|
||
|
|
||
|
BOOL _LoadAndRegister(char *pszDll, BOOL fUnregister)
|
||
|
{
|
||
|
DllRegisterServer pfn;
|
||
|
HINSTANCE hDll;
|
||
|
BOOL fRet;
|
||
|
|
||
|
fRet = TRUE;
|
||
|
|
||
|
if (!(hDll = LoadLibrary(pszDll)))
|
||
|
{
|
||
|
goto LoadLibraryFail;
|
||
|
}
|
||
|
|
||
|
if (!(pfn = (DllRegisterServer)GetProcAddress(hDll, (fUnregister) ? "DllUnregisterServer" : "DllRegisterServer")))
|
||
|
{
|
||
|
goto ProcAddressFail;
|
||
|
}
|
||
|
|
||
|
if ((*pfn)() != S_OK)
|
||
|
{
|
||
|
goto DllRegisterFailed;
|
||
|
}
|
||
|
|
||
|
CommonReturn:
|
||
|
if (hDll)
|
||
|
{
|
||
|
FreeLibrary(hDll);
|
||
|
}
|
||
|
return(fRet);
|
||
|
|
||
|
ErrorReturn:
|
||
|
fRet = FALSE;
|
||
|
goto CommonReturn;
|
||
|
|
||
|
TRACE_ERROR_EX(DBG_SS, LoadLibraryFail);
|
||
|
TRACE_ERROR_EX(DBG_SS, ProcAddressFail);
|
||
|
TRACE_ERROR_EX(DBG_SS, DllRegisterFailed);
|
||
|
}
|
||
|
|
||
|
BOOL _AdjustPolicyFlags(POLSET *pPolSet)
|
||
|
{
|
||
|
DWORD dwPolSettings;
|
||
|
POLSET *pPol;
|
||
|
|
||
|
dwPolSettings = 0;
|
||
|
|
||
|
WintrustGetRegPolicyFlags(&dwPolSettings);
|
||
|
|
||
|
// In WXP, changed to always update the settings
|
||
|
#if 0
|
||
|
//
|
||
|
// only do this if we aren't set yet.
|
||
|
//
|
||
|
if (dwPolSettings != 0)
|
||
|
{
|
||
|
return(TRUE);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
pPol = pPolSet;
|
||
|
|
||
|
while (pPol->dwSetting > 0)
|
||
|
{
|
||
|
if (pPol->fOn)
|
||
|
{
|
||
|
dwPolSettings |= pPol->dwSetting;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
dwPolSettings &= ~(pPol->dwSetting);
|
||
|
}
|
||
|
|
||
|
pPol++;
|
||
|
}
|
||
|
|
||
|
return(WintrustSetRegPolicyFlags(dwPolSettings));
|
||
|
}
|