From d23845620d8b2a4d9b4a8683d764b03ee2683068 Mon Sep 17 00:00:00 2001 From: Dmitry Timoshkov Date: Mon, 17 Feb 2014 11:52:46 +0900 Subject: shell32: Implement SHCreateSessionKey. This implementation is based on the Geoff Chappell description, and it seems to be enough for the application I have here. --- dlls/shell32/shell32.spec | 1 + dlls/shell32/shellreg.c | 41 +++++++++++++++++++++++++++++++++++++++++ dlls/shell32/tests/shellole.c | 4 ++-- 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/dlls/shell32/shell32.spec b/dlls/shell32/shell32.spec index 93fd449..abbe6d2 100644 --- a/dlls/shell32/shell32.spec +++ b/dlls/shell32/shell32.spec @@ -261,6 +261,7 @@ 704 stdcall -noname GUIDFromStringW(wstr ptr) 709 stdcall SHGetSetFolderCustomSettings(ptr str long) 714 stdcall @(ptr) SHELL32_714 # PathIsTemporaryW + 723 stdcall SHCreateSessionKey(long ptr) 727 stdcall SHGetImageList(long ptr ptr) 730 stdcall -noname RestartDialogEx(long wstr long long) 743 stdcall SHCreateFileExtractIconW(wstr long ptr ptr) diff --git a/dlls/shell32/shellreg.c b/dlls/shell32/shellreg.c index 37f3d9e..96a450e 100644 --- a/dlls/shell32/shellreg.c +++ b/dlls/shell32/shellreg.c @@ -147,3 +147,44 @@ HRESULT WINAPI SHRegCloseKey (HKEY hkey) TRACE("%p\n",hkey); return RegCloseKey( hkey ); } + +static const char session_reg_key[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\SessionInfo\\"; + +static BOOL WINAPI create_session_key(INIT_ONCE *once, void *param, void **context) +{ + static const char desktop_guid[] = "__wine_display_device_guid"; + ATOM guid_atom; + HKEY hkey_session; + LPWSTR session_reg_str = param; + + guid_atom = HandleToULong(GetPropA(GetDesktopWindow(), desktop_guid)); + if (!guid_atom) return FALSE; + + MultiByteToWideChar(CP_ACP, 0, session_reg_key, sizeof(session_reg_key), session_reg_str, sizeof(session_reg_key)); + + if (!GlobalGetAtomNameW(guid_atom, session_reg_str + sizeof(session_reg_key) - 1, 39)) + return FALSE; + + if (RegCreateKeyExW(HKEY_CURRENT_USER, session_reg_str, 0, NULL, + REG_OPTION_VOLATILE, KEY_WRITE, NULL, &hkey_session, NULL)) + return FALSE; + + RegCloseKey(hkey_session); + TRACE("session key %s\n", debugstr_w(session_reg_str)); + return TRUE; +} + +/************************************************************************* + * SHCreateSessionKey [SHELL32.723] + * + */ +HRESULT WINAPI SHCreateSessionKey(REGSAM access, HKEY *hkey) +{ + static INIT_ONCE init_once = INIT_ONCE_STATIC_INIT; + static WCHAR session_reg_str[sizeof(session_reg_key) + 39]; + + InitOnceExecuteOnce(&init_once, create_session_key, session_reg_str, NULL); + + TRACE("using session key %s\n", debugstr_w(session_reg_str)); + return RegOpenKeyExW(HKEY_CURRENT_USER, session_reg_str, 0, access, hkey); +} diff --git a/dlls/shell32/tests/shellole.c b/dlls/shell32/tests/shellole.c index e8cf744..91125c0 100644 --- a/dlls/shell32/tests/shellole.c +++ b/dlls/shell32/tests/shellole.c @@ -876,8 +876,8 @@ if (0) /* crashes on native */ hkey = (HKEY)0xdeadbeef; hr = pSHCreateSessionKey(0, &hkey); - ok(hr == E_ACCESSDENIED, "got 0x%08x\n", hr); - ok(hkey == NULL, "got %p\n", hkey); + todo_wine ok(hr == E_ACCESSDENIED, "got 0x%08x\n", hr); + todo_wine ok(hkey == NULL, "got %p\n", hkey); hr = pSHCreateSessionKey(KEY_READ, &hkey); ok(hr == S_OK, "got 0x%08x\n", hr); -- 2.6.4