From: "Rémi Bernon" Subject: [PATCH 6/6] ntoskrnl.exe/tests: Add HID driver test with polled mode. Message-Id: <20210618120611.703993-6-rbernon@codeweavers.com> Date: Fri, 18 Jun 2021 14:06:11 +0200 In-Reply-To: <20210618120611.703993-1-rbernon@codeweavers.com> References: <20210618120611.703993-1-rbernon@codeweavers.com> Signed-off-by: Rémi Bernon --- 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