protected EusbType GetPduType(byte[] data)
        {
            if (null == data) return EusbType.UNKNOWN;

            EusbPdu pdu = new EusbPdu();
            if (!PduMarshaler.Unmarshal(data, pdu))
            {
                return EusbType.UNKNOWN;
            }

            switch (pdu.Mask)
            {
                case Mask_Values.STREAM_ID_NONE:
                    {
                        return EusbType.RIM_EXCHANGE_CAPABILITY_REQUEST;
                    }
                case Mask_Values.STREAM_ID_PROXY:
                    {
                        if (pdu.InterfaceId == (uint)EusbInterfaceId_Values.ADD_VIRTUAL_CHANNEL_OR_DEVICE)
                        {
                            EusbRequestPdu requestPdu = new EusbRequestPdu();
                            if (!PduMarshaler.Unmarshal(data, requestPdu))
                            {
                                return EusbType.UNKNOWN;
                            }
                            switch ((FunctionId_Values)requestPdu.FunctionId)
                            {
                                case FunctionId_Values.ADD_DEVICE:
                                    return EusbType.ADD_DEVICE;
                                case FunctionId_Values.ADD_VIRTUAL_CHANNEL:
                                    return EusbType.ADD_VIRTUAL_CHANNEL;
                                default:
                                    break;
                            }
                        }
                        else if (pdu.InterfaceId == (uint)EusbInterfaceId_Values.CHANNEL_CREATED_CLIENT)
                        {
                            return EusbType.CHANNEL_CREATED;
                        }
                        else
                        {
                            EusbRequestPdu requestPdu = new EusbRequestPdu();
                            if (!PduMarshaler.Unmarshal(data, requestPdu))
                            {
                                return EusbType.UNKNOWN;
                            }

                            if (requestPdu.InterfaceId == RequestCompletionInterfaceId)
                            {
                                switch ((FunctionId_Values)requestPdu.FunctionId)
                                {
                                    case FunctionId_Values.IOCONTROL_COMPLETION:
                                        return EusbType.IOCONTROL_COMPLETION;
                                    case FunctionId_Values.URB_COMPLETION:
                                        return EusbType.URB_COMPLETION;
                                    case FunctionId_Values.URB_COMPLETION_NO_DATA:
                                        return EusbType.URB_COMPLETION_NO_DATA;
                                    default:
                                        break;
                                }
                            }
                        }
                    }
                    break;
                case Mask_Values.STREAM_ID_STUB:
                    {
                        return EusbType.QUERY_DEVICE_TEXT;
                    }
                default:
                    return EusbType.UNKNOWN;
            }
            return EusbType.UNKNOWN;
        }
        private EusbType GetPduType(byte[] data)
        {
            if (null == data) return EusbType.UNKNOWN;

            EusbRequestPdu pdu = new EusbRequestPdu();
            if (!PduMarshaler.Unmarshal(data, pdu))
            {
                return EusbType.UNKNOWN;
            }

            switch (pdu.Mask)
            {
                case Mask_Values.STREAM_ID_NONE:
                    {
                        return EusbType.RIM_EXCHANGE_CAPABILITY_REQUEST;
                    }
                case Mask_Values.STREAM_ID_PROXY:
                    {
                        if (pdu.InterfaceId == (uint)EusbInterfaceId_Values.ADD_VIRTUAL_CHANNEL_OR_DEVICE)
                        {
                            EusbRequestPdu requestPdu = new EusbRequestPdu();
                            if (!PduMarshaler.Unmarshal(data, requestPdu))
                            {
                                return EusbType.UNKNOWN;
                            }
                            switch ((FunctionId_Values)requestPdu.FunctionId)
                            {
                                case FunctionId_Values.ADD_DEVICE:
                                    return EusbType.ADD_DEVICE;
                                case FunctionId_Values.ADD_VIRTUAL_CHANNEL:
                                    return EusbType.ADD_VIRTUAL_CHANNEL;
                                default:
                                    break;
                            }
                        }
                        else if (pdu.InterfaceId == (uint)EusbInterfaceId_Values.CHANNEL_CREATED_SERVER)
                        {
                            return EusbType.CHANNEL_CREATED;
                        }
                        else
                        {
                            EusbRequestPdu requestPdu = new EusbRequestPdu();
                            if (!PduMarshaler.Unmarshal(data, requestPdu))
                            {
                                return EusbType.UNKNOWN;
                            }

                            switch ((FunctionId_Values)requestPdu.FunctionId)
                            {
                                case FunctionId_Values.CANCEL_REQUEST:
                                    return EusbType.CANCEL_REQUEST;
                                case FunctionId_Values.REGISTER_REQUEST_CALLBACK:
                                    return EusbType.REGISTER_REQUEST_CALLBACK;
                                case FunctionId_Values.IO_CONTROL:
                                    return EusbType.IO_CONTROL;
                                case FunctionId_Values.INTERNAL_IO_CONTROL:
                                    return EusbType.INTERNAL_IO_CONTROL;
                                case FunctionId_Values.QUERY_DEVICE_TEXT:
                                    return EusbType.QUERY_DEVICE_TEXT;
                                case FunctionId_Values.TRANSFER_IN_REQUEST:
                                    return EusbType.TRANSFER_IN_REQUEST;
                                case FunctionId_Values.TRANSFER_OUT_REQUEST:
                                    return EusbType.TRANSFER_OUT_REQUEST;
                                case FunctionId_Values.RETRACT_DEVICE:
                                    return EusbType.RETRACT_DEVICE;
                                default:
                                    break;
                            }
                        }
                    }
                    break;
                case Mask_Values.STREAM_ID_STUB:
                    {
                        return EusbType.QUERY_DEVICE_TEXT;
                    }
                default:
                    return EusbType.UNKNOWN;
            }

            return EusbType.UNKNOWN;
        }