Getting Vendor ID and Product ID from Winusb
c#, usb, winusb
Solution
Read the documentation for `WinUsb_GetDescriptor`.
It looks like your parameters are not correct. To obtain the VID/PID, which is in the Device Descriptor, you will want to specify the `USB_DEVICE_DESCRIPTOR_TYPE` type for the second parameter (0x01). You also only need to specify the language ID if you are requesting a String Descriptor. The length for your device descriptor is wrong too, it should be 18 (`ushort` is 2 bytes, this is probably the reason for your access violation). You also want to use `byte` instead of `Byte` in your `DeviceDescriptor` struct, you don't want the .NET class representation of the byte, just the type value itself.
Here is updated code that may work for you:
success = WinUsb_GetDescriptor(myDevInfo.winUsbHandle,
0x01,
(byte)deviceIndex,
0,
ref deviceDescriptor,
18,
ref lengthTransferred);
Problem
I am trying to get the Vendor and Product IDs from a Winusb device and am getting accessviolationexception when trying to use the winusb_GetDesicriptor() and cannot figure out why I am getting that exception. Here are my declarations: ``` 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); ``` And then here is the code I am trying to run: ``` 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); ``` I am getting through the initialize and getting the values back from queryinterfacesettings, but getting the accessviolation on the GetDescriptor call