From: Billy Laws blaws05@gmail.com
--- dlls/ntdll/unix/registry.c | 32 ++++++++++++++++++++++++++++++++ dlls/ntdll/unix/unix_private.h | 2 ++ 2 files changed, 34 insertions(+)
diff --git a/dlls/ntdll/unix/registry.c b/dlls/ntdll/unix/registry.c index e19414bfa86..666c2942335 100644 --- a/dlls/ntdll/unix/registry.c +++ b/dlls/ntdll/unix/registry.c @@ -68,6 +68,38 @@ NTSTATUS open_hkcu_key( const char *path, HANDLE *key ) return NtCreateKey( key, KEY_ALL_ACCESS, &attr, 0, NULL, 0, NULL ); }
+NTSTATUS create_key_recursive( HANDLE *key, ACCESS_MASK access, const OBJECT_ATTRIBUTES *attr, + ULONG index, const UNICODE_STRING *class, ULONG options, ULONG *dispos ) +{ + NTSTATUS status; + HANDLE own_key; + OBJECT_ATTRIBUTES own_attr; + UNICODE_STRING own_name; + DWORD len; + + status = NtCreateKey( key, access, attr, index, class, options, dispos ); + if (!status || status != STATUS_OBJECT_NAME_NOT_FOUND) return status; + + own_attr = *attr; + own_attr.ObjectName = &own_name; + own_name = *attr->ObjectName; + len = own_name.Length / sizeof(WCHAR); + + while (len && own_name.Buffer[len - 1] != '\') len--; + if (!len--) return STATUS_OBJECT_PATH_INVALID; + + own_name.Length = len * sizeof(WCHAR); + status = create_key_recursive( &own_key, access, &own_attr, index, class, options & ~REG_OPTION_CREATE_LINK, dispos ); + if (status) return status; + + own_attr.RootDirectory = own_key; + own_name.Buffer += len + 1; + own_name.Length = attr->ObjectName->Length - own_name.Length - sizeof(WCHAR); + + status = NtCreateKey( key, access, &own_attr, index, class, options, dispos ); + NtClose(own_key); + return status; +}
/****************************************************************************** * NtCreateKey (NTDLL.@) diff --git a/dlls/ntdll/unix/unix_private.h b/dlls/ntdll/unix/unix_private.h index ee5630e76f1..517af815de7 100644 --- a/dlls/ntdll/unix/unix_private.h +++ b/dlls/ntdll/unix/unix_private.h @@ -321,6 +321,8 @@ extern NTSTATUS get_thread_wow64_context( HANDLE handle, void *ctx, ULONG size ) extern NTSTATUS set_thread_wow64_context( HANDLE handle, const void *ctx, ULONG size ); extern void fill_vm_counters( VM_COUNTERS_EX *pvmi, int unix_pid ); extern NTSTATUS open_hkcu_key( const char *path, HANDLE *key ); +extern NTSTATUS create_key_recursive( HANDLE *key, ACCESS_MASK access, const OBJECT_ATTRIBUTES *attr, + ULONG index, const UNICODE_STRING *class, ULONG options, ULONG *dispos );
extern NTSTATUS sync_ioctl( HANDLE file, ULONG code, void *in_buffer, ULONG in_size, void *out_buffer, ULONG out_size );