| /* Unit test suite for wintrust API functions |
| * |
| * Copyright 2006 Paul Vriens |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA |
| * |
| */ |
| |
| #include <stdarg.h> |
| #include <stdio.h> |
| |
| #include "windows.h" |
| #include "softpub.h" |
| #include "wintrust.h" |
| #include "winreg.h" |
| |
| #include "wine/test.h" |
| |
| static BOOL (WINAPI * pWintrustAddActionID)(GUID*, DWORD, CRYPT_REGISTER_ACTIONID*); |
| static BOOL (WINAPI * pWintrustAddDefaultForUsage)(const CHAR*,CRYPT_PROVIDER_REGDEFUSAGE*); |
| static void (WINAPI * pWintrustGetRegPolicyFlags)(DWORD *); |
| static BOOL (WINAPI * pWintrustLoadFunctionPointers)(GUID *, CRYPT_PROVIDER_FUNCTIONS *); |
| static BOOL (WINAPI * pWintrustRemoveActionID)(GUID*); |
| static BOOL (WINAPI * pWintrustSetRegPolicyFlags)(DWORD); |
| |
| static void InitFunctionPtrs(void) |
| { |
| HMODULE hWintrust = GetModuleHandleA("wintrust.dll"); |
| |
| #define WINTRUST_GET_PROC(func) \ |
| p ## func = (void*)GetProcAddress(hWintrust, #func); \ |
| if(!p ## func) \ |
| trace("GetProcAddress(%s) failed\n", #func); |
| |
| WINTRUST_GET_PROC(WintrustAddActionID) |
| WINTRUST_GET_PROC(WintrustAddDefaultForUsage) |
| WINTRUST_GET_PROC(WintrustGetRegPolicyFlags) |
| WINTRUST_GET_PROC(WintrustLoadFunctionPointers) |
| WINTRUST_GET_PROC(WintrustRemoveActionID) |
| WINTRUST_GET_PROC(WintrustSetRegPolicyFlags) |
| |
| #undef WINTRUST_GET_PROC |
| } |
| |
| static void test_AddRem_ActionID(void) |
| { |
| static WCHAR DummyDllW[] = {'d','e','a','d','b','e','e','f','.','d','l','l',0 }; |
| static WCHAR DummyFunctionW[] = {'d','u','m','m','y','f','u','n','c','t','i','o','n',0 }; |
| GUID ActionID = { 0xdeadbeef, 0xdead, 0xbeef, { 0xde,0xad,0xbe,0xef,0xde,0xad,0xbe,0xef }}; |
| CRYPT_REGISTER_ACTIONID ActionIDFunctions; |
| CRYPT_TRUST_REG_ENTRY EmptyProvider = { 0, NULL, NULL }; |
| CRYPT_TRUST_REG_ENTRY DummyProvider = { sizeof(CRYPT_TRUST_REG_ENTRY), DummyDllW, DummyFunctionW }; |
| BOOL ret; |
| |
| if (!pWintrustAddActionID || !pWintrustRemoveActionID) |
| { |
| win_skip("WintrustAddActionID and/or WintrustRemoveActionID are not available\n"); |
| return; |
| } |
| |
| /* All NULL */ |
| SetLastError(0xdeadbeef); |
| ret = pWintrustAddActionID(NULL, 0, NULL); |
| ok (!ret, "Expected WintrustAddActionID to fail.\n"); |
| ok (GetLastError() == ERROR_INVALID_PARAMETER /* XP/W2K3 */ || |
| GetLastError() == 0xdeadbeef /* Win98/NT4/W2K */, |
| "Expected ERROR_INVALID_PARAMETER(W2K3) or 0xdeadbeef(Win98/NT4/W2K), got %u.\n", GetLastError()); |
| |
| /* NULL functions */ |
| SetLastError(0xdeadbeef); |
| ret = pWintrustAddActionID(&ActionID, 0, NULL); |
| ok (!ret, "Expected WintrustAddActionID to fail.\n"); |
| ok (GetLastError() == ERROR_INVALID_PARAMETER /* XP/W2K3 */ || |
| GetLastError() == 0xdeadbeef /* Win98/NT4/W2K */, |
| "Expected ERROR_INVALID_PARAMETER(W2K3) or 0xdeadbeef(Win98/NT4/W2K), got %u.\n", GetLastError()); |
| |
| /* All OK (although no functions defined), except cbStruct is not set in ActionIDFunctions */ |
| SetLastError(0xdeadbeef); |
| memset(&ActionIDFunctions, 0, sizeof(CRYPT_REGISTER_ACTIONID)); |
| ret = pWintrustAddActionID(&ActionID, 0, &ActionIDFunctions); |
| ok (!ret, "Expected WintrustAddActionID to fail.\n"); |
| ok (GetLastError() == ERROR_INVALID_PARAMETER /* XP/W2K3 */ || |
| GetLastError() == 0xdeadbeef /* Win98/NT4/W2K */, |
| "Expected ERROR_INVALID_PARAMETER(W2K3) or 0xdeadbeef(Win98/NT4/W2K), got %u.\n", GetLastError()); |
| |
| /* All OK (although no functions defined) and cbStruct is set now */ |
| SetLastError(0xdeadbeef); |
| memset(&ActionIDFunctions, 0, sizeof(CRYPT_REGISTER_ACTIONID)); |
| ActionIDFunctions.cbStruct = sizeof(CRYPT_REGISTER_ACTIONID); |
| ret = pWintrustAddActionID(&ActionID, 0, &ActionIDFunctions); |
| ok (ret, "Expected WintrustAddActionID to succeed.\n"); |
| ok (GetLastError() == ERROR_INVALID_PARAMETER, |
| "Expected ERROR_INVALID_PARAMETER, got %u.\n", GetLastError()); |
| |
| /* All OK and all (but 1) functions are correctly defined. The DLL and entrypoints |
| * are not present. |
| */ |
| memset(&ActionIDFunctions, 0, sizeof(CRYPT_REGISTER_ACTIONID)); |
| ActionIDFunctions.cbStruct = sizeof(CRYPT_REGISTER_ACTIONID); |
| ActionIDFunctions.sInitProvider = DummyProvider; |
| ActionIDFunctions.sObjectProvider = DummyProvider; |
| ActionIDFunctions.sSignatureProvider = EmptyProvider; |
| ActionIDFunctions.sCertificateProvider = DummyProvider; |
| ActionIDFunctions.sCertificatePolicyProvider = DummyProvider; |
| ActionIDFunctions.sFinalPolicyProvider = DummyProvider; |
| ActionIDFunctions.sTestPolicyProvider = DummyProvider; |
| ActionIDFunctions.sCleanupProvider = DummyProvider; |
| SetLastError(0xdeadbeef); |
| ret = pWintrustAddActionID(&ActionID, 0, &ActionIDFunctions); |
| ok (ret, "Expected WintrustAddActionID to succeed.\n"); |
| ok (GetLastError() == ERROR_INVALID_PARAMETER || |
| GetLastError() == ERROR_ACCESS_DENIED, |
| "Expected ERROR_INVALID_PARAMETER or ERROR_ACCESS_DENIED, got %u.\n", |
| GetLastError()); |
| |
| /* All OK and all functions are correctly defined. The DLL and entrypoints |
| * are not present. |
| */ |
| memset(&ActionIDFunctions, 0, sizeof(CRYPT_REGISTER_ACTIONID)); |
| ActionIDFunctions.cbStruct = sizeof(CRYPT_REGISTER_ACTIONID); |
| ActionIDFunctions.sInitProvider = DummyProvider; |
| ActionIDFunctions.sObjectProvider = DummyProvider; |
| ActionIDFunctions.sSignatureProvider = DummyProvider; |
| ActionIDFunctions.sCertificateProvider = DummyProvider; |
| ActionIDFunctions.sCertificatePolicyProvider = DummyProvider; |
| ActionIDFunctions.sFinalPolicyProvider = DummyProvider; |
| ActionIDFunctions.sTestPolicyProvider = DummyProvider; |
| ActionIDFunctions.sCleanupProvider = DummyProvider; |
| SetLastError(0xdeadbeef); |
| ret = pWintrustAddActionID(&ActionID, 0, &ActionIDFunctions); |
| ok (ret, "Expected WintrustAddActionID to succeed.\n"); |
| ok (GetLastError() == 0xdeadbeef || GetLastError() == ERROR_ACCESS_DENIED, |
| "Expected 0xdeadbeef or ERROR_ACCESS_DENIED, got %u.\n", |
| GetLastError()); |
| |
| SetLastError(0xdeadbeef); |
| ret = pWintrustRemoveActionID(&ActionID); |
| ok ( ret, "WintrustRemoveActionID failed : %d\n", GetLastError()); |
| ok ( GetLastError() == 0xdeadbeef, "Last error should not have been changed: %u\n", GetLastError()); |
| |
| /* NULL input */ |
| SetLastError(0xdeadbeef); |
| ret = pWintrustRemoveActionID(NULL); |
| ok (ret, "Expected WintrustRemoveActionID to succeed.\n"); |
| ok (GetLastError() == ERROR_INVALID_PARAMETER, |
| "Expected ERROR_INVALID_PARAMETER, got %u.\n", GetLastError()); |
| |
| /* The passed GUID is removed by a previous call, so it's basically a test with a nonexistent Trust provider */ |
| SetLastError(0xdeadbeef); |
| ret = pWintrustRemoveActionID(&ActionID); |
| ok (ret, "Expected WintrustRemoveActionID to succeed.\n"); |
| ok (GetLastError() == 0xdeadbeef, |
| "Expected 0xdeadbeef, got %u.\n", GetLastError()); |
| } |
| |
| static void test_AddDefaultForUsage(void) |
| { |
| BOOL ret; |
| static GUID ActionID = { 0xdeadbeef, 0xdead, 0xbeef, { 0xde,0xad,0xbe,0xef,0xde,0xad,0xbe,0xef }}; |
| static WCHAR DummyDllW[] = {'d','e','a','d','b','e','e','f','.','d','l','l',0 }; |
| static CHAR DummyFunction[] = "dummyfunction"; |
| static const CHAR oid[] = "1.2.3.4.5.6.7.8.9.10"; |
| static CRYPT_PROVIDER_REGDEFUSAGE DefUsage; |
| |
| if (!pWintrustAddDefaultForUsage) |
| { |
| win_skip("WintrustAddDefaultForUsage is not available\n"); |
| return; |
| } |
| |
| /* All NULL */ |
| SetLastError(0xdeadbeef); |
| ret = pWintrustAddDefaultForUsage(NULL, NULL); |
| ok (!ret, "Expected WintrustAddDefaultForUsage to fail.\n"); |
| ok (GetLastError() == ERROR_INVALID_PARAMETER, |
| "Expected ERROR_INVALID_PARAMETER, got %u.\n", GetLastError()); |
| |
| /* NULL defusage */ |
| SetLastError(0xdeadbeef); |
| ret = pWintrustAddDefaultForUsage(oid, NULL); |
| ok (!ret, "Expected WintrustAddDefaultForUsage to fail.\n"); |
| ok (GetLastError() == ERROR_INVALID_PARAMETER, |
| "Expected ERROR_INVALID_PARAMETER, got %u.\n", GetLastError()); |
| |
| /* NULL oid and proper defusage */ |
| memset(&DefUsage, 0 , sizeof(CRYPT_PROVIDER_REGDEFUSAGE)); |
| DefUsage.cbStruct = sizeof(CRYPT_PROVIDER_REGDEFUSAGE); |
| DefUsage.pgActionID = &ActionID; |
| DefUsage.pwszDllName = DummyDllW; |
| DefUsage.pwszLoadCallbackDataFunctionName = DummyFunction; |
| DefUsage.pwszFreeCallbackDataFunctionName = DummyFunction; |
| SetLastError(0xdeadbeef); |
| ret = pWintrustAddDefaultForUsage(NULL, &DefUsage); |
| ok (!ret, "Expected WintrustAddDefaultForUsage to fail.\n"); |
| ok (GetLastError() == ERROR_INVALID_PARAMETER, |
| "Expected ERROR_INVALID_PARAMETER, got %u.\n", GetLastError()); |
| |
| /* cbStruct set to 0 */ |
| memset(&DefUsage, 0 , sizeof(CRYPT_PROVIDER_REGDEFUSAGE)); |
| DefUsage.cbStruct = 0; |
| DefUsage.pgActionID = &ActionID; |
| DefUsage.pwszDllName = DummyDllW; |
| DefUsage.pwszLoadCallbackDataFunctionName = DummyFunction; |
| DefUsage.pwszFreeCallbackDataFunctionName = DummyFunction; |
| SetLastError(0xdeadbeef); |
| ret = pWintrustAddDefaultForUsage(oid, &DefUsage); |
| ok (!ret, "Expected WintrustAddDefaultForUsage to fail.\n"); |
| ok (GetLastError() == ERROR_INVALID_PARAMETER, |
| "Expected ERROR_INVALID_PARAMETER, got %u.\n", GetLastError()); |
| } |
| |
| static void test_LoadFunctionPointers(void) |
| { |
| BOOL ret; |
| CRYPT_PROVIDER_FUNCTIONS funcs; |
| GUID action = WINTRUST_ACTION_GENERIC_VERIFY_V2; |
| |
| if (!pWintrustLoadFunctionPointers) |
| { |
| win_skip("WintrustLoadFunctionPointers is not available\n"); |
| return; |
| } |
| SetLastError(0xdeadbeef); |
| ret = pWintrustLoadFunctionPointers(NULL, NULL); |
| ok(!ret && GetLastError() == 0xdeadbeef, "Expected failure\n"); |
| SetLastError(0xdeadbeef); |
| ret = pWintrustLoadFunctionPointers(&action, NULL); |
| ok(!ret && GetLastError() == 0xdeadbeef, "Expected failure\n"); |
| |
| SetLastError(0xdeadbeef); |
| ret = pWintrustLoadFunctionPointers(NULL, &funcs); |
| ok(!ret, "WintrustLoadFunctionPointers succeeded\n"); |
| ok(GetLastError() == ERROR_INVALID_PARAMETER || |
| GetLastError() == 0xdeadbeef /* W2K and XP-SP1 */, |
| "Expected ERROR_INVALID_PARAMETER or 0xdeadbeef, got %d\n", GetLastError()); |
| |
| SetLastError(0xdeadbeef); |
| funcs.cbStruct = 0; |
| ret = pWintrustLoadFunctionPointers(&action, &funcs); |
| ok(!ret && GetLastError() == 0xdeadbeef, "Expected failure\n"); |
| SetLastError(0xdeadbeef); |
| funcs.cbStruct = sizeof(funcs); |
| ret = pWintrustLoadFunctionPointers(&action, &funcs); |
| ok(ret, "WintrustLoadFunctionPointers failed: %d\n", GetLastError()); |
| ok(funcs.pfnAlloc != NULL, "Expected a pointer\n"); |
| ok(funcs.pfnFree != NULL, "Expected a pointer\n"); |
| } |
| |
| static void test_RegPolicyFlags(void) |
| { |
| /* Default state value 0x00023c00, which is |
| * WTPF_IGNOREREVOCATIONONTS | |
| * WTPF_OFFLINEOKNBU_COM | |
| * WTPF_OFFLINEOKNBU_IND | |
| * WTPF_OFFLINEOK_COM | |
| * WTPF_OFFLINEOK_IND |
| */ |
| static const CHAR Software_Publishing[] = |
| "Software\\Microsoft\\Windows\\CurrentVersion\\Wintrust\\" |
| "Trust Providers\\Software Publishing"; |
| static const CHAR State[] = "State"; |
| HKEY key; |
| LONG r; |
| DWORD flags1, flags2, flags3, size; |
| BOOL ret; |
| |
| if (!pWintrustGetRegPolicyFlags || !pWintrustSetRegPolicyFlags) |
| { |
| win_skip("Policy flags functions not present\n"); |
| return; |
| } |
| |
| pWintrustGetRegPolicyFlags(&flags2); |
| |
| r = RegOpenKeyExA(HKEY_CURRENT_USER, Software_Publishing, 0, KEY_ALL_ACCESS, |
| &key); |
| ok(!r, "RegOpenKeyEx failed: %d\n", r); |
| |
| size = sizeof(flags1); |
| r = RegQueryValueExA(key, State, NULL, NULL, (LPBYTE)&flags1, &size); |
| ok(!r || r == ERROR_FILE_NOT_FOUND, "RegQueryValueEx failed: %d\n", r); |
| if (!r) |
| ok(flags1 == flags2, "Got %08x flags instead of %08x\n", flags1, flags2); |
| |
| flags3 = flags2 | 1; |
| ret = pWintrustSetRegPolicyFlags(flags3); |
| ok(ret, "WintrustSetRegPolicyFlags failed: %d\n", GetLastError()); |
| size = sizeof(flags1); |
| r = RegQueryValueExA(key, State, NULL, NULL, (LPBYTE)&flags1, &size); |
| ok(!r, "RegQueryValueEx failed: %d\n", r); |
| ok(flags1 == flags3, "Got %08x flags instead of %08x\n", flags1, flags3); |
| |
| pWintrustSetRegPolicyFlags(flags2); |
| |
| RegCloseKey(key); |
| } |
| |
| START_TEST(register) |
| { |
| InitFunctionPtrs(); |
| |
| test_AddRem_ActionID(); |
| test_AddDefaultForUsage(); |
| test_LoadFunctionPointers(); |
| test_RegPolicyFlags(); |
| } |