/// <summary> /// Get string from descriptor /// </summary> /// <param name="languageID">Language ID</param> /// <param name="entryIndex">Index</param> /// <returns></returns> public unsafe string GetString(ushort languageID, uint entryIndex) { /** * Get length */ byte[] buf = new byte[1]; if (!Request(TYPE_DEVICETOHOST, REQ_GET_DESCRIPTOR, (ushort)((DESC_STRING << 8) | entryIndex), languageID, 1, (byte *)Util.ObjectToVoidPtr(buf))) { return(null); } int len = *(byte *)Util.ObjectToVoidPtr(buf); /** * Load full object */ byte[] buffer = new byte[len]; if (!Request(TYPE_DEVICETOHOST, REQ_GET_DESCRIPTOR, (ushort)((DESC_STRING << 8) | entryIndex), languageID, (ushort)(len), (byte *)Util.ObjectToVoidPtr(buffer))) { return(null); } if (len == 0) { return(""); } /** * Set string */ USBStringDescriptor *ptr = (USBStringDescriptor *)Util.ObjectToVoidPtr(buffer); char *entryData = (char *)ptr + 2; int size = (len - sizeof(USBStringDescriptor)) / 2; char *str = (char *)Heap.Alloc(size); int i = 0; for (; i < size; i++) { str[i] = entryData[i * 2]; } str[i] = (char)0x00; /** * Free unused shizzle */ Heap.Free(buffer); Heap.Free(buf); return(Util.CharPtrToString(str)); }
/// <summary> /// Load all languages /// </summary> /// <returns></returns> public unsafe bool LoadLanguages() { /** * Read length */ byte[] buf = new byte[1]; if (!Request(TYPE_DEVICETOHOST, REQ_GET_DESCRIPTOR, (DESC_STRING << 8) | 0, 0, 1, (byte *)Util.ObjectToVoidPtr(buf))) { return(false); } int len = *(byte *)Util.ObjectToVoidPtr(buf); /** * Read full table */ byte[] buffer = new byte[len]; if (!Request(TYPE_DEVICETOHOST, REQ_GET_DESCRIPTOR, (DESC_STRING << 8) | 0, 0, (ushort)(len), (byte *)Util.ObjectToVoidPtr(buffer))) { return(false); } USBStringDescriptor *ptr = (USBStringDescriptor *)Util.ObjectToVoidPtr(buffer); ushort *entryData = (ushort *)ptr + 1; int entries = (ptr->Length - sizeof(USBStringDescriptor)) / 2; /** * Set entries */ Languages = new ushort[entries]; NumLanguages = entries; for (int i = 0; i < entries; i++) { Languages[i] = *(entryData + i); } /** * Free unused shizzle */ Heap.Free(buf); Heap.Free(buffer); return(true); }