Instrument Neutral Distributed Interface INDI  2.0.2
Classes | Macros | Typedefs | Functions | Variables
hid_win.c File Reference
#include <windows.h>
#include <setupapi.h>
#include <winioctl.h>
#include <stdio.h>
#include <stdlib.h>
#include "hidapi.h"

Go to the source code of this file.

Classes

struct  _HIDD_ATTRIBUTES
 
struct  _HIDP_CAPS
 
struct  hid_device_
 

Macros

#define HID_OUT_CTL_CODE(id)   CTL_CODE(FILE_DEVICE_KEYBOARD, (id), METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
 
#define IOCTL_HID_GET_FEATURE   HID_OUT_CTL_CODE(100)
 
#define HIDP_STATUS_SUCCESS   0x110000
 
#define RESOLVE(x)
 
#define WSTR_LEN   512
 
#define P32
 

Typedefs

typedef LONG NTSTATUS
 
typedef struct _HIDD_ATTRIBUTES HIDD_ATTRIBUTES
 
typedef struct _HIDD_ATTRIBUTESPHIDD_ATTRIBUTES
 
typedef USHORT USAGE
 
typedef struct _HIDP_CAPS HIDP_CAPS
 
typedef struct _HIDP_CAPSPHIDP_CAPS
 
typedef void * PHIDP_PREPARSED_DATA
 
typedef BOOLEAN(__stdcall * HidD_GetAttributes_) (HANDLE device, PHIDD_ATTRIBUTES attrib)
 
typedef BOOLEAN(__stdcall * HidD_GetSerialNumberString_) (HANDLE device, PVOID buffer, ULONG buffer_len)
 
typedef BOOLEAN(__stdcall * HidD_GetManufacturerString_) (HANDLE handle, PVOID buffer, ULONG buffer_len)
 
typedef BOOLEAN(__stdcall * HidD_GetProductString_) (HANDLE handle, PVOID buffer, ULONG buffer_len)
 
typedef BOOLEAN(__stdcall * HidD_SetFeature_) (HANDLE handle, PVOID data, ULONG length)
 
typedef BOOLEAN(__stdcall * HidD_GetFeature_) (HANDLE handle, PVOID data, ULONG length)
 
typedef BOOLEAN(__stdcall * HidD_GetIndexedString_) (HANDLE handle, ULONG string_index, PVOID buffer, ULONG buffer_len)
 
typedef BOOLEAN(__stdcall * HidD_GetPreparsedData_) (HANDLE handle, PHIDP_PREPARSED_DATA *preparsed_data)
 
typedef BOOLEAN(__stdcall * HidD_FreePreparsedData_) (PHIDP_PREPARSED_DATA preparsed_data)
 
typedef NTSTATUS(__stdcall * HidP_GetCaps_) (PHIDP_PREPARSED_DATA preparsed_data, HIDP_CAPS *caps)
 

Functions

int HID_API_EXPORT hid_init (void)
 Initialize the HIDAPI library. More...
 
int HID_API_EXPORT hid_exit (void)
 Finalize the HIDAPI library. More...
 
struct hid_device_info HID_API_EXPORT *HID_API_CALL hid_enumerate (unsigned short vendor_id, unsigned short product_id)
 Enumerate the HID Devices. More...
 
void HID_API_EXPORT HID_API_CALL hid_free_enumeration (struct hid_device_info *devs)
 Free an enumeration Linked List. More...
 
HID_API_EXPORT hid_device *HID_API_CALL hid_open (unsigned short vendor_id, unsigned short product_id, const wchar_t *serial_number)
 Open a HID device using a Vendor ID (VID), Product ID (PID) and optionally a serial number. More...
 
HID_API_EXPORT hid_device *HID_API_CALL hid_open_path (const char *path)
 Open a HID device by its path name. More...
 
int HID_API_EXPORT HID_API_CALL hid_write (hid_device *dev, const unsigned char *data, size_t length)
 Write an Output report to a HID device. More...
 
