337 lines
8 KiB
C++
337 lines
8 KiB
C++
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
//
|
||
|
// Copyright (C) Microsoft Corporation, 1996 - 1999
|
||
|
//
|
||
|
// File: registry.cpp
|
||
|
//
|
||
|
// Contents: Microsoft Internet Security Trust Provider
|
||
|
//
|
||
|
// Functions: WintrustGetRegPolicyFlags
|
||
|
// GetRegProvider
|
||
|
// SetRegProvider
|
||
|
// GetRegSecuritySettings
|
||
|
//
|
||
|
// History: 28-May-1997 pberkman created
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
#include "global.hxx"
|
||
|
|
||
|
#include "cryptreg.h"
|
||
|
|
||
|
|
||
|
#define SZIE30SAFTYLEVEL L"Software\\Microsoft\\Internet Explorer\\Security"
|
||
|
#define SZIE30SAFTYLEVELNAME L"Safety Warning Level"
|
||
|
#define STATUS_SIZE 64
|
||
|
|
||
|
BOOL GetRegProvider(GUID *pgActionID, WCHAR *pwszRegKey, WCHAR *pwszRetDLLName, char *pszRetFuncName)
|
||
|
{
|
||
|
HKEY hKey;
|
||
|
WCHAR wsz[REG_MAX_KEY_NAME];
|
||
|
WCHAR wszGuid[REG_MAX_GUID_TEXT];
|
||
|
DWORD dwType;
|
||
|
DWORD dwSize;
|
||
|
|
||
|
if (!(pgActionID) ||
|
||
|
!(pwszRegKey) ||
|
||
|
!(pwszRetDLLName) ||
|
||
|
!(pszRetFuncName))
|
||
|
{
|
||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
pwszRetDLLName[0] = NULL;
|
||
|
pszRetFuncName[0] = NULL;
|
||
|
|
||
|
|
||
|
if (!(guid2wstr(pgActionID, &wszGuid[0])))
|
||
|
{
|
||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
wcscpy(&wsz[0], pwszRegKey);
|
||
|
wcscat(&wsz[0], L"\\");
|
||
|
wcscat(&wsz[0], &wszGuid[0]);
|
||
|
|
||
|
if (RegOpenKeyExU( HKEY_LOCAL_MACHINE,
|
||
|
&wsz[0],
|
||
|
0,
|
||
|
KEY_READ,
|
||
|
&hKey) != ERROR_SUCCESS)
|
||
|
{
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
dwType = 0;
|
||
|
dwSize = (REG_MAX_KEY_NAME) * sizeof(WCHAR);
|
||
|
|
||
|
if (RegQueryValueExU( hKey,
|
||
|
REG_DLL_NAME,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
(BYTE *)pwszRetDLLName,
|
||
|
&dwSize) != ERROR_SUCCESS)
|
||
|
{
|
||
|
pwszRetDLLName[0] = NULL;
|
||
|
RegCloseKey(hKey);
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
|
||
|
dwType = 0;
|
||
|
dwSize = (REG_MAX_FUNC_NAME) * sizeof(WCHAR);
|
||
|
|
||
|
if (RegQueryValueExU( hKey,
|
||
|
REG_FUNC_NAME,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
(BYTE *)&wsz[0],
|
||
|
&dwSize) != ERROR_SUCCESS)
|
||
|
{
|
||
|
pszRetFuncName[0] = NULL;
|
||
|
RegCloseKey(hKey);
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
if (WideCharToMultiByte(0, 0, &wsz[0], wcslen(&wsz[0]) + 1,
|
||
|
pszRetFuncName, REG_MAX_FUNC_NAME, NULL, NULL) < 1)
|
||
|
{
|
||
|
RegCloseKey(hKey);
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
|
||
|
RegCloseKey(hKey);
|
||
|
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
BOOL SetRegProvider(GUID *pgActionID, WCHAR *pwszRegKey, WCHAR *pwszDLLName, WCHAR *pwszFuncName)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
DWORD dwDisposition;
|
||
|
HKEY hKey;
|
||
|
WCHAR wsz[REG_MAX_KEY_NAME];
|
||
|
WCHAR wszGuid[REG_MAX_GUID_TEXT];
|
||
|
|
||
|
if (!(pgActionID) ||
|
||
|
!(pwszRegKey) ||
|
||
|
!(pwszDLLName) ||
|
||
|
!(pwszFuncName))
|
||
|
{
|
||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
if (!(guid2wstr(pgActionID, &wszGuid[0])))
|
||
|
{
|
||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
wcscpy(&wsz[0], pwszRegKey);
|
||
|
wcscat(&wsz[0], L"\\");
|
||
|
wcscat(&wsz[0], &wszGuid[0]);
|
||
|
|
||
|
hr = RegCreateKeyExU(HKEY_LOCAL_MACHINE,
|
||
|
&wsz[0],
|
||
|
0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL,
|
||
|
&hKey, &dwDisposition);
|
||
|
if (hr != ERROR_SUCCESS)
|
||
|
{
|
||
|
SetLastError(hr);
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
hr = RegSetValueExU(hKey, REG_DLL_NAME,
|
||
|
0, REG_SZ,
|
||
|
(BYTE *)pwszDLLName,
|
||
|
(wcslen(pwszDLLName) + 1) * sizeof(WCHAR));
|
||
|
|
||
|
hr |= RegSetValueExU(hKey, REG_FUNC_NAME,
|
||
|
0, REG_SZ,
|
||
|
(BYTE *)pwszFuncName,
|
||
|
(wcslen(pwszFuncName) + 1) * sizeof(WCHAR));
|
||
|
|
||
|
|
||
|
RegCloseKey(hKey);
|
||
|
|
||
|
if (hr != ERROR_SUCCESS)
|
||
|
{
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
BOOL RemoveRegProvider(GUID *pgActionID, WCHAR *pwszRegKey)
|
||
|
{
|
||
|
WCHAR wsz[REG_MAX_KEY_NAME];
|
||
|
WCHAR wszGuid[REG_MAX_GUID_TEXT];
|
||
|
|
||
|
if (!(pgActionID) ||
|
||
|
!(pwszRegKey))
|
||
|
{
|
||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
if (!(guid2wstr(pgActionID, &wszGuid[0])))
|
||
|
{
|
||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
wcscpy(&wsz[0], pwszRegKey);
|
||
|
wcscat(&wsz[0], L"\\");
|
||
|
wcscat(&wsz[0], &wszGuid[0]);
|
||
|
|
||
|
if (RegDeleteKeyU(HKEY_LOCAL_MACHINE, &wsz[0]) != ERROR_SUCCESS)
|
||
|
{
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
void GetRegSecuritySettings(DWORD *pdwState)
|
||
|
{
|
||
|
HKEY hKeyRoot;
|
||
|
WCHAR wszBuffer[STATUS_SIZE];
|
||
|
DWORD dwType;
|
||
|
DWORD dwSize;
|
||
|
|
||
|
dwType = 0;
|
||
|
dwSize = STATUS_SIZE * sizeof(WCHAR);
|
||
|
|
||
|
*pdwState = 2; // Default to high
|
||
|
|
||
|
if (RegOpenHKCUKeyExU( HKEY_CURRENT_USER,
|
||
|
SZIE30SAFTYLEVEL,
|
||
|
0, // dwReserved
|
||
|
KEY_READ,
|
||
|
&hKeyRoot) != ERROR_SUCCESS)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (RegQueryValueExU( hKeyRoot,
|
||
|
SZIE30SAFTYLEVELNAME,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
(BYTE *)&wszBuffer[0],
|
||
|
&dwSize) != ERROR_SUCCESS)
|
||
|
{
|
||
|
RegCloseKey(hKeyRoot);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKeyRoot);
|
||
|
|
||
|
if (dwType == REG_SZ)
|
||
|
{
|
||
|
if (wcscmp(&wszBuffer[0], L"FailInform") == 0)
|
||
|
{
|
||
|
*pdwState = 2;
|
||
|
}
|
||
|
else if (wcscmp(&wszBuffer[0], L"Query") == 0)
|
||
|
{
|
||
|
*pdwState = 1;
|
||
|
}
|
||
|
else if (wcscmp(&wszBuffer[0], L"SucceedSilent") == 0)
|
||
|
{
|
||
|
*pdwState = 0;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void WINAPI WintrustGetRegPolicyFlags(DWORD *pdwState)
|
||
|
{
|
||
|
HKEY hKey;
|
||
|
DWORD dwDisposition;
|
||
|
DWORD lErr;
|
||
|
DWORD dwType;
|
||
|
DWORD cbData;
|
||
|
|
||
|
*pdwState = 0;
|
||
|
|
||
|
cbData = sizeof(DWORD);
|
||
|
|
||
|
// Open the registry and get to the state var
|
||
|
if (RegCreateHKCUKeyExU(HKEY_CURRENT_USER,
|
||
|
REGPATH_WINTRUST_POLICY_FLAGS,
|
||
|
0,
|
||
|
NULL,
|
||
|
REG_OPTION_NON_VOLATILE,
|
||
|
KEY_READ,
|
||
|
NULL,
|
||
|
&hKey,
|
||
|
&dwDisposition) != ERROR_SUCCESS)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// read the state var
|
||
|
if (RegQueryValueExU( hKey,
|
||
|
REGNAME_WINTRUST_POLICY_FLAGS,
|
||
|
NULL,
|
||
|
&dwType,
|
||
|
(BYTE *)pdwState,
|
||
|
&cbData) != ERROR_SUCCESS)
|
||
|
{
|
||
|
*pdwState = 0;
|
||
|
RegCloseKey(hKey);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKey);
|
||
|
|
||
|
if ((dwType != REG_DWORD) &&
|
||
|
(dwType != REG_BINARY))
|
||
|
{
|
||
|
*pdwState = 0;
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
BOOL WINAPI WintrustSetRegPolicyFlags(DWORD dwState)
|
||
|
{
|
||
|
HKEY hKey;
|
||
|
DWORD dwDisposition;
|
||
|
DWORD lErr;
|
||
|
DWORD dwType;
|
||
|
DWORD cbData;
|
||
|
|
||
|
cbData = sizeof(DWORD);
|
||
|
|
||
|
if (RegCreateHKCUKeyExU(HKEY_CURRENT_USER,
|
||
|
REGPATH_WINTRUST_POLICY_FLAGS,
|
||
|
0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL,
|
||
|
&hKey, &dwDisposition) != ERROR_SUCCESS)
|
||
|
{
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
if (RegSetValueExU(hKey,
|
||
|
REGNAME_WINTRUST_POLICY_FLAGS,
|
||
|
0,
|
||
|
REG_DWORD,
|
||
|
(BYTE *)&dwState,
|
||
|
sizeof(DWORD)) != ERROR_SUCCESS)
|
||
|
{
|
||
|
RegCloseKey(hKey);
|
||
|
return(FALSE);
|
||
|
}
|
||
|
|
||
|
RegCloseKey(hKey);
|
||
|
|
||
|
return(TRUE);
|
||
|
}
|
||
|
|
||
|
|
||
|
|