shell32: Implement SHCreateSessionKey.
Based on a patch by Dmitry Timoshkov. Signed-off-by: Alistair Leslie-Hughes <leslie_alistair@hotmail.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
80a19b613f
commit
a7124722aa
|
@ -33,6 +33,7 @@
|
||||||
#include "winreg.h"
|
#include "winreg.h"
|
||||||
|
|
||||||
#include "undocshell.h"
|
#include "undocshell.h"
|
||||||
|
#include "shell32_main.h"
|
||||||
|
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
|
||||||
|
@ -154,7 +155,25 @@ HRESULT WINAPI SHRegCloseKey (HKEY hkey)
|
||||||
*/
|
*/
|
||||||
HRESULT WINAPI SHCreateSessionKey(REGSAM access, HKEY *hkey)
|
HRESULT WINAPI SHCreateSessionKey(REGSAM access, HKEY *hkey)
|
||||||
{
|
{
|
||||||
FIXME("stub: %d %p\n", access, hkey);
|
static const WCHAR session_format[] = {
|
||||||
*hkey = NULL;
|
'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\',
|
||||||
return E_NOTIMPL;
|
'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','\\','S','e','s','s','i','o','n','I','n','f','o','\\','%','u',0};
|
||||||
|
DWORD session, ret;
|
||||||
|
WCHAR str[ARRAY_SIZE(session_format) + 16];
|
||||||
|
|
||||||
|
if (hkey)
|
||||||
|
*hkey = NULL;
|
||||||
|
|
||||||
|
if (!access)
|
||||||
|
return E_ACCESSDENIED;
|
||||||
|
|
||||||
|
if (!ProcessIdToSessionId(GetCurrentProcessId(), &session))
|
||||||
|
return E_INVALIDARG;
|
||||||
|
|
||||||
|
sprintfW(str, session_format, session);
|
||||||
|
TRACE("using session key %s\n", debugstr_w(str));
|
||||||
|
|
||||||
|
ret = RegCreateKeyExW(HKEY_CURRENT_USER, str, 0, NULL, REG_OPTION_VOLATILE, access, NULL, hkey, NULL);
|
||||||
|
return HRESULT_FROM_WIN32( ret );
|
||||||
}
|
}
|
||||||
|
|
|
@ -862,8 +862,15 @@ static void test_DragQueryFile(void)
|
||||||
|
|
||||||
static void test_SHCreateSessionKey(void)
|
static void test_SHCreateSessionKey(void)
|
||||||
{
|
{
|
||||||
|
static const WCHAR session_format[] = {
|
||||||
|
'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','\\','S','e','s','s','i','o','n','I','n','f','o','\\','%','u',0};
|
||||||
HKEY hkey, hkey2;
|
HKEY hkey, hkey2;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
DWORD session;
|
||||||
|
WCHAR sessionW[(sizeof(session_format)/sizeof(WCHAR)) + 16];
|
||||||
|
LONG ret;
|
||||||
|
|
||||||
if (!pSHCreateSessionKey)
|
if (!pSHCreateSessionKey)
|
||||||
{
|
{
|
||||||
|
@ -876,18 +883,28 @@ static void test_SHCreateSessionKey(void)
|
||||||
|
|
||||||
hkey = (HKEY)0xdeadbeef;
|
hkey = (HKEY)0xdeadbeef;
|
||||||
hr = pSHCreateSessionKey(0, &hkey);
|
hr = pSHCreateSessionKey(0, &hkey);
|
||||||
todo_wine ok(hr == E_ACCESSDENIED, "got 0x%08x\n", hr);
|
ok(hr == E_ACCESSDENIED, "got 0x%08x\n", hr);
|
||||||
ok(hkey == NULL, "got %p\n", hkey);
|
ok(hkey == NULL, "got %p\n", hkey);
|
||||||
|
|
||||||
hr = pSHCreateSessionKey(KEY_READ, &hkey);
|
hr = pSHCreateSessionKey(KEY_READ, &hkey);
|
||||||
todo_wine ok(hr == S_OK, "got 0x%08x\n", hr);
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
|
|
||||||
hr = pSHCreateSessionKey(KEY_READ, &hkey2);
|
hr = pSHCreateSessionKey(KEY_READ, &hkey2);
|
||||||
todo_wine ok(hr == S_OK, "got 0x%08x\n", hr);
|
ok(hr == S_OK, "got 0x%08x\n", hr);
|
||||||
todo_wine ok(hkey != hkey2, "got %p, %p\n", hkey, hkey2);
|
ok(hkey != hkey2, "got %p, %p\n", hkey, hkey2);
|
||||||
|
|
||||||
RegCloseKey(hkey);
|
RegCloseKey(hkey);
|
||||||
RegCloseKey(hkey2);
|
RegCloseKey(hkey2);
|
||||||
|
|
||||||
|
/* check the registry */
|
||||||
|
ProcessIdToSessionId( GetCurrentProcessId(), &session);
|
||||||
|
if (session)
|
||||||
|
{
|
||||||
|
wsprintfW(sessionW, session_format, session);
|
||||||
|
ret = RegOpenKeyW(HKEY_CURRENT_USER, sessionW, &hkey);
|
||||||
|
ok(!ret, "key not found\n");
|
||||||
|
RegCloseKey(hkey);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_dragdrophelper(void)
|
static void test_dragdrophelper(void)
|
||||||
|
|
Loading…
Reference in New Issue