Juan Lang : wintrust: Implement WintrustLoadFunctionPointers.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu May 3 08:57:05 CDT 2007
Module: wine
Branch: master
Commit: 07a7079e2284e82376dc26ef838ed6a89d38c098
URL: http://source.winehq.org/git/wine.git/?a=commit;h=07a7079e2284e82376dc26ef838ed6a89d38c098
Author: Juan Lang <juan_lang at yahoo.com>
Date: Wed May 2 07:43:08 2007 -0700
wintrust: Implement WintrustLoadFunctionPointers.
---
dlls/wintrust/register.c | 82 ++++++++++++++++++++++++++++++++++++++++
dlls/wintrust/tests/register.c | 31 +++++++++++++++
dlls/wintrust/wintrust_main.c | 11 -----
3 files changed, 113 insertions(+), 11 deletions(-)
diff --git a/dlls/wintrust/register.c b/dlls/wintrust/register.c
index 6f0f575..d16b186 100644
--- a/dlls/wintrust/register.c
+++ b/dlls/wintrust/register.c
@@ -771,6 +771,88 @@ BOOL WINAPI WintrustAddDefaultForUsage(const char *pszUsageOID,
return TRUE;
}
+static FARPROC WINTRUST_ReadProviderFromReg(WCHAR *GuidString, const WCHAR *FunctionType)
+{
+ WCHAR ProvKey[MAX_PATH], DllName[MAX_PATH];
+ char FunctionName[MAX_PATH];
+ HKEY Key;
+ LONG Res = ERROR_SUCCESS;
+ DWORD Size;
+ HMODULE Lib;
+ FARPROC Func = NULL;
+
+ /* Create the needed key string */
+ ProvKey[0]='\0';
+ lstrcatW(ProvKey, Trust);
+ lstrcatW(ProvKey, FunctionType);
+ lstrcatW(ProvKey, GuidString);
+
+ Res = RegOpenKeyExW(HKEY_LOCAL_MACHINE, ProvKey, 0, KEY_READ, &Key);
+ if (Res != ERROR_SUCCESS) goto error_close_key;
+
+ /* Read the $DLL entry */
+ Size = sizeof(DllName);
+ Res = RegQueryValueExW(Key, Dll, NULL, NULL, (LPBYTE)DllName, &Size);
+ if (Res != ERROR_SUCCESS) goto error_close_key;
+
+ /* Read the $Function entry */
+ Size = sizeof(FunctionName);
+ Res = RegQueryValueExA(Key, "$Function", NULL, NULL, (LPBYTE)FunctionName, &Size);
+ if (Res != ERROR_SUCCESS) goto error_close_key;
+
+ /* Load the library - there appears to be no way to close a provider, so
+ * just leak the module handle.
+ */
+ Lib = LoadLibraryW(DllName);
+ Func = GetProcAddress(Lib, FunctionName);
+
+error_close_key:
+ RegCloseKey(Key);
+
+ return Func;
+}
+
+/***********************************************************************
+ * WintrustLoadFunctionPointers (WINTRUST.@)
+ */
+BOOL WINAPI WintrustLoadFunctionPointers( GUID* pgActionID,
+ CRYPT_PROVIDER_FUNCTIONS* pPfns )
+{
+ WCHAR GuidString[39];
+
+ TRACE("(%s %p)\n", debugstr_guid(pgActionID), pPfns);
+
+ if (!pPfns) return FALSE;
+ if (!pgActionID)
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+ if (pPfns->cbStruct != sizeof(CRYPT_PROVIDER_FUNCTIONS)) return FALSE;
+
+ /* Create this string only once, instead of in the helper function */
+ WINTRUST_Guid2Wstr( pgActionID, GuidString);
+
+ /* Get the function pointers from the registry, where applicable */
+ pPfns->pfnAlloc = NULL;
+ pPfns->pfnFree = NULL;
+ pPfns->pfnAddStore2Chain = NULL;
+ pPfns->pfnAddSgnr2Chain = NULL;
+ pPfns->pfnAddCert2Chain = NULL;
+ pPfns->pfnAddPrivData2Chain = NULL;
+ pPfns->psUIpfns = NULL;
+ pPfns->pfnInitialize = (PFN_PROVIDER_INIT_CALL)WINTRUST_ReadProviderFromReg(GuidString, Initialization);
+ pPfns->pfnObjectTrust = (PFN_PROVIDER_OBJTRUST_CALL)WINTRUST_ReadProviderFromReg(GuidString, Message);
+ pPfns->pfnSignatureTrust = (PFN_PROVIDER_SIGTRUST_CALL)WINTRUST_ReadProviderFromReg(GuidString, Signature);
+ pPfns->pfnCertificateTrust = (PFN_PROVIDER_CERTTRUST_CALL)WINTRUST_ReadProviderFromReg(GuidString, Certificate);
+ pPfns->pfnCertCheckPolicy = (PFN_PROVIDER_CERTCHKPOLICY_CALL)WINTRUST_ReadProviderFromReg(GuidString, CertCheck);
+ pPfns->pfnFinalPolicy = (PFN_PROVIDER_FINALPOLICY_CALL)WINTRUST_ReadProviderFromReg(GuidString, FinalPolicy);
+ pPfns->pfnTestFinalPolicy = (PFN_PROVIDER_TESTFINALPOLICY_CALL)WINTRUST_ReadProviderFromReg(GuidString, DiagnosticPolicy);
+ pPfns->pfnCleanupPolicy = (PFN_PROVIDER_CLEANUP_CALL)WINTRUST_ReadProviderFromReg(GuidString, Cleanup);
+
+ return TRUE;
+}
+
/***********************************************************************
* WINTRUST_SIPPAddProvider
*
diff --git a/dlls/wintrust/tests/register.c b/dlls/wintrust/tests/register.c
index d442c07..95f8dc6 100644
--- a/dlls/wintrust/tests/register.c
+++ b/dlls/wintrust/tests/register.c
@@ -31,6 +31,7 @@
static BOOL (WINAPI * pWintrustAddActionID)(GUID*, DWORD, CRYPT_REGISTER_ACTIONID*);
static BOOL (WINAPI * pWintrustAddDefaultForUsage)(const CHAR*,CRYPT_PROVIDER_REGDEFUSAGE*);
static BOOL (WINAPI * pWintrustRemoveActionID)(GUID*);
+static BOOL (WINAPI * pWintrustLoadFunctionPointers)(GUID *, CRYPT_PROVIDER_FUNCTIONS *);
static HMODULE hWintrust = 0;
@@ -55,6 +56,7 @@ static BOOL InitFunctionPtrs(void)
WINTRUST_GET_PROC(WintrustAddActionID)
WINTRUST_GET_PROC(WintrustAddDefaultForUsage)
WINTRUST_GET_PROC(WintrustRemoveActionID)
+ WINTRUST_GET_PROC(WintrustLoadFunctionPointers)
return TRUE;
}
@@ -256,6 +258,34 @@ static void test_AddDefaultForUsage(void)
}
}
+static void test_LoadFunctionPointers(void)
+{
+ BOOL ret;
+ CRYPT_PROVIDER_FUNCTIONS funcs;
+ GUID action = WINTRUST_ACTION_GENERIC_VERIFY_V2;
+
+ 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 && GetLastError() == ERROR_INVALID_PARAMETER,
+ "Expected ERROR_INVALID_PARAMETER, 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());
+}
+
START_TEST(register)
{
if(!InitFunctionPtrs())
@@ -263,6 +293,7 @@ START_TEST(register)
test_AddRem_ActionID();
test_AddDefaultForUsage();
+ test_LoadFunctionPointers();
FreeLibrary(hWintrust);
}
diff --git a/dlls/wintrust/wintrust_main.c b/dlls/wintrust/wintrust_main.c
index 41c97d9..073a369 100644
--- a/dlls/wintrust/wintrust_main.c
+++ b/dlls/wintrust/wintrust_main.c
@@ -119,17 +119,6 @@ CRYPT_PROVIDER_DATA * WINAPI WTHelperProvDataFromStateData(HANDLE hStateData)
}
/***********************************************************************
- * WintrustLoadFunctionPointers (WINTRUST.@)
- */
-BOOL WINAPI WintrustLoadFunctionPointers( GUID* pgActionID,
- CRYPT_PROVIDER_FUNCTIONS* pPfns )
-{
- FIXME("%s %p\n", debugstr_guid(pgActionID), pPfns);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
-}
-
-/***********************************************************************
* WintrustGetRegPolicyFlags (WINTRUST.@)
*/
void WINAPI WintrustGetRegPolicyFlags( DWORD* pdwPolicyFlags )
More information about the wine-cvs
mailing list