Aric Stewart : hidclass.sys: Some descriptor values should be unsigned.

Alexandre Julliard julliard at winehq.org
Wed Dec 7 15:20:30 CST 2016


Module: wine
Branch: master
Commit: b5646efe398712e0295e85ec1173822d678521b8
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b5646efe398712e0295e85ec1173822d678521b8

Author: Aric Stewart <aric at codeweavers.com>
Date:   Tue Dec  6 13:11:49 2016 -0600

hidclass.sys: Some descriptor values should be unsigned.

Signed-off-by: Aric Stewart <aric at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/hidclass.sys/descriptor.c | 44 +++++++++++++++++++++---------------------
 1 file changed, 22 insertions(+), 22 deletions(-)

diff --git a/dlls/hidclass.sys/descriptor.c b/dlls/hidclass.sys/descriptor.c
index 9805511..c20e51d 100644
--- a/dlls/hidclass.sys/descriptor.c
+++ b/dlls/hidclass.sys/descriptor.c
@@ -383,7 +383,7 @@ static void debug_print_preparsed(WINE_HIDP_PREPARSED_DATA *data)
     }
 }
 
-static int getValue(int bsize, int source)
+static int getValue(int bsize, int source, BOOL allow_negative)
 {
     int mask = 0xff;
     int negative = 0x80;
@@ -401,7 +401,7 @@ static int getValue(int bsize, int source)
         outofrange = (outofrange<<8);
     }
     value = (source&mask);
-    if (value&negative)
+    if (allow_negative && value&negative)
         value = -1 * (outofrange - value);
     return value;
 }
@@ -566,34 +566,34 @@ static int parse_descriptor(BYTE *descriptor, unsigned int index, unsigned int l
                 switch(bTag)
                 {
                     case TAG_GLOBAL_USAGE_PAGE:
-                        caps->UsagePage = getValue(bSize, itemVal);
+                        caps->UsagePage = getValue(bSize, itemVal, FALSE);
                         break;
                     case TAG_GLOBAL_LOGICAL_MINIMUM:
-                        caps->LogicalMin = getValue(bSize, itemVal);
+                        caps->LogicalMin = getValue(bSize, itemVal, TRUE);
                         break;
                     case TAG_GLOBAL_LOGICAL_MAXIMUM:
-                        caps->LogicalMax = getValue(bSize, itemVal);
+                        caps->LogicalMax = getValue(bSize, itemVal, TRUE);
                         break;
                     case TAG_GLOBAL_PHYSICAL_MINIMUM:
-                        caps->PhysicalMin = getValue(bSize, itemVal);
+                        caps->PhysicalMin = getValue(bSize, itemVal, TRUE);
                         break;
                     case TAG_GLOBAL_PHYSICAL_MAXIMUM:
-                        caps->PhysicalMax = getValue(bSize, itemVal);
+                        caps->PhysicalMax = getValue(bSize, itemVal, TRUE);
                         break;
                     case TAG_GLOBAL_UNIT_EXPONENT:
-                        caps->UnitsExp = getValue(bSize, itemVal);
+                        caps->UnitsExp = getValue(bSize, itemVal, TRUE);
                         break;
                     case TAG_GLOBAL_UNIT:
-                        caps->Units = getValue(bSize, itemVal);
+                        caps->Units = getValue(bSize, itemVal, TRUE);
                         break;
                     case TAG_GLOBAL_REPORT_SIZE:
-                        caps->BitSize = getValue(bSize, itemVal);
+                        caps->BitSize = getValue(bSize, itemVal, FALSE);
                         break;
                     case TAG_GLOBAL_REPORT_ID:
-                        caps->ReportID = getValue(bSize, itemVal);
+                        caps->ReportID = getValue(bSize, itemVal, FALSE);
                         break;
                     case TAG_GLOBAL_REPORT_COUNT:
-                        caps->ReportCount = getValue(bSize, itemVal);
+                        caps->ReportCount = getValue(bSize, itemVal, FALSE);
                         break;
                     case TAG_GLOBAL_PUSH:
                     {
@@ -633,46 +633,46 @@ static int parse_descriptor(BYTE *descriptor, unsigned int index, unsigned int l
                             FIXME("More than %i individual usages defined\n",USAGE_MAX);
                         else
                         {
-                            caps->u.NotRange.Usage[caps->usage_count++] = getValue(bSize, itemVal);
+                            caps->u.NotRange.Usage[caps->usage_count++] = getValue(bSize, itemVal, FALSE);
                             caps->IsRange = FALSE;
                         }
                         break;
                     case TAG_LOCAL_USAGE_MINIMUM:
                         caps->usage_count = 1;
-                        caps->u.Range.UsageMin = getValue(bSize, itemVal);
+                        caps->u.Range.UsageMin = getValue(bSize, itemVal, FALSE);
                         caps->IsRange = TRUE;
                         break;
                     case TAG_LOCAL_USAGE_MAXIMUM:
                         caps->usage_count = 1;
-                        caps->u.Range.UsageMax = getValue(bSize, itemVal);
+                        caps->u.Range.UsageMax = getValue(bSize, itemVal, FALSE);
                         caps->IsRange = TRUE;
                         break;
                     case TAG_LOCAL_DESIGNATOR_INDEX:
-                        caps->u.NotRange.DesignatorIndex = getValue(bSize, itemVal);
+                        caps->u.NotRange.DesignatorIndex = getValue(bSize, itemVal, FALSE);
                         caps->IsDesignatorRange = FALSE;
                         break;
                     case TAG_LOCAL_DESIGNATOR_MINIMUM:
-                        caps->u.Range.DesignatorMin = getValue(bSize, itemVal);
+                        caps->u.Range.DesignatorMin = getValue(bSize, itemVal, FALSE);
                         caps->IsDesignatorRange = TRUE;
                         break;
                     case TAG_LOCAL_DESIGNATOR_MAXIMUM:
-                        caps->u.Range.DesignatorMax = getValue(bSize, itemVal);
+                        caps->u.Range.DesignatorMax = getValue(bSize, itemVal, FALSE);
                         caps->IsDesignatorRange = TRUE;
                         break;
                     case TAG_LOCAL_STRING_INDEX:
-                        caps->u.NotRange.StringIndex = getValue(bSize, itemVal);
+                        caps->u.NotRange.StringIndex = getValue(bSize, itemVal, FALSE);
                         caps->IsStringRange = FALSE;
                         break;
                     case TAG_LOCAL_STRING_MINIMUM:
-                        caps->u.Range.StringMin = getValue(bSize, itemVal);
+                        caps->u.Range.StringMin = getValue(bSize, itemVal, FALSE);
                         caps->IsStringRange = TRUE;
                         break;
                     case TAG_LOCAL_STRING_MAXIMUM:
-                        caps->u.Range.StringMax = getValue(bSize, itemVal);
+                        caps->u.Range.StringMax = getValue(bSize, itemVal, FALSE);
                         caps->IsStringRange = TRUE;
                         break;
                     case TAG_LOCAL_DELIMITER:
-                        caps->Delim = getValue(bSize, itemVal);
+                        caps->Delim = getValue(bSize, itemVal, FALSE);
                         break;
                     default:
                         ERR("Unknown (bTag: 0x%x, bType: 0x%x)\n", bTag, bType);




More information about the wine-cvs mailing list