Signed-off-by: Torge Matthies openglfreak@googlemail.com
-- v4: loader: Add Default, Failed, and LastKnownGood values to HKLM\System\Select. server: Update existing prefixes to use a symlink for HKLM\System\CurrentControlSet. server: Create link from HKLM\System\CurrentControlSet to ControlSet001. advapi32/tests: Add test for CurrentControlSet link.
From: Torge Matthies openglfreak@googlemail.com
Signed-off-by: Torge Matthies openglfreak@googlemail.com --- dlls/advapi32/tests/registry.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+)
diff --git a/dlls/advapi32/tests/registry.c b/dlls/advapi32/tests/registry.c index 8bffefe8628..86784a16d5c 100644 --- a/dlls/advapi32/tests/registry.c +++ b/dlls/advapi32/tests/registry.c @@ -4955,6 +4955,39 @@ static void test_RegRenameKey(void) RegCloseKey(key); }
+static inline BOOL check_cs_number( const WCHAR *str ) +{ + if (str[0] < '0' || str[0] > '9' || str[1] < '0' || str[1] > '9' || str[2] < '0' || str[2] > '9') + return FALSE; + if (str[0] == '0' && str[1] == '0' && str[2] == '0') + return FALSE; + return TRUE; +} + +static void test_control_set_symlink(void) +{ + static const WCHAR target_pfxW[] = L"\REGISTRY\Machine\System\ControlSet"; + DWORD target_len, type, len, err; + BYTE buffer[1024]; + HKEY key; + + target_len = sizeof(target_pfxW) + 3 * sizeof(WCHAR); + + err = RegOpenKeyExA( HKEY_LOCAL_MACHINE, "System\CurrentControlSet", REG_OPTION_OPEN_LINK, KEY_QUERY_VALUE, &key ); + ok( err == ERROR_SUCCESS, "RegOpenKeyEx failed error %lu\n", err ); + len = sizeof(buffer); + err = RegQueryValueExA( key, "SymbolicLinkValue", NULL, &type, buffer, &len ); + todo_wine + ok( err == ERROR_SUCCESS, "RegQueryValueEx failed error %lu\n", err ); + todo_wine + ok( len == target_len - sizeof(WCHAR), "wrong len %lu\n", len ); + todo_wine + ok( !_wcsnicmp( (WCHAR*)buffer, target_pfxW, ARRAY_SIZE(target_pfxW) - 1 ) && + check_cs_number( (WCHAR*)buffer + ARRAY_SIZE(target_pfxW) - 1 ), + "wrong link target\n" ); + RegCloseKey( key ); +} + START_TEST(registry) { /* Load pointers for functions that are not available in all Windows versions */ @@ -4996,6 +5029,7 @@ START_TEST(registry) test_EnumDynamicTimeZoneInformation(); test_perflib_key(); test_RegRenameKey(); + test_control_set_symlink();
/* cleanup */ delete_key( hkey_main );
From: Torge Matthies openglfreak@googlemail.com
Signed-off-by: Torge Matthies openglfreak@googlemail.com --- dlls/advapi32/tests/registry.c | 3 --- server/registry.c | 22 ++++++++++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-)
diff --git a/dlls/advapi32/tests/registry.c b/dlls/advapi32/tests/registry.c index 86784a16d5c..54a9b5be2a2 100644 --- a/dlls/advapi32/tests/registry.c +++ b/dlls/advapi32/tests/registry.c @@ -4977,11 +4977,8 @@ static void test_control_set_symlink(void) ok( err == ERROR_SUCCESS, "RegOpenKeyEx failed error %lu\n", err ); len = sizeof(buffer); err = RegQueryValueExA( key, "SymbolicLinkValue", NULL, &type, buffer, &len ); - todo_wine ok( err == ERROR_SUCCESS, "RegQueryValueEx failed error %lu\n", err ); - todo_wine ok( len == target_len - sizeof(WCHAR), "wrong len %lu\n", len ); - todo_wine ok( !_wcsnicmp( (WCHAR*)buffer, target_pfxW, ARRAY_SIZE(target_pfxW) - 1 ) && check_cs_number( (WCHAR*)buffer + ARRAY_SIZE(target_pfxW) - 1 ), "wrong link target\n" ); diff --git a/server/registry.c b/server/registry.c index 3fea7dd79a4..33cda84788f 100644 --- a/server/registry.c +++ b/server/registry.c @@ -1892,10 +1892,18 @@ void init_registry(void) 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\', 'P','e','r','f','l','i','b','\', '0','0','9'}; + static const WCHAR system[] = {'S','y','s','t','e','m'}; + static const WCHAR ccs[] = {'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t'}; + static const WCHAR cs001_path[] = {'\','R','E','G','I','S','T','R','Y','\', + 'M','a','c','h','i','n','e','\', + 'S','y','s','t','e','m','\', + 'C','o','n','t','r','o','l','S','e','t','0','0','1'}; static const struct unicode_str root_name = { REGISTRY, sizeof(REGISTRY) }; static const struct unicode_str HKLM_name = { HKLM, sizeof(HKLM) }; static const struct unicode_str HKU_name = { HKU_default, sizeof(HKU_default) }; static const struct unicode_str perflib_name = { perflib, sizeof(perflib) }; + static const struct unicode_str system_name = { system, sizeof(system) }; + static const struct unicode_str ccs_name = { ccs, sizeof(ccs) };
WCHAR *current_user_path; struct unicode_str current_user_str; @@ -1973,6 +1981,20 @@ void init_registry(void) release_object( key ); }
+ if ((key = create_key_recursive( hklm, &system_name, current_time ))) + { + struct key *subkey; + subkey = create_key_object( &key->obj, &ccs_name, OBJ_OPENIF | OBJ_OPENLINK, REG_OPTION_CREATE_LINK, + current_time, NULL ); + release_object( key ); + if (subkey) + { + if (subkey->flags & KEY_SYMLINK) + set_value( subkey, &symlink_str, REG_LINK, cs001_path, sizeof(cs001_path) ); + release_object( subkey ); + } + } + release_object( hklm ); release_object( hkcu );
From: Torge Matthies openglfreak@googlemail.com
Signed-off-by: Torge Matthies openglfreak@googlemail.com --- server/registry.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/server/registry.c b/server/registry.c index 33cda84788f..cd9f1596686 100644 --- a/server/registry.c +++ b/server/registry.c @@ -1894,6 +1894,7 @@ void init_registry(void) '0','0','9'}; static const WCHAR system[] = {'S','y','s','t','e','m'}; static const WCHAR ccs[] = {'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t'}; + static const WCHAR cs001[] = {'C','o','n','t','r','o','l','S','e','t','0','0','1'}; static const WCHAR cs001_path[] = {'\','R','E','G','I','S','T','R','Y','\', 'M','a','c','h','i','n','e','\', 'S','y','s','t','e','m','\', @@ -1904,6 +1905,7 @@ void init_registry(void) static const struct unicode_str perflib_name = { perflib, sizeof(perflib) }; static const struct unicode_str system_name = { system, sizeof(system) }; static const struct unicode_str ccs_name = { ccs, sizeof(ccs) }; + static const struct unicode_str cs001_name = { cs001, sizeof(cs001) };
WCHAR *current_user_path; struct unicode_str current_user_str; @@ -1986,11 +1988,17 @@ void init_registry(void) struct key *subkey; subkey = create_key_object( &key->obj, &ccs_name, OBJ_OPENIF | OBJ_OPENLINK, REG_OPTION_CREATE_LINK, current_time, NULL ); + if (subkey && !(subkey->flags & KEY_SYMLINK)) + { + rename_key( subkey, &cs001_name ); + release_object( subkey ); + subkey = create_key_object( &key->obj, &ccs_name, OBJ_OPENLINK, REG_OPTION_CREATE_LINK, current_time, + NULL ); + } release_object( key ); if (subkey) { - if (subkey->flags & KEY_SYMLINK) - set_value( subkey, &symlink_str, REG_LINK, cs001_path, sizeof(cs001_path) ); + set_value( subkey, &symlink_str, REG_LINK, cs001_path, sizeof(cs001_path) ); release_object( subkey ); } }
From: Torge Matthies openglfreak@googlemail.com
Signed-off-by: Torge Matthies openglfreak@googlemail.com --- loader/wine.inf.in | 3 +++ 1 file changed, 3 insertions(+)
diff --git a/loader/wine.inf.in b/loader/wine.inf.in index 347af35af6d..9145a5b176d 100644 --- a/loader/wine.inf.in +++ b/loader/wine.inf.in @@ -602,6 +602,9 @@ HKLM,System\CurrentControlSet\Control\TimeZoneInformation,"TimeZoneKeyName",2,"" HKLM,System\CurrentControlSet\Control\VirtualDeviceDrivers,,16 HKLM,System\CurrentControlSet\Control\VMM32Files,,16 HKLM,System\Select,"Current",0x10003,1 +HKLM,System\Select,"Default",0x10003,1 +HKLM,System\Select,"Failed",0x10003,0 +HKLM,System\Select,"LastKnownGood",0x10003,1 HKCU,AppEvents\Schemes\Apps\Explorer\Navigating.Current,,,"" HKCU,Software\Microsoft\Protected Storage System Provider,,16 ; Some apps requires at least four subkeys of Active Setup\Installed Components
I added code that automatically updates existing prefixes to use a symlink for CurrentControlSet. If that's not desired, then that commit can be cleanly dropped. I'd prefer to update prefixes though.