From e7395e09e175ac635fa655ca9abb7c66bb549ab0 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Thu, 29 Jul 2010 10:02:02 +0400 Subject: [PATCH] shlwapi: Partially implement SHGetShellKey. --- 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 2bf0e79f1ac..3e47af63445 100644 --- a/dlls/shlwapi/ordinal.c +++ b/dlls/shlwapi/ordinal.c @@ -4401,12 +4401,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 c3c59c4e38c..0089a43bb1e 100644 --- a/dlls/shlwapi/tests/ordinal.c +++ b/dlls/shlwapi/tests/ordinal.c @@ -36,6 +36,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); @@ -60,6 +61,7 @@ static HWND (WINAPI *pSHCreateWorkerWindowA)(LONG, HWND, DWORD, DWORD, HMENU, static HRESULT (WINAPI *pSHIShellFolder_EnumObjects)(LPSHELLFOLDER, HWND, SHCONTF, IEnumIDList**); static DWORD (WINAPI *pSHGetIniStringW)(LPCWSTR, LPCWSTR, LPWSTR, DWORD, LPCWSTR); static BOOL (WINAPI *pSHSetIniStringW)(LPCWSTR, LPCWSTR, LPCWSTR, LPCWSTR); +static HKEY (WINAPI *pSHGetShellKey)(DWORD, LPWSTR, BOOL); static HMODULE hmlang; static HRESULT (WINAPI *pLcidToRfc1766A)(LCID, LPSTR, INT); @@ -2675,6 +2677,62 @@ static void test_SHSetIniString(void) DeleteFileW(TestIniW); } +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))) @@ -2698,6 +2756,7 @@ static void init_pointers(void) MAKEFUNC(SHIShellFolder_EnumObjects, 404); MAKEFUNC(SHGetObjectCompatFlags, 476); MAKEFUNC(IUnknown_QueryServiceExec, 484); + MAKEFUNC(SHGetShellKey, 491); MAKEFUNC(SHPropertyBag_ReadLONG, 496); MAKEFUNC(IUnknown_ProfferService, 514); #undef MAKEFUNC @@ -2707,6 +2766,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(); @@ -2734,6 +2794,7 @@ START_TEST(ordinal) test_SHIShellFolder_EnumObjects(); test_SHGetIniString(); test_SHSetIniString(); + test_SHGetShellKey(); FreeLibrary(hshell32); FreeLibrary(hmlang);