[PATCH 5/6] hid: Introduce new get_value_caps_range helper for HidP_InitializeReportForID.
Rémi Bernon
rbernon at codeweavers.com
Mon Jun 21 02:05:22 CDT 2021
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/hid/hidp.c | 80 ++++++++++++++++--------------
dlls/ntoskrnl.exe/tests/ntoskrnl.c | 56 +--------------------
2 files changed, 45 insertions(+), 91 deletions(-)
diff --git a/dlls/hid/hidp.c b/dlls/hid/hidp.c
index 168461d99c9..bdf03a652f4 100644
--- a/dlls/hid/hidp.c
+++ b/dlls/hid/hidp.c
@@ -36,6 +36,36 @@
WINE_DEFAULT_DEBUG_CHANNEL(hidp);
+static NTSTATUS get_value_caps_range( WINE_HIDP_PREPARSED_DATA *preparsed, HIDP_REPORT_TYPE report_type, ULONG report_len,
+ const struct hid_value_caps **caps, const struct hid_value_caps **caps_end )
+{
+ if (preparsed->magic != HID_MAGIC) return HIDP_STATUS_INVALID_PREPARSED_DATA;
+
+ switch (report_type)
+ {
+ case HidP_Input:
+ if (report_len && report_len != preparsed->caps.InputReportByteLength)
+ return HIDP_STATUS_INVALID_REPORT_LENGTH;
+ *caps = HID_INPUT_VALUE_CAPS( preparsed );
+ break;
+ case HidP_Output:
+ if (report_len && report_len != preparsed->caps.OutputReportByteLength)
+ return HIDP_STATUS_INVALID_REPORT_LENGTH;
+ *caps = HID_OUTPUT_VALUE_CAPS( preparsed );
+ break;
+ case HidP_Feature:
+ if (report_len && report_len != preparsed->caps.FeatureReportByteLength)
+ return HIDP_STATUS_INVALID_REPORT_LENGTH;
+ *caps = HID_FEATURE_VALUE_CAPS( preparsed );
+ break;
+ default:
+ return HIDP_STATUS_INVALID_REPORT_TYPE;
+ }
+
+ *caps_end = *caps + preparsed->value_caps_count[report_type];
+ return HIDP_STATUS_SUCCESS;
+}
+
static NTSTATUS get_report_data(BYTE *report, INT reportLength, INT startBit, INT valueSize, PULONG value)
{
@@ -422,48 +452,26 @@ NTSTATUS WINAPI HidP_GetValueCaps( HIDP_REPORT_TYPE report_type, HIDP_VALUE_CAPS
return HidP_GetSpecificValueCaps( report_type, 0, 0, 0, caps, caps_count, preparsed_data );
}
-NTSTATUS WINAPI HidP_InitializeReportForID(HIDP_REPORT_TYPE ReportType, UCHAR ReportID,
- PHIDP_PREPARSED_DATA PreparsedData, PCHAR Report,
- ULONG ReportLength)
+NTSTATUS WINAPI HidP_InitializeReportForID( HIDP_REPORT_TYPE report_type, UCHAR report_id,
+ PHIDP_PREPARSED_DATA preparsed_data, char *report_buf, ULONG report_len )
{
- int size;
- PWINE_HIDP_PREPARSED_DATA data = (PWINE_HIDP_PREPARSED_DATA)PreparsedData;
- WINE_HID_REPORT *report = NULL;
- int r_count;
+ WINE_HIDP_PREPARSED_DATA *preparsed = (WINE_HIDP_PREPARSED_DATA *)preparsed_data;
+ const struct hid_value_caps *caps, *end;
+ NTSTATUS status;
- TRACE("(%i, %i, %p, %p, %i)\n",ReportType, ReportID, PreparsedData, Report, ReportLength);
+ TRACE( "report_type %d, report_id %x, preparsed_data %p, report_buf %p, report_len %u.\n", report_type,
+ report_id, preparsed_data, report_buf, report_len );
- if (data->magic != HID_MAGIC)
- return HIDP_STATUS_INVALID_PREPARSED_DATA;
+ if (!report_len) return HIDP_STATUS_INVALID_REPORT_LENGTH;
- switch(ReportType)
- {
- case HidP_Input:
- size = data->caps.InputReportByteLength;
- break;
- case HidP_Output:
- size = data->caps.OutputReportByteLength;
- break;
- case HidP_Feature:
- size = data->caps.FeatureReportByteLength;
- break;
- default:
- return HIDP_STATUS_INVALID_REPORT_TYPE;
- }
- r_count = data->reportCount[ReportType];
- report = &data->reports[data->reportIdx[ReportType][(BYTE)Report[0]]];
-
- if (!r_count || !size)
- return HIDP_STATUS_REPORT_DOES_NOT_EXIST;
+ status = get_value_caps_range( preparsed, report_type, report_len, &caps, &end );
+ if (status != HIDP_STATUS_SUCCESS) return status;
- if (size != ReportLength)
- return HIDP_STATUS_INVALID_REPORT_LENGTH;
-
- if (report->reportID && report->reportID != Report[0])
- return HIDP_STATUS_REPORT_DOES_NOT_EXIST;
+ while (caps != end && (caps->report_id != report_id || (!caps->usage_min && !caps->usage_max))) caps++;
+ if (caps == end) return HIDP_STATUS_REPORT_DOES_NOT_EXIST;
- ZeroMemory(Report, size);
- Report[0] = ReportID;
+ memset( report_buf, 0, report_len );
+ report_buf[0] = report_id;
return HIDP_STATUS_SUCCESS;
}
diff --git a/dlls/ntoskrnl.exe/tests/ntoskrnl.c b/dlls/ntoskrnl.exe/tests/ntoskrnl.c
index 19099a5a19c..ff3749569ff 100644
--- a/dlls/ntoskrnl.exe/tests/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/tests/ntoskrnl.c
@@ -2134,18 +2134,15 @@ static void test_hidp(HANDLE file, int report_id)
status = HidP_InitializeReportForID(HidP_Input, 0, preparsed_data, report, caps.InputReportByteLength + 1);
ok(status == HIDP_STATUS_INVALID_REPORT_LENGTH, "HidP_InitializeReportForID returned %#x\n", status);
status = HidP_InitializeReportForID(HidP_Input, 1 - report_id, preparsed_data, report, caps.InputReportByteLength);
- todo_wine_if(!report_id)
ok(status == HIDP_STATUS_REPORT_DOES_NOT_EXIST, "HidP_InitializeReportForID returned %#x\n", status);
memset(report, 0xcd, sizeof(report));
status = HidP_InitializeReportForID(HidP_Input, report_id, preparsed_data, report, caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_SUCCESS, "HidP_InitializeReportForID returned %#x\n", status);
memset(buffer, 0xcd, sizeof(buffer));
memset(buffer, 0, caps.InputReportByteLength);
buffer[0] = report_id;
- todo_wine_if(report_id)
ok(!memcmp(buffer, report, sizeof(buffer)), "unexpected report data\n");
status = HidP_SetUsageValueArray(HidP_Input, HID_USAGE_PAGE_GENERIC, 0, HID_USAGE_GENERIC_X, buffer,
@@ -2163,12 +2160,10 @@ static void test_hidp(HANDLE file, int report_id)
status = HidP_GetUsageValueArray(HidP_Input, HID_USAGE_PAGE_GENERIC, 0, HID_USAGE_GENERIC_X, buffer,
sizeof(buffer), preparsed_data, report, caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_NOT_VALUE_ARRAY, "HidP_GetUsageValueArray returned %#x\n", status);
memset(buffer, 0xcd, sizeof(buffer));
status = HidP_GetUsageValueArray(HidP_Input, HID_USAGE_PAGE_GENERIC, 0, HID_USAGE_GENERIC_HATSWITCH, buffer,
0, preparsed_data, report, caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_BUFFER_TOO_SMALL, "HidP_GetUsageValueArray returned %#x\n", status);
status = HidP_GetUsageValueArray(HidP_Input, HID_USAGE_PAGE_GENERIC, 0, HID_USAGE_GENERIC_HATSWITCH, buffer,
8, preparsed_data, report, caps.InputReportByteLength);
@@ -2178,53 +2173,41 @@ static void test_hidp(HANDLE file, int report_id)
value = -128;
status = HidP_SetUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, 0, HID_USAGE_GENERIC_X,
value, preparsed_data, report, caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_SUCCESS, "HidP_SetUsageValue returned %#x\n", status);
value = 0xdeadbeef;
status = HidP_GetUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, 0, HID_USAGE_GENERIC_X,
&value, preparsed_data, report, caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_SUCCESS, "HidP_GetUsageValue returned %#x\n", status);
- todo_wine_if(report_id)
ok(value == 0x80, "got value %x, expected %#x\n", value, 0x80);
value = 0xdeadbeef;
status = HidP_GetScaledUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, 0, HID_USAGE_GENERIC_X,
(LONG *)&value, preparsed_data, report, caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_SUCCESS, "HidP_GetScaledUsageValue returned %#x\n", status);
- todo_wine_if(report_id)
ok(value == -128, "got value %x, expected %#x\n", value, -128);
value = 127;
status = HidP_SetUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, 0, HID_USAGE_GENERIC_X,
value, preparsed_data, report, caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_SUCCESS, "HidP_SetUsageValue returned %#x\n", status);
value = 0xdeadbeef;
status = HidP_GetScaledUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, 0, HID_USAGE_GENERIC_X,
(LONG *)&value, preparsed_data, report, caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_SUCCESS, "HidP_GetScaledUsageValue returned %#x\n", status);
- todo_wine_if(report_id)
ok(value == 127, "got value %x, expected %#x\n", value, 127);
value = 0;
status = HidP_SetUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, 0, HID_USAGE_GENERIC_X,
value, preparsed_data, report, caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_SUCCESS, "HidP_SetUsageValue returned %#x\n", status);
value = 0xdeadbeef;
status = HidP_GetScaledUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, 0, HID_USAGE_GENERIC_X,
(LONG *)&value, preparsed_data, report, caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_SUCCESS, "HidP_GetScaledUsageValue returned %#x\n", status);
- todo_wine_if(report_id)
ok(value == 0, "got value %x, expected %#x\n", value, 0);
value = 0x7fffffff;
status = HidP_SetUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, 0, HID_USAGE_GENERIC_Z,
value, preparsed_data, report, caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_SUCCESS, "HidP_SetUsageValue returned %#x\n", status);
value = 0xdeadbeef;
status = HidP_GetScaledUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, 0, HID_USAGE_GENERIC_Z,
@@ -2236,7 +2219,6 @@ static void test_hidp(HANDLE file, int report_id)
value = 0xdeadbeef;
status = HidP_GetUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, 0, HID_USAGE_GENERIC_Z,
&value, preparsed_data, report, caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_SUCCESS, "HidP_GetUsageValue returned %#x\n", status);
todo_wine
ok(value == 0x7fffffff, "got value %x, expected %#x\n", value, 0x7fffffff);
@@ -2244,12 +2226,10 @@ static void test_hidp(HANDLE file, int report_id)
value = 0x3fffffff;
status = HidP_SetUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, 0, HID_USAGE_GENERIC_Z,
value, preparsed_data, report, caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_SUCCESS, "HidP_SetUsageValue returned %#x\n", status);
value = 0xdeadbeef;
status = HidP_GetScaledUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, 0, HID_USAGE_GENERIC_Z,
(LONG *)&value, preparsed_data, report, caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_SUCCESS, "HidP_GetScaledUsageValue returned %#x\n", status);
todo_wine
ok(value == 0x7fffffff, "got value %x, expected %#x\n", value, 0x7fffffff);
@@ -2257,40 +2237,32 @@ static void test_hidp(HANDLE file, int report_id)
value = 0;
status = HidP_SetUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, 0, HID_USAGE_GENERIC_Z,
value, preparsed_data, report, caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_SUCCESS, "HidP_SetUsageValue returned %#x\n", status);
value = 0xdeadbeef;
status = HidP_GetScaledUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, 0, HID_USAGE_GENERIC_Z,
(LONG *)&value, preparsed_data, report, caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_SUCCESS, "HidP_GetScaledUsageValue returned %#x\n", status);
- todo_wine_if(report_id)
ok(value == 0x80000000, "got value %x, expected %#x\n", value, 0x80000000);
value = 0;
status = HidP_SetUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, 0, HID_USAGE_GENERIC_RX,
value, preparsed_data, report, caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_SUCCESS, "HidP_SetUsageValue returned %#x\n", status);
value = 0xdeadbeef;
status = HidP_GetScaledUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, 0, HID_USAGE_GENERIC_RX,
(LONG *)&value, preparsed_data, report, caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_SUCCESS, "HidP_GetScaledUsageValue returned %#x\n", status);
- todo_wine_if(report_id)
ok(value == 0, "got value %x, expected %#x\n", value, 0);
value = 0xfeedcafe;
status = HidP_SetUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, 0, HID_USAGE_GENERIC_RY,
value, preparsed_data, report, caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_SUCCESS, "HidP_SetUsageValue returned %#x\n", status);
value = 0xdeadbeef;
status = HidP_GetScaledUsageValue(HidP_Input, HID_USAGE_PAGE_GENERIC, 0, HID_USAGE_GENERIC_RY,
(LONG *)&value, preparsed_data, report, caps.InputReportByteLength);
todo_wine
ok(status == HIDP_STATUS_BAD_LOG_PHY_VALUES, "HidP_GetScaledUsageValue returned %#x\n", status);
- todo_wine_if(report_id)
ok(value == 0, "got value %x, expected %#x\n", value, 0);
value = HidP_MaxUsageListLength(HidP_Feature + 1, 0, preparsed_data);
@@ -2314,46 +2286,39 @@ static void test_hidp(HANDLE file, int report_id)
value = 1;
status = HidP_SetUsages(HidP_Input, HID_USAGE_PAGE_BUTTON, 0, usages, &value,
preparsed_data, report, caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_USAGE_NOT_FOUND, "HidP_SetUsages returned %#x\n", status);
usages[1] = 2;
usages[2] = 0xff;
value = 3;
status = HidP_SetUsages(HidP_Input, HID_USAGE_PAGE_BUTTON, 0, usages, &value,
preparsed_data, report, caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_USAGE_NOT_FOUND, "HidP_SetUsages returned %#x\n", status);
usages[0] = 4;
usages[1] = 6;
value = 2;
status = HidP_SetUsages(HidP_Input, HID_USAGE_PAGE_BUTTON, 0, usages, &value,
preparsed_data, report, caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_SUCCESS, "HidP_SetUsages returned %#x\n", status);
usages[0] = 4;
usages[1] = 6;
value = 2;
status = HidP_SetUsages(HidP_Input, HID_USAGE_PAGE_LED, 0, usages, &value, preparsed_data,
report, caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_SUCCESS, "HidP_SetUsages returned %#x\n", status);
status = HidP_SetUsageValue(HidP_Input, HID_USAGE_PAGE_LED, 0, 6, 1,
preparsed_data, report, caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_USAGE_NOT_FOUND, "HidP_SetUsageValue returned %#x\n", status);
value = 0xdeadbeef;
status = HidP_GetUsageValue(HidP_Input, HID_USAGE_PAGE_LED, 0, 6, &value,
preparsed_data, report, caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_USAGE_NOT_FOUND, "HidP_SetUsageValue returned %#x\n", status);
ok(value == 0xdeadbeef, "got value %x, expected %#x\n", value, 0xdeadbeef);
value = 1;
status = HidP_GetUsages(HidP_Input, HID_USAGE_PAGE_BUTTON, 0, usages, &value,
preparsed_data, report, caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_BUFFER_TOO_SMALL, "HidP_GetUsages returned %#x\n", status);
todo_wine
ok(value == 2, "got usage count %d, expected %d\n", value, 2);
@@ -2361,22 +2326,16 @@ static void test_hidp(HANDLE file, int report_id)
memset(usages, 0xcd, sizeof(usages));
status = HidP_GetUsages(HidP_Input, HID_USAGE_PAGE_BUTTON, 0, usages, &value,
preparsed_data, report, caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_SUCCESS, "HidP_GetUsages returned %#x\n", status);
- todo_wine_if(report_id)
ok(value == 2, "got usage count %d, expected %d\n", value, 2);
- todo_wine_if(report_id)
ok(usages[0] == 4, "got usages[0] %x, expected %x\n", usages[0], 4);
- todo_wine_if(report_id)
ok(usages[1] == 6, "got usages[1] %x, expected %x\n", usages[1], 6);
value = ARRAY_SIZE(usages);
memset(usages, 0xcd, sizeof(usages));
status = HidP_GetUsages(HidP_Input, HID_USAGE_PAGE_LED, 0, usages, &value, preparsed_data,
report, caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_SUCCESS, "HidP_GetUsages returned %#x\n", status);
- todo_wine_if(report_id)
ok(value == 2, "got usage count %d, expected %d\n", value, 2);
todo_wine
ok(usages[0] == 6, "got usages[0] %x, expected %x\n", usages[0], 6);
@@ -2387,26 +2346,18 @@ static void test_hidp(HANDLE file, int report_id)
memset(usage_and_pages, 0xcd, sizeof(usage_and_pages));
status = HidP_GetUsagesEx(HidP_Input, 0, usage_and_pages, &value, preparsed_data, report,
caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_SUCCESS, "HidP_GetUsagesEx returned %#x\n", status);
- todo_wine_if(report_id)
ok(value == 4, "got usage count %d, expected %d\n", value, 4);
- todo_wine_if(report_id)
ok(usage_and_pages[0].UsagePage == HID_USAGE_PAGE_BUTTON, "got usage_and_pages[0] UsagePage %x, expected %x\n",
usage_and_pages[0].UsagePage, HID_USAGE_PAGE_BUTTON);
- todo_wine_if(report_id)
ok(usage_and_pages[1].UsagePage == HID_USAGE_PAGE_BUTTON, "got usage_and_pages[1] UsagePage %x, expected %x\n",
usage_and_pages[1].UsagePage, HID_USAGE_PAGE_BUTTON);
- todo_wine_if(report_id)
ok(usage_and_pages[2].UsagePage == HID_USAGE_PAGE_LED, "got usage_and_pages[2] UsagePage %x, expected %x\n",
usage_and_pages[2].UsagePage, HID_USAGE_PAGE_LED);
- todo_wine_if(report_id)
ok(usage_and_pages[3].UsagePage == HID_USAGE_PAGE_LED, "got usage_and_pages[3] UsagePage %x, expected %x\n",
usage_and_pages[3].UsagePage, HID_USAGE_PAGE_LED);
- todo_wine_if(report_id)
ok(usage_and_pages[0].Usage == 4, "got usage_and_pages[0] Usage %x, expected %x\n",
usage_and_pages[0].Usage, 4);
- todo_wine_if(report_id)
ok(usage_and_pages[1].Usage == 6, "got usage_and_pages[1] Usage %x, expected %x\n",
usage_and_pages[1].Usage, 6);
todo_wine
@@ -2428,15 +2379,13 @@ static void test_hidp(HANDLE file, int report_id)
value = 1;
status = HidP_GetData(HidP_Input, data, &value, preparsed_data, report, caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_BUFFER_TOO_SMALL, "HidP_GetData returned %#x\n", status);
todo_wine
ok(value == 9, "got data count %d, expected %d\n", value, 9);
memset(data, 0, sizeof(data));
status = HidP_GetData(HidP_Input, data, &value, preparsed_data, report, caps.InputReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_SUCCESS, "HidP_GetData returned %#x\n", status);
- if (status == HIDP_STATUS_SUCCESS) for (i = 0; i < ARRAY_SIZE(expect_data); ++i)
+ for (i = 0; i < ARRAY_SIZE(expect_data); ++i)
{
winetest_push_context("data[%d]", i);
todo_wine_if(i >= 4)
@@ -2448,18 +2397,15 @@ static void test_hidp(HANDLE file, int report_id)
memset(report, 0xcd, sizeof(report));
status = HidP_InitializeReportForID(HidP_Feature, 3, preparsed_data, report, caps.FeatureReportByteLength);
- todo_wine_if(!report_id)
ok(status == HIDP_STATUS_REPORT_DOES_NOT_EXIST, "HidP_InitializeReportForID returned %#x\n", status);
memset(report, 0xcd, sizeof(report));
status = HidP_InitializeReportForID(HidP_Feature, report_id, preparsed_data, report, caps.FeatureReportByteLength);
- todo_wine_if(report_id)
ok(status == HIDP_STATUS_SUCCESS, "HidP_InitializeReportForID returned %#x\n", status);
memset(buffer, 0xcd, sizeof(buffer));
memset(buffer, 0, caps.FeatureReportByteLength);
buffer[0] = report_id;
- todo_wine_if(report_id)
ok(!memcmp(buffer, report, sizeof(buffer)), "unexpected report data\n");
for (i = 0; i < caps.NumberLinkCollectionNodes; ++i)
--
2.31.0
More information about the wine-devel
mailing list