update for HEAD-2003091401
[reactos.git] / lib / ntdll / rtl / registry.c
index 3643771..5c0222b 100644 (file)
@@ -30,6 +30,9 @@
 
 /* FUNCTIONS ***************************************************************/
 
+/*
+ * @implemented
+ */
 NTSTATUS STDCALL
 RtlCheckRegistryKey(IN ULONG RelativeTo,
                    IN PWSTR Path)
@@ -50,6 +53,9 @@ RtlCheckRegistryKey(IN ULONG RelativeTo,
 }
 
 
+/*
+ * @implemented
+ */
 NTSTATUS STDCALL
 RtlCreateRegistryKey(IN ULONG RelativeTo,
                     IN PWSTR Path)
@@ -70,17 +76,20 @@ RtlCreateRegistryKey(IN ULONG RelativeTo,
 }
 
 
+/*
+ * @implemented
+ */
 NTSTATUS STDCALL
 RtlDeleteRegistryValue(IN ULONG RelativeTo,
-                      IN PWSTR Path,
-                      IN PWSTR ValueName)
+                      IN PCWSTR Path,
+                      IN PCWSTR ValueName)
 {
   HANDLE KeyHandle;
   NTSTATUS Status;
   UNICODE_STRING Name;
 
   Status = RtlpGetRegistryHandle(RelativeTo,
-                                Path,
+                                (PWSTR)Path,
                                 FALSE,
                                 &KeyHandle);
   if (!NT_SUCCESS(Status))
@@ -98,6 +107,9 @@ RtlDeleteRegistryValue(IN ULONG RelativeTo,
 }
 
 
+/*
+ * @unimplemented
+ */
 NTSTATUS STDCALL
 RtlFormatCurrentUserKeyPath(PUNICODE_STRING KeyPath)
 {
@@ -110,6 +122,9 @@ RtlFormatCurrentUserKeyPath(PUNICODE_STRING KeyPath)
 }
 
 
+/*
+ * @implemented
+ */
 NTSTATUS STDCALL
 RtlOpenCurrentUser(IN ACCESS_MASK DesiredAccess,
                   OUT PHANDLE KeyHandle)
@@ -147,9 +162,12 @@ RtlOpenCurrentUser(IN ACCESS_MASK DesiredAccess,
 }
 
 
+/*
+ * @unimplemented
+ */
 NTSTATUS STDCALL
 RtlQueryRegistryValues(IN ULONG RelativeTo,
-                      IN PWSTR Path,
+                      IN PCWSTR Path,
                       IN PRTL_QUERY_REGISTRY_TABLE QueryTable,
                       IN PVOID Context,
                       IN PVOID Environment)
@@ -166,15 +184,17 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
   ULONG ResultSize;
   ULONG Index;
   ULONG StringLen;
+  ULONG ValueNameSize;
   PWSTR StringPtr;
   PWSTR ExpandBuffer;
+  PWSTR ValueName;
   UNICODE_STRING EnvValue;
   UNICODE_STRING EnvExpandedValue;
 
   DPRINT("RtlQueryRegistryValues() called\n");
 
   Status = RtlpGetRegistryHandle(RelativeTo,
-                                Path,
+                                (PWSTR)Path,
                                 FALSE,
                                 &BaseKeyHandle);
   if (!NT_SUCCESS(Status))
@@ -188,15 +208,6 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
   while ((QueryEntry->QueryRoutine != NULL) ||
         (QueryEntry->Name != NULL))
     {
-      if ((QueryEntry->QueryRoutine == NULL) &&
-         ((QueryEntry->Flags & RTL_QUERY_REGISTRY_SUBKEY) != 0))
-       {
-         Status = STATUS_INVALID_PARAMETER;
-         break;
-       }
-
-      DPRINT("Name: %S\n", QueryEntry->Name);
-
       if (((QueryEntry->Flags & (RTL_QUERY_REGISTRY_SUBKEY | RTL_QUERY_REGISTRY_TOPKEY)) != 0) &&
          (BaseKeyHandle != CurrentKeyHandle))
        {
@@ -260,7 +271,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
 
                  SourceString = (PUNICODE_STRING)QueryEntry->DefaultData;
                  ValueString = (PUNICODE_STRING)QueryEntry->EntryContext;
-                 if (ValueString->Buffer == 0)
+                 if (ValueString->Buffer == NULL)
                    {
                      ValueString->Length = SourceString->Length;
                      ValueString->MaximumLength = SourceString->MaximumLength;
@@ -303,7 +314,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
                  ValueString = (PUNICODE_STRING)QueryEntry->EntryContext;
                  if (ValueString->Buffer == NULL)
                    {
-                     ValueString->MaximumLength = ValueInfo->DataLength + sizeof(WCHAR);
+                     ValueString->MaximumLength = ValueInfo->DataLength;
                      ValueString->Buffer = RtlAllocateHeap(RtlGetProcessHeap(),
                                                            0,
                                                            ValueString->MaximumLength);
@@ -315,7 +326,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
                      ValueString->Buffer[0] = 0;
                     }
                  ValueString->Length = min(ValueInfo->DataLength,
-                                           ValueString->MaximumLength - sizeof(WCHAR));
+                                           ValueString->MaximumLength) - sizeof(WCHAR);
                  memcpy(ValueString->Buffer,
                         ValueInfo->Data,
                         ValueString->Length);
@@ -341,7 +352,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
                  RtlInitUnicodeString(&EnvValue,
                                       (PWSTR)ValueInfo->Data);
                  EnvExpandedValue.Length = 0;
-                 EnvExpandedValue.MaximumLength = ValueInfo->DataLength * 2 * sizeof(WCHAR);
+                 EnvExpandedValue.MaximumLength = ValueInfo->DataLength * 2;
                  EnvExpandedValue.Buffer = ExpandBuffer;
                  *ExpandBuffer = 0;
 
@@ -475,7 +486,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
                                                &StringLen);
 
                  StringLen = (wcslen(ExpandBuffer) + 1) * sizeof(WCHAR);
-                 Status = QueryEntry->QueryRoutine(FullValueInfo->Name,
+                 Status = QueryEntry->QueryRoutine(QueryEntry->Name,
                                                    REG_SZ,
                                                    (PVOID)ExpandBuffer,
                                                    StringLen,
@@ -528,13 +539,21 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
              FullValueInfo = RtlAllocateHeap(RtlGetProcessHeap(),
                                              0,
                                              BufferSize);
-             if (FullValueInfo == NULL)
+              if (FullValueInfo == NULL)
                {
                  Status = STATUS_NO_MEMORY;
                  break;
                }
-
-             Index = 0;
+             ValueNameSize = 256 * sizeof(WCHAR);
+             ValueName = RtlAllocateHeap(RtlGetProcessHeap(),
+                                         0,
+                                         ValueNameSize);
+             if (ValueName == NULL)
+               {
+                 Status = STATUS_NO_MEMORY;
+                 break;
+               }
+              Index = 0;
              while (TRUE)
                {
                  Status = NtEnumerateValueKey(CurrentKeyHandle,
@@ -558,6 +577,28 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
                      break;
                    }
 
+                 if (FullValueInfo->NameLength > ValueNameSize - sizeof(WCHAR))
+                   {
+                     /* Should not happen, because the name length is limited to 255 characters */
+                     RtlFreeHeap(RtlGetProcessHeap(),
+                                 0,
+                                 ValueName);
+                     ValueNameSize = FullValueInfo->NameLength + sizeof(WCHAR);
+                      ValueName = RtlAllocateHeap(RtlGetProcessHeap(),
+                                                 0,
+                                                  ValueNameSize);
+                     if (ValueName == NULL)
+                       {
+                         Status = STATUS_NO_MEMORY;
+                         break;
+                       }
+                   }
+
+                 memcpy(ValueName,
+                         FullValueInfo->Name,
+                        FullValueInfo->NameLength);
+                 ValueName[FullValueInfo->NameLength / sizeof(WCHAR)] = 0;
+
                  DPRINT("FullValueInfo->Type: %lu\n", FullValueInfo->Type);
                  if ((FullValueInfo->Type == REG_MULTI_SZ) &&
                      !(QueryEntry->Flags & RTL_QUERY_REGISTRY_NOEXPAND))
@@ -567,7 +608,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
                      while (*StringPtr != 0)
                        {
                          StringLen = (wcslen(StringPtr) + 1) * sizeof(WCHAR);
-                         Status = QueryEntry->QueryRoutine(QueryEntry->Name,
+                         Status = QueryEntry->QueryRoutine(ValueName,
                                                            REG_SZ,
                                                            (PVOID)StringPtr,
                                                            StringLen,
@@ -596,7 +637,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
                      RtlInitUnicodeString(&EnvValue,
                                           StringPtr);
                      EnvExpandedValue.Length = 0;
-                     EnvExpandedValue.MaximumLength = FullValueInfo->DataLength * 2 * sizeof(WCHAR);
+                     EnvExpandedValue.MaximumLength = FullValueInfo->DataLength * 2;
                      EnvExpandedValue.Buffer = ExpandBuffer;
                      *ExpandBuffer = 0;
 
@@ -606,7 +647,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
                                                    &StringLen);
 
                      StringLen = (wcslen(ExpandBuffer) + 1) * sizeof(WCHAR);
-                     Status = QueryEntry->QueryRoutine(FullValueInfo->Name,
+                     Status = QueryEntry->QueryRoutine(ValueName,
                                                        REG_SZ,
                                                        (PVOID)ExpandBuffer,
                                                        StringLen,
@@ -619,7 +660,7 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
                    }
                  else
                    {
-                     Status = QueryEntry->QueryRoutine(FullValueInfo->Name,
+                     Status = QueryEntry->QueryRoutine(ValueName,
                                                        FullValueInfo->Type,
                                                        (PVOID)FullValueInfo + FullValueInfo->DataOffset,
                                                        FullValueInfo->DataLength,
@@ -638,7 +679,9 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
              RtlFreeHeap(RtlGetProcessHeap(),
                          0,
                          FullValueInfo);
-
+             RtlFreeHeap(RtlGetProcessHeap(),
+                         0,
+                         ValueName);
              if (!NT_SUCCESS(Status))
                break;
            }
@@ -656,10 +699,13 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
 }
 
 
+/*
+ * @implemented
+ */
 NTSTATUS STDCALL
 RtlWriteRegistryValue(IN ULONG RelativeTo,
-                     IN PWSTR Path,
-                     IN PWSTR ValueName,
+                     IN PCWSTR Path,
+                     IN PCWSTR ValueName,
                      IN ULONG ValueType,
                      IN PVOID ValueData,
                      IN ULONG ValueLength)
@@ -669,7 +715,7 @@ RtlWriteRegistryValue(IN ULONG RelativeTo,
   UNICODE_STRING Name;
 
   Status = RtlpGetRegistryHandle(RelativeTo,
-                                Path,
+                                (PWSTR)Path,
                                 TRUE,
                                 &KeyHandle);
   if (!NT_SUCCESS(Status))
@@ -691,6 +737,9 @@ RtlWriteRegistryValue(IN ULONG RelativeTo,
 }
 
 
+/*
+ * @implemented
+ */
 NTSTATUS STDCALL
 RtlpNtCreateKey(OUT HANDLE KeyHandle,
                IN ACCESS_MASK DesiredAccess,
@@ -712,6 +761,9 @@ RtlpNtCreateKey(OUT HANDLE KeyHandle,
 }
 
 
+/*
+ * @implemented
+ */
 NTSTATUS STDCALL
 RtlpNtEnumerateSubKey(IN HANDLE KeyHandle,
                      OUT PUNICODE_STRING SubKeyName,
@@ -767,6 +819,9 @@ RtlpNtEnumerateSubKey(IN HANDLE KeyHandle,
 }
 
 
+/*
+ * @implemented
+ */
 NTSTATUS STDCALL
 RtlpNtMakeTemporaryKey(IN HANDLE KeyHandle)
 {
@@ -774,6 +829,9 @@ RtlpNtMakeTemporaryKey(IN HANDLE KeyHandle)
 }
 
 
+/*
+ * @implemented
+ */
 NTSTATUS STDCALL
 RtlpNtOpenKey(OUT HANDLE KeyHandle,
              IN ACCESS_MASK DesiredAccess,
@@ -789,6 +847,9 @@ RtlpNtOpenKey(OUT HANDLE KeyHandle,
 }
 
 
+/*
+ * @implemented
+ */
 NTSTATUS STDCALL
 RtlpNtQueryValueKey(IN HANDLE KeyHandle,
                    OUT PULONG Type OPTIONAL,
@@ -845,6 +906,9 @@ RtlpNtQueryValueKey(IN HANDLE KeyHandle,
 }
 
 
+/*
+ * @implemented
+ */
 NTSTATUS STDCALL
 RtlpNtSetValueKey(IN HANDLE KeyHandle,
                  IN ULONG Type,