[WINESYNC] setupapi: Implement SetupQueryDrivesInDiskSpaceList.

wine-staging patch by Michael Müller <michael@fds-team.de>

+ Add the .spec exports.

Co-authored-by: Hermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
This commit is contained in:
winesync 2023-09-17 16:04:52 +02:00 committed by Hermès Bélusca-Maïto
parent 492011e956
commit 3ad50272d5
No known key found for this signature in database
GPG key ID: 3B2539C65E7B93D0
4 changed files with 351 additions and 2 deletions

View file

@ -407,3 +407,88 @@ BOOL WINAPI SetupAddToDiskSpaceListA(HDSKSPC diskspace, PCSTR targetfile,
if (targetfileW) HeapFree(GetProcessHeap(), 0, targetfileW);
return ret;
}
/***********************************************************************
* SetupQueryDrivesInDiskSpaceListW (SETUPAPI.@)
*/
BOOL WINAPI SetupQueryDrivesInDiskSpaceListW(HDSKSPC diskspace, PWSTR buffer, DWORD size, PDWORD required_size)
{
struct space_list *list = diskspace;
struct file_entry *file;
DWORD cur_size = 1;
BOOL used[26];
TRACE("(%p, %p, %ld, %p)\n", diskspace, buffer, size, required_size);
if (!diskspace)
{
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
memset(&used, 0, sizeof(used));
LIST_FOR_EACH_ENTRY(file, &list->files, struct file_entry, entry)
{
int device;
/* UNC paths are not yet supported by this function */
if (towlower(file->path[0]) < 'a' || towlower(file->path[0]) > 'z' || file->path[1] != ':')
continue;
device = towlower(file->path[0]) - 'a';
if (used[device]) continue;
cur_size += 3;
if (buffer)
{
if (cur_size > size)
{
if (required_size) *required_size = cur_size;
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return FALSE;
}
*buffer++ = towlower(file->path[0]);
*buffer++ = ':';
*buffer++ = 0;
}
used[device] = TRUE;
}
if (buffer && size) *buffer = 0;
if (required_size) *required_size = cur_size;
return TRUE;
}
/***********************************************************************
* SetupQueryDrivesInDiskSpaceListA (SETUPAPI.@)
*/
BOOL WINAPI SetupQueryDrivesInDiskSpaceListA(HDSKSPC diskspace, PSTR buffer, DWORD size, PDWORD required_size)
{
WCHAR *bufferW = NULL;
BOOL ret;
int i;
if (buffer && size)
{
bufferW = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR));
if (!bufferW)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return FALSE;
}
}
ret = SetupQueryDrivesInDiskSpaceListW(diskspace, bufferW ? bufferW : (WCHAR *)buffer,
size, required_size);
if (bufferW)
{
for (i = 0; i < size; i++)
buffer[i] = bufferW[i];
HeapFree(GetProcessHeap(), 0, bufferW);
}
return ret;
}

View file

@ -469,8 +469,8 @@
@ stdcall SetupPromptForDiskA(ptr str str str str str long ptr long ptr)
@ stdcall SetupPromptForDiskW(ptr wstr wstr wstr wstr wstr long ptr long ptr)
@ stdcall SetupPromptReboot(ptr ptr long)
@ stdcall -stub SetupQueryDrivesInDiskSpaceListA(ptr ptr long ptr)
@ stub SetupQueryDrivesInDiskSpaceListW
@ stdcall SetupQueryDrivesInDiskSpaceListA(ptr ptr long ptr)
@ stdcall SetupQueryDrivesInDiskSpaceListW(ptr ptr long ptr)
@ stub SetupQueryFileLogA
@ stub SetupQueryFileLogW
@ stdcall SetupQueryInfFileInformationA(ptr long str long ptr)

View file

