我试图从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调用上获取访问权限