Improved default value handling in RtlQueryRegistryValues().
authorEric Kohl <eric.kohl@reactos.org>
Mon, 29 Apr 2002 23:20:44 +0000 (23:20 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Mon, 29 Apr 2002 23:20:44 +0000 (23:20 +0000)
svn path=/trunk/; revision=2898

reactos/lib/ntdll/rtl/registry.c
reactos/ntoskrnl/cm/rtlfunc.c

index 0ea127c..ec6a358 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: registry.c,v 1.10 2002/02/10 13:55:45 ekohl Exp $
+/* $Id: registry.c,v 1.11 2002/04/29 23:19:53 ekohl Exp $
  *
  * COPYRIGHT:         See COPYING in the top level directory
  * PROJECT:           ReactOS kernel
@@ -240,8 +240,51 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
                                   &ResultSize);
          if (!NT_SUCCESS(Status))
            {
-             RtlFreeHeap(RtlGetProcessHeap(), 0, ValueInfo);
-             break;
+             if (QueryEntry->Flags & RTL_QUERY_REGISTRY_REQUIRED)
+               {
+                 RtlFreeHeap(RtlGetProcessHeap(), 0, ValueInfo);
+                 Status = STATUS_OBJECT_NAME_NOT_FOUND;
+                 break;
+               }
+       
+             if (QueryEntry->DefaultType == REG_SZ)
+               {
+                 PUNICODE_STRING ValueString;
+                 PUNICODE_STRING SourceString;
+
+                 SourceString = (PUNICODE_STRING)QueryEntry->DefaultData;
+                 ValueString = (PUNICODE_STRING)QueryEntry->EntryContext;
+                 if (ValueString->Buffer == 0)
+                   {
+                     ValueString->Length = SourceString->Length;
+                     ValueString->MaximumLength = SourceString->MaximumLength;
+                     ValueString->Buffer = RtlAllocateHeap(RtlGetProcessHeap(),
+                                                           0,
+                                                           ValueString->MaximumLength);
+                     if (!ValueString->Buffer)
+                       break;
+                     ValueString->Buffer[0] = 0;
+                     memcpy(ValueString->Buffer,
+                            SourceString->Buffer,
+                            SourceString->MaximumLength);
+                   }
+                 else
+                   {
+                     ValueString->Length = min(SourceString->Length,
+                                               ValueString->MaximumLength - sizeof(WCHAR));
+                     memcpy(ValueString->Buffer,
+                            SourceString->Buffer,
+                            ValueString->Length);
+                     ((PWSTR)ValueString->Buffer)[ValueString->Length / sizeof(WCHAR)] = 0;
+                   }
+               }
+             else
+               {
+                 memcpy(QueryEntry->EntryContext,
+                        QueryEntry->DefaultData,
+                        QueryEntry->DefaultLength);
+               }
+             Status = STATUS_SUCCESS;
            }
          else
            {
index 67549d5..91f9837 100644 (file)
@@ -225,9 +225,50 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
                                   &ResultSize);
          if (!NT_SUCCESS(Status))
            {
-             DPRINT("ZwQueryValueKey() failed with status %x\n", Status);
-             ExFreePool(ValueInfo);
-             break;
+             if (QueryEntry->Flags & RTL_QUERY_REGISTRY_REQUIRED)
+               {
+                 ExFreePool(ValueInfo);
+                 Status = STATUS_OBJECT_NAME_NOT_FOUND;
+                 goto ByeBye;
+               }
+       
+             if (QueryEntry->DefaultType == REG_SZ)
+               {
+                 PUNICODE_STRING ValueString;
+                 PUNICODE_STRING SourceString;
+
+                 SourceString = (PUNICODE_STRING)QueryEntry->DefaultData;
+                 ValueString = (PUNICODE_STRING)QueryEntry->EntryContext;
+                 if (ValueString->Buffer == 0)
+                   {
+                     ValueString->Length = SourceString->Length;
+                     ValueString->MaximumLength = SourceString->MaximumLength;
+                     ValueString->Buffer = ExAllocatePool(PagedPool,
+                                                          ValueString->MaximumLength);
+                     if (!ValueString->Buffer)
+                       break;
+                     ValueString->Buffer[0] = 0;
+                     memcpy(ValueString->Buffer,
+                            SourceString->Buffer,
+                            SourceString->MaximumLength);
+                   }
+                 else
+                   {
+                     ValueString->Length = RtlMin(SourceString->Length,
+                                                  ValueString->MaximumLength - sizeof(WCHAR));
+                     memcpy(ValueString->Buffer,
+                            SourceString->Buffer,
+                            ValueString->Length);
+                     ((PWSTR)ValueString->Buffer)[ValueString->Length / sizeof(WCHAR)] = 0;
+                   }
+               }
+             else
+               {
+                 memcpy(QueryEntry->EntryContext,
+                        QueryEntry->DefaultData,
+                        QueryEntry->DefaultLength);
+               }
+             Status = STATUS_SUCCESS;
            }
          else
            {
@@ -451,6 +492,8 @@ RtlQueryRegistryValues(IN ULONG RelativeTo,
       QueryEntry++;
     }
 
+ByeBye:
+
   if (CurrentKeyHandle != BaseKeyHandle)
     NtClose(CurrentKeyHandle);