繁体   English   中英

在没有libusb的情况下在C#中获取USB设备描述符?

[英]Getting the USB Device Descriptor in C# without libusb?

我想读取USB串行端口(不仅是VID / PID的设备描述符),主要是我可以获取bcdDevice,iProduct和iManufacturer),因此我可以知道USB串行端口是否能够满足我的需求这样做(我们在现场有几个调制解调器,其中一个在半双工模式下更可靠)。

我不想使用libusbdotnet,因为我不希望我的用户必须提前弄清楚要进行过滤以获取我感兴趣的端口。

我知道如何用C做到这一点; 在USBView应用程序上,我们将需要使用SetupAPI枚举控制器(SetupDiEnumDeviceInfo),然后枚举集线器,然后使用IOCTL查询集线器以获取每个端口上的内容。

我想我必须这样做,因为我无法从COM13中找出映射-> \\。\\ USB#ROOT_HUB30#4&2a9d917a&0&0#{f18a0e88-c30c-11d0-8815-00a0c906bed8} .. 是否有更好/更轻松的方法一种获取ioctl所需文件名的方法,而不是全部通过它们并对其进行过滤?

我还尝试将usbview应用程序制作为C DLL,并尝试对此进行包装,但是我无法使自己的DLL正确编译...

我试图将此作为起点从usbview添加到enum.c

typedef struct
{
    PSTR Name;
    PSTR path;
    int port;
} USBDevice;

USBDevice USBDevices[255] = { 0 };
int ndevices;

    extern __declspec(dllexport) int GetDevices(PSTR filter)
    {
        //Enumerate it all and filter for "COM%"
        //Store the data in the USBDevice array.
    }

    extern __declspec(dllexport) PSTR DeviceName(int i)
    {
        return USBDevices[i].Name;
    }

    extern __declspec(dllexport) PSTR DevicePath(int i)
    {
        return USBDevices[i].path;
    }

    extern __declspec(dllexport) void FreeList(void)
    {
        char* foo;
        int i;

        for (i = 0; i<ndevices; i++)
        {
            free(USBDevices[i].Name);
            free(USBDevices[i].path);
        }

        ndevices = 0;
    }

    extern __declspec(dllexport) PUSB_COMMON_DESCRIPTOR GetDevuceInfo(PSTR path, int port)
    {
        //I didn't want to figure out how to marshal this.
    }

    extern __declspec(dllexport) PSTR GetDevuceInfoValue(PSTR path,int port, int selector)
    {
        //Open Hub, send IOCTL to it, get data, filter that, return the interesting bit.
    }

但是我无法将生成的DLL加载到我的C#项目中(运行时会崩溃-甚至在出现窗口之前)。 查看DLL,看来它是垃圾(遍历DLL会导致walker崩溃)。 所以...我不确定在那儿做错了什么,所以我打算将enum.c转换为C#pinvoke样式并进行滚动,但这似乎需要很多工作,尤其是如果有获取COM14的更简单方法-> \\。\\ USB#ROOT_HUB30#4&2a9d917a&0&0#{f18a0e88-c30c-11d0-8815-00a0c906bed8} [Port1]链接...

所以...我前面还有很多工作要做,还是有一种更简单的方法来获得链接(我已经从注册表中尝试过,但是似乎没有映射)。

看来这批准的方式(EnumerateDevices,CM_GetParent,将其蒙格到有效路径,然后要求集线器获取数据)。 我编写了一个C程序来完成肮脏的工作,它的工作就像一个魅力。 我想我将其包装在DLL中并将其发布到CodeProject。

但是警告...即使您执行DeviceIOControl,Windows 也不会重新查询您的设备。 它仅在插件上查询您的设备。

但是至少您可以找到“制造商字符串”,以便可以从插入的所有相似端口中识别出USB端口。然后再次从SetupAPI获取该端口,所以...我不知道它到底是什么买你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM