Stefan Leichter : ntdll: Implement RtlCreateRegistryKey.

Alexandre Julliard julliard at winehq.org
Mon May 14 06:54:26 CDT 2018


Module: wine
Branch: stable
Commit: 18489d157e1fb5401f7bb2ab199539205ef6cf1c
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=18489d157e1fb5401f7bb2ab199539205ef6cf1c

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>
(cherry picked from commit 535419a2bf8da3fd21cfdede44bf51026a97b94d)
Signed-off-by: Michael Stefaniuc <mstefani 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 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(&regkey, &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, &regkey, &string);
+    if(status != STATUS_SUCCESS)
+	return status;
+
     status = NtOpenKey(handle, KEY_ALL_ACCESS, &regkey);
-    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, &regkey, &string);
+    if(status != STATUS_SUCCESS)
+	return status;
+
+    status = NtCreateKey(&handle, KEY_ALL_ACCESS, &regkey, 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);




More information about the wine-cvs mailing list