[PATCH 2/2] Partially implement SHGetShellKey
Nikolay Sivov
nsivov at codeweavers.com
Tue Jul 27 10:41:55 CDT 2010
---
dlls/shlwapi/ordinal.c | 36 ++++++++++++++++++++++--
dlls/shlwapi/tests/ordinal.c | 63 +++++++++++++++++++++++++++++++++++++++++-
2 files changed, 95 insertions(+), 4 deletions(-)
diff --git a/dlls/shlwapi/ordinal.c b/dlls/shlwapi/ordinal.c
index 2bf0e79..3e47af6 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 3f8f2a1..5e3d5f3 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);
@@ -627,7 +629,7 @@ static void test_GetShellSecurityDescriptor(void)
DWORD dwRev;
SECURITY_DESCRIPTOR_CONTROL control;
- ok(IsValidSecurityDescriptor(psd), "returned value is not valid SD\n");
+ ok(IsValidSecurityDescriptor(psd), "returned value is not valid SD, %p\n", psd);
ok(GetSecurityDescriptorControl(psd, &control, &dwRev),
"GetSecurityDescriptorControl failed with error %u\n", GetLastError());
@@ -2661,6 +2663,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)))
@@ -2684,6 +2742,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
@@ -2693,6 +2752,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();
@@ -2720,6 +2780,7 @@ START_TEST(ordinal)
test_SHIShellFolder_EnumObjects();
test_SHGetIniString();
test_SHSetIniString();
+ test_SHGetShellKey();
FreeLibrary(hshell32);
FreeLibrary(hmlang);
--
1.5.6.5
--------------000303020702080402010905--
More information about the wine-patches
mailing list