@ -616,6 +616,75 @@ static void test_SetupAddToDiskSpaceListA(void)
"Expected SetupDestroyDiskSpaceList to succeed\n");
}
static void test_SetupQueryDrivesInDiskSpaceListA(void)
{
char buffer[MAX_PATH];
HDSKSPC handle;
DWORD size;
BOOL ret;
handle = SetupCreateDiskSpaceListA(NULL, 0, SPDSL_IGNORE_DISK);
ok(handle != NULL,"Expected SetupCreateDiskSpaceListA to return a valid handle\n");
ret = SetupQueryDrivesInDiskSpaceListA(handle, NULL, 0, NULL);
ok(ret, "Expected SetupQueryDrivesInDiskSpaceListA to succeed\n");
size = 0;
ret = SetupQueryDrivesInDiskSpaceListA(handle, NULL, 0, &size);
ok(ret, "Expected SetupQueryDrivesInDiskSpaceListA to succeed\n");
ok(size == 1, "Expected size 1, got %lu\n", size);
ret = SetupAddToDiskSpaceListA(handle, "F:\\random-file.dat", 0, FILEOP_COPY, 0, 0);
ok(ret, "Expected SetupAddToDiskSpaceListA to succeed\n");
ret = SetupAddToDiskSpaceListA(handle, "G:\\random-file.dat", 0, FILEOP_COPY, 0, 0);
ok(ret, "Expected SetupAddToDiskSpaceListA to succeed\n");
ret = SetupAddToDiskSpaceListA(handle, "G:\\random-file2.dat", 0, FILEOP_COPY, 0, 0);
ok(ret, "Expected SetupAddToDiskSpaceListA to succeed\n");
ret = SetupAddToDiskSpaceListA(handle, "X:\\random-file.dat", 0, FILEOP_COPY, 0, 0);
ok(ret, "Expected SetupAddToDiskSpaceListA to succeed\n");
size = 0;
ret = SetupQueryDrivesInDiskSpaceListA(handle, NULL, 0, &size);
ok(ret, "Expected SetupQueryDrivesInDiskSpaceListA to succeed\n");
ok(size == 10, "Expected size 10, got %lu\n", size);
size = 0;
ret = SetupQueryDrivesInDiskSpaceListA(handle, buffer, 0, &size);
ok(!ret, "Expected SetupQueryDrivesInDiskSpaceListA to fail\n");
ok(size == 4, "Expected size 4, got %lu\n", size);
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"Expected GetLastError() to return ERROR_INSUFFICIENT_BUFFER, got %lu\n", GetLastError());
size = 0;
ret = SetupQueryDrivesInDiskSpaceListA(handle, buffer, 4, &size);
ok(!ret, "Expected SetupQueryDrivesInDiskSpaceListA to fail\n");
ok(size == 7, "Expected size 7, got %lu\n", size);
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"Expected GetLastError() to return ERROR_INSUFFICIENT_BUFFER, got %lu\n", GetLastError());
size = 0;
ret = SetupQueryDrivesInDiskSpaceListA(handle, buffer, 7, &size);
ok(!ret, "Expected SetupQueryDrivesInDiskSpaceListA to fail\n");
ok(size == 10, "Expected size 10, got %lu\n", size);
ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
"Expected GetLastError() to return ERROR_INSUFFICIENT_BUFFER, got %lu\n", GetLastError());
size = 0;
memset(buffer, 0xff, sizeof(buffer));
ret = SetupQueryDrivesInDiskSpaceListA(handle, buffer, sizeof(buffer), &size);
ok(ret, "Expected SetupQueryDrivesInDiskSpaceListA to succeed\n");
ok(size == 10, "Expected size 10, got %lu\n", size);
ok(!memcmp("f:\0g:\0x:\0\0", buffer, 10), "Device list does not match\n");
memset(buffer, 0xff, sizeof(buffer));
ret = SetupQueryDrivesInDiskSpaceListA(handle, buffer, sizeof(buffer), NULL);
ok(ret, "Expected SetupQueryDrivesInDiskSpaceListA to succeed\n");
ok(!memcmp("f:\0g:\0x:\0\0", buffer, 10), "Device list does not match\n");
}
START_TEST(diskspace)
{
test_SetupCreateDiskSpaceListA();
@ -625,4 +694,5 @@ START_TEST(diskspace)
test_SetupQuerySpaceRequiredOnDriveA();
test_SetupQuerySpaceRequiredOnDriveW();
test_SetupAddToDiskSpaceListA();
test_SetupQueryDrivesInDiskSpaceListA();
}

View file

