[PATCH 6/6] ntoskrnl.exe/tests: Add HID driver test with polled mode.

Rémi Bernon rbernon at codeweavers.com
Fri Jun 18 07:06:11 CDT 2021


Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/ntoskrnl.exe/tests/driver_hid.c | 19 +++++++++++++++++--
 dlls/ntoskrnl.exe/tests/ntoskrnl.c   | 24 ++++++++++++++++--------
 2 files changed, 33 insertions(+), 10 deletions(-)

diff --git a/dlls/ntoskrnl.exe/tests/driver_hid.c b/dlls/ntoskrnl.exe/tests/driver_hid.c
index eb81426823b..ed8a0021347 100644
--- a/dlls/ntoskrnl.exe/tests/driver_hid.c
+++ b/dlls/ntoskrnl.exe/tests/driver_hid.c
@@ -41,6 +41,7 @@ static UNICODE_STRING control_symlink;
 
 static unsigned int got_start_device;
 static DWORD report_id;
+static DWORD polled_mode;
 
 struct minidevice_extension
 {
@@ -419,6 +420,13 @@ static NTSTATUS WINAPI driver_internal_ioctl(DEVICE_OBJECT *device, IRP *irp)
             if (out_size != expected_size) test_failed = TRUE;
 
             if (mext->removed) ret = STATUS_DEVICE_REMOVED;
+            else if (polled_mode)
+            {
+                memset(irp->UserBuffer, 0xa5, expected_size);
+                if (report_id) ((char *)irp->UserBuffer)[0] = report_id;
+                irp->IoStatus.Information = expected_size;
+                ret = STATUS_SUCCESS;
+            }
             else
             {
                 InsertTailList(&mext->irp_queue, &irp->Tail.Overlay.ListEntry);
@@ -450,7 +458,7 @@ static NTSTATUS WINAPI driver_internal_ioctl(DEVICE_OBJECT *device, IRP *irp)
                 ok(packet->reportBuffer[0] == 0xcd, "got first byte %x\n", packet->reportBuffer[0]);
             }
 
-            if ((entry = RemoveHeadList(&mext->irp_queue)) != &mext->irp_queue)
+            if (!polled_mode && (entry = RemoveHeadList(&mext->irp_queue)) != &mext->irp_queue)
             {
                 IRP *tmp = CONTAINING_RECORD(entry, IRP, Tail.Overlay.ListEntry);
                 memset(tmp->UserBuffer, 0xa5, 23);
@@ -474,7 +482,7 @@ static NTSTATUS WINAPI driver_internal_ioctl(DEVICE_OBJECT *device, IRP *irp)
 
             todo_wine_if(report_id)
             ok(packet->reportId == report_id, "got packet report id %u\n", packet->reportId);
-            todo_wine_if(report_id)
+            todo_wine_if(packet->reportBufferLen == 22 || packet->reportBufferLen == 24)
             ok(packet->reportBufferLen == expected_size, "got packet buffer len %u\n", packet->reportBufferLen);
             ok(!!packet->reportBuffer, "got packet buffer %p\n", packet->reportBuffer);
 
@@ -585,6 +593,13 @@ NTSTATUS WINAPI DriverEntry(DRIVER_OBJECT *driver, UNICODE_STRING *registry)
     ok(!ret, "ZwQueryValueKey returned %#x\n", ret);
     memcpy(&report_id, buffer + info_size, size - info_size);
 
+    RtlInitUnicodeString(&name_str, L"PolledMode");
+    size = info_size + sizeof(polled_mode);
+    ret = ZwQueryValueKey(hkey, &name_str, KeyValuePartialInformation, buffer, size, &size);
+    ok(!ret, "ZwQueryValueKey returned %#x\n", ret);
+    memcpy(&polled_mode, buffer + info_size, size - info_size);
+    params.DevicesArePolled = polled_mode;
+
     driver->DriverExtension->AddDevice = driver_add_device;
     driver->DriverUnload = driver_unload;
     driver->MajorFunction[IRP_MJ_PNP] = driver_pnp;
diff --git a/dlls/ntoskrnl.exe/tests/ntoskrnl.c b/dlls/ntoskrnl.exe/tests/ntoskrnl.c
index df661327b41..fee0368fe6b 100644
--- a/dlls/ntoskrnl.exe/tests/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/tests/ntoskrnl.c
@@ -1600,7 +1600,7 @@ static inline void check_hidp_value_caps_(int line, HIDP_VALUE_CAPS *caps, const
     }
 }
 
-static void test_hidp(HANDLE file, int report_id)
+static void test_hidp(HANDLE file, int report_id, int polled_mode)
 {
     const HIDP_CAPS expect_hidp_caps[] =
     {
@@ -2625,15 +2625,18 @@ static void test_hidp(HANDLE file, int report_id)
     memset( report, 0xcd, sizeof(report) );
     SetLastError(0xdeadbeef);
     ret = ReadFile( file, report, caps.InputReportByteLength, &value, NULL );
+    todo_wine_if(polled_mode)
     ok(ret, "ReadFile failed, last error %u\n", GetLastError());
+    todo_wine_if(polled_mode)
     ok(value == caps.InputReportByteLength, "ReadFile returned %x\n", value);
+    todo_wine_if(polled_mode)
     ok(report[0] == report_id, "unexpected report data\n");
 
     HidD_FreePreparsedData(preparsed_data);
     CloseHandle(file);
 }
 
-static void test_hid_device(DWORD report_id)
+static void test_hid_device(DWORD report_id, DWORD polled_mode)
 {
     char buffer[200];
     SP_DEVICE_INTERFACE_DETAIL_DATA_A *iface_detail = (void *)buffer;
@@ -2648,7 +2651,7 @@ static void test_hid_device(DWORD report_id)
     HDEVINFO set;
     HANDLE file;
 
-    winetest_push_context("report %d", report_id);
+    winetest_push_context("report %d, polled %d", report_id, polled_mode);
 
     set = SetupDiGetClassDevsA(&GUID_DEVINTERFACE_HID, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
     ok(set != INVALID_HANDLE_VALUE, "failed to get device list, error %#x\n", GetLastError());
@@ -2680,7 +2683,7 @@ static void test_hid_device(DWORD report_id)
             FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
     ok(file != INVALID_HANDLE_VALUE, "got error %u\n", GetLastError());
 
-    test_hidp(file, report_id);
+    test_hidp(file, report_id, polled_mode);
 
     CloseHandle(file);
 
@@ -2692,7 +2695,7 @@ static void test_hid_device(DWORD report_id)
     winetest_pop_context();
 }
 
-static void test_hid_driver(struct testsign_context *ctx, DWORD report_id)
+static void test_hid_driver(struct testsign_context *ctx, DWORD report_id, DWORD polled_mode)
 {
     static const char hardware_id[] = "test_hardware_id\0";
     char path[MAX_PATH], dest[MAX_PATH], *filepart;
@@ -2717,6 +2720,9 @@ static void test_hid_driver(struct testsign_context *ctx, DWORD report_id)
     status = RegSetValueExW(hkey, L"ReportID", 0, REG_DWORD, (void *)&report_id, sizeof(report_id));
     ok(!status, "RegSetValueExW returned %#x\n", status);
 
+    status = RegSetValueExW(hkey, L"PolledMode", 0, REG_DWORD, (void *)&polled_mode, sizeof(polled_mode));
+    ok(!status, "RegSetValueExW returned %#x\n", status);
+
     load_resource(L"driver_hid.dll", driver_filename);
     ret = MoveFileExW(driver_filename, L"winetest.sys", MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING);
     ok(ret, "failed to move file, error %u\n", GetLastError());
@@ -2764,7 +2770,7 @@ static void test_hid_driver(struct testsign_context *ctx, DWORD report_id)
 
     /* Tests. */
 
-    test_hid_device(report_id);
+    test_hid_device(report_id, polled_mode);
 
     /* Clean up. */
 
@@ -2895,8 +2901,10 @@ START_TEST(ntoskrnl)
     test_pnp_driver(&ctx);
 
     subtest("driver_hid");
-    test_hid_driver(&ctx, 0);
-    test_hid_driver(&ctx, 1);
+    test_hid_driver(&ctx, 0, FALSE);
+    test_hid_driver(&ctx, 1, FALSE);
+    test_hid_driver(&ctx, 0, TRUE);
+    test_hid_driver(&ctx, 1, TRUE);
 
 out:
     testsign_cleanup(&ctx);
-- 
2.31.0




More information about the wine-devel mailing list