Module: wine Branch: stable Commit: 18489d157e1fb5401f7bb2ab199539205ef6cf1c URL: https://source.winehq.org/git/wine.git/?a=commit;h=18489d157e1fb5401f7bb2ab1...
Author: Stefan Leichter sle85276@gmx.de Date: Mon Mar 12 00:15:27 2018 +0100
ntdll: Implement RtlCreateRegistryKey.
Signed-off-by: Stefan Leichter sle85276@gmx.de Signed-off-by: Alexandre Julliard julliard@winehq.org (cherry picked from commit 535419a2bf8da3fd21cfdede44bf51026a97b94d) Signed-off-by: Michael Stefaniuc mstefani@winehq.org
---
dlls/ntdll/ntdll.spec | 2 +- dlls/ntdll/reg.c | 69 ++++++++++++++++++++++++++++++------- dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 2 +- include/winternl.h | 1 + 4 files changed, 60 insertions(+), 14 deletions(-)
diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index 5c5365d..a6d6dc8 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -509,7 +509,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 a34c863..c6acd76 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 str) { - 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,30 @@ 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) + str->Buffer = RtlAllocateHeap(GetProcessHeap(), 0, len); + if (str->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(str->Buffer, base); + strcatW(str->Buffer, Path); + str->Length = len - sizeof(WCHAR); + str->MaximumLength = len; + InitializeObjectAttributes(regkey, str, OBJ_CASE_INSENSITIVE, NULL, NULL); + return STATUS_SUCCESS; +} + +static NTSTATUS RTL_GetKeyHandle(ULONG RelativeTo, PCWSTR Path, PHANDLE handle) +{ + OBJECT_ATTRIBUTES regkey; + UNICODE_STRING string; + NTSTATUS status; + + status = RTL_KeyHandleCreateObject(RelativeTo, Path, ®key, &string); + if(status != STATUS_SUCCESS) + return status; + status = NtOpenKey(handle, KEY_ALL_ACCESS, ®key); - RtlFreeHeap(GetProcessHeap(), 0, KeyString.Buffer); + RtlFreeUnicodeString( &string ); return status; }
@@ -1415,6 +1425,41 @@ NTSTATUS WINAPI RtlCheckRegistryKey(IN ULONG RelativeTo, IN PWSTR Path) }
/************************************************************************* + * 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(ULONG RelativeTo, PWSTR path) +{ + OBJECT_ATTRIBUTES regkey; + UNICODE_STRING string; + HANDLE handle; + NTSTATUS status; + + RelativeTo &= ~RTL_REGISTRY_OPTIONAL; + + if (!RelativeTo && (path == NULL || path[0] == 0)) + return STATUS_OBJECT_PATH_SYNTAX_BAD; + if (RelativeTo <= RTL_REGISTRY_USER && (path == NULL || path[0] == 0)) + return STATUS_SUCCESS; + status = RTL_KeyHandleCreateObject(RelativeTo, path, ®key, &string); + if(status != STATUS_SUCCESS) + return status; + + status = NtCreateKey(&handle, KEY_ALL_ACCESS, ®key, 0, NULL, REG_OPTION_NON_VOLATILE, NULL); + if (handle) NtClose(handle); + RtlFreeUnicodeString( &string ); + return status; +} + +/************************************************************************* * RtlDeleteRegistryValue [NTDLL.@] * * Query multiple registry values with a single call. diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec index 24b40c3..63ef17b 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/winternl.h b/include/winternl.h index f9f3350..d5aee67 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -2466,6 +2466,7 @@ NTSYSAPI void WINAPI RtlClearAllBits(PRTL_BITMAP); NTSYSAPI void WINAPI RtlClearBits(PRTL_BITMAP,ULONG,ULONG); NTSYSAPI NTSTATUS WINAPI RtlCreateActivationContext(HANDLE*,const void*); NTSYSAPI PDEBUG_BUFFER WINAPI RtlCreateQueryDebugBuffer(ULONG,BOOLEAN); +NTSYSAPI NTSTATUS WINAPI RtlCreateRegistryKey(ULONG,PWSTR); NTSYSAPI ULONG WINAPI RtlCompactHeap(HANDLE,ULONG); NTSYSAPI LONG WINAPI RtlCompareString(const STRING*,const STRING*,BOOLEAN); NTSYSAPI LONG WINAPI RtlCompareUnicodeString(const UNICODE_STRING*,const UNICODE_STRING*,BOOLEAN);