[PATCH] Partially implement SHGetShellKey
Nikolay Sivov
nsivov at codeweavers.com
Sun Jul 11 04:18:40 CDT 2010
---
dlls/shlwapi/ordinal.c | 36 +++++++++++++++++++++++++--
dlls/shlwapi/tests/ordinal.c | 54 ++++++++++++++++++++++++++++++++++++++++++
2 files changed, 87 insertions(+), 3 deletions(-)
diff --git a/dlls/shlwapi/ordinal.c b/dlls/shlwapi/ordinal.c
index 5f332f3..0d21921 100644
--- a/dlls/shlwapi/ordinal.c
+++ b/dlls/shlwapi/ordinal.c
@@ -4363,12 +4363,42 @@ BOOL WINAPI SHSkipJunction(IBindCtx *pbc, const CLSID *pclsid)
}
/***********************************************************************
- * SHGetShellKey (SHLWAPI.@)
+ * SHGetShellKey (SHLWAPI.491)
*/
HKEY WINAPI SHGetShellKey(DWORD flags, LPCWSTR sub_key, BOOL create)
{
- FIXME("(0x%08x, %s, %d): stub\n", flags, debugstr_w(sub_key), create);
- return (HKEY)0x50;
+ enum _shellkey_flags {
+ SHKEY_Explorer = 0x00,
+ SHKEY_Root_HKCU = 0x01
+ };
+
+ static const WCHAR explorerW[] = {'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','\\',
+ 'E','x','p','l','o','r','e','r',0};
+ HKEY hroot, hkey = NULL;
+
+ TRACE("(0x%08x, %s, %d)\n", flags, debugstr_w(sub_key), create);
+
+ switch (flags)
+ {
+ case SHKEY_Explorer | SHKEY_Root_HKCU:
+ RegOpenKeyExW(HKEY_CURRENT_USER, explorerW, 0, MAXIMUM_ALLOWED, &hroot);
+ break;
+ case 0:
+ return NULL;
+ default:
+ FIXME("unsupported flags (0x%08x)\n", flags);
+ return (HKEY)0xdeadbeef;
+ }
+
+ if (create)
+ RegCreateKeyExW(hroot, sub_key, 0, NULL, 0, MAXIMUM_ALLOWED, NULL, &hkey, NULL);
+ else
+ RegOpenKeyExW(hroot, sub_key, 0, MAXIMUM_ALLOWED, &hkey);
+
+ RegCloseKey(hroot);
+ return hkey;
}
/***********************************************************************
diff --git a/dlls/shlwapi/tests/ordinal.c b/dlls/shlwapi/tests/ordinal.c
index bf61418..30b99a8 100644
--- a/dlls/shlwapi/tests/ordinal.c
+++ b/dlls/shlwapi/tests/ordinal.c
@@ -35,6 +35,7 @@
/* Function ptrs for ordinal calls */
static HMODULE hShlwapi;
static BOOL is_win2k_and_lower;
+static BOOL is_win9x;
static int (WINAPI *pSHSearchMapInt)(const int*,const int*,int,int);
static HRESULT (WINAPI *pGetAcceptLanguagesA)(LPSTR,LPDWORD);
@@ -56,6 +57,7 @@ static BOOL (WINAPI *pGUIDFromStringA)(LPSTR, CLSID *);
static HRESULT (WINAPI *pIUnknown_QueryServiceExec)(IUnknown*, REFIID, const GUID*, DWORD, DWORD, VARIANT*, VARIANT*);
static HRESULT (WINAPI *pIUnknown_ProfferService)(IUnknown*, REFGUID, IServiceProvider*, DWORD*);
static HWND (WINAPI *pSHCreateWorkerWindowA)(LONG, HWND, DWORD, DWORD, HMENU, LONG_PTR);
+static HKEY (WINAPI *pSHGetShellKey)(DWORD, LPWSTR, BOOL);
static HMODULE hmlang;
static HRESULT (WINAPI *pLcidToRfc1766A)(LCID, LPSTR, INT);
@@ -2369,6 +2371,55 @@ static void test_SHCreateWorkerWindowA(void)
DestroyWindow(hwnd);
}
+enum _shellkey_flags {
+ SHKEY_Explorer = 0x00,
+ SHKEY_Root_HKCU = 0x01
+};
+
+static void test_SHGetShellKey(void)
+{
+ void *pPathBuildRootW = GetProcAddress(hShlwapi, "PathBuildRootW");
+ HKEY hkey, hkey2;
+ DWORD ret;
+
+ if (!pSHGetShellKey || is_win9x)
+ {
+ win_skip("SHGetShellKey(ordinal 491) isn't available\n");
+ return;
+ }
+
+ if (pPathBuildRootW && pPathBuildRootW == pSHGetShellKey) /* win2k */
+ {
+ win_skip("SHGetShellKey(ordinal 491) used for PathBuildRootW\n");
+ return;
+ }
+
+ /* marking broken cause latest Vista+ versions fail here */
+ SetLastError(0xdeadbeef);
+ hkey = pSHGetShellKey(SHKEY_Explorer, NULL, FALSE);
+ ok(hkey == NULL || broken(hkey != NULL), "got %p\n", hkey);
+ if (hkey)
+ {
+ hkey2 = 0;
+ ret = RegOpenKeyExA(hkey, "Shell Folders", 0, KEY_READ, &hkey2);
+ ok(ret == ERROR_SUCCESS, "got %d\n", ret);
+ ok(hkey2 != NULL, "got %p\n", hkey2);
+ RegCloseKey( hkey2 );
+ RegCloseKey( hkey );
+ }
+
+ hkey = pSHGetShellKey(SHKEY_Explorer | SHKEY_Root_HKCU, NULL, FALSE);
+ ok(hkey != NULL, "got %p\n", hkey);
+
+ hkey2 = 0;
+ ret = RegOpenKeyExA(hkey, "Shell Folders", 0, KEY_READ, &hkey2);
+ ok(ret == ERROR_SUCCESS, "got %d\n", ret);
+ ok(hkey2 != NULL, "got %p\n", hkey2);
+ RegCloseKey( hkey2 );
+
+ RegCloseKey( hkey );
+}
+
static void init_pointers(void)
{
#define MAKEFUNC(f, ord) (p##f = (void*)GetProcAddress(hShlwapi, (LPSTR)(ord)))
@@ -2389,6 +2440,7 @@ static void init_pointers(void)
MAKEFUNC(SHFormatDateTimeW, 354);
MAKEFUNC(SHGetObjectCompatFlags, 476);
MAKEFUNC(IUnknown_QueryServiceExec, 484);
+ MAKEFUNC(SHGetShellKey, 491);
MAKEFUNC(SHPropertyBag_ReadLONG, 496);
MAKEFUNC(IUnknown_ProfferService, 514);
#undef MAKEFUNC
@@ -2398,6 +2450,7 @@ START_TEST(ordinal)
{
hShlwapi = GetModuleHandleA("shlwapi.dll");
is_win2k_and_lower = GetProcAddress(hShlwapi, "StrChrNW") == 0;
+ is_win9x = (GetVersion() & 0x80000000);
init_pointers();
@@ -2419,4 +2472,5 @@ START_TEST(ordinal)
test_IUnknown_QueryServiceExec();
test_IUnknown_ProfferService();
test_SHCreateWorkerWindowA();
+ test_SHGetShellKey();
}
--
1.5.6.5
--------------070901050109020700070600--
More information about the wine-patches
mailing list