Juan Lang : wintrust:
Implement WintrustGetRegPolicyFlags and WintrustSetRegPolicyFlags.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue May 15 14:02:16 CDT 2007
Module: wine
Branch: master
Commit: 1af94dbf3b83c68058d432fcc32e7a09d0ea2041
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1af94dbf3b83c68058d432fcc32e7a09d0ea2041
Author: Juan Lang <juan_lang at yahoo.com>
Date: Mon May 14 18:15:09 2007 -0700
wintrust: Implement WintrustGetRegPolicyFlags and WintrustSetRegPolicyFlags.
---
dlls/wintrust/tests/register.c | 60 ++++++++++++++++++++++++++++++++++++++++
dlls/wintrust/wintrust_main.c | 55 ++++++++++++++++++++++++++++++++++--
include/wintrust.h | 1 +
3 files changed, 113 insertions(+), 3 deletions(-)
diff --git a/dlls/wintrust/tests/register.c b/dlls/wintrust/tests/register.c
index 95f8dc6..8046a78 100644
--- a/dlls/wintrust/tests/register.c
+++ b/dlls/wintrust/tests/register.c
@@ -286,6 +286,65 @@ static void test_LoadFunctionPointers(void)
ok(ret, "WintrustLoadFunctionPointers failed: %d\n", GetLastError());
}
+typedef void (WINAPI *WintrustGetRegPolicyFlagsFunc)(DWORD *);
+typedef BOOL (WINAPI *WintrustSetRegPolicyFlagsFunc)(DWORD);
+
+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 WCHAR Software_Publishing[] = {
+ 'S','o','f','t','w','a','r','e','\\',
+ 'M','i','c','r','o','s','o','f','t','\\',
+ 'W','i','n','d','o','w','s','\\',
+ 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
+ 'W','i','n','t','r','u','s','t','\\',
+ 'T','r','u','s','t',' ','P','r','o','v','i','d','e','r','s','\\',
+ 'S','o','f','t','w','a','r','e',' ',
+ 'P','u','b','l','i','s','h','i','n','g',0 };
+ static const WCHAR State[] = { 'S','t','a','t','e',0 };
+ WintrustGetRegPolicyFlagsFunc pGetFlags;
+ WintrustSetRegPolicyFlagsFunc pSetFlags;
+ HKEY key;
+ LONG r;
+ DWORD flags1, flags2, flags3, size;
+ BOOL ret;
+
+ pGetFlags = (WintrustGetRegPolicyFlagsFunc)GetProcAddress(hWintrust,
+ "WintrustGetRegPolicyFlags");
+ pSetFlags = (WintrustSetRegPolicyFlagsFunc)GetProcAddress(hWintrust,
+ "WintrustSetRegPolicyFlags");
+ if (!pGetFlags || !pSetFlags)
+ skip("Policy flags functions not present\n");
+
+ r = RegOpenKeyExW(HKEY_CURRENT_USER, Software_Publishing, 0, KEY_ALL_ACCESS,
+ &key);
+ ok(!r, "RegOpenKeyEx failed: %d\n", r);
+
+ size = sizeof(flags1);
+ r = RegQueryValueExW(key, State, NULL, NULL, (LPBYTE)&flags1, &size);
+ ok(!r, "RegQueryValueEx failed: %d\n", r);
+
+ pGetFlags(&flags2);
+ ok(flags1 == flags2, "Didn't get expected flags\n");
+
+ flags3 = flags2 | 1;
+ ret = pSetFlags(flags3);
+ ok(ret, "pSetFlags failed: %d\n", GetLastError());
+ size = sizeof(flags1);
+ r = RegQueryValueExW(key, State, NULL, NULL, (LPBYTE)&flags1, &size);
+ ok(flags1 == flags3, "Didn't get expected flags\n");
+
+ pSetFlags(flags2);
+
+ RegCloseKey(key);
+}
+
START_TEST(register)
{
if(!InitFunctionPtrs())
@@ -294,6 +353,7 @@ START_TEST(register)
test_AddRem_ActionID();
test_AddDefaultForUsage();
test_LoadFunctionPointers();
+ test_RegPolicyFlags();
FreeLibrary(hWintrust);
}
diff --git a/dlls/wintrust/wintrust_main.c b/dlls/wintrust/wintrust_main.c
index 073a369..66ad322 100644
--- a/dlls/wintrust/wintrust_main.c
+++ b/dlls/wintrust/wintrust_main.c
@@ -23,6 +23,7 @@
#include "windef.h"
#include "winbase.h"
#include "winerror.h"
+#include "winreg.h"
#include "guiddef.h"
#include "wintrust.h"
#include "softpub.h"
@@ -118,13 +119,48 @@ CRYPT_PROVIDER_DATA * WINAPI WTHelperProvDataFromStateData(HANDLE hStateData)
return NULL;
}
+static const WCHAR Software_Publishing[] = {
+ 'S','o','f','t','w','a','r','e','\\',
+ 'M','i','c','r','o','s','o','f','t','\\',
+ 'W','i','n','d','o','w','s','\\',
+ 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
+ 'W','i','n','t','r','u','s','t','\\',
+ 'T','r','u','s','t',' ','P','r','o','v','i','d','e','r','s','\\',
+ 'S','o','f','t','w','a','r','e',' ',
+ 'P','u','b','l','i','s','h','i','n','g',0 };
+static const WCHAR State[] = { 'S','t','a','t','e',0 };
+
/***********************************************************************
* WintrustGetRegPolicyFlags (WINTRUST.@)
*/
void WINAPI WintrustGetRegPolicyFlags( DWORD* pdwPolicyFlags )
{
- FIXME("%p\n", pdwPolicyFlags);
+ HKEY key;
+ LONG r;
+
+ TRACE("%p\n", pdwPolicyFlags);
+
*pdwPolicyFlags = 0;
+ r = RegCreateKeyExW(HKEY_CURRENT_USER, Software_Publishing, 0, NULL, 0,
+ KEY_READ, NULL, &key, NULL);
+ if (!r)
+ {
+ DWORD size = sizeof(DWORD);
+
+ r = RegQueryValueExW(key, State, NULL, NULL, (LPBYTE)pdwPolicyFlags,
+ &size);
+ RegCloseKey(key);
+ if (r)
+ {
+ /* Failed to query, create and return default value */
+ *pdwPolicyFlags = WTPF_IGNOREREVOCATIONONTS |
+ WTPF_OFFLINEOKNBU_COM |
+ WTPF_OFFLINEOKNBU_IND |
+ WTPF_OFFLINEOK_COM |
+ WTPF_OFFLINEOK_IND;
+ WintrustSetRegPolicyFlags(*pdwPolicyFlags);
+ }
+ }
}
/***********************************************************************
@@ -132,6 +168,19 @@ void WINAPI WintrustGetRegPolicyFlags( DWORD* pdwPolicyFlags )
*/
BOOL WINAPI WintrustSetRegPolicyFlags( DWORD dwPolicyFlags)
{
- FIXME("stub: %x\n", dwPolicyFlags);
- return TRUE;
+ HKEY key;
+ LONG r;
+
+ TRACE("%x\n", dwPolicyFlags);
+
+ r = RegCreateKeyExW(HKEY_CURRENT_USER, Software_Publishing, 0,
+ NULL, 0, KEY_WRITE, NULL, &key, NULL);
+ if (!r)
+ {
+ r = RegSetValueExW(key, State, 0, REG_DWORD, (LPBYTE)&dwPolicyFlags,
+ sizeof(DWORD));
+ RegCloseKey(key);
+ }
+ if (r) SetLastError(r);
+ return r == ERROR_SUCCESS;
}
diff --git a/include/wintrust.h b/include/wintrust.h
index a422f9d..f7c0667 100644
--- a/include/wintrust.h
+++ b/include/wintrust.h
@@ -364,6 +364,7 @@ BOOL WINAPI WintrustRemoveActionID(GUID*);
BOOL WINAPI WintrustLoadFunctionPointers(GUID*,CRYPT_PROVIDER_FUNCTIONS*);
BOOL WINAPI WintrustAddDefaultForUsage(const char*,CRYPT_PROVIDER_REGDEFUSAGE*);
void WINAPI WintrustGetRegPolicyFlags(DWORD*);
+BOOL WINAPI WintrustSetRegPolicyFlags(DWORD);
LONG WINAPI WinVerifyTrust(HWND,GUID*,LPVOID);
HRESULT WINAPI WinVerifyTrustEx(HWND,GUID*,WINTRUST_DATA*);
More information about the wine-cvs
mailing list