mirror of
https://github.com/reactos/reactos.git
synced 2024-06-29 01:12:06 +00:00
[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:
parent
492011e956
commit
3ad50272d5
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
Loading…
Reference in a new issue