Commit 8eb6180d authored by Rémi Bernon's avatar Rémi Bernon Committed by Alexandre Julliard

hidparse.sys: Replace start_index with HID_VALUE_CAPS_ARRAY_HAS_MORE flag.

parent 3fa5d9eb
...@@ -293,19 +293,24 @@ struct get_usage_params ...@@ -293,19 +293,24 @@ struct get_usage_params
static NTSTATUS get_usage( const struct hid_value_caps *caps, void *user ) static NTSTATUS get_usage( const struct hid_value_caps *caps, void *user )
{ {
const struct hid_value_caps *end = caps;
ULONG index_min, index_max, bit, last;
struct get_usage_params *params = user; struct get_usage_params *params = user;
unsigned char *report_buf; unsigned char *report_buf;
ULONG bit, last;
BYTE index; BYTE index;
report_buf = (unsigned char *)params->report_buf + caps->start_byte; report_buf = (unsigned char *)params->report_buf + caps->start_byte;
if (HID_VALUE_CAPS_IS_ARRAY( caps )) if (HID_VALUE_CAPS_IS_ARRAY( caps ))
{ {
while (end->flags & HID_VALUE_CAPS_ARRAY_HAS_MORE) end++;
index_min = end - caps + 1;
index_max = index_min + caps->usage_max - caps->usage_min;
for (bit = caps->start_bit, last = bit + caps->report_count * caps->bit_size - 1; bit <= last; bit += 8) for (bit = caps->start_bit, last = bit + caps->report_count * caps->bit_size - 1; bit <= last; bit += 8)
{ {
if (!(index = report_buf[bit / 8])) continue; if (!(index = report_buf[bit / 8]) || index < index_min || index > index_max) continue;
if (params->usages < params->usages_end) *params->usages = caps->usage_min + index - caps->start_index; if (params->usages < params->usages_end) *params->usages = caps->usage_min + index - index_min;
params->usages++; params->usages++;
} }
return HIDP_STATUS_SUCCESS; return HIDP_STATUS_SUCCESS;
...@@ -499,18 +504,22 @@ struct set_usage_params ...@@ -499,18 +504,22 @@ struct set_usage_params
static NTSTATUS set_usage( const struct hid_value_caps *caps, void *user ) static NTSTATUS set_usage( const struct hid_value_caps *caps, void *user )
{ {
const struct hid_value_caps *end = caps;
struct set_usage_params *params = user; struct set_usage_params *params = user;
ULONG index_min, bit, last;
unsigned char *report_buf; unsigned char *report_buf;
ULONG bit, last;
report_buf = (unsigned char *)params->report_buf + caps->start_byte; report_buf = (unsigned char *)params->report_buf + caps->start_byte;
if (HID_VALUE_CAPS_IS_ARRAY( caps )) if (HID_VALUE_CAPS_IS_ARRAY( caps ))
{ {
while (end->flags & HID_VALUE_CAPS_ARRAY_HAS_MORE) end++;
index_min = end - caps + 1;
for (bit = caps->start_bit, last = bit + caps->report_count * caps->bit_size - 1; bit <= last; bit += 8) for (bit = caps->start_bit, last = bit + caps->report_count * caps->bit_size - 1; bit <= last; bit += 8)
{ {
if (report_buf[bit / 8]) continue; if (report_buf[bit / 8]) continue;
report_buf[bit / 8] = caps->start_index + params->usage - caps->usage_min; report_buf[bit / 8] = index_min + params->usage - caps->usage_min;
break; break;
} }
...@@ -559,18 +568,22 @@ struct unset_usage_params ...@@ -559,18 +568,22 @@ struct unset_usage_params
static NTSTATUS unset_usage( const struct hid_value_caps *caps, void *user ) static NTSTATUS unset_usage( const struct hid_value_caps *caps, void *user )
{ {
ULONG index, index_min, index_max, bit, last;
const struct hid_value_caps *end = caps;
struct unset_usage_params *params = user; struct unset_usage_params *params = user;
unsigned char *report_buf; unsigned char *report_buf;
ULONG bit, index, last;
report_buf = (unsigned char *)params->report_buf + caps->start_byte; report_buf = (unsigned char *)params->report_buf + caps->start_byte;
if (HID_VALUE_CAPS_IS_ARRAY( caps )) if (HID_VALUE_CAPS_IS_ARRAY( caps ))
{ {
while (end->flags & HID_VALUE_CAPS_ARRAY_HAS_MORE) end++;
index_min = end - caps + 1;
index_max = index_min + caps->usage_max - caps->usage_min;
for (bit = caps->start_bit, last = bit + caps->report_count * caps->bit_size - 1; bit <= last; bit += 8) for (bit = caps->start_bit, last = bit + caps->report_count * caps->bit_size - 1; bit <= last; bit += 8)
{ {
index = caps->start_index + params->usage - caps->usage_min; if (!(index = report_buf[bit / 8]) || index < index_min || index > index_max) continue;
if (report_buf[bit / 8] != index) continue;
report_buf[bit / 8] = 0; report_buf[bit / 8] = 0;
params->found = TRUE; params->found = TRUE;
break; break;
...@@ -758,21 +771,26 @@ struct get_usage_and_page_params ...@@ -758,21 +771,26 @@ struct get_usage_and_page_params
static NTSTATUS get_usage_and_page( const struct hid_value_caps *caps, void *user ) static NTSTATUS get_usage_and_page( const struct hid_value_caps *caps, void *user )
{ {
struct get_usage_and_page_params *params = user; struct get_usage_and_page_params *params = user;
const struct hid_value_caps *end = caps;
ULONG index_min, index_max, bit, last;
unsigned char *report_buf; unsigned char *report_buf;
ULONG bit, last;
BYTE index; BYTE index;
report_buf = (unsigned char *)params->report_buf + caps->start_byte; report_buf = (unsigned char *)params->report_buf + caps->start_byte;
if (HID_VALUE_CAPS_IS_ARRAY( caps )) if (HID_VALUE_CAPS_IS_ARRAY( caps ))
{ {
while (end->flags & HID_VALUE_CAPS_ARRAY_HAS_MORE) end++;
index_min = end - caps + 1;
index_max = index_min + caps->usage_max - caps->usage_min;
for (bit = caps->start_bit, last = bit + caps->report_count * caps->bit_size - 1; bit <= last; bit += 8) for (bit = caps->start_bit, last = bit + caps->report_count * caps->bit_size - 1; bit <= last; bit += 8)
{ {
if (!(index = report_buf[bit / 8])) continue; if (!(index = report_buf[bit / 8]) || index < index_min || index > index_max) continue;
if (params->usages < params->usages_end) if (params->usages < params->usages_end)
{ {
params->usages->UsagePage = caps->usage_page; params->usages->UsagePage = caps->usage_page;
params->usages->Usage = caps->usage_min + index - caps->start_index; params->usages->Usage = caps->usage_min + index - index_min;
} }
params->usages++; params->usages++;
} }
...@@ -848,7 +866,8 @@ static NTSTATUS find_all_data( const struct hid_value_caps *caps, void *user ) ...@@ -848,7 +866,8 @@ static NTSTATUS find_all_data( const struct hid_value_caps *caps, void *user )
{ {
struct find_all_data_params *params = user; struct find_all_data_params *params = user;
HIDP_DATA *data = params->data, *data_end = params->data_end; HIDP_DATA *data = params->data, *data_end = params->data_end;
ULONG bit, last, bit_count = caps->bit_size * caps->report_count; ULONG index_min, index_max, bit, last, bit_count;
const struct hid_value_caps *end = caps;
unsigned char *report_buf; unsigned char *report_buf;
BYTE index; BYTE index;
...@@ -858,12 +877,16 @@ static NTSTATUS find_all_data( const struct hid_value_caps *caps, void *user ) ...@@ -858,12 +877,16 @@ static NTSTATUS find_all_data( const struct hid_value_caps *caps, void *user )
if (HID_VALUE_CAPS_IS_ARRAY( caps )) if (HID_VALUE_CAPS_IS_ARRAY( caps ))
{ {
while (end->flags & HID_VALUE_CAPS_ARRAY_HAS_MORE) end++;
index_min = end - caps + 1;
index_max = index_min + caps->usage_max - caps->usage_min;
for (bit = caps->start_bit, last = bit + caps->report_count * caps->bit_size - 1; bit <= last; bit += 8) for (bit = caps->start_bit, last = bit + caps->report_count * caps->bit_size - 1; bit <= last; bit += 8)
{ {
if (!(index = report_buf[bit / 8])) continue; if (!(index = report_buf[bit / 8]) || index < index_min || index > index_max) continue;
if (data < data_end) if (data < data_end)
{ {
data->DataIndex = caps->data_index_min + index - caps->start_index; data->DataIndex = caps->data_index_min + index - index_min;
data->On = 1; data->On = 1;
} }
data++; data++;
...@@ -888,6 +911,7 @@ static NTSTATUS find_all_data( const struct hid_value_caps *caps, void *user ) ...@@ -888,6 +911,7 @@ static NTSTATUS find_all_data( const struct hid_value_caps *caps, void *user )
{ {
data->DataIndex = caps->data_index_min; data->DataIndex = caps->data_index_min;
data->RawValue = 0; data->RawValue = 0;
bit_count = caps->bit_size * caps->report_count;
if ((bit_count + 7) / 8 > sizeof(data->RawValue)) return HIDP_STATUS_BUFFER_TOO_SMALL; if ((bit_count + 7) / 8 > sizeof(data->RawValue)) return HIDP_STATUS_BUFFER_TOO_SMALL;
copy_bits( (void *)&data->RawValue, report_buf, bit_count, -caps->start_bit ); copy_bits( (void *)&data->RawValue, report_buf, bit_count, -caps->start_bit );
} }
......
...@@ -354,13 +354,14 @@ static BOOL parse_new_value_caps( struct hid_parser_state *state, HIDP_REPORT_TY ...@@ -354,13 +354,14 @@ static BOOL parse_new_value_caps( struct hid_parser_state *state, HIDP_REPORT_TY
} }
value = state->values[type] + *value_idx; value = state->values[type] + *value_idx;
state->items.start_index = usages_size;
if (!(is_array = HID_VALUE_CAPS_IS_ARRAY( &state->items ))) state->items.report_count -= usages_size - 1; if (!(is_array = HID_VALUE_CAPS_IS_ARRAY( &state->items ))) state->items.report_count -= usages_size - 1;
else start_bit -= state->items.report_count * state->items.bit_size; else start_bit -= state->items.report_count * state->items.bit_size;
while (usages_size--) while (usages_size--)
{ {
if (!is_array) start_bit -= state->items.report_count * state->items.bit_size; if (!is_array) start_bit -= state->items.report_count * state->items.bit_size;
else if (usages_size) state->items.flags |= HID_VALUE_CAPS_ARRAY_HAS_MORE;
else state->items.flags &= ~HID_VALUE_CAPS_ARRAY_HAS_MORE;
state->items.start_byte = start_bit / 8; state->items.start_byte = start_bit / 8;
state->items.start_bit = start_bit % 8; state->items.start_bit = start_bit % 8;
state->items.usage_page = state->usages_page[usages_size]; state->items.usage_page = state->usages_page[usages_size];
...@@ -372,7 +373,6 @@ static BOOL parse_new_value_caps( struct hid_parser_state *state, HIDP_REPORT_TY ...@@ -372,7 +373,6 @@ static BOOL parse_new_value_caps( struct hid_parser_state *state, HIDP_REPORT_TY
*value++ = state->items; *value++ = state->items;
*value_idx += 1; *value_idx += 1;
if (!is_array) state->items.report_count = 1; if (!is_array) state->items.report_count = 1;
else state->items.start_index -= 1;
} }
state->items.usage_page = usage_page; state->items.usage_page = usage_page;
......
...@@ -52,7 +52,6 @@ struct hid_value_caps ...@@ -52,7 +52,6 @@ struct hid_value_caps
USHORT report_count; USHORT report_count;
UCHAR start_bit; UCHAR start_bit;
USHORT start_byte; USHORT start_byte;
ULONG start_index;
LONG logical_min; LONG logical_min;
LONG logical_max; LONG logical_max;
LONG physical_min; LONG physical_min;
...@@ -61,6 +60,8 @@ struct hid_value_caps ...@@ -61,6 +60,8 @@ struct hid_value_caps
ULONG units_exp; ULONG units_exp;
}; };
/* named array continues on next caps */
#define HID_VALUE_CAPS_ARRAY_HAS_MORE 0x01
#define HID_VALUE_CAPS_IS_RANGE 0x10 #define HID_VALUE_CAPS_IS_RANGE 0x10
#define HID_VALUE_CAPS_IS_STRING_RANGE 0x40 #define HID_VALUE_CAPS_IS_STRING_RANGE 0x40
#define HID_VALUE_CAPS_IS_DESIGNATOR_RANGE 0x80 #define HID_VALUE_CAPS_IS_DESIGNATOR_RANGE 0x80
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment