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 void SendPdu(EusbPdu pdu, DynamicVirtualChannel channel)
        {
            Site.Assume.IsNotNull(channel, "DynamicVirtualChannel must be initialized.");

            channel.Send(PduMarshaler.Marshal(pdu));

            Site.Log.Add(LogEntryKind.Debug, "Sending {0}: \r\n{1}\r\n", pdu.GetType().ToString(), pdu.ToString());
        }
 private void LogPdu(EusbPdu pdu)
 {
     Site.Log.Add(LogEntryKind.Debug, "{0}\r\n{1}\r\n", pdu.GetType().ToString(), pdu.ToString());
 }
        public static void VerifyResponse(EusbPdu request, EusbPdu responseToBeVerified)
        {
            if (!NeedVerify)
            {
                return;
            }

            if (responseToBeVerified is EusbIoControlCompletionPdu)
            {
                Site.Assert.IsInstanceOfType(
                    request,
                    typeof(EusbRegisterRequestCallbackPdu),
                    "The request must be type of EusbRegisterRequestCallbackPdu"
                    );
            }
        }
        private uint ParseUInt32IoResult(EusbPdu pdu)
        {
            Site.Assert.IsInstanceOfType(
                pdu,
                typeof(EusbIoControlCompletionPdu),
                "Must receive an EusbIoControlCompletionPdu message."
                );

            EusbIoControlCompletionPdu completionPdu = (EusbIoControlCompletionPdu)pdu;

            Site.Assert.IsSuccess(
                (int)completionPdu.HResult,
                "the HResult member of the EusbIoControlCompletionPdu must be a successful code."
                );

            Site.Assert.AreEqual<uint>(
                4,
                completionPdu.OutputBufferSize,
                "If the operation is successful, the client MUST set the OutputBufferSize field to 0x4."
                );

            uint res = BitConverter.ToUInt32(completionPdu.OutputBuffer, 0);

            return res;
        }
        private USB_STRING_DESCRIPTOR ParseStringDescriptor(EusbPdu pdu)
        {
            if (pdu is EusbUrbCompletionNoDataPdu)
            {
                Site.Log.Add(
                    LogEntryKind.Debug,
                    "Unexpectedly received an EusbUrbCompletionNoDataPdu message: {0}",
                    pdu
                    );
                return null;
            }

            Site.Assert.IsInstanceOfType(
                pdu,
                typeof(EusbUrbCompletionPdu),
                "Must receive an EusbUrbCompletionPdu message."
                );

            EusbUrbCompletionPdu completionPdu = (EusbUrbCompletionPdu)pdu;

            Site.Assert.IsSuccess(
                (int)completionPdu.HResult,
                "the HResult member of the EusbUrbCompletionPdu must be a successful code."
                );

            USB_STRING_DESCRIPTOR res = UsbStructParser.Parse<USB_STRING_DESCRIPTOR>(completionPdu);

            Site.Assert.IsNotNull(res, "USB_STRING_DESCRIPTOR cannot be parsed from EusbUrbCompletionPdu");
            return res;
        }