Module: wine Branch: master Commit: 5d7bbb56c15ec5fb377802395e762ba665975b93 URL: https://gitlab.winehq.org/wine/wine/-/commit/5d7bbb56c15ec5fb377802395e762ba...
Author: Sven Baars sbaars@codeweavers.com Date: Wed Nov 30 13:57:09 2022 +0100
kernelbase: Move create_key() below open_key().
---
dlls/kernelbase/registry.c | 162 ++++++++++++++++++++++----------------------- 1 file changed, 81 insertions(+), 81 deletions(-)
diff --git a/dlls/kernelbase/registry.c b/dlls/kernelbase/registry.c index 133214c84d4..a74a4d8e411 100644 --- a/dlls/kernelbase/registry.c +++ b/dlls/kernelbase/registry.c @@ -140,87 +140,6 @@ static HKEY get_perflib_key( HANDLE key ) return key; }
-/* wrapper for NtCreateKey that creates the key recursively if necessary */ -static NTSTATUS create_key( HKEY *retkey, HKEY root, UNICODE_STRING name, ULONG options, ACCESS_MASK access, - const UNICODE_STRING *class, PULONG dispos ) -{ - BOOL force_wow32 = is_win64 && (access & KEY_WOW64_32KEY); - NTSTATUS status = STATUS_OBJECT_NAME_NOT_FOUND; - OBJECT_ATTRIBUTES attr; - HANDLE subkey; - - attr.Length = sizeof(attr); - attr.RootDirectory = root; - attr.ObjectName = &name; - attr.Attributes = 0; - attr.SecurityDescriptor = NULL; - attr.SecurityQualityOfService = NULL; - if (options & REG_OPTION_OPEN_LINK) attr.Attributes |= OBJ_OPENLINK; - - if (!force_wow32) status = NtCreateKey( &subkey, access, &attr, 0, class, options, dispos ); - - 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; - - attrs = attr.Attributes; - - for (;;) - { - 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; - } - } - if (i == len) - { - attr.Attributes = attrs; - status = NtCreateKey( &subkey, access, &attr, 0, class, options, dispos ); - } - else - { - attr.Attributes = attrs & ~OBJ_OPENLINK; - status = NtCreateKey( &subkey, access, &attr, 0, class, - options & ~REG_OPTION_CREATE_LINK, dispos ); - } - 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++; - } - } - 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 ); - status = STATUS_SUCCESS; - } - *retkey = attr.RootDirectory; - return status; -} - static NTSTATUS open_subkey( HKEY *subkey, HKEY root, UNICODE_STRING *name, DWORD options, ACCESS_MASK access ) { DWORD i = 0, len = name->Length / sizeof(WCHAR); @@ -322,6 +241,87 @@ static NTSTATUS open_key( HKEY *retkey, HKEY root, UNICODE_STRING name, DWORD op return status; }
+/* wrapper for NtCreateKey that creates the key recursively if necessary */ +static NTSTATUS create_key( HKEY *retkey, HKEY root, UNICODE_STRING name, ULONG options, ACCESS_MASK access, + const UNICODE_STRING *class, PULONG dispos ) +{ + BOOL force_wow32 = is_win64 && (access & KEY_WOW64_32KEY); + NTSTATUS status = STATUS_OBJECT_NAME_NOT_FOUND; + OBJECT_ATTRIBUTES attr; + HANDLE subkey; + + attr.Length = sizeof(attr); + attr.RootDirectory = root; + attr.ObjectName = &name; + attr.Attributes = 0; + attr.SecurityDescriptor = NULL; + attr.SecurityQualityOfService = NULL; + if (options & REG_OPTION_OPEN_LINK) attr.Attributes |= OBJ_OPENLINK; + + if (!force_wow32) status = NtCreateKey( &subkey, access, &attr, 0, class, options, dispos ); + + 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; + + attrs = attr.Attributes; + + for (;;) + { + 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; + } + } + if (i == len) + { + attr.Attributes = attrs; + status = NtCreateKey( &subkey, access, &attr, 0, class, options, dispos ); + } + else + { + attr.Attributes = attrs & ~OBJ_OPENLINK; + status = NtCreateKey( &subkey, access, &attr, 0, class, + options & ~REG_OPTION_CREATE_LINK, dispos ); + } + 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++; + } + } + 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 ); + status = STATUS_SUCCESS; + } + *retkey = attr.RootDirectory; + return status; +} + /* create one of the HKEY_* special root keys */ static HKEY create_special_root_hkey( HKEY hkey, DWORD access ) {