fixed calls to NtDuplicateObject
[reactos.git] / reactos / lib / rtl / registry.c
index 303ef4b..641e931 100644 (file)
@@ -1,12 +1,9 @@
-/* $Id$
- *
+/*
  * 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 "rtl.h"
+#include <rtl.h>
 
 #define NDEBUG
 #include <debug.h>
 
+#define TAG_RTLREGISTRY TAG('R', 't', 'l', 'R')
 
 /* FUNCTIONS ***************************************************************/
 
@@ -47,7 +44,7 @@ RtlpGetRegistryHandle(ULONG RelativeTo,
                                 NtCurrentProcess(),
                                 KeyHandle,
                                 0,
-                                FALSE,
+                                0,
                                 DUPLICATE_SAME_ACCESS);
 #ifndef NDEBUG
       if(!NT_SUCCESS(Status))
@@ -157,7 +154,7 @@ RtlpGetRegistryHandle(ULONG RelativeTo,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlCheckRegistryKey(IN ULONG RelativeTo,
                    IN PWSTR Path)
 {
@@ -182,7 +179,7 @@ RtlCheckRegistryKey(IN ULONG RelativeTo,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlCreateRegistryKey(IN ULONG RelativeTo,
                     IN PWSTR Path)
 {
@@ -207,7 +204,7 @@ RtlCreateRegistryKey(IN ULONG RelativeTo,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlDeleteRegistryValue(IN ULONG RelativeTo,
                       IN PCWSTR Path,
                       IN PCWSTR ValueName)
@@ -240,7 +237,7 @@ RtlDeleteRegistryValue(IN ULONG RelativeTo,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlFormatCurrentUserKeyPath (OUT PUNICODE_STRING KeyPath)
 {
   HANDLE TokenHandle;
@@ -305,11 +302,10 @@ RtlFormatCurrentUserKeyPath (OUT PUNICODE_STRING KeyPath)
 
   KeyPath->Length = 0;
   KeyPath->MaximumLength = Length;
-  KeyPath->Buffer = ExAllocatePool (PagedPool,
-                                   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;
     }
@@ -327,7 +323,7 @@ RtlFormatCurrentUserKeyPath (OUT PUNICODE_STRING KeyPath)
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlOpenCurrentUser(IN ACCESS_MASK DesiredAccess,
                   OUT PHANDLE KeyHandle)
 {
@@ -373,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,
@@ -450,7 +446,7 @@ 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;
@@ -467,7 +463,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
            {
              if (QueryEntry->Flags & RTL_QUERY_REGISTRY_REQUIRED)
                {
-                 ExFreePool(ValueInfo);
+                 RtlpFreeMemory(ValueInfo, TAG_RTLREGISTRY);
                  Status = STATUS_OBJECT_NAME_NOT_FOUND;
                  break;
                }
@@ -483,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;
@@ -521,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;
@@ -544,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;
@@ -567,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;
@@ -585,7 +581,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
                         ValueString->Length);
                  ((PWSTR)ValueString->Buffer)[ValueString->Length / sizeof(WCHAR)] = 0;
 
-                 ExFreePool(ExpandBuffer);
+                 RtlpFreeMemory(ExpandBuffer, TAG_RTLREGISTRY);
                }
              else
                {
@@ -601,7 +597,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
 
            }
 
-         ExFreePool(ValueInfo);
+         RtlpFreeMemory(ValueInfo, TAG_RTLREGISTRY);
        }
       else
        {
@@ -612,7 +608,7 @@ 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;
@@ -661,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;
@@ -688,7 +684,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
                                                    Context,
                                                    QueryEntry->EntryContext);
 
-                 ExFreePool(ExpandBuffer);
+                 RtlpFreeMemory(ExpandBuffer, TAG_RTLREGISTRY);
                }
              else
                {
@@ -706,7 +702,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
 
                }
 
-             ExFreePool(ValueInfo);
+             RtlpFreeMemory(ValueInfo, TAG_RTLREGISTRY);
              if (!NT_SUCCESS(Status))
                break;
            }
@@ -727,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;
@@ -767,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;
@@ -787,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);
@@ -807,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;
@@ -835,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);
@@ -855,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;
            }
@@ -877,7 +873,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlWriteRegistryValue(IN ULONG RelativeTo,
                      IN PCWSTR Path,
                      IN PCWSTR ValueName,
@@ -897,7 +893,7 @@ RtlWriteRegistryValue(IN ULONG RelativeTo,
                                 &KeyHandle);
   if (!NT_SUCCESS(Status))
   {
-    DPRINT("RtlpGetRegistryHandle() failed! Status: 0x%x\n", Status);
+    DPRINT("RtlpGetRegistryHandle() failed! Status: 0x%lx\n", Status);
     return(Status);
   }
 
@@ -912,7 +908,7 @@ RtlWriteRegistryValue(IN ULONG RelativeTo,
                         ValueLength);
   if (!NT_SUCCESS(Status))
   {
-    DPRINT1("ZwSetValueKey() failed! Status: 0x%x\n", Status);
+    DPRINT1("ZwSetValueKey() failed! Status: 0x%lx\n", Status);
   }
 
   ZwClose(KeyHandle);
@@ -924,7 +920,7 @@ RtlWriteRegistryValue(IN ULONG RelativeTo,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlpNtCreateKey(OUT HANDLE KeyHandle,
                IN ACCESS_MASK DesiredAccess,
                IN POBJECT_ATTRIBUTES ObjectAttributes,
@@ -948,7 +944,7 @@ RtlpNtCreateKey(OUT HANDLE KeyHandle,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlpNtEnumerateSubKey(IN HANDLE KeyHandle,
                      OUT PUNICODE_STRING SubKeyName,
                      IN ULONG Index,
@@ -963,7 +959,7 @@ 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);
     }
@@ -992,7 +988,7 @@ RtlpNtEnumerateSubKey(IN HANDLE KeyHandle,
 
   if (KeyInfo != NULL)
     {
-      ExFreePool(KeyInfo);
+      RtlpFreeMemory(KeyInfo, TAG_RTLREGISTRY);
     }
 
   return(Status);
@@ -1002,7 +998,7 @@ RtlpNtEnumerateSubKey(IN HANDLE KeyHandle,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlpNtMakeTemporaryKey(IN HANDLE KeyHandle)
 {
   return(ZwDeleteKey(KeyHandle));
@@ -1012,7 +1008,7 @@ RtlpNtMakeTemporaryKey(IN HANDLE KeyHandle)
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlpNtOpenKey(OUT HANDLE KeyHandle,
              IN ACCESS_MASK DesiredAccess,
              IN POBJECT_ATTRIBUTES ObjectAttributes,
@@ -1030,7 +1026,7 @@ RtlpNtOpenKey(OUT HANDLE KeyHandle,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlpNtQueryValueKey(IN HANDLE KeyHandle,
                    OUT PULONG Type OPTIONAL,
                    OUT PVOID Data OPTIONAL,
@@ -1050,7 +1046,7 @@ 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);
 
@@ -1076,7 +1072,7 @@ RtlpNtQueryValueKey(IN HANDLE KeyHandle,
        }
     }
 
-  ExFreePool(ValueInfo);
+  RtlpFreeMemory(ValueInfo, TAG_RTLREGISTRY);
 
   return(Status);
 }
@@ -1085,7 +1081,7 @@ RtlpNtQueryValueKey(IN HANDLE KeyHandle,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlpNtSetValueKey(IN HANDLE KeyHandle,
                  IN ULONG Type,
                  IN PVOID Data,