int HID_API_EXPORT HID_API_CALL hid_read_timeout (hid_device *dev, unsigned char *data, size_t length, int milliseconds)
 Read an Input report from a HID device with timeout. More...
 
int HID_API_EXPORT HID_API_CALL hid_read (hid_device *dev, unsigned char *data, size_t length)
 Read an Input report from a HID device. More...
 
int HID_API_EXPORT HID_API_CALL hid_set_nonblocking (hid_device *dev, int nonblock)
 Set the device handle to be non-blocking. More...
 
int HID_API_EXPORT HID_API_CALL hid_send_feature_report (hid_device *dev, const unsigned char *data, size_t length)
 Send a Feature report to the device. More...
 
int HID_API_EXPORT HID_API_CALL hid_get_feature_report (hid_device *dev, unsigned char *data, size_t length)
 Get a feature report from a HID device. More...
 
void HID_API_EXPORT HID_API_CALL hid_close (hid_device *dev)
 Close a HID device. More...
 
int HID_API_EXPORT_CALL HID_API_CALL hid_get_manufacturer_string (hid_device *dev, wchar_t *string, size_t maxlen)
 Get The Manufacturer String from a HID device. More...
 
int HID_API_EXPORT_CALL HID_API_CALL hid_get_product_string (hid_device *dev, wchar_t *string, size_t maxlen)
 Get The Product String from a HID device. More...
 
int HID_API_EXPORT_CALL HID_API_CALL hid_get_serial_number_string (hid_device *dev, wchar_t *string, size_t maxlen)
 Get The Serial Number String from a HID device. More...
 
int HID_API_EXPORT_CALL HID_API_CALL hid_get_indexed_string (hid_device *dev, int string_index, wchar_t *string, size_t maxlen)
 Get a string from a HID device, based on its string index. More...
 
HID_API_EXPORT const wchar_t *HID_API_CALL hid_error (hid_device *dev)
 Get a string describing the last error which occurred. More...
 

Variables

unsigned short VendorID = 0x04d8
 
unsigned short ProductID = 0x3f
 

Macro Definition Documentation

◆ HID_OUT_CTL_CODE

#define HID_OUT_CTL_CODE (   id)    CTL_CODE(FILE_DEVICE_KEYBOARD, (id), METHOD_OUT_DIRECT, FILE_ANY_ACCESS)

Definition at line 58 of file hid_win.c.

◆ HIDP_STATUS_SUCCESS

#define HIDP_STATUS_SUCCESS   0x110000

Definition at line 104 of file hid_win.c.

◆ IOCTL_HID_GET_FEATURE

#define IOCTL_HID_GET_FEATURE   HID_OUT_CTL_CODE(100)

Definition at line 59 of file hid_win.c.

◆ P32

#define P32

Definition at line 885 of file hid_win.c.

◆ RESOLVE

