private bool ParseDescriptor(int length, UsbDescriptorStructure des)
        {
            byte[] temp = new byte[length];
            if (length != ms.Read(temp, 0, length))
            {
                return(false);
            }

            return(PduMarshaler.Unmarshal(temp, des));
        }
        private UsbDescriptorStructure GetNextDescriptor(UsbDescriptorTypes descriptorType)
        {
            byte[] temp = new byte[2];
            UsbDescriptorStructure result = null;

            while (ms.Position < ms.Length - 2)
            {
                if (2 != ms.Read(temp, 0, 2))
                {
                    return(null);
                }

                UsbDescriptorStructure des = new UsbDescriptorStructure();
                PduMarshaler.Unmarshal(temp, des);

                if (des.bDescriptorType == descriptorType)
                {
                    ms.Seek(-2, SeekOrigin.Current);

                    switch (des.bDescriptorType)
                    {
                    case UsbDescriptorTypes.USB_INTERFACE_DESCRIPTOR_TYPE:
                        result = new USB_INTERFACE_DESCRIPTOR();
                        if (ParseDescriptor(USB_INTERFACE_DESCRIPTOR.DefaultSize, result))
                        {
                            return(result);
                        }
                        break;

                    default:
                        throw new NotImplementedException();
                        //break;
                    }
                }
                else
                {
                    ms.Seek(des.bLength - 1, SeekOrigin.Current);
                }
            }
            return(result);
        }