从Winusb获取供应商ID和产品ID

 bls6653474 发布于 2023-02-11 22:28

我试图从Winusb设备获取供应商和产品ID,并在尝试使用winusb_GetDesicriptor()时遇到accessviolationexception,并且无法弄清楚为什么我会得到该异常.

这是我的声明:

    internal devInfo myDevInfo = new devInfo();
    USB_INTERFACE_DESCRIPTOR ifaceDescriptor;
    USB_DEVICE_DESCRIPTOR deviceDescriptor;


    internal struct USB_INTERFACE_DESCRIPTOR
    {
        internal Byte bLength;
        internal Byte bDescriptorType;
        internal Byte bInterfaceNumber;
        internal Byte bAlternateSetting;
        internal Byte bNumEndpoints;
        internal Byte bInterfaceClass;
        internal Byte bInterfaceSubClass;
        internal Byte bInterfaceProtocol;
        internal Byte iInterface;
    }


    [StructLayout(LayoutKind.Explicit, Size = 18, CharSet = CharSet.Auto)]
    internal struct USB_DEVICE_DESCRIPTOR
    {
        [FieldOffset(0)]internal byte bLength;
        [FieldOffset(1)]internal byte bDescriptorType;
        [FieldOffset(2)]internal ushort bcdUSB;
        [FieldOffset(4)]internal byte bDeviceClass;
        [FieldOffset(5)]internal byte bDeviceSubClass;
        [FieldOffset(6)]internal byte bDeviceProtocol;
        [FieldOffset(7)]internal byte bMaxPacketSize0;
        [FieldOffset(8)]internal ushort idVendor;
        [FieldOffset(10)]internal ushort idProduct;
        [FieldOffset(12)]internal ushort bcdDevice;
        [FieldOffset(14)]internal byte iManufacturer;
        [FieldOffset(15)]internal byte iProduct;
        [FieldOffset(16)]internal byte iSerialNumber;
        [FieldOffset(17)]internal byte bNumConfigurations;
    }

    [DllImport("winusb.dll", SetLastError = true)]
    internal static extern Boolean WinUsb_Initialize(SafeFileHandle DeviceHandle, ref IntPtr InterfaceHandle);

    [DllImport("winusb.dll", SetLastError = true)]
    internal static extern Boolean WinUsb_QueryInterfaceSettings(IntPtr InterfaceHandle, Byte AlternateInterfaceNumber, ref USB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor);

    [DllImport("winusb.dll", SetLastError = true)]
    internal static extern Boolean WinUsb_GetDescriptor(IntPtr InterfaceHandle, byte DescriptorType, byte Index, ushort LanguageID, ref USB_DEVICE_DESCRIPTOR UsbAltDeviceDescriptor, ulong BufferLength, ref long LengthTransferred);

然后这是我试图运行的代码:

deviceHandle = CreateFile
                   (devicePathName,
                   (GENERIC_WRITE | GENERIC_READ),
                   FILE_SHARE_READ | FILE_SHARE_WRITE,
                   IntPtr.Zero,
                   OPEN_EXISTING,
                   FILE_FLAG_OVERLAPPED,
                   0);

            success = WinUsb_Initialize(deviceHandle, ref myDevInfo.winUsbHandle);
            success = WinUsb_QueryInterfaceSettings(myDevInfo.winUsbHandle, 0, ref ifaceDescriptor);
            success = WinUsb_GetDescriptor(myDevInfo.winUsbHandle,
                           0x01,
                           (byte)deviceIndex,
                           0,
                           ref deviceDescriptor,
                           18,
                           ref lengthTransferred);

我正在通过初始化并从queryinterfacesettings获取值,但在GetDescriptor调用上获取访问权限

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有