From: Stefan Leichter Subject: [PATCH] ntdll: implement RtlCreateRegistryKey Message-Id: <94a50b6b-2596-3486-7871-8e8789aa4cc2@gmx.de> Date: Sun, 4 Mar 2018 14:11:30 +0100 fixes https://bugs.winehq.org/show_bug.cgi?id=44641 Signed-off-by: Stefan Leichter --- dlls/ntdll/ntdll.spec | 2 +- dlls/ntdll/reg.c | 66 ++++++++++++++++++++++++++++++------- dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 2 +- include/ddk/wdm.h | 2 ++ 4 files changed, 59 insertions(+), 13 deletions(-) diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index 6e996a58d3..84d695da1b 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -508,7 +508,7 @@ @ stdcall RtlCreateProcessParameters(ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) @ stub RtlCreatePropertySet @ stdcall RtlCreateQueryDebugBuffer(long long) -@ stub RtlCreateRegistryKey +@ stdcall RtlCreateRegistryKey(long wstr) @ stdcall RtlCreateSecurityDescriptor(ptr long) # @ stub RtlCreateSystemVolumeInformationFolder @ stub RtlCreateTagHeap diff --git a/dlls/ntdll/reg.c b/dlls/ntdll/reg.c index 2dd75bea3a..c51c3b4daf 100644 --- a/dlls/ntdll/reg.c +++ b/dlls/ntdll/reg.c @@ -1133,13 +1133,10 @@ static NTSTATUS RTL_ReportRegistryValue(PKEY_VALUE_FULL_INFORMATION pInfo, } -static NTSTATUS RTL_GetKeyHandle(ULONG RelativeTo, PCWSTR Path, PHANDLE handle) +static NTSTATUS RTL_KeyHandleCreateObject(ULONG RelativeTo, PCWSTR Path, POBJECT_ATTRIBUTES regkey, PUNICODE_STRING KeyString) { - UNICODE_STRING KeyString; - OBJECT_ATTRIBUTES regkey; PCWSTR base; INT len; - NTSTATUS status; static const WCHAR empty[] = {0}; static const WCHAR control[] = {'\\','R','e','g','i','s','t','r','y','\\','M','a','c','h','i','n','e', @@ -1191,17 +1188,64 @@ static NTSTATUS RTL_GetKeyHandle(ULONG RelativeTo, PCWSTR Path, PHANDLE handle) } len = (strlenW(base) + strlenW(Path) + 1) * sizeof(WCHAR); - KeyString.Buffer = RtlAllocateHeap(GetProcessHeap(), 0, len); - if (KeyString.Buffer == NULL) + KeyString->Buffer = RtlAllocateHeap(GetProcessHeap(), 0, len); + if (KeyString->Buffer == NULL) return STATUS_NO_MEMORY; - strcpyW(KeyString.Buffer, base); - strcatW(KeyString.Buffer, Path); - KeyString.Length = len - sizeof(WCHAR); - KeyString.MaximumLength = len; - InitializeObjectAttributes(®key, &KeyString, OBJ_CASE_INSENSITIVE, NULL, NULL); + strcpyW(KeyString->Buffer, base); + strcatW(KeyString->Buffer, Path); + KeyString->Length = len - sizeof(WCHAR); + KeyString->MaximumLength = len; + InitializeObjectAttributes(regkey, KeyString, OBJ_CASE_INSENSITIVE, NULL, NULL); + TRACE("Resulting key: %s\n", debugstr_us(regkey->ObjectName)); + return STATUS_SUCCESS; +} + +static NTSTATUS RTL_GetKeyHandle(ULONG RelativeTo, PCWSTR Path, PHANDLE handle) +{ + OBJECT_ATTRIBUTES regkey; + UNICODE_STRING KeyString; + NTSTATUS status; + + + status = RTL_KeyHandleCreateObject(RelativeTo, Path, ®key, &KeyString); + if(status != STATUS_SUCCESS) + return status; + status = NtOpenKey(handle, KEY_ALL_ACCESS, ®key); RtlFreeHeap(GetProcessHeap(), 0, KeyString.Buffer); + + return status; +} + +/************************************************************************* + * RtlCreateRegistryKey [NTDLL.@] + * + * Add a key to the registry given by absolute or relative path + * + * PARAMS + * RelativeTo [I] Registry path that Path refers to + * Path [I] Path to key + * + * RETURNS + * STATUS_SUCCESS or an appropriate NTSTATUS error code. + */ +NTSTATUS WINAPI RtlCreateRegistryKey(IN ULONG RelativeTo, IN PWSTR Path) +{ + OBJECT_ATTRIBUTES regkey; + UNICODE_STRING KeyString; + HANDLE handle; + NTSTATUS status; + + status = RTL_KeyHandleCreateObject(RelativeTo, Path, ®key, &KeyString); + if(status != STATUS_SUCCESS) + return status; + + status = NtCreateKey(&handle, KEY_ALL_ACCESS, ®key, 0, NULL, REG_OPTION_NON_VOLATILE, NULL); + if(handle != INVALID_HANDLE_VALUE) + NtClose(handle); + RtlFreeHeap(GetProcessHeap(), 0, KeyString.Buffer); + return status; } diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec index 7f437049d6..219757a32d 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec +++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec @@ -975,7 +975,7 @@ @ stdcall RtlCreateAcl(ptr long long) @ stdcall RtlCreateAtomTable(long ptr) @ stdcall RtlCreateHeap(long ptr long long ptr ptr) -@ stub RtlCreateRegistryKey +@ stdcall RtlCreateRegistryKey(long wstr) @ stdcall RtlCreateSecurityDescriptor(ptr long) @ stub RtlCreateSystemVolumeInformationFolder @ stdcall RtlCreateUnicodeString(ptr wstr) diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h index 61374a7ed4..946824b16f 100644 --- a/include/ddk/wdm.h +++ b/include/ddk/wdm.h @@ -1346,6 +1346,8 @@ HANDLE WINAPI PsGetCurrentThreadId(void); BOOLEAN WINAPI PsGetVersion(ULONG*,ULONG*,ULONG*,UNICODE_STRING*); NTSTATUS WINAPI PsTerminateSystemThread(NTSTATUS); +NTSTATUS WINAPI RtlCreateRegistryKey(ULONG,PWSTR); + NTSTATUS WINAPI ZwAddBootEntry(PUNICODE_STRING,PUNICODE_STRING); NTSTATUS WINAPI ZwAccessCheckAndAuditAlarm(PUNICODE_STRING,HANDLE,PUNICODE_STRING,PUNICODE_STRING,PSECURITY_DESCRIPTOR,ACCESS_MASK,PGENERIC_MAPPING,BOOLEAN,PACCESS_MASK,PBOOLEAN,PBOOLEAN); NTSTATUS WINAPI ZwAdjustPrivilegesToken(HANDLE,BOOLEAN,PTOKEN_PRIVILEGES,DWORD,PTOKEN_PRIVILEGES,PDWORD);