From 5bc1b8ac3150c45636c72ead3d8cfae11690b362 Mon Sep 17 00:00:00 2001 From: Juan Lang Date: Fri, 11 Aug 2006 20:37:04 -0700 Subject: [PATCH] crypt32: Improve undocumented functions. - Test and implement I_CryptGetDefaultCryptProv (and correct its parameter list) - I_CryptReadTrustedPublisherDWORDValueFromRegistry always initializes its out parameter, correct and show with a test. --- dlls/crypt32/crypt32.spec | 2 +- dlls/crypt32/main.c | 17 ++++++++++++++--- dlls/crypt32/tests/main.c | 36 ++++++++++++++++++++++++++++++++---- 3 files changed, 47 insertions(+), 8 deletions(-) diff --git a/dlls/crypt32/crypt32.spec b/dlls/crypt32/crypt32.spec index 64f10e76b36..99e475001cf 100644 --- a/dlls/crypt32/crypt32.spec +++ b/dlls/crypt32/crypt32.spec @@ -186,7 +186,7 @@ @ stdcall I_CryptFlushLruCache(ptr long long) @ stdcall I_CryptFreeLruCache(ptr long long) @ stdcall I_CryptFreeTls(long long) -@ stdcall I_CryptGetDefaultCryptProv(long long long) +@ stdcall I_CryptGetDefaultCryptProv(long) @ stub I_CryptGetDefaultCryptProvForEncrypt @ stdcall I_CryptGetOssGlobal(long) @ stdcall I_CryptGetTls(long) diff --git a/dlls/crypt32/main.c b/dlls/crypt32/main.c index 47bb8fc11bb..9b94adf67d7 100644 --- a/dlls/crypt32/main.c +++ b/dlls/crypt32/main.c @@ -271,10 +271,20 @@ BOOL WINAPI I_CryptGetOssGlobal(DWORD x) return FALSE; } -BOOL WINAPI I_CryptGetDefaultCryptProv(DWORD x, DWORD y, DWORD z) +HCRYPTPROV WINAPI I_CryptGetDefaultCryptProv(DWORD reserved) { - FIXME("%08lx %08lx %08lx\n", x, y, z); - return FALSE; + HCRYPTPROV ret; + + TRACE("(%08lx)\n", reserved); + + if (reserved) + { + SetLastError(E_INVALIDARG); + return (HCRYPTPROV)0; + } + ret = CRYPT_GetDefaultProvider(); + CryptContextAddRef(ret, NULL, 0); + return ret; } BOOL WINAPI I_CryptReadTrustedPublisherDWORDValueFromRegistry(LPCWSTR name, @@ -292,6 +302,7 @@ BOOL WINAPI I_CryptReadTrustedPublisherDWORDValueFromRegistry(LPCWSTR name, TRACE("(%s, %p)\n", debugstr_w(name), value); + *value = 0; rc = RegCreateKeyW(HKEY_LOCAL_MACHINE, safer, &key); if (rc == ERROR_SUCCESS) { diff --git a/dlls/crypt32/tests/main.c b/dlls/crypt32/tests/main.c index 128120b0610..8b980ce0895 100644 --- a/dlls/crypt32/tests/main.c +++ b/dlls/crypt32/tests/main.c @@ -295,7 +295,7 @@ static void test_readTrustedPublisherDWORD(void) static const WCHAR authenticodeFlags[] = { 'A','u','t','h','e','n', 't','i','c','o','d','e','F','l','a','g','s',0 }; BOOL ret, exists = FALSE; - DWORD size, readFlags, returnedFlags; + DWORD size, readFlags = 0, returnedFlags; HKEY key; LONG rc; @@ -308,14 +308,41 @@ static void test_readTrustedPublisherDWORD(void) if (rc == ERROR_SUCCESS) exists = TRUE; } + returnedFlags = 0xdeadbeef; ret = pReadDWORD(authenticodeFlags, &returnedFlags); ok(ret == exists, "Unexpected return value\n"); - if (exists) - ok(readFlags == returnedFlags, - "Expected flags %08lx, got %08lx\n", readFlags, returnedFlags); + ok(readFlags == returnedFlags, + "Expected flags %08lx, got %08lx\n", readFlags, returnedFlags); } } +typedef HCRYPTPROV (WINAPI *I_CryptGetDefaultCryptProvFunc)(DWORD w); + +static void test_getDefaultCryptProv(void) +{ + I_CryptGetDefaultCryptProvFunc pI_CryptGetDefaultCryptProv; + HCRYPTPROV prov; + + if (!hCrypt) return; + + pI_CryptGetDefaultCryptProv = (I_CryptGetDefaultCryptProvFunc) + GetProcAddress(hCrypt, "I_CryptGetDefaultCryptProv"); + if (!pI_CryptGetDefaultCryptProv) return; + + prov = pI_CryptGetDefaultCryptProv(0xdeadbeef); + ok(prov == 0 && GetLastError() == E_INVALIDARG, + "Expected E_INVALIDARG, got %08lx\n", GetLastError()); + prov = pI_CryptGetDefaultCryptProv(PROV_RSA_FULL); + ok(prov == 0 && GetLastError() == E_INVALIDARG, + "Expected E_INVALIDARG, got %08lx\n", GetLastError()); + prov = pI_CryptGetDefaultCryptProv(1); + ok(prov == 0 && GetLastError() == E_INVALIDARG, + "Expected E_INVALIDARG, got %08lx\n", GetLastError()); + prov = pI_CryptGetDefaultCryptProv(0); + ok(prov != 0, "I_CryptGetDefaultCryptProv failed: %08lx\n", GetLastError()); + CryptReleaseContext(prov, 0); +} + START_TEST(main) { hCrypt = LoadLibraryA("crypt32.dll"); @@ -326,4 +353,5 @@ START_TEST(main) test_cryptAllocate(); test_cryptTls(); test_readTrustedPublisherDWORD(); + test_getDefaultCryptProv(); }