static LONG WINTRUST_CertVerify(HWND hwnd, GUID *actionID, WINTRUST_DATA *data) { DWORD err = ERROR_SUCCESS, numSteps = 0; CRYPT_PROVIDER_DATA *provData; BOOL ret; struct wintrust_step verifySteps[5]; TRACE("(%p, %s, %p)\n", hwnd, debugstr_guid(actionID), data); provData = WINTRUST_AllocateProviderData(); if (!provData) return ERROR_OUTOFMEMORY; ret = WintrustLoadFunctionPointers(actionID, provData->psPfns); if (!ret) { err = GetLastError(); goto error; } if (!provData->psPfns->pfnObjectTrust) provData->psPfns->pfnObjectTrust = WINTRUST_CertVerifyObjTrust; /* Not sure why, but native skips the policy check */ provData->psPfns->pfnCertCheckPolicy = NULL; data->hWVTStateData = provData; provData->pWintrustData = data; if (hwnd == INVALID_HANDLE_VALUE) provData->hWndParent = GetDesktopWindow(); else provData->hWndParent = hwnd; provData->pgActionID = actionID; WintrustGetRegPolicyFlags(&provData->dwRegPolicySettings); numSteps = WINTRUST_AddTrustStepsFromFunctions(verifySteps, provData->psPfns); err = WINTRUST_ExecuteSteps(verifySteps, numSteps, provData); goto done; error: if (provData) { WINTRUST_Free(provData->padwTrustStepErrors); WINTRUST_Free(provData->u.pPDSip); WINTRUST_Free(provData->psPfns); WINTRUST_Free(provData); } done: TRACE("returning %08x\n", err); return err; }
static void test_provider_funcs(void) { static GUID generic_verify_v2 = WINTRUST_ACTION_GENERIC_VERIFY_V2; SAFE_PROVIDER_FUNCTIONS funcs = { sizeof(SAFE_PROVIDER_FUNCTIONS), 0 }; BOOL ret; ret = WintrustLoadFunctionPointers(&generic_verify_v2, (CRYPT_PROVIDER_FUNCTIONS *)&funcs); if (!ret) skip("WintrustLoadFunctionPointers failed\n"); else { test_utils(&funcs); testInitialize(&funcs, &generic_verify_v2); testObjTrust(&funcs, &generic_verify_v2); testCertTrust(&funcs, &generic_verify_v2); } }