From b5a0759b15e494d244304b10e057c03f405855dd Mon Sep 17 00:00:00 2001 From: Sven Baars Date: Wed, 30 Nov 2022 13:43:47 +0100 Subject: [PATCH] kernelbase: Restructure the create_key() loop. --- dlls/kernelbase/registry.c | 55 ++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/dlls/kernelbase/registry.c b/dlls/kernelbase/registry.c index c690d659eb4..d414b210026 100644 --- a/dlls/kernelbase/registry.c +++ b/dlls/kernelbase/registry.c @@ -274,30 +274,21 @@ static NTSTATUS create_key( HKEY *retkey, HKEY root, UNICODE_STRING name, ULONG if (status == STATUS_OBJECT_NAME_NOT_FOUND) { WCHAR *buffer = name.Buffer; - DWORD attrs, pos = 0, i = 0, len = name.Length / sizeof(WCHAR); - - /* don't try to create registry root */ - if (!attr.RootDirectory && len > 10 && !wcsnicmp( buffer, L"\\Registry\\", 10 )) i += 10; - - while (i < len && buffer[i] != '\\') i++; - if (i == len && !force_wow32) return status; + DWORD attrs, i, len = name.Length / sizeof(WCHAR); attrs = attr.Attributes; - for (;;) + while (len) { - name.Buffer = buffer + pos; - name.Length = (i - pos) * sizeof(WCHAR); - if (force_wow32 && pos) - { - if (is_wow6432node( &name )) force_wow32 = FALSE; - else if ((subkey = open_wow6432node( attr.RootDirectory ))) - { - if (attr.RootDirectory != root) NtClose( attr.RootDirectory ); - attr.RootDirectory = subkey; - force_wow32 = FALSE; - } - } + i = 0; + + /* don't try to create registry root */ + if (!attr.RootDirectory && len > 10 && !wcsnicmp( buffer, L"\\Registry\\", 10 )) i += 10; + while (i < len && buffer[i] != '\\') i++; + + name.Buffer = buffer; + name.Length = i * sizeof(WCHAR); + if (i == len) { attr.Attributes = attrs; @@ -311,19 +302,25 @@ static NTSTATUS create_key( HKEY *retkey, HKEY root, UNICODE_STRING name, ULONG } if (attr.RootDirectory != root) NtClose( attr.RootDirectory ); if (!NT_SUCCESS(status)) return status; - if (i == len) break; attr.RootDirectory = subkey; while (i < len && buffer[i] == '\\') i++; - pos = i; - while (i < len && buffer[i] != '\\') i++; + buffer += i; + len -= i; + + if (force_wow32) + { + name.Buffer = buffer; + name.Length = len * sizeof(WCHAR); + if (is_wow6432node( &name )) force_wow32 = FALSE; + else if ((subkey = open_wow6432node( attr.RootDirectory ))) + { + NtClose( attr.RootDirectory ); + attr.RootDirectory = subkey; + force_wow32 = FALSE; + } + } } } - attr.RootDirectory = subkey; - if (force_wow32 && (subkey = open_wow6432node( attr.RootDirectory ))) - { - if (attr.RootDirectory != root) NtClose( attr.RootDirectory ); - attr.RootDirectory = subkey; - } if (status == STATUS_PREDEFINED_HANDLE) { attr.RootDirectory = get_perflib_key( attr.RootDirectory );