/// <summary>
        /// Method to receive and decode client capabilities.
        /// </summary>
        /// <param name="serverMaxRequestSize">The MaxRequestSize field of the server-to-client Multifragment Update Capability Set. </param>
        /// <param name="supportedRfxCaps">Output the TS_RFX_ICAP array supported by the client.</param>
        public void ReceiveAndCheckClientCapabilities(uint serverMaxRequestSize, out TS_RFX_ICAP[] supportedRfxCaps)
        {
            supportedRfxCaps      = null;
            s2cMaxRequestSize     = serverMaxRequestSize;
            ConfirmCapabilitySets = this.rdpbcgrSessionContext.ConfirmCapabilitySets;
            foreach (ITsCapsSet capSet in ConfirmCapabilitySets)
            {
                if (capSet is TS_MULTIFRAGMENTUPDATE_CAPABILITYSET)
                {
                    this.is_Client_Multifragment_Update_CapabilitySet_Received = true;
                    this.client_Multifragment_Update_CapabilitySet             = (TS_MULTIFRAGMENTUPDATE_CAPABILITYSET)capSet;
                }
                else if (capSet is TS_LARGE_POINTER_CAPABILITYSET)
                {
                    this.is_Client_Large_Pointer_Capability_Set_Received = true;
                    this.client_Large_Pointer_Capability_Set             = (TS_LARGE_POINTER_CAPABILITYSET)capSet;
                }
                else if (capSet is TS_BITMAPCACHE_CAPABILITYSET_REV2)
                {
                    this.is_Client_Revision2_Bitmap_Cache_Capability_Set_Received = true;
                    this.client_Revision2_Bitmap_Cache_Capability_Set             = (TS_BITMAPCACHE_CAPABILITYSET_REV2)capSet;
                }
                else if (capSet is TS_FRAME_ACKNOWLEDGE_CAPABILITYSET)
                {
                    this.is_TS_FRAME_ACKNOWLEDGE_CAPABILITYSET_Received = true;
                    this.clientTS_FRAME_ACKNOWLEDGE_CAPABILITYSET       = (TS_FRAME_ACKNOWLEDGE_CAPABILITYSET)capSet;
                }
                else if (capSet is TS_SURFCMDS_CAPABILITYSET)
                {
                    this.is_Client_Surface_Commands_Capability_Set_Received = true;
                    this.client_Surface_Commands_Capability_Set             = (TS_SURFCMDS_CAPABILITYSET)capSet;
                    if ((this.client_Surface_Commands_Capability_Set.cmdFlags & CmdFlags_Values.SURFCMDS_STREAMSURFACEBITS) == CmdFlags_Values.SURFCMDS_STREAMSURFACEBITS)
                    {
                        this.clientupportStreamSurfaceBits = true;
                    }
                }
                else if (capSet is TS_BITMAPCODECS_CAPABILITYSET)
                {
                    this.is_Client_Bitmap_Codecs_Capability_Set_Received = true;
                    this.client_Bitmap_Codecs_Capability_Set             = (TS_BITMAPCODECS_CAPABILITYSET)capSet;
                    foreach (TS_BITMAPCODEC codec in this.client_Bitmap_Codecs_Capability_Set.supportedBitmapCodecs.bitmapCodecArray)
                    {
                        if (is_REMOTEFX_CODEC_GUID(codec.codecGUID))
                        {
                            is_TS_RFX_CLNT_CAPS_CONTAINER_Received = true;
                            remoteFXCodecID = codec.codecID;
                            this.client_RFX_Caps_Container = rdprfxServerDecoder.Decode_TS_RFX_CLNT_CAPS_CONTAINER(codec.codecProperties);
                            supportedRfxCaps = this.client_RFX_Caps_Container.capsData.capsetsData[0].icapsData;
                            break;
                        }
                    }
                }
            }

            //Verify Client Capabilities
            VerifyClientCapabilities();
        }
