[PATCH v10 2/2] kernel32/tests: Add SeekPenalty Test to Volume.c

David Koolhoven david at koolhoven-home.net
Tue May 25 12:53:17 CDT 2021


Helps test for compatibility with SeekPenaltyQueryProperty.

Signed-off-by: David Koolhoven <david at koolhoven-home.net>
---
v10: Fix patch, narrow success scope on supported hosts.
---
 dlls/kernel32/tests/volume.c | 45 ++++++++++++++++++++++++++++++++++++
 1 file changed, 45 insertions(+)

diff --git a/dlls/kernel32/tests/volume.c b/dlls/kernel32/tests/volume.c
index ed3897a6b94..37ce5ea74c7 100644
--- a/dlls/kernel32/tests/volume.c
+++ b/dlls/kernel32/tests/volume.c
@@ -654,6 +654,50 @@ static void test_disk_query_property(void)
     CloseHandle(handle);
 }
 
+static void test_disk_query_seek_penalty_property(void)
+{
+    STORAGE_PROPERTY_QUERY query = {0};
+    DEVICE_SEEK_PENALTY_DESCRIPTOR descriptor = {0};
+    HANDLE handle;
+    DWORD error;
+    DWORD size;
+    BOOL ret;
+
+    handle = CreateFileA("\\\\.\\PhysicalDrive0", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,
+                         0, 0);
+    if (handle == INVALID_HANDLE_VALUE)
+    {
+        win_skip("can't open \\\\.\\PhysicalDrive0 %#x\n", GetLastError());
+        return;
+    }
+
+    query.PropertyId = (STORAGE_PROPERTY_ID)StorageDeviceSeekPenaltyProperty;
+    query.QueryType = PropertyStandardQuery;
+
+    SetLastError(0xdeadbeef);
+    ret = DeviceIoControl(handle, IOCTL_STORAGE_QUERY_PROPERTY, &query, sizeof(query), &descriptor, sizeof(descriptor),
+                          &size, NULL);
+    error = GetLastError();
+    /* Only should complete on Win7 and Win10 */
+    if (!ret && error == ERROR_INVALID_FUNCTION)
+    {
+        win_skip("This function is not implemented before Win7, got error %#x\n", error);
+        return;
+    }
+    if (!ret && error == ERROR_GEN_FAILURE)
+    {
+        win_skip("Host system does not support this call, likely a VM, must complete on a reporting drive Error: %#x\n", error);
+         return;
+    }
+    ok(ret, "expect ret %#x, got %#x\n", TRUE, ret);
+    ok(error == 0xdeadbeef, "expect err %#x, got err %#x\n", 0xdeadbeef, error);
+    ok(size == sizeof(descriptor), "got size %d\n", size);
+    ok(descriptor.Version == sizeof(descriptor), "got descriptor.Version %d\n", descriptor.Version);
+    ok(descriptor.Size == sizeof(descriptor), "got descriptor.Size %d\n", descriptor.Size);
+
+    CloseHandle(handle);
+}
+
 static void test_GetVolumePathNameA(void)
 {
     char volume_path[MAX_PATH], cwd[MAX_PATH], expect_path[MAX_PATH];
@@ -1645,6 +1689,7 @@ START_TEST(volume)
     test_enum_vols();
     test_disk_extents();
     test_disk_query_property();
+    test_disk_query_seek_penalty_property(void)
     test_GetVolumePathNamesForVolumeNameA();
     test_GetVolumePathNamesForVolumeNameW();
     test_cdrom_ioctl();
-- 
2.19.1




More information about the wine-devel mailing list