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