libusb_open retorna 'LIBUSB_ERROR_NOT_SUPPORTED' no Windows 7

Tenho vindo a desenvolver drivers USB usando LibUSB no Linux, mas agora eu quero ter um dos meus drivers compilados para o Windows (esta é a primeira vez que estou fazendo isso).

Meu ambiente

Eu estou trabalhando no Windows 7 usando oMinGW compilador (também usando Dev-cpp IDE), e estou usando uma biblioteca libusb pré-compiladaesse link.

O meu aparelho: É um dispositivo de toque HID. Portanto, nenhum driver é necessário para o Windows. Eu tenho um endpoint adicional para obter certos dados de depuração.

Meu código:

Eu compilei o código para listar todos os dispositivos e dispositivos USB conectados à minha máquina, e o código funciona. Agora eu adiciono código para abrir o dispositivo para que eu pegue um identificador de dispositivo e inicie a comunicação. Mas a função retorna -12 Ou seja,LIBUSB_ERROR_NOT_SUPPORTED.

Como posso resolver este problema?

Eu procurei pela Internet e não encontrei uma solução definitiva para esse problema. Enquanto é o código que funciona lindamente no Linux.

P.S .: Eu adicionei o código inteiro abaixo. oDoList(); função funciona bem, mas oGetTRSDevice(); função falha emlibusb_open(dev, &handle);.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libusb.h>


libusb_device_handle* deviceHandle = NULL;

int DoList();
libusb_device_handle* GetTRSDevice(void);

int main()
{
    int ret = libusb_init(NULL);
    if (ret < 0) {
        printf("Failed to init libusb");
        return ret;
    }

    DoList();
    deviceHandle = GetTRSDevice();
    if(!deviceHandle) {
        printf("Failed to locate device");
        goto fail_dev_open;
    }

    printf("Device opened");

    libusb_close(deviceHandle);
    fail_dev_open:
        libusb_exit(NULL);

    return(ret);
}

int DoList()
{
    libusb_device **devs;
    ssize_t cnt;


    cnt = libusb_get_device_list(NULL, &devs);
    if (cnt < 0)
        return (int) cnt;

    libusb_device *dev;
    int i = 0;

    while ((dev = devs[i++]) != NULL) {
        struct libusb_device_descriptor desc;
        int r = libusb_get_device_descriptor(dev, &desc);
        if (r < 0) {
            fprintf(stderr, "failed to get device descriptor");
            return(-1);
        }

        printf("%04x:%04x (bus %d, device %d)\n",
               desc.idVendor, desc.idProduct,
               libusb_get_bus_number(dev), libusb_get_device_address(dev));
    }
    libusb_free_device_list(devs, 1);
    return 0;
}

libusb_device_handle* GetTRSDevice(void)
{
    int i = 0;
    ssize_t cnt;
    libusb_device *dev;
    libusb_device **devs;
    libusb_device_handle* handle = NULL;

    cnt = libusb_get_device_list(NULL, &devs);
    if (cnt < 0) {
        printf("Failed libusb_get_device_list");
        return(0);
    }

    while ((dev = devs[i++]) != NULL) {
        struct libusb_device_descriptor desc;
        int ret = libusb_get_device_descriptor(dev, &desc);
        if (ret < 0) {
            printf("Failed libusb_get_device_descriptor");
            continue;
        }
        if(desc.idVendor == 0X238f && desc.idProduct == 1) {
            int ret = libusb_open(dev, &handle);
            if (ret < 0) {
                printf("Failed libusb_open: %d\n\r",ret);
                break;
            }
            #ifndef WIN32
                libusb_detach_kernel_driver(handle, 0);
            #endif
            ret = libusb_claim_interface(handle,0);
            if (ret < 0) {
                libusb_close(handle);
                handle=NULL;
                break;
            }
            break;
        }
    }
    libusb_free_device_list(devs, 1);
    return(handle);
}

questionAnswers(2)

yourAnswerToTheQuestion