- Don't convert the device name, if the name is a NULL pointer (in QueryDosDeviceA).
authorHartmut Birr <osexpert@googlemail.com>
Sun, 25 Sep 2005 17:25:55 +0000 (17:25 +0000)
committerHartmut Birr <osexpert@googlemail.com>
Sun, 25 Sep 2005 17:25:55 +0000 (17:25 +0000)
- Convert the string in several steps, because the string may be longer than 32k characters (in QueryDosDeviceA).

svn path=/trunk/; revision=18060

reactos/lib/kernel32/file/dosdev.c

index c5e50bb..915db4d 100644 (file)
@@ -96,51 +96,68 @@ QueryDosDeviceA(
   UNICODE_STRING TargetPathU;
   ANSI_STRING TargetPathA;
   DWORD Length;
+  DWORD CurrentLength;
+  PWCHAR Buffer;
 
-  if (!RtlCreateUnicodeStringFromAsciiz (&DeviceNameU,
-                                        (LPSTR)lpDeviceName))
+  if (lpDeviceName)
   {
-    SetLastError (ERROR_NOT_ENOUGH_MEMORY);
-    return 0;
+    if (!RtlCreateUnicodeStringFromAsciiz (&DeviceNameU,
+                                          (LPSTR)lpDeviceName))
+    {
+      SetLastError (ERROR_NOT_ENOUGH_MEMORY);
+      return 0;
+    }
   }
-
-  TargetPathU.Length = 0;
-  TargetPathU.MaximumLength = (USHORT)ucchMax * sizeof(WCHAR);
-  TargetPathU.Buffer = RtlAllocateHeap (RtlGetProcessHeap (),
-                                       0,
-                                       TargetPathU.MaximumLength);
-  if (TargetPathU.Buffer == NULL)
+  Buffer = RtlAllocateHeap (RtlGetProcessHeap (),
+                           0,
+                           ucchMax * sizeof(WCHAR));
+  if (Buffer == NULL)
   {
+    if (lpDeviceName)
+    {
+      RtlFreeHeap (RtlGetProcessHeap (),
+                  0,
+                  DeviceNameU.Buffer);
+    }
     SetLastError (ERROR_NOT_ENOUGH_MEMORY);
     return 0;
   }
 
-  Length = QueryDosDeviceW (DeviceNameU.Buffer,
-                           TargetPathU.Buffer,
+  Length = QueryDosDeviceW (lpDeviceName ? DeviceNameU.Buffer : NULL,
+                           Buffer,
                            ucchMax);
   if (Length != 0)
   {
-    TargetPathU.Length = Length * sizeof(WCHAR);
-
-    TargetPathA.Length = 0;
-    TargetPathA.MaximumLength = (USHORT)ucchMax;
     TargetPathA.Buffer = lpTargetPath;
+    TargetPathU.Buffer = Buffer;
+    ucchMax = Length;
 
-    RtlUnicodeStringToAnsiString (&TargetPathA,
-                                 &TargetPathU,
-                                 FALSE);
-
-    DPRINT ("TargetPathU: '%wZ'\n", &TargetPathU);
-    DPRINT ("TargetPathA: '%Z'\n", &TargetPathA);
+    while (ucchMax)
+    {
+      CurrentLength = min (ucchMax, MAXUSHORT / 2);
+      TargetPathU.MaximumLength = TargetPathU.Length = CurrentLength * sizeof(WCHAR);
+     
+      TargetPathA.Length = 0;
+      TargetPathA.MaximumLength = CurrentLength;
+
+      RtlUnicodeStringToAnsiString (&TargetPathA,
+                                   &TargetPathU,
+                                   FALSE);
+      ucchMax -= CurrentLength;
+      TargetPathA.Buffer += TargetPathA.Length;
+      TargetPathU.Buffer += TargetPathU.Length / sizeof(WCHAR);
+    }
   }
 
   RtlFreeHeap (RtlGetProcessHeap (),
               0,
-              TargetPathU.Buffer);
-  RtlFreeHeap (RtlGetProcessHeap (),
-              0,
-              DeviceNameU.Buffer);
-
+              Buffer);
+  if (lpDeviceName)
+  {
+    RtlFreeHeap (RtlGetProcessHeap (),
+                0,
+                DeviceNameU.Buffer);
+  }
   return Length;
 }