Esempio n. 2
0
        /// <summary>
        /// Create Bitmap Codec structure which contains a TS_RFX_CLNT_CAPS_CONTAINER structure
        /// </summary>
        /// <returns></returns>
        private TS_BITMAPCODEC CreateTS_BITMAPCODEC_Image_RemoteFX()
        {
            TS_RFX_ICAP rfxIcapRLGR1 = new TS_RFX_ICAP();

            rfxIcapRLGR1.version     = version_Value.CLW_VERSION_1_0;
            rfxIcapRLGR1.flags       = 0x02;
            rfxIcapRLGR1.entropyBits = entropyBits_Value.CLW_ENTROPY_RLGR1;

            TS_RFX_ICAP rfxIcapRLGR3 = new TS_RFX_ICAP();

            rfxIcapRLGR3.version     = version_Value.CLW_VERSION_1_0;
            rfxIcapRLGR3.flags       = 0x02;
            rfxIcapRLGR3.entropyBits = entropyBits_Value.CLW_ENTROPY_RLGR3;

            TS_RFX_CAPSET rfxCapSet = new TS_RFX_CAPSET();

            rfxCapSet.numIcaps  = 2;
            rfxCapSet.icapsData = new TS_RFX_ICAP[] { rfxIcapRLGR1, rfxIcapRLGR3 };

            TS_RFX_CAPS rfxCaps = new TS_RFX_CAPS();

            rfxCaps.capsetsData = new TS_RFX_CAPSET[] { rfxCapSet };

            TS_RFX_CLNT_CAPS_CONTAINER rfxClnCaps = new TS_RFX_CLNT_CAPS_CONTAINER();

            rfxClnCaps.captureFlags = 0x00000001;
            rfxClnCaps.capsData     = rfxCaps;


            TS_BITMAPCODEC bitmapCodec = new TS_BITMAPCODEC();

            bitmapCodec.codecGUID.codecGUID1  = 0x2744CCD4;
            bitmapCodec.codecGUID.codecGUID2  = 0x9D8A;
            bitmapCodec.codecGUID.codecGUID3  = 0x4E74;
            bitmapCodec.codecGUID.codecGUID4  = 0x80;
            bitmapCodec.codecGUID.codecGUID5  = 0x3C;
            bitmapCodec.codecGUID.codecGUID6  = 0x0E;
            bitmapCodec.codecGUID.codecGUID7  = 0xCB;
            bitmapCodec.codecGUID.codecGUID8  = 0xEE;
            bitmapCodec.codecGUID.codecGUID9  = 0xA1;
            bitmapCodec.codecGUID.codecGUID10 = 0x9C;
            bitmapCodec.codecGUID.codecGUID11 = 0x54;
            bitmapCodec.codecID               = 3;
            bitmapCodec.codecProperties       = rfxClnCaps.ToBytes();
            bitmapCodec.codecPropertiesLength = (ushort)bitmapCodec.codecProperties.Length;
            return(bitmapCodec);
        }
        /// <summary>
        /// Create Bitmap Codec structure which contains a TS_RFX_CLNT_CAPS_CONTAINER structure
        /// </summary>
        /// <returns></returns>
        private static TS_BITMAPCODEC CreateTS_BITMAPCODEC_RemoteFX()
        {
            TS_RFX_ICAP rfxIcapRLGR1 = new TS_RFX_ICAP();

            rfxIcapRLGR1.version     = version_Value.CLW_VERSION_1_0;
            rfxIcapRLGR1.flags       = 0x00;
            rfxIcapRLGR1.entropyBits = entropyBits_Value.CLW_ENTROPY_RLGR1;

            TS_RFX_ICAP rfxIcapRLGR3 = new TS_RFX_ICAP();

            rfxIcapRLGR3.version     = version_Value.CLW_VERSION_1_0;
            rfxIcapRLGR3.flags       = 0x00;
            rfxIcapRLGR3.entropyBits = entropyBits_Value.CLW_ENTROPY_RLGR3;

            TS_RFX_CAPSET rfxCapSet = new TS_RFX_CAPSET();

            rfxCapSet.numIcaps  = 2;
            rfxCapSet.icapsData = new TS_RFX_ICAP[] { rfxIcapRLGR1, rfxIcapRLGR3 };

            TS_RFX_CAPS rfxCaps = new TS_RFX_CAPS();

            rfxCaps.capsetsData = new TS_RFX_CAPSET[] { rfxCapSet };

            TS_RFX_CLNT_CAPS_CONTAINER rfxClnCaps = new TS_RFX_CLNT_CAPS_CONTAINER();

            rfxClnCaps.captureFlags = 0x00000001;
            rfxClnCaps.capsData     = rfxCaps;


            TS_BITMAPCODEC bitmapCodec = new TS_BITMAPCODEC();

            bitmapCodec.codecGUID.codecGUID1  = 0x76772F12;
            bitmapCodec.codecGUID.codecGUID2  = 0xBD72;
            bitmapCodec.codecGUID.codecGUID3  = 0x4463;
            bitmapCodec.codecGUID.codecGUID4  = 0xAF;
            bitmapCodec.codecGUID.codecGUID5  = 0xB3;
            bitmapCodec.codecGUID.codecGUID6  = 0xB7;
            bitmapCodec.codecGUID.codecGUID7  = 0x3C;
            bitmapCodec.codecGUID.codecGUID8  = 0x9C;
            bitmapCodec.codecGUID.codecGUID9  = 0x6F;
            bitmapCodec.codecGUID.codecGUID10 = 0x78;
            bitmapCodec.codecGUID.codecGUID11 = 0x86;
            bitmapCodec.codecID               = 2;
            bitmapCodec.codecProperties       = rfxClnCaps.ToBytes();
            bitmapCodec.codecPropertiesLength = (ushort)bitmapCodec.codecProperties.Length;
            return(bitmapCodec);
        }