public static Result libusb_get_string_descriptor(this ILibUsb lib, IntPtr deviceHandle, byte index, ushort langId, IntPtr data, int length) { return(lib.libusb_control_transfer(deviceHandle, (byte)EndpointDirection.In, (byte)StandardRequest.LIBUSB_REQUEST_GET_DESCRIPTOR, (ushort)(((byte)DescriptorType.LIBUSB_DT_STRING << 8) | index), langId, data, (ushort)length, 1000)); }
static LibUsb() { switch (Environment.OSVersion.Platform) { case PlatformID.MacOSX: case PlatformID.Unix: _libUsb = new LibUsbMac(); break; case PlatformID.Win32NT: case PlatformID.Win32S: case PlatformID.Win32Windows: case PlatformID.WinCE: _libUsb = new LibUsbWindows(); break; } }
private static unsafe string GetStringDescriptor(ILibUsb impl, IntPtr deviceHandle, byte index, string fallback) { const int Buffer = 255; byte[] str = new byte[Buffer]; if (index > 0) { fixed(byte *ptr = str) { var res = impl.libusb_get_string_descriptor(deviceHandle, 0, 0, new IntPtr(ptr), Buffer); if ((int)res < 4) { return(fallback); } var langId = (ushort)(str[2] | (str[3] << 8)); res = impl.libusb_get_string_descriptor(deviceHandle, index, langId, new IntPtr(ptr), Buffer); if (res < 0) { return(fallback); } if (str[1] != (int)DescriptorType.LIBUSB_DT_STRING) { return(fallback); } if (str[0] > (int)res) { return(fallback); } return(Encoding.Unicode.GetString(str, 2, (int)res)); } } return(fallback); }