fixed calls to NtDuplicateObject
[reactos.git] / reactos / lib / rtl / registry.c
index 725c307..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 ***************************************************************/
 
@@ -49,7 +44,7 @@ RtlpGetRegistryHandle(ULONG RelativeTo,
                                 NtCurrentProcess(),
                                 KeyHandle,
                                 0,
-                                FALSE,
+                                0,
                                 DUPLICATE_SAME_ACCESS);
 #ifndef NDEBUG
       if(!NT_SUCCESS(Status))
@@ -57,7 +52,7 @@ RtlpGetRegistryHandle(ULONG RelativeTo,
         DPRINT("ZwDuplicateObject() failed! Status: 0x%x\n", Status);
       }
 #endif
-      
+
       return(Status);
     }
 
@@ -159,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,
@@ -182,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,
@@ -205,7 +204,7 @@ RtlCreateRegistryKey(IN ULONG RelativeTo,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlDeleteRegistryValue(IN ULONG RelativeTo,
                       IN PCWSTR Path,
                       IN PCWSTR ValueName)
@@ -214,6 +213,8 @@ RtlDeleteRegistryValue(IN ULONG RelativeTo,
   NTSTATUS Status;
   UNICODE_STRING Name;
 
+  PAGED_CODE_RTL();
+
   Status = RtlpGetRegistryHandle(RelativeTo,
                                 (PWSTR)Path,
                                 FALSE,
@@ -236,7 +237,7 @@ RtlDeleteRegistryValue(IN ULONG RelativeTo,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlFormatCurrentUserKeyPath (OUT PUNICODE_STRING KeyPath)
 {
   HANDLE TokenHandle;
@@ -246,10 +247,12 @@ RtlFormatCurrentUserKeyPath (OUT PUNICODE_STRING KeyPath)
   UNICODE_STRING SidString;
   NTSTATUS Status;
 
+  PAGED_CODE_RTL();
+
   DPRINT ("RtlFormatCurrentUserKeyPath() called\n");
 
   Status = ZwOpenThreadToken (NtCurrentThread (),
-                             TOKEN_READ,
+                             TOKEN_QUERY,
                              TRUE,
                              &TokenHandle);
   if (!NT_SUCCESS (Status))
@@ -261,7 +264,7 @@ RtlFormatCurrentUserKeyPath (OUT PUNICODE_STRING KeyPath)
        }
 
       Status = ZwOpenProcessToken (NtCurrentProcess (),
-                                  TOKEN_READ,
+                                  TOKEN_QUERY,
                                   &TokenHandle);
       if (!NT_SUCCESS (Status))
        {
@@ -299,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;
     }
@@ -321,7 +323,7 @@ RtlFormatCurrentUserKeyPath (OUT PUNICODE_STRING KeyPath)
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlOpenCurrentUser(IN ACCESS_MASK DesiredAccess,
                   OUT PHANDLE KeyHandle)
 {
@@ -329,6 +331,8 @@ RtlOpenCurrentUser(IN ACCESS_MASK DesiredAccess,
   UNICODE_STRING KeyPath;
   NTSTATUS Status;
 
+  PAGED_CODE_RTL();
+
   Status = RtlFormatCurrentUserKeyPath(&KeyPath);
   if (NT_SUCCESS(Status))
     {
@@ -365,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,
@@ -391,6 +395,8 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
   UNICODE_STRING EnvValue;
   UNICODE_STRING EnvExpandedValue;
 
+  PAGED_CODE_RTL();
+
   DPRINT("RtlQueryRegistryValues() called\n");
 
   Status = RtlpGetRegistryHandle(RelativeTo,
@@ -440,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;
@@ -457,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;
@@ -473,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;
@@ -511,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;
@@ -534,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;
@@ -557,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;
@@ -575,7 +581,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
                         ValueString->Length);
                  ((PWSTR)ValueString->Buffer)[ValueString->Length / sizeof(WCHAR)] = 0;
 
-                 ExFreePool(ExpandBuffer);
+                 RtlpFreeMemory(ExpandBuffer, TAG_RTLREGISTRY);
                }
              else
                {
@@ -591,7 +597,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
 
            }
 
-         ExFreePool(ValueInfo);
+         RtlpFreeMemory(ValueInfo, TAG_RTLREGISTRY);
        }
       else
        {
@@ -602,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;
@@ -651,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;
@@ -678,7 +684,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
                                                    Context,
                                                    QueryEntry->EntryContext);
 
-                 ExFreePool(ExpandBuffer);
+                 RtlpFreeMemory(ExpandBuffer, TAG_RTLREGISTRY);
                }
              else
                {
@@ -696,7 +702,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
 
                }
 
-             ExFreePool(ValueInfo);
+             RtlpFreeMemory(ValueInfo, TAG_RTLREGISTRY);
              if (!NT_SUCCESS(Status))
                break;
            }
@@ -717,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;
@@ -757,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;
@@ -777,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);
@@ -797,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;
@@ -825,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);
@@ -845,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;
            }
@@ -867,7 +873,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlWriteRegistryValue(IN ULONG RelativeTo,
                      IN PCWSTR Path,
                      IN PCWSTR ValueName,
@@ -879,13 +885,15 @@ 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%x\n", Status);
+    DPRINT("RtlpGetRegistryHandle() failed! Status: 0x%lx\n", Status);
     return(Status);
   }
 
@@ -900,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);
@@ -912,7 +920,7 @@ RtlWriteRegistryValue(IN ULONG RelativeTo,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlpNtCreateKey(OUT HANDLE KeyHandle,
                IN ACCESS_MASK DesiredAccess,
                IN POBJECT_ATTRIBUTES ObjectAttributes,
@@ -936,7 +944,7 @@ RtlpNtCreateKey(OUT HANDLE KeyHandle,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlpNtEnumerateSubKey(IN HANDLE KeyHandle,
                      OUT PUNICODE_STRING SubKeyName,
                      IN ULONG Index,
@@ -951,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);
     }
@@ -980,7 +988,7 @@ RtlpNtEnumerateSubKey(IN HANDLE KeyHandle,
 
   if (KeyInfo != NULL)
     {
-      ExFreePool(KeyInfo);
+      RtlpFreeMemory(KeyInfo, TAG_RTLREGISTRY);
     }
 
   return(Status);
@@ -990,7 +998,7 @@ RtlpNtEnumerateSubKey(IN HANDLE KeyHandle,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlpNtMakeTemporaryKey(IN HANDLE KeyHandle)
 {
   return(ZwDeleteKey(KeyHandle));
@@ -1000,7 +1008,7 @@ RtlpNtMakeTemporaryKey(IN HANDLE KeyHandle)
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlpNtOpenKey(OUT HANDLE KeyHandle,
              IN ACCESS_MASK DesiredAccess,
              IN POBJECT_ATTRIBUTES ObjectAttributes,
@@ -1018,7 +1026,7 @@ RtlpNtOpenKey(OUT HANDLE KeyHandle,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlpNtQueryValueKey(IN HANDLE KeyHandle,
                    OUT PULONG Type OPTIONAL,
                    OUT PVOID Data OPTIONAL,
@@ -1038,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);
 
@@ -1064,7 +1072,7 @@ RtlpNtQueryValueKey(IN HANDLE KeyHandle,
        }
     }
 
-  ExFreePool(ValueInfo);
+  RtlpFreeMemory(ValueInfo, TAG_RTLREGISTRY);
 
   return(Status);
 }
@@ -1073,7 +1081,7 @@ RtlpNtQueryValueKey(IN HANDLE KeyHandle,
 /*
  * @implemented
  */
-NTSTATUS STDCALL
+NTSTATUS NTAPI
 RtlpNtSetValueKey(IN HANDLE KeyHandle,
                  IN ULONG Type,
                  IN PVOID Data,