From 3eb49852317b1aadb60eb1163c9a8c5a5a6a141d Mon Sep 17 00:00:00 2001 From: Andrew Nguyen Date: Tue, 7 Sep 2010 05:01:11 -0500 Subject: [PATCH] setupapi: Implement SetupDuplicateDiskSpaceListA/W. --- dlls/setupapi/diskspace.c | 38 ++++++++++ dlls/setupapi/setupapi.spec | 4 +- dlls/setupapi/tests/diskspace.c | 156 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 196 insertions(+), 2 deletions(-) diff --git a/dlls/setupapi/diskspace.c b/dlls/setupapi/diskspace.c index 050a3891d38..89cac077cdd 100644 --- a/dlls/setupapi/diskspace.c +++ b/dlls/setupapi/diskspace.c @@ -102,6 +102,44 @@ 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.@) diff --git a/dlls/setupapi/setupapi.spec b/dlls/setupapi/setupapi.spec index bb96c1931c8..9db4b6ed6fb 100644 --- a/dlls/setupapi/setupapi.spec +++ b/dlls/setupapi/setupapi.spec @@ -391,8 +391,8 @@ @ stub SetupDiSetSelectedDriverA @ stub SetupDiSetSelectedDriverW @ stub SetupDiUnremoveDevice -@ stub SetupDuplicateDiskSpaceListA -@ stub SetupDuplicateDiskSpaceListW +@ stdcall SetupDuplicateDiskSpaceListA(ptr ptr long long) +@ stdcall SetupDuplicateDiskSpaceListW(ptr ptr long long) @ stdcall SetupEnumInfSectionsA(long long ptr long ptr) @ stdcall SetupEnumInfSectionsW(long long ptr long ptr) @ stdcall SetupFindFirstLineA(long str str ptr) diff --git a/dlls/setupapi/tests/diskspace.c b/dlls/setupapi/tests/diskspace.c index 4700c5d08e7..573eb734536 100644 --- a/dlls/setupapi/tests/diskspace.c +++ b/dlls/setupapi/tests/diskspace.c @@ -146,6 +146,160 @@ static void test_SetupCreateDiskSpaceListW(void) GetLastError()); } +static void test_SetupDuplicateDiskSpaceListA(void) +{ + HDSKSPC handle, duplicate; + int is_win9x = !SetupCreateDiskSpaceListW((void *)0xdeadbeef, 0xdeadbeef, 0) && + GetLastError() == ERROR_CALL_NOT_IMPLEMENTED; + + if (is_win9x) + win_skip("SetupDuplicateDiskSpaceListA crashes with NULL disk space handle on Win9x\n"); + else + { + SetLastError(0xdeadbeef); + duplicate = SetupDuplicateDiskSpaceListA(NULL, NULL, 0, 0); + ok(!duplicate, "Expected SetupDuplicateDiskSpaceList to return NULL, got %p\n", duplicate); + ok(GetLastError() == ERROR_INVALID_HANDLE, + "Expected GetLastError() to return ERROR_INVALID_HANDLE, got %u\n", GetLastError()); + + SetLastError(0xdeadbeef); + duplicate = SetupDuplicateDiskSpaceListA(NULL, (void *)0xdeadbeef, 0, 0); + ok(!duplicate, "Expected SetupDuplicateDiskSpaceList to return NULL, got %p\n", duplicate); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", GetLastError()); + + SetLastError(0xdeadbeef); + duplicate = SetupDuplicateDiskSpaceListA(NULL, NULL, 0xdeadbeef, 0); + ok(!duplicate, "Expected SetupDuplicateDiskSpaceList to return NULL, got %p\n", duplicate); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", GetLastError()); + + SetLastError(0xdeadbeef); + duplicate = SetupDuplicateDiskSpaceListA(NULL, NULL, 0, ~0U); + ok(!duplicate, "Expected SetupDuplicateDiskSpaceList to return NULL, got %p\n", duplicate); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", GetLastError()); + } + + handle = SetupCreateDiskSpaceListA(NULL, 0, 0); + ok(handle != NULL, + "Expected SetupCreateDiskSpaceListA to return a valid handle, got NULL\n"); + + if (!handle) + { + skip("Failed to create a disk space handle\n"); + return; + } + + SetLastError(0xdeadbeef); + duplicate = SetupDuplicateDiskSpaceListA(handle, (void *)0xdeadbeef, 0, 0); + ok(!duplicate, "Expected SetupDuplicateDiskSpaceList to return NULL, got %p\n", duplicate); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", GetLastError()); + + SetLastError(0xdeadbeef); + duplicate = SetupDuplicateDiskSpaceListA(handle, NULL, 0xdeadbeef, 0); + ok(!duplicate, "Expected SetupDuplicateDiskSpaceList to return NULL, got %p\n", duplicate); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", GetLastError()); + + SetLastError(0xdeadbeef); + duplicate = SetupDuplicateDiskSpaceListA(handle, NULL, 0, SPDSL_IGNORE_DISK); + ok(!duplicate, "Expected SetupDuplicateDiskSpaceList to return NULL, got %p\n", duplicate); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", GetLastError()); + + SetLastError(0xdeadbeef); + duplicate = SetupDuplicateDiskSpaceListA(handle, NULL, 0, ~0U); + ok(!duplicate, "Expected SetupDuplicateDiskSpaceList to return NULL, got %p\n", duplicate); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", GetLastError()); + + duplicate = SetupDuplicateDiskSpaceListA(handle, NULL, 0, 0); + ok(duplicate != NULL, "Expected SetupDuplicateDiskSpaceList to return NULL, got %p\n", duplicate); + ok(duplicate != handle, + "Expected new handle (%p) to be different from the old handle (%p)\n", duplicate, handle); + + ok(SetupDestroyDiskSpaceList(duplicate), "Expected SetupDestroyDiskSpaceList to succeed\n"); + ok(SetupDestroyDiskSpaceList(handle), "Expected SetupDestroyDiskSpaceList to succeed\n"); +} + +static void test_SetupDuplicateDiskSpaceListW(void) +{ + HDSKSPC handle, duplicate; + + SetLastError(0xdeadbeef); + duplicate = SetupDuplicateDiskSpaceListW(NULL, NULL, 0, 0); + if (!duplicate && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) + { + win_skip("SetupDuplicateDiskSpaceListW is not available\n"); + return; + } + ok(!duplicate, "Expected SetupDuplicateDiskSpaceList to return NULL, got %p\n", duplicate); + ok(GetLastError() == ERROR_INVALID_HANDLE, + "Expected GetLastError() to return ERROR_INVALID_HANDLE, got %u\n", GetLastError()); + + SetLastError(0xdeadbeef); + duplicate = SetupDuplicateDiskSpaceListW(NULL, (void *)0xdeadbeef, 0, 0); + ok(!duplicate, "Expected SetupDuplicateDiskSpaceList to return NULL, got %p\n", duplicate); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", GetLastError()); + + SetLastError(0xdeadbeef); + duplicate = SetupDuplicateDiskSpaceListW(NULL, NULL, 0xdeadbeef, 0); + ok(!duplicate, "Expected SetupDuplicateDiskSpaceList to return NULL, got %p\n", duplicate); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", GetLastError()); + + SetLastError(0xdeadbeef); + duplicate = SetupDuplicateDiskSpaceListW(NULL, NULL, 0, ~0U); + ok(!duplicate, "Expected SetupDuplicateDiskSpaceList to return NULL, got %p\n", duplicate); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", GetLastError()); + + handle = SetupCreateDiskSpaceListW(NULL, 0, 0); + ok(handle != NULL, + "Expected SetupCreateDiskSpaceListW to return a valid handle, got NULL\n"); + + if (!handle) + { + skip("Failed to create a disk space handle\n"); + return; + } + + SetLastError(0xdeadbeef); + duplicate = SetupDuplicateDiskSpaceListW(handle, (void *)0xdeadbeef, 0, 0); + ok(!duplicate, "Expected SetupDuplicateDiskSpaceList to return NULL, got %p\n", duplicate); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", GetLastError()); + + SetLastError(0xdeadbeef); + duplicate = SetupDuplicateDiskSpaceListW(handle, NULL, 0xdeadbeef, 0); + ok(!duplicate, "Expected SetupDuplicateDiskSpaceList to return NULL, got %p\n", duplicate); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", GetLastError()); + + SetLastError(0xdeadbeef); + duplicate = SetupDuplicateDiskSpaceListW(handle, NULL, 0, SPDSL_IGNORE_DISK); + ok(!duplicate, "Expected SetupDuplicateDiskSpaceList to return NULL, got %p\n", duplicate); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", GetLastError()); + + SetLastError(0xdeadbeef); + duplicate = SetupDuplicateDiskSpaceListW(handle, NULL, 0, ~0U); + ok(!duplicate, "Expected SetupDuplicateDiskSpaceList to return NULL, got %p\n", duplicate); + ok(GetLastError() == ERROR_INVALID_PARAMETER, + "Expected GetLastError() to return ERROR_INVALID_PARAMETER, got %u\n", GetLastError()); + + duplicate = SetupDuplicateDiskSpaceListW(handle, NULL, 0, 0); + ok(duplicate != NULL, "Expected SetupDuplicateDiskSpaceList to return NULL, got %p\n", duplicate); + ok(duplicate != handle, + "Expected new handle (%p) to be different from the old handle (%p)\n", duplicate, handle); + + ok(SetupDestroyDiskSpaceList(duplicate), "Expected SetupDestroyDiskSpaceList to succeed\n"); + ok(SetupDestroyDiskSpaceList(handle), "Expected SetupDestroyDiskSpaceList to succeed\n"); +} + static void test_SetupQuerySpaceRequiredOnDriveA(void) { BOOL ret; @@ -324,6 +478,8 @@ START_TEST(diskspace) { test_SetupCreateDiskSpaceListA(); test_SetupCreateDiskSpaceListW(); + test_SetupDuplicateDiskSpaceListA(); + test_SetupDuplicateDiskSpaceListW(); test_SetupQuerySpaceRequiredOnDriveA(); test_SetupQuerySpaceRequiredOnDriveW(); } -- 2.11.4.GIT