gpt4 book ai didi

c# - 从 Winusb 获取供应商 ID 和产品 ID

转载 作者:太空狗 更新时间:2023-10-30 01:05:01 27 4
gpt4 key购买 nike

我正在尝试从 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 调用中遇到访问冲突

最佳答案

阅读documentation for WinUsb_GetDescriptor .

看起来你的参数不正确。要获取设备描述符中的 VID/PID,您需要为第二个参数 (0x01) 指定 USB_DEVICE_DESCRIPTOR_TYPE 类型。如果您请求字符串描述符,您也只需要指定语言 ID。你的设备描述符的长度也是错误的,它应该是 18(ushort 是 2 个字节,这可能是你的访问冲突的原因)。您还想在 DeviceDescriptor 结构中使用 byte 而不是 Byte,您不需要字节的 .NET 类表示,只是类型值本身。

以下是可能适合您的更新代码:

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

关于c# - 从 Winusb 获取供应商 ID 和产品 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20474324/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com