From 3f0ee3ea2fdfbb57d84d91554a4338b2132b36a4 Mon Sep 17 00:00:00 2001 From: Alistair Leslie-Hughes Date: Wed, 22 Sep 2021 19:01:44 +1000 Subject: [PATCH] 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 ) -- 2.11.4.GIT