[pkg-wine-party] [wine] 255/283: ntdll: Implement RtlCreateRegistryKey.
Michael Gilbert
mgilbert at moszumanska.debian.org
Sun Apr 1 16:16:49 UTC 2018
This is an automated email from the git hooks/post-receive script.
mgilbert pushed a commit to branch upstream
in repository wine.
commit 535419a2bf8da3fd21cfdede44bf51026a97b94d
Author: Stefan Leichter <sle85276 at gmx.de>
Date: Mon Mar 12 00:15:27 2018 +0100
ntdll: Implement RtlCreateRegistryKey.
Signed-off-by: Stefan Leichter <sle85276 at gmx.de>
Signed-off-by: Alexandre Julliard <julliard at 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 e545eaf..04e108c 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 901f0ee..9464b38 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
+++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
@@ -976,7 +976,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 5e4d8b7..f01344c 100644
--- a/include/winternl.h
+++ b/include/winternl.h
@@ -2517,6 +2517,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);
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-wine/wine.git
More information about the pkg-wine-party
mailing list