Exemplo n.º 1
0
        /// <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));
        }
Exemplo n.º 2
0
        /// <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);
        }