//+------------------------------------------------------------------------- // // 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)); }