Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
36b2f6be
Commit
36b2f6be
authored
Jan 23, 2023
by
Rémi Bernon
Committed by
Alexandre Julliard
Jan 25, 2023
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
hidp: Allow match all usages on specific functions only.
parent
4466e2c2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
22 additions
and
14 deletions
+22
-14
hid.c
dlls/dinput/tests/hid.c
+5
-0
hidp.c
dlls/hid/hidp.c
+17
-14
No files found.
dlls/dinput/tests/hid.c
View file @
36b2f6be
...
@@ -1841,6 +1841,11 @@ static void test_hidp( HANDLE file, HANDLE async_file, int report_id, BOOL polle
...
@@ -1841,6 +1841,11 @@ static void test_hidp( HANDLE file, HANDLE async_file, int report_id, BOOL polle
ok
(
buffer
[
0
]
==
(
char
)
0xcd
,
"got report value %#x
\n
"
,
buffer
[
0
]
);
ok
(
buffer
[
0
]
==
(
char
)
0xcd
,
"got report value %#x
\n
"
,
buffer
[
0
]
);
ok
(
buffer
[
1
]
==
(
char
)
0xcd
,
"got report value %#x
\n
"
,
buffer
[
1
]
);
ok
(
buffer
[
1
]
==
(
char
)
0xcd
,
"got report value %#x
\n
"
,
buffer
[
1
]
);
status
=
HidP_GetUsageValue
(
HidP_Input
,
HID_USAGE_PAGE_GENERIC
,
0
,
0
,
&
value
,
preparsed_data
,
report
,
caps
.
InputReportByteLength
);
ok
(
status
==
HIDP_STATUS_USAGE_NOT_FOUND
,
"HidP_GetUsageValue returned %#lx
\n
"
,
status
);
status
=
HidP_GetUsageValue
(
HidP_Input
,
0
,
0
,
HID_USAGE_GENERIC_X
,
&
value
,
preparsed_data
,
report
,
caps
.
InputReportByteLength
);
ok
(
status
==
HIDP_STATUS_USAGE_NOT_FOUND
,
"HidP_GetUsageValue returned %#lx
\n
"
,
status
);
report
[
16
]
=
0xff
;
report
[
16
]
=
0xff
;
report
[
17
]
=
0xff
;
report
[
17
]
=
0xff
;
status
=
HidP_GetUsageValue
(
HidP_Input
,
HID_USAGE_PAGE_GENERIC
,
0
,
HID_USAGE_GENERIC_HATSWITCH
,
status
=
HidP_GetUsageValue
(
HidP_Input
,
HID_USAGE_PAGE_GENERIC
,
0
,
HID_USAGE_GENERIC_HATSWITCH
,
...
...
dlls/hid/hidp.c
View file @
36b2f6be
...
@@ -68,14 +68,17 @@ static NTSTATUS get_value_caps_range( struct hid_preparsed_data *preparsed, HIDP
...
@@ -68,14 +68,17 @@ static NTSTATUS get_value_caps_range( struct hid_preparsed_data *preparsed, HIDP
return
HIDP_STATUS_SUCCESS
;
return
HIDP_STATUS_SUCCESS
;
}
}
#define USAGE_MASK 0xffff
#define USAGE_ANY 0x10000
struct
caps_filter
struct
caps_filter
{
{
BOOLEAN
buttons
;
BOOLEAN
buttons
;
BOOLEAN
values
;
BOOLEAN
values
;
BOOLEAN
array
;
BOOLEAN
array
;
USAGE
usage_page
;
DWORD
usage_page
;
USHORT
collection
;
USHORT
collection
;
USAGE
usage
;
DWORD
usage
;
UCHAR
report_id
;
UCHAR
report_id
;
};
};
...
@@ -84,10 +87,10 @@ static BOOL match_value_caps( const struct hid_value_caps *caps, const struct ca
...
@@ -84,10 +87,10 @@ static BOOL match_value_caps( const struct hid_value_caps *caps, const struct ca
if
(
!
caps
->
usage_min
&&
!
caps
->
usage_max
)
return
FALSE
;
if
(
!
caps
->
usage_min
&&
!
caps
->
usage_max
)
return
FALSE
;
if
(
filter
->
buttons
&&
!
(
caps
->
flags
&
HID_VALUE_CAPS_IS_BUTTON
))
return
FALSE
;
if
(
filter
->
buttons
&&
!
(
caps
->
flags
&
HID_VALUE_CAPS_IS_BUTTON
))
return
FALSE
;
if
(
filter
->
values
&&
(
caps
->
flags
&
HID_VALUE_CAPS_IS_BUTTON
))
return
FALSE
;
if
(
filter
->
values
&&
(
caps
->
flags
&
HID_VALUE_CAPS_IS_BUTTON
))
return
FALSE
;
if
(
filter
->
usage_page
&&
filter
->
usage_page
!=
caps
->
usage_page
)
return
FALSE
;
if
(
filter
->
usage_page
!=
USAGE_ANY
&&
(
filter
->
usage_page
&
USAGE_MASK
)
!=
caps
->
usage_page
)
return
FALSE
;
if
(
filter
->
collection
&&
filter
->
collection
!=
caps
->
link_collection
)
return
FALSE
;
if
(
filter
->
collection
&&
filter
->
collection
!=
caps
->
link_collection
)
return
FALSE
;
if
(
!
filter
->
usage
)
return
TRUE
;
if
(
filter
->
usage
==
USAGE_ANY
)
return
TRUE
;
return
caps
->
usage_min
<=
filter
->
usage
&&
caps
->
usage_max
>=
filter
->
usage
;
return
caps
->
usage_min
<=
(
filter
->
usage
&
USAGE_MASK
)
&&
caps
->
usage_max
>=
(
filter
->
usage
&
USAGE_MASK
)
;
}
}
typedef
NTSTATUS
(
*
enum_value_caps_callback
)(
const
struct
hid_value_caps
*
caps
,
void
*
user
);
typedef
NTSTATUS
(
*
enum_value_caps_callback
)(
const
struct
hid_value_caps
*
caps
,
void
*
user
);
...
@@ -384,7 +387,7 @@ NTSTATUS WINAPI HidP_GetUsages( HIDP_REPORT_TYPE report_type, USAGE usage_page,
...
@@ -384,7 +387,7 @@ NTSTATUS WINAPI HidP_GetUsages( HIDP_REPORT_TYPE report_type, USAGE usage_page,
{
{
struct
hid_preparsed_data
*
preparsed
=
(
struct
hid_preparsed_data
*
)
preparsed_data
;
struct
hid_preparsed_data
*
preparsed
=
(
struct
hid_preparsed_data
*
)
preparsed_data
;
struct
get_usage_params
params
=
{.
usages
=
usages
,
.
usages_end
=
usages
+
*
usages_len
,
.
report_buf
=
report_buf
};
struct
get_usage_params
params
=
{.
usages
=
usages
,
.
usages_end
=
usages
+
*
usages_len
,
.
report_buf
=
report_buf
};
struct
caps_filter
filter
=
{.
buttons
=
TRUE
,
.
usage_page
=
usage_page
,
.
collection
=
collection
};
struct
caps_filter
filter
=
{.
buttons
=
TRUE
,
.
usage_page
=
usage_page
,
.
collection
=
collection
,
.
usage
=
USAGE_ANY
};
NTSTATUS
status
;
NTSTATUS
status
;
USHORT
limit
=
-
1
;
USHORT
limit
=
-
1
;
...
@@ -441,7 +444,7 @@ static NTSTATUS get_usage_list_length( const struct hid_value_caps *caps, void *
...
@@ -441,7 +444,7 @@ static NTSTATUS get_usage_list_length( const struct hid_value_caps *caps, void *
ULONG
WINAPI
HidP_MaxUsageListLength
(
HIDP_REPORT_TYPE
report_type
,
USAGE
usage_page
,
PHIDP_PREPARSED_DATA
preparsed_data
)
ULONG
WINAPI
HidP_MaxUsageListLength
(
HIDP_REPORT_TYPE
report_type
,
USAGE
usage_page
,
PHIDP_PREPARSED_DATA
preparsed_data
)
{
{
struct
hid_preparsed_data
*
preparsed
=
(
struct
hid_preparsed_data
*
)
preparsed_data
;
struct
hid_preparsed_data
*
preparsed
=
(
struct
hid_preparsed_data
*
)
preparsed_data
;
struct
caps_filter
filter
=
{.
buttons
=
TRUE
,
.
usage_page
=
usage_page
};
struct
caps_filter
filter
=
{.
buttons
=
TRUE
,
.
usage_page
=
usage_page
|
USAGE_ANY
,
.
usage
=
USAGE_ANY
};
USHORT
limit
=
-
1
;
USHORT
limit
=
-
1
;
ULONG
count
=
0
;
ULONG
count
=
0
;
...
@@ -590,7 +593,7 @@ NTSTATUS WINAPI HidP_SetUsages( HIDP_REPORT_TYPE report_type, USAGE usage_page,
...
@@ -590,7 +593,7 @@ NTSTATUS WINAPI HidP_SetUsages( HIDP_REPORT_TYPE report_type, USAGE usage_page,
{
{
struct
hid_preparsed_data
*
preparsed
=
(
struct
hid_preparsed_data
*
)
preparsed_data
;
struct
hid_preparsed_data
*
preparsed
=
(
struct
hid_preparsed_data
*
)
preparsed_data
;
struct
set_usage_params
params
=
{.
report_buf
=
report_buf
};
struct
set_usage_params
params
=
{.
report_buf
=
report_buf
};
struct
caps_filter
filter
=
{.
buttons
=
TRUE
,
.
usage_page
=
usage_page
,
.
collection
=
collection
};
struct
caps_filter
filter
=
{.
buttons
=
TRUE
,
.
usage_page
=
usage_page
,
.
collection
=
collection
,
.
usage
=
USAGE_ANY
};
NTSTATUS
status
;
NTSTATUS
status
;
USHORT
limit
=
1
;
USHORT
limit
=
1
;
ULONG
i
,
count
=
*
usage_count
;
ULONG
i
,
count
=
*
usage_count
;
...
@@ -656,7 +659,7 @@ NTSTATUS WINAPI HidP_UnsetUsages( HIDP_REPORT_TYPE report_type, USAGE usage_page
...
@@ -656,7 +659,7 @@ NTSTATUS WINAPI HidP_UnsetUsages( HIDP_REPORT_TYPE report_type, USAGE usage_page
{
{
struct
hid_preparsed_data
*
preparsed
=
(
struct
hid_preparsed_data
*
)
preparsed_data
;
struct
hid_preparsed_data
*
preparsed
=
(
struct
hid_preparsed_data
*
)
preparsed_data
;
struct
unset_usage_params
params
=
{.
report_buf
=
report_buf
,
.
found
=
FALSE
};
struct
unset_usage_params
params
=
{.
report_buf
=
report_buf
,
.
found
=
FALSE
};
struct
caps_filter
filter
=
{.
buttons
=
TRUE
,
.
usage_page
=
usage_page
,
.
collection
=
collection
};
struct
caps_filter
filter
=
{.
buttons
=
TRUE
,
.
usage_page
=
usage_page
,
.
collection
=
collection
,
.
usage
=
USAGE_ANY
};
NTSTATUS
status
;
NTSTATUS
status
;
USHORT
limit
=
1
;
USHORT
limit
=
1
;
ULONG
i
,
count
=
*
usage_count
;
ULONG
i
,
count
=
*
usage_count
;
...
@@ -739,7 +742,7 @@ NTSTATUS WINAPI HidP_GetSpecificButtonCaps( HIDP_REPORT_TYPE report_type, USAGE
...
@@ -739,7 +742,7 @@ NTSTATUS WINAPI HidP_GetSpecificButtonCaps( HIDP_REPORT_TYPE report_type, USAGE
PHIDP_PREPARSED_DATA
preparsed_data
)
PHIDP_PREPARSED_DATA
preparsed_data
)
{
{
struct
hid_preparsed_data
*
preparsed
=
(
struct
hid_preparsed_data
*
)
preparsed_data
;
struct
hid_preparsed_data
*
preparsed
=
(
struct
hid_preparsed_data
*
)
preparsed_data
;
const
struct
caps_filter
filter
=
{.
buttons
=
TRUE
,
.
usage_page
=
usage_page
,
.
collection
=
collection
,
.
usage
=
usage
};
const
struct
caps_filter
filter
=
{.
buttons
=
TRUE
,
.
usage_page
=
usage_page
|
USAGE_ANY
,
.
collection
=
collection
,
.
usage
=
usage
|
USAGE_ANY
};
TRACE
(
"report_type %d, usage_page %u, collection %u, usage %u, caps %p, caps_count %p, preparsed_data %p.
\n
"
,
TRACE
(
"report_type %d, usage_page %u, collection %u, usage %u, caps %p, caps_count %p, preparsed_data %p.
\n
"
,
report_type
,
usage_page
,
collection
,
usage
,
caps
,
caps_count
,
preparsed_data
);
report_type
,
usage_page
,
collection
,
usage
,
caps
,
caps_count
,
preparsed_data
);
...
@@ -806,7 +809,7 @@ NTSTATUS WINAPI HidP_GetSpecificValueCaps( HIDP_REPORT_TYPE report_type, USAGE u
...
@@ -806,7 +809,7 @@ NTSTATUS WINAPI HidP_GetSpecificValueCaps( HIDP_REPORT_TYPE report_type, USAGE u
PHIDP_PREPARSED_DATA
preparsed_data
)
PHIDP_PREPARSED_DATA
preparsed_data
)
{
{
struct
hid_preparsed_data
*
preparsed
=
(
struct
hid_preparsed_data
*
)
preparsed_data
;
struct
hid_preparsed_data
*
preparsed
=
(
struct
hid_preparsed_data
*
)
preparsed_data
;
const
struct
caps_filter
filter
=
{.
values
=
TRUE
,
.
usage_page
=
usage_page
,
.
collection
=
collection
,
.
usage
=
usage
};
const
struct
caps_filter
filter
=
{.
values
=
TRUE
,
.
usage_page
=
usage_page
|
USAGE_ANY
,
.
collection
=
collection
,
.
usage
=
usage
|
USAGE_ANY
};
TRACE
(
"report_type %d, usage_page %u, collection %u, usage %u, caps %p, caps_count %p, preparsed_data %p.
\n
"
,
TRACE
(
"report_type %d, usage_page %u, collection %u, usage %u, caps %p, caps_count %p, preparsed_data %p.
\n
"
,
report_type
,
usage_page
,
collection
,
usage
,
caps
,
caps_count
,
preparsed_data
);
report_type
,
usage_page
,
collection
,
usage
,
caps
,
caps_count
,
preparsed_data
);
...
@@ -869,7 +872,7 @@ NTSTATUS WINAPI HidP_GetUsagesEx( HIDP_REPORT_TYPE report_type, USHORT collectio
...
@@ -869,7 +872,7 @@ NTSTATUS WINAPI HidP_GetUsagesEx( HIDP_REPORT_TYPE report_type, USHORT collectio
{
{
struct
get_usage_and_page_params
params
=
{.
usages
=
usages
,
.
usages_end
=
usages
+
*
usages_len
,
.
report_buf
=
report_buf
};
struct
get_usage_and_page_params
params
=
{.
usages
=
usages
,
.
usages_end
=
usages
+
*
usages_len
,
.
report_buf
=
report_buf
};
struct
hid_preparsed_data
*
preparsed
=
(
struct
hid_preparsed_data
*
)
preparsed_data
;
struct
hid_preparsed_data
*
preparsed
=
(
struct
hid_preparsed_data
*
)
preparsed_data
;
struct
caps_filter
filter
=
{.
buttons
=
TRUE
,
.
collection
=
collection
};
struct
caps_filter
filter
=
{.
buttons
=
TRUE
,
.
usage_page
=
USAGE_ANY
,
.
collection
=
collection
,
.
usage
=
USAGE_ANY
};
NTSTATUS
status
;
NTSTATUS
status
;
USHORT
limit
=
-
1
;
USHORT
limit
=
-
1
;
...
@@ -899,7 +902,7 @@ static NTSTATUS count_data( const struct hid_value_caps *caps, void *user )
...
@@ -899,7 +902,7 @@ static NTSTATUS count_data( const struct hid_value_caps *caps, void *user )
ULONG
WINAPI
HidP_MaxDataListLength
(
HIDP_REPORT_TYPE
report_type
,
PHIDP_PREPARSED_DATA
preparsed_data
)
ULONG
WINAPI
HidP_MaxDataListLength
(
HIDP_REPORT_TYPE
report_type
,
PHIDP_PREPARSED_DATA
preparsed_data
)
{
{
struct
hid_preparsed_data
*
preparsed
=
(
struct
hid_preparsed_data
*
)
preparsed_data
;
struct
hid_preparsed_data
*
preparsed
=
(
struct
hid_preparsed_data
*
)
preparsed_data
;
struct
caps_filter
filter
=
{};
struct
caps_filter
filter
=
{
.
usage_page
=
USAGE_ANY
,
.
usage
=
USAGE_ANY
};
USHORT
limit
=
-
1
;
USHORT
limit
=
-
1
;
ULONG
count
=
0
;
ULONG
count
=
0
;
...
@@ -981,7 +984,7 @@ NTSTATUS WINAPI HidP_GetData( HIDP_REPORT_TYPE report_type, HIDP_DATA *data, ULO
...
@@ -981,7 +984,7 @@ NTSTATUS WINAPI HidP_GetData( HIDP_REPORT_TYPE report_type, HIDP_DATA *data, ULO
{
{
struct
find_all_data_params
params
=
{.
data
=
data
,
.
data_end
=
data
+
*
data_len
,
.
report_buf
=
report_buf
};
struct
find_all_data_params
params
=
{.
data
=
data
,
.
data_end
=
data
+
*
data_len
,
.
report_buf
=
report_buf
};
struct
hid_preparsed_data
*
preparsed
=
(
struct
hid_preparsed_data
*
)
preparsed_data
;
struct
hid_preparsed_data
*
preparsed
=
(
struct
hid_preparsed_data
*
)
preparsed_data
;
struct
caps_filter
filter
=
{};
struct
caps_filter
filter
=
{
.
usage_page
=
USAGE_ANY
,
.
usage
=
USAGE_ANY
};
NTSTATUS
status
;
NTSTATUS
status
;
USHORT
limit
=
-
1
;
USHORT
limit
=
-
1
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment