reactos/lib/advapi32/reg
diff -u -r1.44 -r1.45
--- reg.c	25 Feb 2004 14:25:10 -0000	1.44
+++ reg.c	1 Apr 2004 13:53:08 -0000	1.45
@@ -1,4 +1,4 @@
-/* $Id: reg.c,v 1.44 2004/02/25 14:25:10 ekohl Exp $
+/* $Id: reg.c,v 1.45 2004/04/01 13:53:08 ekohl Exp $
  *
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS system libraries
@@ -2191,10 +2191,10 @@
       ErrorCode = RtlNtStatusToDosError (Status);
       SetLastError (ErrorCode);
       MaxCopy = 0;
-      if (NULL != lpcbData)
-        {
-          ResultSize = sizeof(*ValueInfo) + *lpcbData;
-        }
+      if (lpcbData != NULL)
+	{
+	  ResultSize = sizeof(*ValueInfo) + *lpcbData;
+	}
     }
 
   if (lpType != NULL)
@@ -2202,27 +2202,35 @@
       *lpType = ValueInfo->Type;
     }
 
-  if (NT_SUCCESS(Status))
-    RtlMoveMemory (lpData,
-		   ValueInfo->Data,
-		   min(ValueInfo->DataLength,MaxCopy));
+  if (NT_SUCCESS(Status) && lpData != NULL)
+    {
+      RtlMoveMemory (lpData,
+		     ValueInfo->Data,
+		     min(ValueInfo->DataLength, MaxCopy));
+    }
 
   if ((ValueInfo->Type == REG_SZ) ||
       (ValueInfo->Type == REG_MULTI_SZ) ||
       (ValueInfo->Type == REG_EXPAND_SZ))
     {
-      if (MaxCopy > ValueInfo->DataLength)
-	((PWSTR)lpData)[ValueInfo->DataLength / sizeof(WCHAR)] = 0;
-      
-      if (lpcbData) {
-	*lpcbData = (ResultSize - sizeof(*ValueInfo));
-	DPRINT("(string) Returning Size: %d\n", *lpcbData);
-      }
+      if (lpData != NULL && MaxCopy > ValueInfo->DataLength)
+	{
+	  ((PWSTR)lpData)[ValueInfo->DataLength / sizeof(WCHAR)] = 0;
+	}
+
+      if (lpcbData != NULL)
+	{
+	  *lpcbData = (ResultSize - sizeof(*ValueInfo));
+	  DPRINT("(string) Returning Size: %lu\n", *lpcbData);
+	}
     }
   else
-    if (lpcbData) {
-      *lpcbData = ResultSize - sizeof(*ValueInfo);
-      DPRINT("(other) Returning Size: %d\n", *lpcbData);
+    {
+      if (lpcbData != NULL)
+	{
+	  *lpcbData = ResultSize - sizeof(*ValueInfo);
+	  DPRINT("(other) Returning Size: %lu\n", *lpcbData);
+	}
     }
 
   DPRINT("Type %d  Size %d\n", ValueInfo->Type, ValueInfo->DataLength);
@@ -2255,7 +2263,7 @@
   DWORD Length;
   DWORD Type;
 
-  if ((lpData) && (!lpcbData))
+  if (lpData != NULL && lpcbData == NULL)
     {
       SetLastError(ERROR_INVALID_PARAMETER);
       return ERROR_INVALID_PARAMETER;
@@ -2269,10 +2277,10 @@
 					  0,
 					  ValueData.MaximumLength);
       if (!ValueData.Buffer)
-        {
-          SetLastError(ERROR_OUTOFMEMORY);
-          return ERROR_OUTOFMEMORY;
-        }
+	{
+	  SetLastError(ERROR_OUTOFMEMORY);
+	  return ERROR_OUTOFMEMORY;
+	}
     }
   else
     {
@@ -2284,42 +2292,52 @@
   RtlCreateUnicodeStringFromAsciiz (&ValueName,
 				    (LPSTR)lpValueName);
 
-  /* Convert length from USHORT to DWORD */
-  Length = ValueData.Length;
+  Length = *lpcbData * sizeof(WCHAR);
   ErrorCode = RegQueryValueExW (hKey,
 				ValueName.Buffer,
 				lpReserved,
 				&Type,
 				(LPBYTE)ValueData.Buffer,
 				&Length);
-  if (lpType != NULL)
-    *lpType = Type;
+  DPRINT("ErrorCode %lu\n", ErrorCode);
 
-  if ((ErrorCode == ERROR_SUCCESS) && (ValueData.Buffer != NULL))
+  if (ErrorCode == ERROR_SUCCESS ||
+      ErrorCode == ERROR_MORE_DATA)
     {
+      if (lpType != NULL)
+	{
+	  *lpType = Type;
+	}
+
       if ((Type == REG_SZ) || (Type == REG_MULTI_SZ) || (Type == REG_EXPAND_SZ))
 	{
-	  RtlInitAnsiString(&AnsiString, NULL);
-	  AnsiString.Buffer = lpData;
-	  AnsiString.MaximumLength = *lpcbData;
-	  ValueData.Length = Length;
-	  ValueData.MaximumLength = ValueData.Length + sizeof(WCHAR);
-	  RtlUnicodeStringToAnsiString(&AnsiString, &ValueData, FALSE);
+	  if (ErrorCode == ERROR_SUCCESS && ValueData.Buffer != NULL)
+	    {
+	      RtlInitAnsiString(&AnsiString, NULL);
+	      AnsiString.Buffer = lpData;
+	      AnsiString.MaximumLength = *lpcbData;
+	      ValueData.Length = Length;
+	      ValueData.MaximumLength = ValueData.Length + sizeof(WCHAR);
+	      RtlUnicodeStringToAnsiString(&AnsiString, &ValueData, FALSE);
+	    }
 	  Length = Length / sizeof(WCHAR);
 	}
       else
 	{
 	  Length = min(*lpcbData, Length);
-	  RtlMoveMemory(lpData, ValueData.Buffer, Length);
+	  if (ErrorCode == ERROR_SUCCESS && ValueData.Buffer != NULL)
+	    {
+	      RtlMoveMemory(lpData, ValueData.Buffer, Length);
+	    }
 	}
-    }
 
-  if (lpcbData != NULL)
-    {
-      *lpcbData = Length;
+      if (lpcbData != NULL)
+	{
+	  *lpcbData = Length;
+	}
     }
 
-  if (ValueData.Buffer)
+  if (ValueData.Buffer != NULL)
     {
       RtlFreeHeap(ProcessHeap, 0, ValueData.Buffer);
     }