2 * SetupAPI DiskSpace functions
4 * Copyright 2004 CodeWeavers (Aric Stewart)
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #include "setupapi_private.h"
23 WINE_DEFAULT_DEBUG_CHANNEL(setupapi
);
28 LONGLONG dwWantedSpace
;
29 } DRIVE_ENTRY
, *LPDRIVE_ENTRY
;
33 DRIVE_ENTRY Drives
[26];
34 } DISKSPACELIST
, *LPDISKSPACELIST
;
37 /***********************************************************************
38 * SetupCreateDiskSpaceListW (SETUPAPI.@)
40 HDSKSPC WINAPI
SetupCreateDiskSpaceListW(PVOID Reserved1
, DWORD Reserved2
, UINT Flags
)
45 LPDISKSPACELIST list
=NULL
;
47 TRACE("(%p, %u, 0x%08x)\n", Reserved1
, Reserved2
, Flags
);
49 if (Reserved1
|| Reserved2
|| Flags
& ~SPDSL_IGNORE_DISK
)
51 SetLastError(ERROR_INVALID_PARAMETER
);
55 rc
= GetLogicalDriveStringsW(255,drives
);
60 list
= HeapAlloc(GetProcessHeap(),0,sizeof(DISKSPACELIST
));
62 list
->dwDriveCount
= 0;
68 DWORD type
= GetDriveTypeW(ptr
);
69 if (type
== DRIVE_FIXED
)
75 lstrcpyW(list
->Drives
[list
->dwDriveCount
].lpzName
,ptr
);
76 GetDiskFreeSpaceW(ptr
,§ors
,&bytes
,&clusters
,&total
);
77 list
->Drives
[list
->dwDriveCount
].dwFreeSpace
= clusters
* sectors
*
79 list
->Drives
[list
->dwDriveCount
].dwWantedSpace
= 0;
82 ptr
+= lstrlenW(ptr
) + 1;
88 /***********************************************************************
89 * SetupCreateDiskSpaceListA (SETUPAPI.@)
91 HDSKSPC WINAPI
SetupCreateDiskSpaceListA(PVOID Reserved1
, DWORD Reserved2
, UINT Flags
)
93 return SetupCreateDiskSpaceListW( Reserved1
, Reserved2
, Flags
);
96 /***********************************************************************
97 * SetupDuplicateDiskSpaceListW (SETUPAPI.@)
99 HDSKSPC WINAPI
SetupDuplicateDiskSpaceListW(HDSKSPC DiskSpace
, PVOID Reserved1
, DWORD Reserved2
, UINT Flags
)
101 DISKSPACELIST
*list_copy
, *list_original
= DiskSpace
;
103 if (Reserved1
|| Reserved2
|| Flags
)
105 SetLastError(ERROR_INVALID_PARAMETER
);
111 SetLastError(ERROR_INVALID_HANDLE
);
115 list_copy
= HeapAlloc(GetProcessHeap(), 0, sizeof(DISKSPACELIST
));
118 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
122 *list_copy
= *list_original
;
127 /***********************************************************************
128 * SetupDuplicateDiskSpaceListA (SETUPAPI.@)
130 HDSKSPC WINAPI
SetupDuplicateDiskSpaceListA(HDSKSPC DiskSpace
, PVOID Reserved1
, DWORD Reserved2
, UINT Flags
)
132 return SetupDuplicateDiskSpaceListW(DiskSpace
, Reserved1
, Reserved2
, Flags
);
135 /***********************************************************************
136 * SetupAddInstallSectionToDiskSpaceListA (SETUPAPI.@)
138 BOOL WINAPI
SetupAddInstallSectionToDiskSpaceListA(HDSKSPC DiskSpace
,
139 HINF InfHandle
, HINF LayoutInfHandle
,
140 LPCSTR SectionName
, PVOID Reserved1
, UINT Reserved2
)
146 /***********************************************************************
147 * SetupQuerySpaceRequiredOnDriveW (SETUPAPI.@)
149 BOOL WINAPI
SetupQuerySpaceRequiredOnDriveW(HDSKSPC DiskSpace
,
150 LPCWSTR DriveSpec
, LONGLONG
*SpaceRequired
,
151 PVOID Reserved1
, UINT Reserved2
)
155 LPDISKSPACELIST list
= DiskSpace
;
157 static const WCHAR bkslsh
[]= {'\\',0};
161 SetLastError(ERROR_INVALID_HANDLE
);
167 SetLastError(ERROR_INVALID_PARAMETER
);
171 driveW
= HeapAlloc(GetProcessHeap(), 0, (lstrlenW(DriveSpec
) + 2) * sizeof(WCHAR
));
174 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
178 lstrcpyW(driveW
,DriveSpec
);
179 lstrcatW(driveW
,bkslsh
);
181 TRACE("Looking for drive %s\n",debugstr_w(driveW
));
183 for (i
= 0; i
< list
->dwDriveCount
; i
++)
185 TRACE("checking drive %s\n",debugstr_w(list
->Drives
[i
].lpzName
));
186 if (lstrcmpW(driveW
,list
->Drives
[i
].lpzName
)==0)
189 *SpaceRequired
= list
->Drives
[i
].dwWantedSpace
;
194 HeapFree(GetProcessHeap(), 0, driveW
);
196 if (!rc
) SetLastError(ERROR_INVALID_DRIVE
);
200 /***********************************************************************
201 * SetupQuerySpaceRequiredOnDriveA (SETUPAPI.@)
203 BOOL WINAPI
SetupQuerySpaceRequiredOnDriveA(HDSKSPC DiskSpace
,
204 LPCSTR DriveSpec
, LONGLONG
*SpaceRequired
,
205 PVOID Reserved1
, UINT Reserved2
)
211 /* The parameter validation checks are in a different order from the
212 * Unicode variant of SetupQuerySpaceRequiredOnDrive. */
215 SetLastError(ERROR_INVALID_PARAMETER
);
221 SetLastError(ERROR_INVALID_HANDLE
);
225 len
= MultiByteToWideChar(CP_ACP
, 0, DriveSpec
, -1, NULL
, 0);
227 DriveSpecW
= HeapAlloc(GetProcessHeap(), 0, len
* sizeof(WCHAR
));
230 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
234 MultiByteToWideChar(CP_ACP
, 0, DriveSpec
, -1, DriveSpecW
, len
);
236 ret
= SetupQuerySpaceRequiredOnDriveW(DiskSpace
, DriveSpecW
, SpaceRequired
,
237 Reserved1
, Reserved2
);
239 HeapFree(GetProcessHeap(), 0, DriveSpecW
);
244 /***********************************************************************
245 * SetupDestroyDiskSpaceList (SETUPAPI.@)
247 BOOL WINAPI
SetupDestroyDiskSpaceList(HDSKSPC DiskSpace
)
249 LPDISKSPACELIST list
= (LPDISKSPACELIST
)DiskSpace
;
250 HeapFree(GetProcessHeap(),0,list
);