@ -0,0 +1,194 @@
diff --git a/dll/win32/setupapi/diskspace.c b/dll/win32/setupapi/diskspace.c
index 962764cf279..1fa4486ce1e 100644
--- a/dll/win32/setupapi/diskspace.c
+++ b/dll/win32/setupapi/diskspace.c
@@ -407,3 +407,88 @@ BOOL WINAPI SetupAddToDiskSpaceListA(HDSKSPC diskspace, PCSTR targetfile,
if (targetfileW) HeapFree(GetProcessHeap(), 0, targetfileW);
return ret;
}
+
+/***********************************************************************
+ * SetupQueryDrivesInDiskSpaceListW (SETUPAPI.@)
+ */
+BOOL WINAPI SetupQueryDrivesInDiskSpaceListW(HDSKSPC diskspace, PWSTR buffer, DWORD size, PDWORD required_size)
+{
+ struct space_list *list = diskspace;
+ struct file_entry *file;
+ DWORD cur_size = 1;
+ BOOL used[26];
+
+ TRACE("(%p, %p, %ld, %p)\n", diskspace, buffer, size, required_size);
+
+ if (!diskspace)
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+
+ memset(&used, 0, sizeof(used));
+ LIST_FOR_EACH_ENTRY(file, &list->files, struct file_entry, entry)
+ {
+ int device;
+
+ /* UNC paths are not yet supported by this function */
+ if (towlower(file->path[0]) < 'a' || towlower(file->path[0]) > 'z' || file->path[1] != ':')
+ continue;
+
+ device = towlower(file->path[0]) - 'a';
+ if (used[device]) continue;
+
+ cur_size += 3;
+
+ if (buffer)
+ {
+ if (cur_size > size)
+ {
+ if (required_size) *required_size = cur_size;
+ SetLastError(ERROR_INSUFFICIENT_BUFFER);
+ return FALSE;
+ }
+ *buffer++ = towlower(file->path[0]);
+ *buffer++ = ':';
+ *buffer++ = 0;
+ }
+
+ used[device] = TRUE;
+ }
+
+ if (buffer && size) *buffer = 0;
+ if (required_size) *required_size = cur_size;
+ return TRUE;
+}
+
+/***********************************************************************
+ * SetupQueryDrivesInDiskSpaceListA (SETUPAPI.@)
+ */
+BOOL WINAPI SetupQueryDrivesInDiskSpaceListA(HDSKSPC diskspace, PSTR buffer, DWORD size, PDWORD required_size)
+{
+ WCHAR *bufferW = NULL;
+ BOOL ret;
+ int i;
+
+ if (buffer && size)
+ {
+ bufferW = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WCHAR));
+ if (!bufferW)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return FALSE;
+ }
+ }
+
+ ret = SetupQueryDrivesInDiskSpaceListW(diskspace, bufferW ? bufferW : (WCHAR *)buffer,
+ size, required_size);
+
+ if (bufferW)
+ {
+ for (i = 0; i < size; i++)
+ buffer[i] = bufferW[i];
+ HeapFree(GetProcessHeap(), 0, bufferW);
+ }
+
+ return ret;
+}
diff --git a/dll/win32/setupapi/setupapi.spec b/dll/win32/setupapi/setupapi.spec
index 04296dbf9c4..4a87ac167da 100644
--- a/dll/win32/setupapi/setupapi.spec
+++ b/dll/win32/setupapi/setupapi.spec
@@ -469,8 +469,8 @@
@ stdcall SetupPromptForDiskA(ptr str str str str str long ptr long ptr)
@ stdcall SetupPromptForDiskW(ptr wstr wstr wstr wstr wstr long ptr long ptr)
@ stdcall SetupPromptReboot(ptr ptr long)
-@ stdcall -stub SetupQueryDrivesInDiskSpaceListA(ptr ptr long ptr)
-@ stub SetupQueryDrivesInDiskSpaceListW
+@ stdcall SetupQueryDrivesInDiskSpaceListA(ptr ptr long ptr)
+@ stdcall SetupQueryDrivesInDiskSpaceListW(ptr ptr long ptr)
@ stub SetupQueryFileLogA
@ stub SetupQueryFileLogW
@ stdcall SetupQueryInfFileInformationA(ptr long str long ptr)
diff --git a/modules/rostests/winetests/setupapi/diskspace.c b/modules/rostests/winetests/setupapi/diskspace.c
index 3cd83c8471f..930b957e913 100644
--- a/modules/rostests/winetests/setupapi/diskspace.c
+++ b/modules/rostests/winetests/setupapi/diskspace.c
@@ -616,6 +616,75 @@ static void test_SetupAddToDiskSpaceListA(void)
"Expected SetupDestroyDiskSpaceList to succeed\n");
}
+static void test_SetupQueryDrivesInDiskSpaceListA(void)
+{
+ char buffer[MAX_PATH];
+ HDSKSPC handle;
+ DWORD size;
+ BOOL ret;
+
+ handle = SetupCreateDiskSpaceListA(NULL, 0, SPDSL_IGNORE_DISK);
+ ok(handle != NULL,"Expected SetupCreateDiskSpaceListA to return a valid handle\n");
+
+ ret = SetupQueryDrivesInDiskSpaceListA(handle, NULL, 0, NULL);
+ ok(ret, "Expected SetupQueryDrivesInDiskSpaceListA to succeed\n");
+
+ size = 0;
+ ret = SetupQueryDrivesInDiskSpaceListA(handle, NULL, 0, &size);
+ ok(ret, "Expected SetupQueryDrivesInDiskSpaceListA to succeed\n");
+ ok(size == 1, "Expected size 1, got %lu\n", size);
+
+ ret = SetupAddToDiskSpaceListA(handle, "F:\\random-file.dat", 0, FILEOP_COPY, 0, 0);
+ ok(ret, "Expected SetupAddToDiskSpaceListA to succeed\n");
+
+ ret = SetupAddToDiskSpaceListA(handle, "G:\\random-file.dat", 0, FILEOP_COPY, 0, 0);
+ ok(ret, "Expected SetupAddToDiskSpaceListA to succeed\n");
+
+ ret = SetupAddToDiskSpaceListA(handle, "G:\\random-file2.dat", 0, FILEOP_COPY, 0, 0);
+ ok(ret, "Expected SetupAddToDiskSpaceListA to succeed\n");
+
+ ret = SetupAddToDiskSpaceListA(handle, "X:\\random-file.dat", 0, FILEOP_COPY, 0, 0);
+ ok(ret, "Expected SetupAddToDiskSpaceListA to succeed\n");
+
+ size = 0;
+ ret = SetupQueryDrivesInDiskSpaceListA(handle, NULL, 0, &size);
+ ok(ret, "Expected SetupQueryDrivesInDiskSpaceListA to succeed\n");
+ ok(size == 10, "Expected size 10, got %lu\n", size);
+
+ size = 0;
+ ret = SetupQueryDrivesInDiskSpaceListA(handle, buffer, 0, &size);
+ ok(!ret, "Expected SetupQueryDrivesInDiskSpaceListA to fail\n");
+ ok(size == 4, "Expected size 4, got %lu\n", size);
+ ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
+ "Expected GetLastError() to return ERROR_INSUFFICIENT_BUFFER, got %lu\n", GetLastError());
+
+ size = 0;
+ ret = SetupQueryDrivesInDiskSpaceListA(handle, buffer, 4, &size);
+ ok(!ret, "Expected SetupQueryDrivesInDiskSpaceListA to fail\n");
+ ok(size == 7, "Expected size 7, got %lu\n", size);
+ ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
+ "Expected GetLastError() to return ERROR_INSUFFICIENT_BUFFER, got %lu\n", GetLastError());
+
+ size = 0;
+ ret = SetupQueryDrivesInDiskSpaceListA(handle, buffer, 7, &size);
+ ok(!ret, "Expected SetupQueryDrivesInDiskSpaceListA to fail\n");
+ ok(size == 10, "Expected size 10, got %lu\n", size);
+ ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER,
+ "Expected GetLastError() to return ERROR_INSUFFICIENT_BUFFER, got %lu\n", GetLastError());
+
+ size = 0;
+ memset(buffer, 0xff, sizeof(buffer));
+ ret = SetupQueryDrivesInDiskSpaceListA(handle, buffer, sizeof(buffer), &size);
+ ok(ret, "Expected SetupQueryDrivesInDiskSpaceListA to succeed\n");
+ ok(size == 10, "Expected size 10, got %lu\n", size);
+ ok(!memcmp("f:\0g:\0x:\0\0", buffer, 10), "Device list does not match\n");
+
+ memset(buffer, 0xff, sizeof(buffer));
+ ret = SetupQueryDrivesInDiskSpaceListA(handle, buffer, sizeof(buffer), NULL);
+ ok(ret, "Expected SetupQueryDrivesInDiskSpaceListA to succeed\n");
+ ok(!memcmp("f:\0g:\0x:\0\0", buffer, 10), "Device list does not match\n");
+}
+
START_TEST(diskspace)
{
test_SetupCreateDiskSpaceListA();
@@ -625,4 +694,5 @@ START_TEST(diskspace)
test_SetupQuerySpaceRequiredOnDriveA();
test_SetupQuerySpaceRequiredOnDriveW();
test_SetupAddToDiskSpaceListA();
+ test_SetupQueryDrivesInDiskSpaceListA();
}