protected unsafe string RetrieveStringFromDevice(ushort index)
        {
            byte[] buffer = new byte[c_DeviceStringBufferSize];

            byte *payload = null;

            fixed(byte *p = buffer)
            {
                ushort wValue = (ushort)((ushort)((USB_STRING_DESCRIPTOR_TYPE << 8) & 0xFF00) | (ushort)(index & 0x00FF));
                int    read   = m_winUsbDevice.Do_Control_Read_Transfer(ref buffer, USB_GET_DESCRIPTOR, wValue);

                if (read != -1)
                {
                    // null terminate the string
                    if (read > (c_DeviceStringBufferSize - 2))
                    {
                        read = c_DeviceStringBufferSize - 2;
                    }

                    p[read]     = 0;
                    p[read + 1] = 0;

                    // skip first two characters
                    payload = p + 2;
                }
            }

            return(payload == null ? null : new string((char *)payload));
        }