fixed calls to NtDuplicateObject
[reactos.git] / reactos / lib / rtl / registry.c
index 1f79d8a..641e931 100644 (file)
@@ -1,12 +1,9 @@
-/* $Id: registry.c 12852 2005-01-06 13:58:04Z mf $
- *
+/*
  * COPYRIGHT:         See COPYING in the top level directory
- * PROJECT:           ReactOS kernel
+ * PROJECT:           ReactOS system libraries
  * PURPOSE:           Rtl registry functions
  * FILE:              lib/rtl/registry.c
  * PROGRAMER:         Eric Kohl
- * REVISION HISTORY:
- *                    2000/08/11: Created
  */
 
 /*
  *     - support RTL_QUERY_REGISTRY_DELETE
  */
 
-/* INCLUDES ****************************************************************/
+/* INCLUDES *****************************************************************/
 
-#define __NTDRIVER__
-#include <ddk/ntddk.h>
-#include <ntdll/rtl.h>
-#include <ntos/minmax.h>
+#include <rtl.h>
 
 #define NDEBUG
-#include <ntdll/ntdll.h>
+#include <debug.h>
 
+#define TAG_RTLREGISTRY TAG('R', 't', 'l', 'R')
 
 /* FUNCTIONS ***************************************************************/
 
@@ -44,13 +39,20 @@ RtlpGetRegistryHandle(ULONG RelativeTo,
 
   if (RelativeTo & RTL_REGISTRY_HANDLE)
     {
-      Status = NtDuplicateObject(NtCurrentProcess(),
+      Status = ZwDuplicateObject(NtCurrentProcess(),
                                 (HANDLE)Path,
                                 NtCurrentProcess(),
                                 KeyHandle,
                                 0,
-                                FALSE,
+                                0,
                                 DUPLICATE_SAME_ACCESS);
+#ifndef NDEBUG
+      if(!NT_SUCCESS(Status))
+      {
+        DPRINT("ZwDuplicateObject() failed! Status: 0x%x\n", Status);
+      }
+#endif
+
       return(Status);
     }
 
@@ -58,18 +60,20 @@ RtlpGetRegistryHandle(ULONG RelativeTo,
     RelativeTo &= ~RTL_REGISTRY_OPTIONAL;
 
   if (RelativeTo >= RTL_REGISTRY_MAXIMUM)
+  {
+    DPRINT("Invalid relative flag, parameter invalid!\n");
     return(STATUS_INVALID_PARAMETER);
+  }
 
   KeyName.Length = 0;
-  KeyName.MaximumLength = MAX_PATH;
+  KeyName.MaximumLength = sizeof(KeyBuffer);
   KeyName.Buffer = KeyBuffer;
   KeyBuffer[0] = 0;
 
   switch (RelativeTo)
     {
       case RTL_REGISTRY_ABSOLUTE:
-       RtlAppendUnicodeToString(&KeyName,
-                                L"\\");
+        /* nothing to prefix! */
        break;
 
       case RTL_REGISTRY_SERVICES:
@@ -102,16 +106,8 @@ RtlpGetRegistryHandle(ULONG RelativeTo,
        RtlAppendUnicodeToString (&KeyName,
                                  L"\\");
        break;
-
-      /* ReactOS specific */
-      case RTL_REGISTRY_ENUM:
-       RtlAppendUnicodeToString(&KeyName,
-                                L"\\Registry\\Machine\\System\\CurrentControlSet\\Enum\\");
-       break;
     }
 
-  DPRINT("KeyName %wZ\n", &KeyName);
-
   if (Path[0] == L'\\' && RelativeTo != RTL_REGISTRY_ABSOLUTE)
     {
       Path++;
@@ -127,9 +123,9 @@ RtlpGetRegistryHandle(ULONG RelativeTo,
                             NULL,
                             NULL);
 
-  if (Create == TRUE)
+  if (Create)
     {
-      Status = NtCreateKey(KeyHandle,
+      Status = ZwCreateKey(KeyHandle,
                           KEY_ALL_ACCESS,
                           &ObjectAttributes,
                           0,
@@ -139,11 +135,18 @@ RtlpGetRegistryHandle(ULONG RelativeTo,
     }
   else
     {
-      Status = NtOpenKey(KeyHandle,
+      Status = ZwOpenKey(KeyHandle,
                         KEY_ALL_ACCESS,
                         &ObjectAttributes);
     }
 
+#ifndef NDEBUG
+  if(!NT_SUCCESS(Status))
+  {
+    DPRINT("%s failed! Status: 0x%x\n", (Create ? "ZwCreateKey" : "ZwOpenKey"), Status);
+  }
+#endif
+
   return(Status);
 }
 
@@ -151,13 +154,15 @@ RtlpGetRegistryHandle(ULONG RelativeTo,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlCheckRegistryKey(IN ULONG RelativeTo,
                    IN PWSTR Path)
 {
   HANDLE KeyHandle;
   NTSTATUS Status;
 
+  PAGED_CODE_RTL();
+
   Status = RtlpGetRegistryHandle(RelativeTo,
                                 Path,
                                 FALSE,
@@ -165,7 +170,7 @@ RtlCheckRegistryKey(IN ULONG RelativeTo,
   if (!NT_SUCCESS(Status))
     return(Status);
 
-  NtClose(KeyHandle);
+  ZwClose(KeyHandle);
 
   return(STATUS_SUCCESS);
 }
@@ -174,13 +179,15 @@ RtlCheckRegistryKey(IN ULONG RelativeTo,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlCreateRegistryKey(IN ULONG RelativeTo,
                     IN PWSTR Path)
 {
   HANDLE KeyHandle;
   NTSTATUS Status;
 
+  PAGED_CODE_RTL();
+
   Status = RtlpGetRegistryHandle(RelativeTo,
                                 Path,
                                 TRUE,
@@ -188,7 +195,7 @@ RtlCreateRegistryKey(IN ULONG RelativeTo,
   if (!NT_SUCCESS(Status))
     return(Status);
 
-  NtClose(KeyHandle);
+  ZwClose(KeyHandle);
 
   return(STATUS_SUCCESS);
 }
@@ -197,7 +204,7 @@ RtlCreateRegistryKey(IN ULONG RelativeTo,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlDeleteRegistryValue(IN ULONG RelativeTo,
                       IN PCWSTR Path,
                       IN PCWSTR ValueName)
@@ -206,6 +213,8 @@ RtlDeleteRegistryValue(IN ULONG RelativeTo,
   NTSTATUS Status;
   UNICODE_STRING Name;
 
+  PAGED_CODE_RTL();
+
   Status = RtlpGetRegistryHandle(RelativeTo,
                                 (PWSTR)Path,
                                 FALSE,
@@ -216,10 +225,10 @@ RtlDeleteRegistryValue(IN ULONG RelativeTo,
   RtlInitUnicodeString(&Name,
                       ValueName);
 
-  Status = NtDeleteValueKey(KeyHandle,
+  Status = ZwDeleteValueKey(KeyHandle,
                            &Name);
 
-  NtClose(KeyHandle);
+  ZwClose(KeyHandle);
 
   return(Status);
 }
@@ -228,7 +237,7 @@ RtlDeleteRegistryValue(IN ULONG RelativeTo,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlFormatCurrentUserKeyPath (OUT PUNICODE_STRING KeyPath)
 {
   HANDLE TokenHandle;
@@ -238,40 +247,42 @@ RtlFormatCurrentUserKeyPath (OUT PUNICODE_STRING KeyPath)
   UNICODE_STRING SidString;
   NTSTATUS Status;
 
+  PAGED_CODE_RTL();
+
   DPRINT ("RtlFormatCurrentUserKeyPath() called\n");
 
-  Status = NtOpenThreadToken (NtCurrentThread (),
-                             TOKEN_READ,
+  Status = ZwOpenThreadToken (NtCurrentThread (),
+                             TOKEN_QUERY,
                              TRUE,
                              &TokenHandle);
   if (!NT_SUCCESS (Status))
     {
       if (Status != STATUS_NO_TOKEN)
        {
-         DPRINT1 ("NtOpenThreadToken() failed (Status %lx)\n", Status);
+         DPRINT1 ("ZwOpenThreadToken() failed (Status %lx)\n", Status);
          return Status;
        }
 
-      Status = NtOpenProcessToken (NtCurrentProcess (),
-                                  TOKEN_READ,
+      Status = ZwOpenProcessToken (NtCurrentProcess (),
+                                  TOKEN_QUERY,
                                   &TokenHandle);
       if (!NT_SUCCESS (Status))
        {
-         DPRINT1 ("NtOpenProcessToken() failed (Status %lx)\n", Status);
+         DPRINT1 ("ZwOpenProcessToken() failed (Status %lx)\n", Status);
          return Status;
        }
     }
 
   SidBuffer = (PSID_AND_ATTRIBUTES)Buffer;
-  Status = NtQueryInformationToken (TokenHandle,
+  Status = ZwQueryInformationToken (TokenHandle,
                                    TokenUser,
                                    (PVOID)SidBuffer,
                                    256,
                                    &Length);
-  NtClose (TokenHandle);
+  ZwClose (TokenHandle);
   if (!NT_SUCCESS(Status))
     {
-      DPRINT1 ("NtQueryInformationToken() failed (Status %lx)\n", Status);
+      DPRINT1 ("ZwQueryInformationToken() failed (Status %lx)\n", Status);
       return Status;
     }
 
@@ -291,11 +302,10 @@ RtlFormatCurrentUserKeyPath (OUT PUNICODE_STRING KeyPath)
 
   KeyPath->Length = 0;
   KeyPath->MaximumLength = Length;
-  KeyPath->Buffer = ExAllocatePool (NonPagedPool,
-                                   KeyPath->MaximumLength);
+  KeyPath->Buffer = RtlpAllocateStringMemory(KeyPath->MaximumLength, TAG_USTR);
   if (KeyPath->Buffer == NULL)
     {
-      DPRINT1 ("ExAllocatePool() failed\n");
+      DPRINT1 ("RtlpAllocateMemory() failed\n");
       RtlFreeUnicodeString (&SidString);
       return STATUS_NO_TOKEN;
     }
@@ -313,7 +323,7 @@ RtlFormatCurrentUserKeyPath (OUT PUNICODE_STRING KeyPath)
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlOpenCurrentUser(IN ACCESS_MASK DesiredAccess,
                   OUT PHANDLE KeyHandle)
 {
@@ -321,6 +331,8 @@ RtlOpenCurrentUser(IN ACCESS_MASK DesiredAccess,
   UNICODE_STRING KeyPath;
   NTSTATUS Status;
 
+  PAGED_CODE_RTL();
+
   Status = RtlFormatCurrentUserKeyPath(&KeyPath);
   if (NT_SUCCESS(Status))
     {
@@ -329,7 +341,7 @@ RtlOpenCurrentUser(IN ACCESS_MASK DesiredAccess,
                                 OBJ_CASE_INSENSITIVE,
                                 NULL,
                                 NULL);
-      Status = NtOpenKey(KeyHandle,
+      Status = ZwOpenKey(KeyHandle,
                         DesiredAccess,
                         &ObjectAttributes);
       RtlFreeUnicodeString(&KeyPath);
@@ -346,7 +358,7 @@ RtlOpenCurrentUser(IN ACCESS_MASK DesiredAccess,
                             OBJ_CASE_INSENSITIVE,
                             NULL,
                             NULL);
-  Status = NtOpenKey(KeyHandle,
+  Status = ZwOpenKey(KeyHandle,
                     DesiredAccess,
                     &ObjectAttributes);
 
@@ -357,7 +369,7 @@ RtlOpenCurrentUser(IN ACCESS_MASK DesiredAccess,
 /*
  * @unimplemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlQueryRegistryValues(IN ULONG RelativeTo,
                       IN PCWSTR Path,
                       IN PRTL_QUERY_REGISTRY_TABLE QueryTable,
@@ -383,6 +395,8 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
   UNICODE_STRING EnvValue;
   UNICODE_STRING EnvExpandedValue;
 
+  PAGED_CODE_RTL();
+
   DPRINT("RtlQueryRegistryValues() called\n");
 
   Status = RtlpGetRegistryHandle(RelativeTo,
@@ -403,7 +417,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
       if (((QueryEntry->Flags & (RTL_QUERY_REGISTRY_SUBKEY | RTL_QUERY_REGISTRY_TOPKEY)) != 0) &&
          (BaseKeyHandle != CurrentKeyHandle))
        {
-         NtClose(CurrentKeyHandle);
+         ZwClose(CurrentKeyHandle);
          CurrentKeyHandle = BaseKeyHandle;
        }
 
@@ -418,7 +432,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
                                     OBJ_CASE_INSENSITIVE,
                                     BaseKeyHandle,
                                     NULL);
-         Status = NtOpenKey(&CurrentKeyHandle,
+         Status = ZwOpenKey(&CurrentKeyHandle,
                             KEY_ALL_ACCESS,
                             &ObjectAttributes);
          if (!NT_SUCCESS(Status))
@@ -432,14 +446,14 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
                               QueryEntry->Name);
 
          BufferSize = sizeof (KEY_VALUE_PARTIAL_INFORMATION) + 4096;
-         ValueInfo = ExAllocatePool(PagedPool, BufferSize);
+         ValueInfo = RtlpAllocateMemory(BufferSize, TAG_RTLREGISTRY);
          if (ValueInfo == NULL)
            {
              Status = STATUS_NO_MEMORY;
              break;
            }
 
-         Status = NtQueryValueKey(CurrentKeyHandle,
+         Status = ZwQueryValueKey(CurrentKeyHandle,
                                   &KeyName,
                                   KeyValuePartialInformation,
                                   ValueInfo,
@@ -449,11 +463,11 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
            {
              if (QueryEntry->Flags & RTL_QUERY_REGISTRY_REQUIRED)
                {
-                 ExFreePool(ValueInfo);
+                 RtlpFreeMemory(ValueInfo, TAG_RTLREGISTRY);
                  Status = STATUS_OBJECT_NAME_NOT_FOUND;
                  break;
                }
-       
+
              if (QueryEntry->DefaultType == REG_SZ)
                {
                  PUNICODE_STRING ValueString;
@@ -465,7 +479,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
                    {
                      ValueString->Length = SourceString->Length;
                      ValueString->MaximumLength = SourceString->MaximumLength;
-                     ValueString->Buffer = ExAllocatePool(PagedPool, BufferSize);
+                     ValueString->Buffer = RtlpAllocateMemory(BufferSize, TAG_RTLREGISTRY);
                      if (!ValueString->Buffer)
                        break;
                      ValueString->Buffer[0] = 0;
@@ -503,7 +517,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
                  if (ValueString->Buffer == NULL)
                    {
                      ValueString->MaximumLength = ValueInfo->DataLength;
-                     ValueString->Buffer = ExAllocatePool(PagedPool, ValueString->MaximumLength);
+                     ValueString->Buffer = RtlpAllocateMemory(ValueString->MaximumLength, TAG_RTLREGISTRY);
                      if (ValueString->Buffer == NULL)
                        {
                          Status = STATUS_INSUFFICIENT_RESOURCES;
@@ -526,7 +540,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
 
                  ValueString = (PUNICODE_STRING)QueryEntry->EntryContext;
 
-                 ExpandBuffer = ExAllocatePool(PagedPool, ValueInfo->DataLength * 2);
+                 ExpandBuffer = RtlpAllocateMemory(ValueInfo->DataLength * 2, TAG_RTLREGISTRY);
                  if (ExpandBuffer == NULL)
                    {
                      Status = STATUS_NO_MEMORY;
@@ -549,7 +563,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
                    {
                      ValueString->MaximumLength = EnvExpandedValue.Length + sizeof(WCHAR);
                      ValueString->Length = EnvExpandedValue.Length;
-                     ValueString->Buffer = ExAllocatePool(PagedPool, ValueString->MaximumLength);
+                     ValueString->Buffer = RtlpAllocateMemory(ValueString->MaximumLength, TAG_RTLREGISTRY);
                      if (ValueString->Buffer == NULL)
                        {
                          Status = STATUS_INSUFFICIENT_RESOURCES;
@@ -567,7 +581,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
                         ValueString->Length);
                  ((PWSTR)ValueString->Buffer)[ValueString->Length / sizeof(WCHAR)] = 0;
 
-                 ExFreePool(ExpandBuffer);
+                 RtlpFreeMemory(ExpandBuffer, TAG_RTLREGISTRY);
                }
              else
                {
@@ -583,7 +597,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
 
            }
 
-         ExFreePool(ValueInfo);
+         RtlpFreeMemory(ValueInfo, TAG_RTLREGISTRY);
        }
       else
        {
@@ -594,14 +608,14 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
                                   QueryEntry->Name);
 
              BufferSize = sizeof (KEY_VALUE_PARTIAL_INFORMATION) + 4096;
-             ValueInfo = ExAllocatePool(PagedPool, BufferSize);
+             ValueInfo = RtlpAllocateMemory(BufferSize, TAG_RTLREGISTRY);
              if (ValueInfo == NULL)
                {
                  Status = STATUS_NO_MEMORY;
                  break;
                }
 
-             Status = NtQueryValueKey(CurrentKeyHandle,
+             Status = ZwQueryValueKey(CurrentKeyHandle,
                                       &KeyName,
                                       KeyValuePartialInformation,
                                       ValueInfo,
@@ -643,7 +657,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
                {
                  DPRINT("Expand REG_EXPAND_SZ type\n");
 
-                 ExpandBuffer = ExAllocatePool(PagedPool, ValueInfo->DataLength * 2);
+                 ExpandBuffer = RtlpAllocateMemory(ValueInfo->DataLength * 2, TAG_RTLREGISTRY);
                  if (ExpandBuffer == NULL)
                    {
                      Status = STATUS_NO_MEMORY;
@@ -670,7 +684,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
                                                    Context,
                                                    QueryEntry->EntryContext);
 
-                 ExFreePool(ExpandBuffer);
+                 RtlpFreeMemory(ExpandBuffer, TAG_RTLREGISTRY);
                }
              else
                {
@@ -688,7 +702,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
 
                }
 
-             ExFreePool(ValueInfo);
+             RtlpFreeMemory(ValueInfo, TAG_RTLREGISTRY);
              if (!NT_SUCCESS(Status))
                break;
            }
@@ -709,14 +723,14 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
              DPRINT("Enumerate values\n");
 
              BufferSize = sizeof(KEY_VALUE_FULL_INFORMATION) + 4096;
-             FullValueInfo = ExAllocatePool(PagedPool, BufferSize);
+             FullValueInfo = RtlpAllocateMemory(BufferSize, TAG_RTLREGISTRY);
              if (FullValueInfo == NULL)
                {
                  Status = STATUS_NO_MEMORY;
                  break;
                }
              ValueNameSize = 256 * sizeof(WCHAR);
-             ValueName = ExAllocatePool(PagedPool, ValueNameSize);
+             ValueName = RtlpAllocateMemory(ValueNameSize, TAG_RTLREGISTRY);
              if (ValueName == NULL)
                {
                  Status = STATUS_NO_MEMORY;
@@ -725,7 +739,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
              Index = 0;
              while (TRUE)
                {
-                 Status = NtEnumerateValueKey(CurrentKeyHandle,
+                 Status = ZwEnumerateValueKey(CurrentKeyHandle,
                                               Index,
                                               KeyValueFullInformation,
                                               FullValueInfo,
@@ -749,9 +763,9 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
                  if (FullValueInfo->NameLength > ValueNameSize - sizeof(WCHAR))
                    {
                      /* Should not happen, because the name length is limited to 255 characters */
-                     ExFreePool(ValueName);
+                     RtlpFreeMemory(ValueName, TAG_RTLREGISTRY);
                      ValueNameSize = FullValueInfo->NameLength + sizeof(WCHAR);
-                     ValueName = ExAllocatePool(PagedPool, ValueNameSize);
+                     ValueName = RtlpAllocateMemory(ValueNameSize, TAG_RTLREGISTRY);
                      if (ValueName == NULL)
                        {
                          Status = STATUS_NO_MEMORY;
@@ -769,7 +783,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
                      !(QueryEntry->Flags & RTL_QUERY_REGISTRY_NOEXPAND))
                    {
                      DPRINT("Expand REG_MULTI_SZ type\n");
-                     StringPtr = (PWSTR)((PVOID)FullValueInfo + FullValueInfo->DataOffset);
+                     StringPtr = (PWSTR)((ULONG_PTR)FullValueInfo + FullValueInfo->DataOffset);
                      while (*StringPtr != 0)
                        {
                          StringLen = (wcslen(StringPtr) + 1) * sizeof(WCHAR);
@@ -789,8 +803,8 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
                    {
                      DPRINT("Expand REG_EXPAND_SZ type\n");
 
-                     StringPtr = (PWSTR)((PVOID)FullValueInfo + FullValueInfo->DataOffset);
-                     ExpandBuffer = ExAllocatePool(PagedPool, FullValueInfo->DataLength * 2);
+                     StringPtr = (PWSTR)((ULONG_PTR)FullValueInfo + FullValueInfo->DataOffset);
+                     ExpandBuffer = RtlpAllocateMemory(FullValueInfo->DataLength * 2, TAG_RTLREGISTRY);
                      if (ExpandBuffer == NULL)
                        {
                          Status = STATUS_NO_MEMORY;
@@ -817,13 +831,13 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
                                                        Context,
                                                        QueryEntry->EntryContext);
 
-                      ExFreePool(ExpandBuffer);
+                      RtlpFreeMemory(ExpandBuffer, TAG_RTLREGISTRY);
                    }
                  else
                    {
                      Status = QueryEntry->QueryRoutine(ValueName,
                                                        FullValueInfo->Type,
-                                                       (PVOID)FullValueInfo + FullValueInfo->DataOffset,
+                                                       (PVOID)((ULONG_PTR)FullValueInfo + FullValueInfo->DataOffset),
                                                        FullValueInfo->DataLength,
                                                        Context,
                                                        QueryEntry->EntryContext);
@@ -837,8 +851,8 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
                  Index++;
                }
 
-             ExFreePool(FullValueInfo);
-             ExFreePool(ValueName);
+             RtlpFreeMemory(FullValueInfo, TAG_RTLREGISTRY);
+             RtlpFreeMemory(ValueName, TAG_RTLREGISTRY);
              if (!NT_SUCCESS(Status))
                break;
            }
@@ -848,9 +862,9 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
     }
 
   if (CurrentKeyHandle != BaseKeyHandle)
-    NtClose(CurrentKeyHandle);
+    ZwClose(CurrentKeyHandle);
 
-  NtClose(BaseKeyHandle);
+  ZwClose(BaseKeyHandle);
 
   return(Status);
 }
@@ -859,7 +873,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlWriteRegistryValue(IN ULONG RelativeTo,
                      IN PCWSTR Path,
                      IN PCWSTR ValueName,
@@ -871,24 +885,33 @@ RtlWriteRegistryValue(IN ULONG RelativeTo,
   NTSTATUS Status;
   UNICODE_STRING Name;
 
+  PAGED_CODE_RTL();
+
   Status = RtlpGetRegistryHandle(RelativeTo,
                                 (PWSTR)Path,
                                 TRUE,
                                 &KeyHandle);
   if (!NT_SUCCESS(Status))
+  {
+    DPRINT("RtlpGetRegistryHandle() failed! Status: 0x%lx\n", Status);
     return(Status);
+  }
 
   RtlInitUnicodeString(&Name,
                       ValueName);
 
-  Status = NtSetValueKey(KeyHandle,
+  Status = ZwSetValueKey(KeyHandle,
                         &Name,
                         0,
                         ValueType,
                         ValueData,
                         ValueLength);
-  if (NT_SUCCESS(Status))
-    NtClose(KeyHandle);
+  if (!NT_SUCCESS(Status))
+  {
+    DPRINT1("ZwSetValueKey() failed! Status: 0x%lx\n", Status);
+  }
+
+  ZwClose(KeyHandle);
 
   return(Status);
 }
@@ -897,7 +920,7 @@ RtlWriteRegistryValue(IN ULONG RelativeTo,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlpNtCreateKey(OUT HANDLE KeyHandle,
                IN ACCESS_MASK DesiredAccess,
                IN POBJECT_ATTRIBUTES ObjectAttributes,
@@ -908,7 +931,7 @@ RtlpNtCreateKey(OUT HANDLE KeyHandle,
   if (ObjectAttributes != NULL)
     ObjectAttributes->Attributes &= ~(OBJ_PERMANENT | OBJ_EXCLUSIVE);
 
-  return(NtCreateKey(KeyHandle,
+  return(ZwCreateKey(KeyHandle,
                     DesiredAccess,
                     ObjectAttributes,
                     0,
@@ -921,7 +944,7 @@ RtlpNtCreateKey(OUT HANDLE KeyHandle,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlpNtEnumerateSubKey(IN HANDLE KeyHandle,
                      OUT PUNICODE_STRING SubKeyName,
                      IN ULONG Index,
@@ -936,12 +959,12 @@ RtlpNtEnumerateSubKey(IN HANDLE KeyHandle,
     {
       BufferLength = SubKeyName->MaximumLength +
                     sizeof(KEY_BASIC_INFORMATION);
-      KeyInfo = ExAllocatePool(PagedPool,      BufferLength);
+      KeyInfo = RtlpAllocateMemory(BufferLength, TAG_RTLREGISTRY);
       if (KeyInfo == NULL)
        return(STATUS_NO_MEMORY);
     }
 
-  Status = NtEnumerateKey(KeyHandle,
+  Status = ZwEnumerateKey(KeyHandle,
                          Index,
                          KeyBasicInformation,
                          KeyInfo,
@@ -965,7 +988,7 @@ RtlpNtEnumerateSubKey(IN HANDLE KeyHandle,
 
   if (KeyInfo != NULL)
     {
-      ExFreePool(KeyInfo);
+      RtlpFreeMemory(KeyInfo, TAG_RTLREGISTRY);
     }
 
   return(Status);
@@ -975,17 +998,17 @@ RtlpNtEnumerateSubKey(IN HANDLE KeyHandle,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlpNtMakeTemporaryKey(IN HANDLE KeyHandle)
 {
-  return(NtDeleteKey(KeyHandle));
+  return(ZwDeleteKey(KeyHandle));
 }
 
 
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlpNtOpenKey(OUT HANDLE KeyHandle,
              IN ACCESS_MASK DesiredAccess,
              IN POBJECT_ATTRIBUTES ObjectAttributes,
@@ -994,7 +1017,7 @@ RtlpNtOpenKey(OUT HANDLE KeyHandle,
   if (ObjectAttributes != NULL)
     ObjectAttributes->Attributes &= ~(OBJ_PERMANENT | OBJ_EXCLUSIVE);
 
-  return(NtOpenKey(KeyHandle,
+  return(ZwOpenKey(KeyHandle,
                   DesiredAccess,
                   ObjectAttributes));
 }
@@ -1003,7 +1026,7 @@ RtlpNtOpenKey(OUT HANDLE KeyHandle,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlpNtQueryValueKey(IN HANDLE KeyHandle,
                    OUT PULONG Type OPTIONAL,
                    OUT PVOID Data OPTIONAL,
@@ -1023,11 +1046,11 @@ RtlpNtQueryValueKey(IN HANDLE KeyHandle,
   if (DataLength != NULL)
     BufferLength = *DataLength;
 
-  ValueInfo = ExAllocatePool(PagedPool, BufferLength);
+  ValueInfo = RtlpAllocateMemory(BufferLength, TAG_RTLREGISTRY);
   if (ValueInfo == NULL)
     return(STATUS_NO_MEMORY);
 
-  Status = NtQueryValueKey(KeyHandle,
+  Status = ZwQueryValueKey(KeyHandle,
                           &ValueName,
                           KeyValuePartialInformation,
                           ValueInfo,
@@ -1049,7 +1072,7 @@ RtlpNtQueryValueKey(IN HANDLE KeyHandle,
        }
     }
 
-  ExFreePool(ValueInfo);
+  RtlpFreeMemory(ValueInfo, TAG_RTLREGISTRY);
 
   return(Status);
 }
@@ -1058,7 +1081,7 @@ RtlpNtQueryValueKey(IN HANDLE KeyHandle,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlpNtSetValueKey(IN HANDLE KeyHandle,
                  IN ULONG Type,
                  IN PVOID Data,
@@ -1068,7 +1091,7 @@ RtlpNtSetValueKey(IN HANDLE KeyHandle,
 
   RtlInitUnicodeString(&ValueName,
                       NULL);
-  return(NtSetValueKey(KeyHandle,
+  return(ZwSetValueKey(KeyHandle,
                       &ValueName,
                       0,
                       Type,