2020-09-30 17:12:32 +02:00

275 lines
7.0 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]);
if (RegCreateKeyExU(HKEY_LOCAL_MACHINE, &wsz[0], 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dwDisposition) != ERROR_SUCCESS) {
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,
0,
&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);
}