#define RESOLVE (   x)
Value:
x = (x##_)GetProcAddress(lib_handle, #x); \
if (!x) \
return -1;

◆ WSTR_LEN

#define WSTR_LEN   512

Typedef Documentation

◆ HIDD_ATTRIBUTES

◆ HidD_FreePreparsedData_

typedef BOOLEAN(__stdcall * HidD_FreePreparsedData_) (PHIDP_PREPARSED_DATA preparsed_data)

Definition at line 114 of file hid_win.c.

◆ HidD_GetAttributes_

typedef BOOLEAN(__stdcall * HidD_GetAttributes_) (HANDLE device, PHIDD_ATTRIBUTES attrib)

Definition at line 106 of file hid_win.c.

◆ HidD_GetFeature_

typedef BOOLEAN(__stdcall * HidD_GetFeature_) (HANDLE handle, PVOID data, ULONG length)

Definition at line 111 of file hid_win.c.

◆ HidD_GetIndexedString_

typedef BOOLEAN(__stdcall * HidD_GetIndexedString_) (HANDLE handle, ULONG string_index, PVOID buffer, ULONG buffer_len)

Definition at line 112 of file hid_win.c.

◆ HidD_GetManufacturerString_

typedef BOOLEAN(__stdcall * HidD_GetManufacturerString_) (HANDLE handle, PVOID buffer, ULONG buffer_len)

Definition at line 108 of file hid_win.c.

◆ HidD_GetPreparsedData_

typedef BOOLEAN(__stdcall * HidD_GetPreparsedData_) (HANDLE handle, PHIDP_PREPARSED_DATA *preparsed_data)

Definition at line 113 of file hid_win.c.

◆ HidD_GetProductString_

typedef BOOLEAN(__stdcall * HidD_GetProductString_) (HANDLE handle, PVOID buffer, ULONG buffer_len)

Definition at line 109 of file hid_win.c.

◆ HidD_GetSerialNumberString_

typedef BOOLEAN(__stdcall * HidD_GetSerialNumberString_) (HANDLE device, PVOID buffer, ULONG buffer_len)

Definition at line 107 of file hid_win.c.

◆ HidD_SetFeature_

typedef BOOLEAN(__stdcall * HidD_SetFeature_) (HANDLE handle, PVOID data, ULONG length)

Definition at line 110 of file hid_win.c.

◆ HIDP_CAPS

typedef struct _HIDP_CAPS HIDP_CAPS

◆ HidP_GetCaps_

typedef NTSTATUS(__stdcall * HidP_GetCaps_) (PHIDP_PREPARSED_DATA preparsed_data, HIDP_CAPS *caps)

Definition at line 115 of file hid_win.c.

◆ NTSTATUS

typedef LONG NTSTATUS

Definition at line 33 of file hid_win.c.

◆ PHIDD_ATTRIBUTES

◆ PHIDP_CAPS

typedef struct _HIDP_CAPS * PHIDP_CAPS

◆ PHIDP_PREPARSED_DATA

typedef void* PHIDP_PREPARSED_DATA

Definition at line 103 of file hid_win.c.

◆ USAGE

typedef USHORT USAGE

Definition at line 92 of file hid_win.c.

Function Documentation

◆ hid_close()

void HID_API_EXPORT HID_API_CALL hid_close ( hid_device device)

Close a HID device.

@ingroup API
@param device A device handle returned from hid_open().

Definition at line 809 of file hid_win.c.

◆ hid_enumerate()

struct hid_device_info HID_API_EXPORT* HID_API_CALL hid_enumerate ( unsigned short  vendor_id,
unsigned short  product_id 
)

Enumerate the HID Devices.

This function returns a linked list of all the HID devices
attached to the system which match vendor_id and product_id.
If @p vendor_id and @p product_id are both set to 0, then
all HID devices will be returned.

@ingroup API
@param vendor_id The Vendor ID (VID) of the types of device
    to open.
@param product_id The Product ID (PID) of the types of
    device to open.
Returns
This function returns a pointer to a linked list of type struct hid_device, containing information about the HID devices attached to the system, or NULL in the case of failure. Free this linked list by calling hid_free_enumeration().

Definition at line 257 of file hid_win.c.

◆ hid_error()

HID_API_EXPORT const wchar_t* HID_API_CALL hid_error ( hid_device device)

Get a string describing the last error which occurred.

@ingroup API
@param device A device handle returned from hid_open().

@returns
    This function returns a string containing the last error
    which occurred or NULL if none has occurred.

Definition at line 878 of file hid_win.c.

◆ hid_exit()

int HID_API_EXPORT hid_exit ( )

Finalize the HIDAPI library.

This function frees all of the static data associated with
HIDAPI. It should be called at the end of execution to avoid
memory leaks.

@ingroup API
Returns
This function returns 0 on success and -1 on error.

Definition at line 246 of file hid_win.c.

◆ hid_free_enumeration()

void HID_API_EXPORT HID_API_CALL hid_free_enumeration ( struct hid_device_info devs)

Free an enumeration Linked List.

This function frees a linked list created by hid_enumerate().

@ingroup API
Parameters
devsPointer to a list of struct_device returned from hid_enumerate().

Definition at line 490 of file hid_win.c.

◆ hid_get_feature_report()

int HID_API_EXPORT HID_API_CALL hid_get_feature_report ( hid_device device,
unsigned char *  data,
size_t  length 
)

Get a feature report from a HID device.

Make sure to set the first byte of @p data[] to the Report
ID of the report to be read.  Make sure to allow space for
this extra byte in @p data[].

@ingroup API
@param device A device handle returned from hid_open().
@param data A buffer to put the read data into, including
    the Report ID. Set the first byte of @p data[] to the
    Report ID of the report to be read.
@param length The number of bytes to read, including an
    extra byte for the report ID. The buffer can be longer
    than the actual report.

@returns
    This function returns the number of bytes read and
    -1 on error.

Definition at line 767 of file hid_win.c.

◆ hid_get_indexed_string()

int HID_API_EXPORT_CALL HID_API_CALL hid_get_indexed_string ( hid_device device,
int  string_index,
wchar_t *  string,
size_t  maxlen 
)

Get a string from a HID device, based on its string index.

@ingroup API
@param device A device handle returned from hid_open().
@param string_index The index of the string to get.
@param string A wide string buffer to put the data into.
@param maxlen The length of the buffer in multiples of wchar_t.

@returns
    This function returns 0 on success and -1 on error.

Definition at line 863 of file hid_win.c.

◆ hid_get_manufacturer_string()

int HID_API_EXPORT_CALL HID_API_CALL hid_get_manufacturer_string ( hid_device device,
wchar_t *  string,
size_t  maxlen 
)

Get The Manufacturer String from a HID device.

@ingroup API
@param device A device handle returned from hid_open().
@param string A wide string buffer to put the data into.
@param maxlen The length of the buffer in multiples of wchar_t.

@returns
    This function returns 0 on success and -1 on error.

Definition at line 821 of file hid_win.c.

◆ hid_get_product_string()

int HID_API_EXPORT_CALL HID_API_CALL hid_get_product_string ( hid_device device,
wchar_t *  string,
size_t  maxlen 
)

Get The Product String from a HID device.

@ingroup API
@param device A device handle returned from hid_open().
@param string A wide string buffer to put the data into.
@param maxlen The length of the buffer in multiples of wchar_t.

@returns
    This function returns 0 on success and -1 on error.

Definition at line 835 of file hid_win.c.

◆ hid_get_serial_number_string()

int HID_API_EXPORT_CALL HID_API_CALL hid_get_serial_number_string ( hid_device device,
wchar_t *  string,
size_t  maxlen 
)

Get The Serial Number String from a HID device.

@ingroup API
@param device A device handle returned from hid_open().
@param string A wide string buffer to put the data into.
@param maxlen The length of the buffer in multiples of wchar_t.

@returns
    This function returns 0 on success and -1 on error.

Definition at line 849 of file hid_win.c.

◆ hid_init()

int HID_API_EXPORT hid_init ( )

Initialize the HIDAPI library.

This function initializes the HIDAPI library. Calling it is not
strictly necessary, as it will be called automatically by
hid_enumerate() and any of the hid_open_*() functions if it is
needed.  This function should be called at the beginning of
execution however, if there is a chance of HIDAPI handles
being opened by different threads simultaneously.

@ingroup API

@returns
    This function returns 0 on success and -1 on error.

Definition at line 230 of file hid_win.c.

◆ hid_open_path()

HID_API_EXPORT hid_device* HID_API_CALL hid_open_path ( const char *  path)

Open a HID device by its path name.

The path name be determined by calling hid_enumerate(), or a
platform-specific path name can be used (eg: /dev/hidraw0 on
Linux).

@ingroup API
Parameters
pathThe path name of the device to open
@returns
    This function returns a pointer to a #hid_device object on
    success or NULL on failure.

Definition at line 548 of file hid_win.c.

◆ hid_read_timeout()

int HID_API_EXPORT HID_API_CALL hid_read_timeout ( hid_device dev,
unsigned char *  data,
size_t  length,
int  milliseconds 
)

Read an Input report from a HID device with timeout.

Input reports are returned
to the host through the INTERRUPT IN endpoint. The first byte will
contain the Report number if the device uses numbered reports.

@ingroup API
@param device A device handle returned from hid_open().
@param data A buffer to put the read data into.
@param length The number of bytes to read. For devices with
    multiple reports, make sure to read an extra byte for
    the report number.
@param milliseconds timeout in milliseconds or -1 for blocking wait.

@returns
    This function returns the actual number of bytes read and
    -1 on error.

Definition at line 664 of file hid_win.c.

◆ hid_send_feature_report()

int HID_API_EXPORT HID_API_CALL hid_send_feature_report ( hid_device device,
const unsigned char *  data,
size_t  length 
)

Send a Feature report to the device.

Feature reports are sent over the Control endpoint as a
Set_Report transfer.  The first byte of @p data[] must
contain the Report ID. For devices which only support a
single report, this must be set to 0x0. The remaining bytes
contain the report data. Since the Report ID is mandatory,
calls to hid_send_feature_report() will always contain one
more byte than the report contains. For example, if a hid
report is 16 bytes long, 17 bytes must be passed to
hid_send_feature_report(): the Report ID (or 0x0, for
devices which do not use numbered reports), followed by the
report data (16 bytes). In this example, the length passed
in would be 17.

@ingroup API
@param device A device handle returned from hid_open().
@param data The data to send, including the report number as
    the first byte.
@param length The length in bytes of the data to send, including
    the report number.

@returns
    This function returns the actual number of bytes written and
    -1 on error.

Definition at line 755 of file hid_win.c.

◆ hid_set_nonblocking()

int HID_API_EXPORT HID_API_CALL hid_set_nonblocking ( hid_device device,
int  nonblock 
)

Set the device handle to be non-blocking.

In non-blocking mode calls to hid_read() will return
immediately with a value of 0 if there is no data to be
read. In blocking mode, hid_read() will wait (block) until
there is data to read before returning.

Nonblocking can be turned on and off at any time.

@ingroup API
@param device A device handle returned from hid_open().
@param nonblock enable or not the nonblocking reads
 - 1 to enable nonblocking
 - 0 to disable nonblocking.

@returns
    This function returns 0 on success and -1 on error.

Definition at line 749 of file hid_win.c.

◆ hid_write()

int HID_API_EXPORT HID_API_CALL hid_write ( hid_device device,
const unsigned char *  data,
size_t  length 
)

Write an Output report to a HID device.

The first byte of @p data[] must contain the Report ID. For
devices which only support a single report, this must be set
to 0x0. The remaining bytes contain the report data. Since
the Report ID is mandatory, calls to hid_write() will always
contain one more byte than the report contains. For example,
if a hid report is 16 bytes long, 17 bytes must be passed to
hid_write(), the Report ID (or 0x0, for devices with a
single report), followed by the report data (16 bytes). In
this example, the length passed in would be 17.

hid_write() will send the data on the first OUT endpoint, if
one exists. If it does not, it will send the data through
the Control Endpoint (Endpoint 0).

@ingroup API
@param device A device handle returned from hid_open().
@param data The data to send, including the report number as
    the first byte.
@param length The length in bytes of the data to send.

@returns
    This function returns the actual number of bytes written and
    -1 on error.

Definition at line 603 of file hid_win.c.

Variable Documentation

◆ ProductID

unsigned short ProductID = 0x3f

Definition at line 893 of file hid_win.c.

◆ VendorID

unsigned short VendorID = 0x04d8

Definition at line 892 of file hid_win.c.