shlwapi: Implement undocumented SHLWAPI_266 and SHLWAPI_271
Rolf Kalbermatter
rolf.kalbermatter at citeng.com
Wed Mar 26 18:59:48 CST 2003
While fiddling around with SHRestricted() I came across this undocumented
function in shlwapi.dll. It is used by the native SHRestricted function
to do the search for a policy but Wine uses a different internal structure,
so that I did not make SHRestricted() call this function.
Changelog
* dlls/shlwapi/shlwapi.spec
Fix signature for SHLWAPI_266 and add SHLWAPI_271
* dlls/shlwapi/ordinal.h
Add some declarations used by SHLWAPI_266
* dlls/shlwapi/ordinal.c
Implement SHLWAPI_266 and SHLWAPI_271
License: X11, LGPL
Rolf Kalbermatter
Index: dlls/shlwapi/shlwapi.spec
===================================================================
RCS file: /home/wine/wine/dlls/shlwapi/shlwapi.spec,v
retrieving revision 1.71
diff -u -r1.71 shlwapi.spec
--- dlls/shlwapi/shlwapi.spec 20 Mar 2003 03:53:13 -0000 1.71
+++ dlls/shlwapi/shlwapi.spec 27 Mar 2003 00:48:49 -0000
@@ -212,7 +212,7 @@
212 stdcall @(ptr ptr long) SHLWAPI_212
213 stdcall @(ptr) SHLWAPI_213
214 stdcall @(ptr ptr) SHLWAPI_214
-215 stdcall @(long long long) SHLWAPI_215
+215 stdcall @(str ptr long) SHLWAPI_215
216 stub @
217 stdcall @(wstr ptr ptr) SHLWAPI_217
218 stdcall @(long wstr ptr ptr) SHLWAPI_218
@@ -263,12 +263,12 @@
263 stub @
264 stub @
265 stub @
-266 stdcall @(long long long long) SHLWAPI_266
+266 stdcall @(long wstr ptr ptr) SHLWAPI_266
267 stdcall @(long long long long) SHLWAPI_267
268 stdcall @(long long) SHLWAPI_268
269 stub @
270 stub @
-271 stub @
+271 stdcall @(wstr wstr wstr) SHLWAPI_271
272 stub @
273 stub @
274 stub @
Index: dlls/shlwapi/ordinal.h
===================================================================
RCS file: /home/wine/wine/dlls/shlwapi/ordinal.h,v
retrieving revision 1.5
diff -u -r1.5 ordinal.h
--- dlls/shlwapi/ordinal.h 3 Apr 2002 02:43:03 -0000 1.5
+++ dlls/shlwapi/ordinal.h 27 Mar 2003 00:55:00 -0000
@@ -51,6 +51,17 @@
if (!(func = (void*)GetProcAddress(SHLWAPI_h##module, name))) return fail; \
} \
} while (0)
+
+/* SHLWAPI_266 definitions and structures */
+#define SHELL_NO_POLICY -1
+
+typedef struct tagPOLICYDATA
+{
+ DWORD policy; /* flags value passed to SHRestricted */
+ LPCWSTR appstr; /* application str such as "Explorer" */
+ LPCWSTR keystr; /* name of the actual registry key / policy */
+} POLICYDATA, *LPPOLICYDATA;
+
extern HMODULE SHLWAPI_hshell32;
Index: dlls/shlwapi/ordinal.c
===================================================================
RCS file: /home/wine/wine/dlls/shlwapi/ordinal.c,v
retrieving revision 1.64
diff -u -r1.64 ordinal.c
--- dlls/shlwapi/ordinal.c 3 Jan 2003 19:12:56 -0000 1.64
+++ dlls/shlwapi/ordinal.c 27 Mar 2003 00:57:01 -0000
@@ -46,6 +46,7 @@
#include "winuser.h"
#include "wine/debug.h"
#include "shlwapi.h"
+#include "ordinal.h"
WINE_DEFAULT_DEBUG_CHANNEL(shell);
@@ -1068,7 +1069,6 @@
/*************************************************************************
* @ [SHLWAPI.169]
*
- *
* Release an interface.
*
* PARAMS
@@ -1371,7 +1371,7 @@
* bEnable [I] Whether to enable (TRUE) or disable (FALSE) the item.
*
* RETURNS
- * The return code from CheckMenuItem.
+ * The return code from EnableMenuItem.
*/
UINT WINAPI SHLWAPI_181(HMENU hMenu, UINT wItemID, BOOL bEnable)
{
@@ -1912,24 +1912,90 @@
return /* 0xabba1243 */ 0;
}
+/* default shell policy registry key */
+static WCHAR strRegistryPolicyW[] = {'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',
+ '\\','P','o','l','i','c','i','e','s',0};
+
+/*************************************************************************
+ * @ [SHLWAPI.271]
+ *
+ * Retrieve a policy value from the registry.
+ *
+ * PARAMS
+ * lpSubKey [I] registry key name
+ * lpSubName [I] subname of registry key
+ * lpValue [I] value name of registry value
+ *
+ * RETURNS
+ * the value associated with the registry key or 0 if not found
+ */
+DWORD WINAPI SHLWAPI_271(LPCWSTR lpSubKey, LPCWSTR lpSubName, LPCWSTR lpValue)
+{
+ DWORD retval, datsize = 4;
+ HKEY hKey;
+
+ if (!lpSubKey)
+ lpSubKey = (LPCWSTR)strRegistryPolicyW;
+
+ retval = RegOpenKeyW(HKEY_LOCAL_MACHINE, lpSubKey, &hKey);
+ if (retval != ERROR_SUCCESS)
+ retval = RegOpenKeyW(HKEY_CURRENT_USER, lpSubKey, &hKey);
+ if (retval != ERROR_SUCCESS)
+ return 0;
+
+ SHGetValueW(hKey, lpSubName, lpValue, NULL, (LPBYTE)&retval, &datsize);
+ RegCloseKey(hKey);
+ return retval;
+}
+
/*************************************************************************
- * @ [SHLWAPI.266]
+ * @ [SHLWAPI.266]
+ *
+ * Helper function to retrieve the possibly cached value for a specific policy
+ *
+ * PARAMS
+ * policy [I] The policy to look for
+ * initial [I] Main registry key to open, if NULL use default
+ * polTable [I] Table of known policies, 0 terminated
+ * polArr [I] Cache array of policy values
+ *
+ * RETURNS
+ * The retrieved policy value or 0 if not successful
*
- * native does at least approximately:
- * strcpyW(newstr, x);
- * strcatW(newstr, "\\Restrictions");
- * if (RegOpenKeyExA(80000001, newstr, 00000000,00000001,40520b78))
- * return 0;
- * *unknown*
+ * NOTES
+ * This function is used by the native SHRestricted function to search for the
+ * policy and cache it once retrieved. The current Wine implementation uses a
+ * different POLICYDATA structure and implements a similar algorithme adapted to
+ * that structure.
*/
DWORD WINAPI SHLWAPI_266 (
- LPVOID w,
- LPVOID x, /* [in] partial registry key */
- LPVOID y,
- LPVOID z)
+ DWORD policy,
+ LPCWSTR initial, /* [in] partial registry key */
+ LPPOLICYDATA polTable,
+ LPDWORD polArr)
{
- FIXME("(%p %p %p %p)stub\n",w,x,y,z);
- return /* 0xabba1248 */ 0;
+ TRACE("(0x%08x %s %p %p)\n", policy, debugstr_w(initial), polTable, polArr);
+
+ if (!polTable || !polArr)
+ return 0;
+
+ for (;polTable->policy; polTable++, polArr++)
+ {
+ if (policy == polTable->policy)
+ {
+ /* we have a known policy */
+
+ /* check if this policy has been cached */
+ if (*polArr == SHELL_NO_POLICY)
+ *polArr = SHLWAPI_271(initial, polTable->appstr, polTable->keystr);
+ return *polArr;
+ }
+ }
+ /* we don't know this policy, return 0 */
+ TRACE("unknown policy: (%08lx)\n", policy);
+ return 0;
}
/*************************************************************************
More information about the wine-patches
mailing list