[SETUPAPI]
[reactos.git] / reactos / dll / win32 / setupapi / diskspace.c
index f246e5e..1857c33 100644 (file)
@@ -35,7 +35,7 @@ typedef struct {
 
 
 /***********************************************************************
- *             SetupCreateDiskSpaceListW  (SETUPAPI.@)
+ *      SetupCreateDiskSpaceListW  (SETUPAPI.@)
  */
 HDSKSPC WINAPI SetupCreateDiskSpaceListW(PVOID Reserved1, DWORD Reserved2, UINT Flags)
 {
@@ -44,6 +44,14 @@ HDSKSPC WINAPI SetupCreateDiskSpaceListW(PVOID Reserved1, DWORD Reserved2, UINT
     WCHAR *ptr;
     LPDISKSPACELIST list=NULL;
 
+    TRACE("(%p, %u, 0x%08x)\n", Reserved1, Reserved2, Flags);
+
+    if (Reserved1 || Reserved2 || Flags & ~SPDSL_IGNORE_DISK)
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return NULL;
+    }
+
     rc = GetLogicalDriveStringsW(255,drives);
 
     if (rc == 0)
@@ -52,9 +60,9 @@ HDSKSPC WINAPI SetupCreateDiskSpaceListW(PVOID Reserved1, DWORD Reserved2, UINT
     list = HeapAlloc(GetProcessHeap(),0,sizeof(DISKSPACELIST));
 
     list->dwDriveCount = 0;
-    
+
     ptr = drives;
-    
+
     while (*ptr)
     {
         DWORD type = GetDriveTypeW(ptr);
@@ -73,7 +81,7 @@ HDSKSPC WINAPI SetupCreateDiskSpaceListW(PVOID Reserved1, DWORD Reserved2, UINT
         }
        ptr += lstrlenW(ptr) + 1;
     }
-    return  (HANDLE)list;
+    return list;
 }
 
 
@@ -85,12 +93,50 @@ HDSKSPC WINAPI SetupCreateDiskSpaceListA(PVOID Reserved1, DWORD Reserved2, UINT
     return SetupCreateDiskSpaceListW( Reserved1, Reserved2, Flags );
 }
 
+/***********************************************************************
+ *             SetupDuplicateDiskSpaceListW  (SETUPAPI.@)
+ */
+HDSKSPC WINAPI SetupDuplicateDiskSpaceListW(HDSKSPC DiskSpace, PVOID Reserved1, DWORD Reserved2, UINT Flags)
+{
+    DISKSPACELIST *list_copy, *list_original = DiskSpace;
+
+    if (Reserved1 || Reserved2 || Flags)
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return NULL;
+    }
+
+    if (!DiskSpace)
+    {
+        SetLastError(ERROR_INVALID_HANDLE);
+        return NULL;
+    }
+
+    list_copy = HeapAlloc(GetProcessHeap(), 0, sizeof(DISKSPACELIST));
+    if (!list_copy)
+    {
+        SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+        return NULL;
+    }
+
+    *list_copy = *list_original;
+
+    return list_copy;
+}
+
+/***********************************************************************
+ *             SetupDuplicateDiskSpaceListA  (SETUPAPI.@)
+ */
+HDSKSPC WINAPI SetupDuplicateDiskSpaceListA(HDSKSPC DiskSpace, PVOID Reserved1, DWORD Reserved2, UINT Flags)
+{
+    return SetupDuplicateDiskSpaceListW(DiskSpace, Reserved1, Reserved2, Flags);
+}
 
 /***********************************************************************
  *             SetupAddInstallSectionToDiskSpaceListA  (SETUPAPI.@)
  */
-BOOL WINAPI SetupAddInstallSectionToDiskSpaceListA(HDSKSPC DiskSpace, 
-                        HINF InfHandle, HINF LayoutInfHandle, 
+BOOL WINAPI SetupAddInstallSectionToDiskSpaceListA(HDSKSPC DiskSpace,
+                        HINF InfHandle, HINF LayoutInfHandle,
                         LPCSTR SectionName, PVOID Reserved1, UINT Reserved2)
 {
     FIXME ("Stub\n");
@@ -98,20 +144,38 @@ BOOL WINAPI SetupAddInstallSectionToDiskSpaceListA(HDSKSPC DiskSpace,
 }
 
 /***********************************************************************
-*              SetupQuerySpaceRequiredOnDriveA  (SETUPAPI.@)
+*              SetupQuerySpaceRequiredOnDriveW  (SETUPAPI.@)
 */
-BOOL WINAPI SetupQuerySpaceRequiredOnDriveA(HDSKSPC DiskSpace, 
-                        LPCSTR DriveSpec, LONGLONG* SpaceRequired, 
+BOOL WINAPI SetupQuerySpaceRequiredOnDriveW(HDSKSPC DiskSpace,
+                        LPCWSTR DriveSpec, LONGLONG *SpaceRequired,
                         PVOID Reserved1, UINT Reserved2)
 {
-    WCHAR driveW[20];
+    WCHAR *driveW;
     unsigned int i;
-    LPDISKSPACELIST list = (LPDISKSPACELIST)DiskSpace;
+    LPDISKSPACELIST list = DiskSpace;
     BOOL rc = FALSE;
     static const WCHAR bkslsh[]= {'\\',0};
 
-    MultiByteToWideChar(CP_ACP,0,DriveSpec,-1,driveW,20);
+    if (!DiskSpace)
+    {
+        SetLastError(ERROR_INVALID_HANDLE);
+        return FALSE;
+    }
+
+    if (!DriveSpec)
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+
+    driveW = HeapAlloc(GetProcessHeap(), 0, (lstrlenW(DriveSpec) + 2) * sizeof(WCHAR));
+    if (!driveW)
+    {
+        SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+        return FALSE;
+    }
 
+    lstrcpyW(driveW,DriveSpec);
     lstrcatW(driveW,bkslsh);
 
     TRACE("Looking for drive %s\n",debugstr_w(driveW));
@@ -127,9 +191,56 @@ BOOL WINAPI SetupQuerySpaceRequiredOnDriveA(HDSKSPC DiskSpace,
         }
     }
 
+    HeapFree(GetProcessHeap(), 0, driveW);
+
+    if (!rc) SetLastError(ERROR_INVALID_DRIVE);
     return rc;
 }
 
+/***********************************************************************
+*              SetupQuerySpaceRequiredOnDriveA  (SETUPAPI.@)
+*/
+BOOL WINAPI SetupQuerySpaceRequiredOnDriveA(HDSKSPC DiskSpace,
+                        LPCSTR DriveSpec, LONGLONG *SpaceRequired,
+                        PVOID Reserved1, UINT Reserved2)
+{
+    DWORD len;
+    LPWSTR DriveSpecW;
+    BOOL ret;
+
+    /* The parameter validation checks are in a different order from the
+     * Unicode variant of SetupQuerySpaceRequiredOnDrive. */
+    if (!DriveSpec)
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+
+    if (!DiskSpace)
+    {
+        SetLastError(ERROR_INVALID_HANDLE);
+        return FALSE;
+    }
+
+    len = MultiByteToWideChar(CP_ACP, 0, DriveSpec, -1, NULL, 0);
+
+    DriveSpecW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+    if (!DriveSpecW)
+    {
+        SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+        return FALSE;
+    }
+
+    MultiByteToWideChar(CP_ACP, 0, DriveSpec, -1, DriveSpecW, len);
+
+    ret = SetupQuerySpaceRequiredOnDriveW(DiskSpace, DriveSpecW, SpaceRequired,
+                                          Reserved1, Reserved2);
+
+    HeapFree(GetProcessHeap(), 0, DriveSpecW);
+
+    return ret;
+}
+
 /***********************************************************************
 *              SetupDestroyDiskSpaceList  (SETUPAPI.@)
 */
@@ -137,5 +248,5 @@ BOOL WINAPI SetupDestroyDiskSpaceList(HDSKSPC DiskSpace)
 {
     LPDISKSPACELIST list = (LPDISKSPACELIST)DiskSpace;
     HeapFree(GetProcessHeap(),0,list);
-    return TRUE; 
+    return TRUE;
 }