Win32Hid.cs
author StephaneLenclud
Sun, 15 Feb 2015 12:10:40 +0100
changeset 57 878e0b271c11
parent 56 cace0afae0fa
child 58 7ef0f9dc229c
permissions -rw-r--r--
Win32Hid: improved button caps structure.
     1 using System;
     2 using System.Runtime.InteropServices;
     3 using Microsoft.Win32.SafeHandles;
     4 using System.Text;
     5 
     6 namespace Win32
     7 {
     8 
     9     static partial class Function
    10     {
    11         [DllImport("hid.dll", CharSet = CharSet.Unicode)]
    12         public static extern HidStatus HidP_GetUsagesEx(HIDP_REPORT_TYPE ReportType, ushort LinkCollection, [Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] USAGE_AND_PAGE[] ButtonList, ref uint UsageLength, IntPtr PreparsedData, [MarshalAs(UnmanagedType.LPArray)] byte[] Report, uint ReportLength);
    13 
    14         [DllImport("hid.dll", CharSet = CharSet.Auto, SetLastError = true)]
    15         public static extern Boolean HidD_GetManufacturerString(SafeFileHandle HidDeviceObject, StringBuilder Buffer, Int32 BufferLength);
    16 
    17         [DllImport("hid.dll", CharSet = CharSet.Auto, SetLastError = true)]
    18         public static extern Boolean HidD_GetProductString(SafeFileHandle HidDeviceObject, StringBuilder Buffer, Int32 BufferLength);
    19 
    20         [DllImport("hid.dll", CharSet = CharSet.Auto, SetLastError = true)]
    21         public static extern Boolean HidD_GetAttributes(SafeFileHandle HidDeviceObject, ref HIDD_ATTRIBUTES Attributes);
    22 
    23         /// Return Type: NTSTATUS->LONG->int
    24         ///PreparsedData: PHIDP_PREPARSED_DATA->_HIDP_PREPARSED_DATA*
    25         ///Capabilities: PHIDP_CAPS->_HIDP_CAPS*
    26         [DllImportAttribute("hid.dll", EntryPoint = "HidP_GetCaps", CallingConvention = CallingConvention.StdCall)]
    27         public static extern HidStatus HidP_GetCaps(System.IntPtr PreparsedData, ref HIDP_CAPS Capabilities);
    28 
    29         /// Return Type: NTSTATUS->LONG->int
    30         ///ReportType: HIDP_REPORT_TYPE->_HIDP_REPORT_TYPE
    31         ///ButtonCaps: PHIDP_BUTTON_CAPS->_HIDP_BUTTON_CAPS*
    32         ///ButtonCapsLength: PUSHORT->USHORT*
    33         ///PreparsedData: PHIDP_PREPARSED_DATA->_HIDP_PREPARSED_DATA*
    34         [System.Runtime.InteropServices.DllImportAttribute("hid.dll", EntryPoint = "HidP_GetButtonCaps", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
    35         public static extern HidStatus HidP_GetButtonCaps(HIDP_REPORT_TYPE ReportType, [Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] HIDP_BUTTON_CAPS[] ButtonCaps, ref ushort ButtonCapsLength, System.IntPtr PreparsedData);
    36 
    37         /// Return Type: NTSTATUS->LONG->int
    38         ///ReportType: HIDP_REPORT_TYPE->_HIDP_REPORT_TYPE
    39         ///ValueCaps: PHIDP_VALUE_CAPS->_HIDP_VALUE_CAPS*
    40         ///ValueCapsLength: PUSHORT->USHORT*
    41         ///PreparsedData: PHIDP_PREPARSED_DATA->_HIDP_PREPARSED_DATA*
    42         [System.Runtime.InteropServices.DllImportAttribute("hid.dll", EntryPoint = "HidP_GetValueCaps", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
    43         public static extern HidStatus HidP_GetValueCaps(HIDP_REPORT_TYPE ReportType, ref HIDP_VALUE_CAPS[] ValueCaps, ref ushort ValueCapsLength, System.IntPtr PreparsedData);
    44 
    45     }
    46 
    47 
    48     static partial class Macro
    49     {
    50 
    51 
    52     }
    53 
    54 
    55     static partial class Const
    56     {
    57 
    58 
    59     }
    60 
    61 
    62     public enum HIDP_REPORT_TYPE : ushort
    63     {
    64         HidP_Input = 0,
    65         HidP_Output,
    66         HidP_Feature
    67     }
    68 
    69 
    70     public enum HidStatus : uint
    71     {
    72         HIDP_STATUS_SUCCESS = 0x110000,
    73         HIDP_STATUS_NULL = 0x80110001,
    74         HIDP_STATUS_INVALID_PREPARSED_DATA = 0xc0110001,
    75         HIDP_STATUS_INVALID_REPORT_TYPE = 0xc0110002,
    76         HIDP_STATUS_INVALID_REPORT_LENGTH = 0xc0110003,
    77         HIDP_STATUS_USAGE_NOT_FOUND = 0xc0110004,
    78         HIDP_STATUS_VALUE_OUT_OF_RANGE = 0xc0110005,
    79         HIDP_STATUS_BAD_LOG_PHY_VALUES = 0xc0110006,
    80         HIDP_STATUS_BUFFER_TOO_SMALL = 0xc0110007,
    81         HIDP_STATUS_INTERNAL_ERROR = 0xc0110008,
    82         HIDP_STATUS_I8042_TRANS_UNKNOWN = 0xc0110009,
    83         HIDP_STATUS_INCOMPATIBLE_REPORT_ID = 0xc011000a,
    84         HIDP_STATUS_NOT_VALUE_ARRAY = 0xc011000b,
    85         HIDP_STATUS_IS_VALUE_ARRAY = 0xc011000c,
    86         HIDP_STATUS_DATA_INDEX_NOT_FOUND = 0xc011000d,
    87         HIDP_STATUS_DATA_INDEX_OUT_OF_RANGE = 0xc011000e,
    88         HIDP_STATUS_BUTTON_NOT_PRESSED = 0xc011000f,
    89         HIDP_STATUS_REPORT_DOES_NOT_EXIST = 0xc0110010,
    90         HIDP_STATUS_NOT_IMPLEMENTED = 0xc0110020,
    91         HIDP_STATUS_I8242_TRANS_UNKNOWN = 0xc0110009
    92     }
    93 
    94 
    95     [StructLayout(LayoutKind.Sequential)]
    96     public struct USAGE_AND_PAGE
    97     {
    98         public ushort Usage;
    99         public ushort UsagePage;
   100     };
   101 
   102     [StructLayout(LayoutKind.Sequential)]
   103     public struct HIDD_ATTRIBUTES
   104     {
   105         public uint Size;
   106         public ushort VendorID;
   107         public ushort ProductID;
   108         public ushort VersionNumber;
   109     }
   110 
   111 
   112     [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
   113     public struct HIDP_CAPS
   114     {
   115 
   116         /// USAGE->USHORT->unsigned short
   117         public ushort Usage;
   118 
   119         /// USAGE->USHORT->unsigned short
   120         public ushort UsagePage;
   121 
   122         /// USHORT->unsigned short
   123         public ushort InputReportByteLength;
   124 
   125         /// USHORT->unsigned short
   126         public ushort OutputReportByteLength;
   127 
   128         /// USHORT->unsigned short
   129         public ushort FeatureReportByteLength;
   130 
   131         /// USHORT[17]
   132         [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst = 17, ArraySubType = System.Runtime.InteropServices.UnmanagedType.U2)]
   133         public ushort[] Reserved;
   134 
   135         /// USHORT->unsigned short
   136         public ushort NumberLinkCollectionNodes;
   137 
   138         /// USHORT->unsigned short
   139         public ushort NumberInputButtonCaps;
   140 
   141         /// USHORT->unsigned short
   142         public ushort NumberInputValueCaps;
   143 
   144         /// USHORT->unsigned short
   145         public ushort NumberInputDataIndices;
   146 
   147         /// USHORT->unsigned short
   148         public ushort NumberOutputButtonCaps;
   149 
   150         /// USHORT->unsigned short
   151         public ushort NumberOutputValueCaps;
   152 
   153         /// USHORT->unsigned short
   154         public ushort NumberOutputDataIndices;
   155 
   156         /// USHORT->unsigned short
   157         public ushort NumberFeatureButtonCaps;
   158 
   159         /// USHORT->unsigned short
   160         public ushort NumberFeatureValueCaps;
   161 
   162         /// USHORT->unsigned short
   163         public ushort NumberFeatureDataIndices;
   164     }
   165 
   166     /// <summary>
   167     /// Type created in place of an anonymous struct
   168     /// </summary>
   169     [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
   170     public struct HIDP_BUTTON_CAPS_RANGE
   171     {
   172 
   173         /// USAGE->USHORT->unsigned short
   174         public ushort UsageMin;
   175 
   176         /// USAGE->USHORT->unsigned short
   177         public ushort UsageMax;
   178 
   179         /// USHORT->unsigned short
   180         public ushort StringMin;
   181 
   182         /// USHORT->unsigned short
   183         public ushort StringMax;
   184 
   185         /// USHORT->unsigned short
   186         public ushort DesignatorMin;
   187 
   188         /// USHORT->unsigned short
   189         public ushort DesignatorMax;
   190 
   191         /// USHORT->unsigned short
   192         public ushort DataIndexMin;
   193 
   194         /// USHORT->unsigned short
   195         public ushort DataIndexMax;
   196     }
   197 
   198     /// <summary>
   199     /// Type created in place of an anonymous struct
   200     /// </summary>
   201     [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
   202     public struct HIDP_BUTTON_CAPS_NOT_RANGE
   203     {
   204 
   205         /// USAGE->USHORT->unsigned short
   206         public ushort Usage;
   207 
   208         /// USAGE->USHORT->unsigned short
   209         public ushort Reserved1;
   210 
   211         /// USHORT->unsigned short
   212         public ushort StringIndex;
   213 
   214         /// USHORT->unsigned short
   215         public ushort Reserved2;
   216 
   217         /// USHORT->unsigned short
   218         public ushort DesignatorIndex;
   219 
   220         /// USHORT->unsigned short
   221         public ushort Reserved3;
   222 
   223         /// USHORT->unsigned short
   224         public ushort DataIndex;
   225 
   226         /// USHORT->unsigned short
   227         public ushort Reserved4;
   228     }
   229 
   230     /// <summary>
   231     /// 
   232     /// </summary>
   233     [StructLayoutAttribute(LayoutKind.Explicit, Pack = 1)]
   234     public struct HIDP_BUTTON_CAPS
   235     {
   236         /// USAGE->USHORT->unsigned short
   237         [FieldOffset(0)]
   238         public ushort UsagePage;
   239 
   240         /// UCHAR->unsigned char
   241         [FieldOffset(2)]
   242         public byte ReportID;
   243 
   244         /// BOOLEAN->BYTE->unsigned char
   245         [FieldOffset(3)]
   246         public bool IsAlias;
   247 
   248         /// USHORT->unsigned short
   249         [FieldOffset(4)]
   250         public ushort BitField;
   251 
   252         /// USHORT->unsigned short
   253         [FieldOffset(6)]
   254         public ushort LinkCollection;
   255 
   256         /// USAGE->USHORT->unsigned short
   257         [FieldOffset(8)]
   258         public ushort LinkUsage;
   259 
   260         /// USAGE->USHORT->unsigned short
   261         [FieldOffset(10)]
   262         public ushort LinkUsagePage;
   263 
   264         /// BOOLEAN->BYTE->unsigned char
   265         [FieldOffset(12)]
   266         public bool IsRange;
   267 
   268         /// BOOLEAN->BYTE->unsigned char
   269         [FieldOffset(13)]
   270         public bool IsStringRange;
   271 
   272         /// BOOLEAN->BYTE->unsigned char
   273         [FieldOffset(14)]
   274         public bool IsDesignatorRange;
   275 
   276         /// BOOLEAN->BYTE->unsigned char
   277         [FieldOffset(15)]
   278         public bool IsAbsolute;
   279 
   280         /// ULONG[10]
   281         [FieldOffset(16)]
   282         [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 10, ArraySubType = UnmanagedType.U4)]
   283         public uint[] Reserved;
   284 
   285         /// Union Range/NotRange
   286         [FieldOffset(56)]
   287         HIDP_BUTTON_CAPS_RANGE Range;
   288 
   289         [FieldOffset(56)]
   290         HIDP_BUTTON_CAPS_NOT_RANGE NotRange;       
   291     }
   292 
   293     /// <summary>
   294     /// Type created in place of an anonymous struct
   295     /// </summary>
   296     [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
   297     public struct HIDP_VALUE_CAPS_RANGE
   298     {
   299 
   300         /// USAGE->USHORT->unsigned short
   301         public ushort UsageMin;
   302 
   303         /// USAGE->USHORT->unsigned short
   304         public ushort UsageMax;
   305 
   306         /// USHORT->unsigned short
   307         public ushort StringMin;
   308 
   309         /// USHORT->unsigned short
   310         public ushort StringMax;
   311 
   312         /// USHORT->unsigned short
   313         public ushort DesignatorMin;
   314 
   315         /// USHORT->unsigned short
   316         public ushort DesignatorMax;
   317 
   318         /// USHORT->unsigned short
   319         public ushort DataIndexMin;
   320 
   321         /// USHORT->unsigned short
   322         public ushort DataIndexMax;
   323     }
   324 
   325     /// <summary>
   326     /// Type created in place of an anonymous struct
   327     /// </summary>
   328     [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
   329     public struct HIDP_VALUE_CAPS_NOT_RANGE
   330     {
   331 
   332         /// USAGE->USHORT->unsigned short
   333         public ushort Usage;
   334 
   335         /// USAGE->USHORT->unsigned short
   336         public ushort Reserved1;
   337 
   338         /// USHORT->unsigned short
   339         public ushort StringIndex;
   340 
   341         /// USHORT->unsigned short
   342         public ushort Reserved2;
   343 
   344         /// USHORT->unsigned short
   345         public ushort DesignatorIndex;
   346 
   347         /// USHORT->unsigned short
   348         public ushort Reserved3;
   349 
   350         /// USHORT->unsigned short
   351         public ushort DataIndex;
   352 
   353         /// USHORT->unsigned short
   354         public ushort Reserved4;
   355     }
   356 
   357     [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Explicit)]
   358     public struct HIDP_VALUE_CAPS_UNION
   359     {
   360 
   361         /// 
   362         [System.Runtime.InteropServices.FieldOffsetAttribute(0)]
   363         public HIDP_VALUE_CAPS_RANGE Range;
   364 
   365         /// 
   366         [System.Runtime.InteropServices.FieldOffsetAttribute(0)]
   367         public HIDP_VALUE_CAPS_NOT_RANGE NotRange;
   368     }
   369 
   370     [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
   371     public struct HIDP_VALUE_CAPS
   372     {
   373 
   374         /// USAGE->USHORT->unsigned short
   375         public ushort UsagePage;
   376 
   377         /// UCHAR->unsigned char
   378         public byte ReportID;
   379 
   380         /// BOOLEAN->BYTE->unsigned char
   381         public byte IsAlias;
   382 
   383         /// USHORT->unsigned short
   384         public ushort BitField;
   385 
   386         /// USHORT->unsigned short
   387         public ushort LinkCollection;
   388 
   389         /// USAGE->USHORT->unsigned short
   390         public ushort LinkUsage;
   391 
   392         /// USAGE->USHORT->unsigned short
   393         public ushort LinkUsagePage;
   394 
   395         /// BOOLEAN->BYTE->unsigned char
   396         public byte IsRange;
   397 
   398         /// BOOLEAN->BYTE->unsigned char
   399         public byte IsStringRange;
   400 
   401         /// BOOLEAN->BYTE->unsigned char
   402         public byte IsDesignatorRange;
   403 
   404         /// BOOLEAN->BYTE->unsigned char
   405         public byte IsAbsolute;
   406 
   407         /// BOOLEAN->BYTE->unsigned char
   408         public byte HasNull;
   409 
   410         /// UCHAR->unsigned char
   411         public byte Reserved;
   412 
   413         /// USHORT->unsigned short
   414         public ushort BitSize;
   415 
   416         /// USHORT->unsigned short
   417         public ushort ReportCount;
   418 
   419         /// USHORT[5]
   420         [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst = 5, ArraySubType = System.Runtime.InteropServices.UnmanagedType.U2)]
   421         public ushort[] Reserved2;
   422 
   423         /// ULONG->unsigned int
   424         public uint UnitsExp;
   425 
   426         /// ULONG->unsigned int
   427         public uint Units;
   428 
   429         /// LONG->int
   430         public int LogicalMin;
   431 
   432         /// LONG->int
   433         public int LogicalMax;
   434 
   435         /// LONG->int
   436         public int PhysicalMin;
   437 
   438         /// LONG->int
   439         public int PhysicalMax;
   440 
   441         /// 
   442         public HIDP_VALUE_CAPS_UNION Union;
   443     }
   444 }
   445 
   446