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

217 lines
6.4 KiB
C++

// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 1999
// File: usagedef.cpp
// Contents: Microsoft Internet Security Trust Provider Model
// Functions: WintrustAddDefaultForUsage
// WintrustGetDefaultForUsage
// History: 07-Sep-1997 pberkman created
#include "global.hxx"
#include "cryptreg.h"
BOOL WINAPI WintrustAddDefaultForUsage(const char* pszUsageOID,
CRYPT_PROVIDER_REGDEFUSAGE* psDefUsage)
{
HKEY hKey;
WCHAR wsz[REG_MAX_KEY_NAME];
WCHAR wszUsage[REG_MAX_FUNC_NAME];
WCHAR wszGuid[REG_MAX_GUID_TEXT];
DWORD dwDisposition;
HRESULT hr;
int cchUsage;
if (!(pszUsageOID) ||
!(psDefUsage) ||
!(_ISINSTRUCT(CRYPT_PROVIDER_REGDEFUSAGE,
psDefUsage->cbStruct,
pwszFreeCallbackDataFunctionName)) ||
!(psDefUsage->pgActionID)) {
SetLastError(ERROR_INVALID_PARAMETER);
return(FALSE);
}
if (!(guid2wstr(psDefUsage->pgActionID, &wszGuid[0]))) {
SetLastError(ERROR_INVALID_PARAMETER);
return(FALSE);
}
wszUsage[0] = L'\0';
cchUsage = MultiByteToWideChar(0, 0, pszUsageOID, -1, &wszUsage[0],
REG_MAX_FUNC_NAME);
if (0 >= cchUsage) {
SetLastError(ERROR_INVALID_PARAMETER);
return(FALSE);
}
if (REG_MAX_KEY_NAME < wcslen(REG_TRUST_USAGE_KEY) + 1 + cchUsage + 1) {
SetLastError(ERROR_INVALID_PARAMETER);
return(FALSE);
}
wcscpy(&wsz[0], REG_TRUST_USAGE_KEY);
wcscat(&wsz[0], L"\\");
wcscat(&wsz[0], &wszUsage[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_DEF_FOR_USAGE, 0, REG_SZ, (BYTE*)&wszGuid[0], (wcslen(&wszGuid[0]) + 1) * sizeof(WCHAR));
if (psDefUsage->pwszDllName) {
hr |= RegSetValueExU(hKey, REG_DLL_NAME, 0, REG_SZ, (BYTE*)psDefUsage->pwszDllName, (wcslen(psDefUsage->pwszDllName) + 1) * sizeof(WCHAR));
if (psDefUsage->pwszLoadCallbackDataFunctionName) {
hr |= RegSetValueExA(hKey, REG_DEF_CALLBACK_ALLOC, 0, REG_SZ, (BYTE*)psDefUsage->pwszLoadCallbackDataFunctionName, strlen(psDefUsage->pwszLoadCallbackDataFunctionName) + 1);
if (psDefUsage->pwszFreeCallbackDataFunctionName) {
hr |= RegSetValueExA(hKey, REG_DEF_CALLBACK_FREE, 0, REG_SZ, (BYTE*)psDefUsage->pwszFreeCallbackDataFunctionName, strlen(psDefUsage->pwszFreeCallbackDataFunctionName) + 1);
}
}
}
RegCloseKey(hKey);
return((hr == ERROR_SUCCESS) ? TRUE : FALSE);
}
BOOL WINAPI WintrustGetDefaultForUsage(DWORD dwAction, const char* pszUsageOID,
CRYPT_PROVIDER_DEFUSAGE* psUsage)
{
BOOL fRet;
HKEY hKey;
WCHAR wsz[REG_MAX_KEY_NAME];
char szFunc[REG_MAX_FUNC_NAME];
WCHAR wszUsage[REG_MAX_FUNC_NAME];
WCHAR wszGuid[REG_MAX_GUID_TEXT];
DWORD dwType;
DWORD dwSize;
HINSTANCE hDll;
PFN_ALLOCANDFILLDEFUSAGE pfnAlloc;
PFN_FREEDEFUSAGE pfnFree;
int cchUsage;
fRet = TRUE;
hKey = NULL;
hDll = NULL;
pfnAlloc = NULL;
pfnFree = NULL;
if (!(pszUsageOID) ||
!(psUsage) ||
!(_ISINSTRUCT(CRYPT_PROVIDER_DEFUSAGE,
psUsage->cbStruct,
pDefSIPClientData))) {
goto InvalidParamError;
}
memset(&psUsage->gActionID, 0x00, sizeof(GUID));
wszUsage[0] = L'\0';
cchUsage = MultiByteToWideChar(0, 0, pszUsageOID, -1, &wszUsage[0],
REG_MAX_FUNC_NAME);
if (0 >= cchUsage) {
goto InvalidParamError;
}
if (REG_MAX_KEY_NAME < wcslen(REG_TRUST_USAGE_KEY) + 1 + cchUsage + 1) {
goto InvalidParamError;
}
wcscpy(&wsz[0], REG_TRUST_USAGE_KEY);
wcscat(&wsz[0], L"\\");
wcscat(&wsz[0], &wszUsage[0]);
if (RegOpenKeyExU(HKEY_LOCAL_MACHINE, &wsz[0], 0, KEY_READ, &hKey) != ERROR_SUCCESS) {
goto RegOpenError;
}
// get the dll name and function entry points
dwType = 0;
dwSize = REG_MAX_KEY_NAME * sizeof(WCHAR);
if (RegQueryValueExU(hKey, REG_DLL_NAME, NULL, &dwType, (BYTE*)&wsz[0], &dwSize) == ERROR_SUCCESS) {
if (hDll = LoadLibraryU(&wsz[0])) {
dwType = 0;
dwSize = REG_MAX_FUNC_NAME;
if (RegQueryValueExA(hKey,
(dwAction == DWACTION_FREE) ? REG_DEF_CALLBACK_FREE : REG_DEF_CALLBACK_ALLOC,
NULL, &dwType, (BYTE*)&szFunc[0], &dwSize) == ERROR_SUCCESS) {
if (dwAction == DWACTION_FREE) {
pfnFree = (PFN_FREEDEFUSAGE)GetProcAddress(hDll, &szFunc[0]);
if (pfnFree) {
(*pfnFree)(pszUsageOID, psUsage);
}
fRet = TRUE;
goto CommonReturn;
}
pfnAlloc = (PFN_ALLOCANDFILLDEFUSAGE)GetProcAddress(hDll, &szFunc[0]);
}
}
}
if (dwAction != DWACTION_ALLOCANDFILL) {
goto CommonReturn;
}
dwType = 0;
dwSize = REG_MAX_GUID_TEXT * sizeof(WCHAR);
wszGuid[0] = NULL;
if (RegQueryValueExU(hKey,
REG_DEF_FOR_USAGE,
NULL,
&dwType,
(BYTE*)&wszGuid[0],
&dwSize) != ERROR_SUCCESS) {
goto RegQueryError;
}
if (!(wstr2guid(&wszGuid[0], &psUsage->gActionID))) {
goto GuidError;
}
if (pfnAlloc) {
if (!(*pfnAlloc)(pszUsageOID, psUsage)) {
goto UsageAllocError;
}
}
CommonReturn:
if (hKey) {
RegCloseKey(hKey);
}
if (hDll) {
FreeLibrary(hDll);
}
return(fRet);
ErrorReturn:
fRet = FALSE;
goto CommonReturn;
TRACE_ERROR_EX(DBG_SS, RegOpenError);
TRACE_ERROR_EX(DBG_SS, RegQueryError);
TRACE_ERROR_EX(DBG_SS, GuidError);
TRACE_ERROR_EX(DBG_SS, UsageAllocError);
SET_ERROR_VAR_EX(DBG_SS, InvalidParamError, ERROR_INVALID_PARAMETER);
}