windows-nt/Source/XPSP1/NT/ds/security/cryptoapi/pkitrust/wintrust/registry.cpp

337 lines
8 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
//+-------------------------------------------------------------------------
//
// 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);
}