Module: wine Branch: master Commit: 3f0ee3ea2fdfbb57d84d91554a4338b2132b36a4 URL: https://gitlab.winehq.org/wine/wine/-/commit/3f0ee3ea2fdfbb57d84d91554a4338b...
Author: Alistair Leslie-Hughes leslie_alistair@hotmail.com Date: Wed Sep 22 19:01:44 2021 +1000
sapi: Implement ISpRegDataKey CreateKey.
---
dlls/sapi/tests/token.c | 8 ++++++++ dlls/sapi/token.c | 24 ++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-)
diff --git a/dlls/sapi/tests/token.c b/dlls/sapi/tests/token.c index a65669b585a..63f5c651a50 100644 --- a/dlls/sapi/tests/token.c +++ b/dlls/sapi/tests/token.c @@ -29,6 +29,7 @@ static void test_data_key(void) { ISpRegDataKey *data_key; + ISpDataKey *sub; HRESULT hr; HKEY key; LONG res; @@ -41,11 +42,18 @@ static void test_data_key(void) NULL, &key, NULL ); ok( res == ERROR_SUCCESS, "got %ld\n", res );
+ hr = ISpRegDataKey_CreateKey( data_key, L"Testing", &sub ); + ok( hr == E_HANDLE, "got %08lx\n", hr ); + hr = ISpRegDataKey_SetKey( data_key, key, FALSE ); ok( hr == S_OK, "got %08lx\n", hr ); hr = ISpRegDataKey_SetKey( data_key, key, FALSE ); ok( hr == SPERR_ALREADY_INITIALIZED, "got %08lx\n", hr );
+ hr = ISpRegDataKey_CreateKey( data_key, L"Testing", &sub ); + ok( hr == S_OK, "got %08lx\n", hr ); + ISpDataKey_Release(sub); + ISpRegDataKey_Release( data_key ); }
diff --git a/dlls/sapi/token.c b/dlls/sapi/token.c index 6993ffdbac1..133d27a2a66 100644 --- a/dlls/sapi/token.c +++ b/dlls/sapi/token.c @@ -145,8 +145,28 @@ static HRESULT WINAPI data_key_OpenKey( ISpRegDataKey *iface, static HRESULT WINAPI data_key_CreateKey( ISpRegDataKey *iface, LPCWSTR name, ISpDataKey **sub_key ) { - FIXME( "stub\n" ); - return E_NOTIMPL; + struct data_key *This = impl_from_ISpRegDataKey( iface ); + ISpRegDataKey *spregkey; + HRESULT hr; + HKEY key; + LONG res; + + TRACE( "%p, %s, %p\n", This, debugstr_w(name), sub_key ); + + res = RegCreateKeyExW( This->key, name, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &key, NULL ); + if (res != ERROR_SUCCESS) + return HRESULT_FROM_WIN32(res); + + hr = data_key_create(NULL, &IID_ISpRegDataKey, (void**)&spregkey); + if (SUCCEEDED(hr)) + { + hr = ISpRegDataKey_SetKey(spregkey, key, FALSE); + if (SUCCEEDED(hr)) + hr = ISpRegDataKey_QueryInterface(spregkey, &IID_ISpDataKey, (void**)sub_key); + ISpRegDataKey_Release(spregkey); + } + + return hr; }
static HRESULT WINAPI data_key_DeleteKey( ISpRegDataKey *iface, LPCWSTR name )