/// <summary> /// Gets a <see cref="DescriptorType.String"/> descriptor from the device. /// </summary> /// <param name="stringData">Buffer to store the returned string in upon success.</param> /// <param name="langId">The language ID to retrieve the string in. (0x409 for english).</param> /// <param name="stringIndex">The string index to retrieve.</param> /// <returns>True on success.</returns> public bool GetString(out string stringData, short langId, byte stringIndex) { stringData = null; int iTransferLength; LangStringDescriptor sd = new LangStringDescriptor(255); bool bSuccess = GetDescriptor((byte) DescriptorType.String, stringIndex, langId, sd.Ptr, sd.MaxSize, out iTransferLength); if (bSuccess && iTransferLength > UsbDescriptor.Size && sd.Length == iTransferLength) bSuccess = sd.Get(out stringData); else if (!bSuccess) UsbError.Error(ErrorCode.Win32Error, Marshal.GetLastWin32Error(), "GetString:GetDescriptor", this); else stringData = String.Empty; return bSuccess; }
/// <summary> /// Asking for the zero'th index is special - it returns a string /// descriptor that contains all the language IDs supported by the /// device. Typically there aren't many - often only one. The /// language IDs are 16 bit numbers, and they start at the third byte /// in the descriptor. See USB 2.0 specification, section 9.6.7, for /// more information on this. /// </summary> /// <returns>A collection of LCIDs that the current <see cref="UsbDevice"/> supports.</returns> public bool GetLangIDs(out short[] langIDs) { LangStringDescriptor sd = new LangStringDescriptor(UsbDescriptor.Size + (16*sizeof (short))); int ret; bool bSuccess = GetDescriptor((byte) DescriptorType.String, 0, 0, sd.Ptr, sd.MaxSize, out ret); if (bSuccess && ret == sd.Length) { bSuccess = sd.Get(out langIDs); } else { langIDs = new short[0]; UsbError.Error(ErrorCode.Win32Error, Marshal.GetLastWin32Error(), "GetLangIDs", this); } sd.Free(); return bSuccess; }