[PATCH 5/6] Partially implement SHGetShellKey

Nikolay Sivov nsivov at codeweavers.com
Wed Jul 21 06:45:27 CDT 2010


---
 dlls/shlwapi/ordinal.c       |   36 ++++++++++++++++++++++--
 dlls/shlwapi/tests/ordinal.c |   61 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 94 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 c8cfcfc..7f56ad1 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);
@@ -2370,6 +2372,62 @@ 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)
+    {
+        win_skip("SHGetShellKey(ordinal 491) isn't available\n");
+        return;
+    }
+
+    /* some win2k */
+    if (pPathBuildRootW && pPathBuildRootW == pSHGetShellKey)
+    {
+        win_skip("SHGetShellKey(ordinal 491) used for PathBuildRootW\n");
+        return;
+    }
+
+    if (is_win9x || is_win2k_and_lower)
+    {
+        win_skip("Ordinal 491 used for another call, skipping SHGetShellKey tests\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)))
@@ -2390,6 +2448,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
@@ -2399,6 +2458,7 @@ START_TEST(ordinal)
 {
     hShlwapi = GetModuleHandleA("shlwapi.dll");
     is_win2k_and_lower = GetProcAddress(hShlwapi, "StrChrNW") == 0;
+    is_win9x = GetProcAddress(hShlwapi, (LPSTR)99) == 0; /* StrCpyNXA */
 
     init_pointers();
 
@@ -2420,4 +2480,5 @@ START_TEST(ordinal)
     test_IUnknown_QueryServiceExec();
     test_IUnknown_ProfferService();
     test_SHCreateWorkerWindowA();
+    test_SHGetShellKey();
 }
-- 
1.5.6.5


--------------000308080305050702010704--



More information about the wine-patches mailing list