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