/// <summary> /// Decode Client Announce Reply packet. /// </summary> /// <param name="data">Packet data.</param> /// <returns>Client Announce Reply packet.</returns> public static DR_CORE_SERVER_ANNOUNCE_RSP DecodeClientAnnounceReply(byte[] data) { int index = 0; DR_CORE_SERVER_ANNOUNCE_RSP packet = new DR_CORE_SERVER_ANNOUNCE_RSP(); packet.Header = DecodeRdpdrHeader(data, ref index, false); packet.VersionMajor = (DR_CORE_SERVER_ANNOUNCE_RSP_VersionMajor_Values)ParseUInt16(data, ref index, false); packet.VersionMinor = (DR_CORE_SERVER_ANNOUNCE_RSP_VersionMinor_Values)ParseUInt16(data, ref index, false); packet.ClientId = ParseUInt32(data, ref index, false); return(packet); }
/// <summary> /// Generate static virtual channel data messages for test. /// MS-RDPEFS is used to generated virtual channel traffics. /// </summary> /// <param name="invalidType">Invalid Type</param> public void GenerateStaticVirtualChannelTraffics(StaticVirtualChannel_InvalidType invalidType) { /* * MS-RDPEFS protocol Initialization. */ byte[] receivedData = null; uint clientId = 0; if (invalidType == StaticVirtualChannel_InvalidType.None) { //Sending Server Announce Request. byte[] data = RdpefsUtility.EncodeServerAnnounceRequest(RdpefsUtility.CreateServerAnnounceRequest()); SendVirtualChannelPDU(RDPDR_ChannelId, data, StaticVirtualChannel_InvalidType.None); //Expecting Client Announce Reply. WaitForVirtualChannelPdu(RDPDR_ChannelId, out receivedData, pduWaitTimeSpan); DR_CORE_SERVER_ANNOUNCE_RSP reply = RdpefsUtility.DecodeClientAnnounceReply(receivedData); clientId = reply.ClientId; //Expecting Client Name Request. WaitForVirtualChannelPdu(RDPDR_ChannelId, out receivedData, pduWaitTimeSpan); //Sending Server Core Capability Request. data = RdpefsUtility.EncodeServerCoreCapabilityRequest(RdpefsUtility.CreateServerCoreCapabilityRequest()); SendVirtualChannelPDU(RDPDR_ChannelId, data, StaticVirtualChannel_InvalidType.None); //Sending Server Client ID Confirm. data = RdpefsUtility.EncodeServerClientIDConfirm(RdpefsUtility.CreateServerClientIDConfirm(clientId)); SendVirtualChannelPDU(RDPDR_ChannelId, data, StaticVirtualChannel_InvalidType.None); //Expecting Client Core Capability Response. WaitForVirtualChannelPdu(RDPDR_ChannelId, out receivedData, pduWaitTimeSpan); DR_CORE_CAPABILITY_RSP capRsp = RdpefsUtility.DecodeClientCoreCapabilityRSP(receivedData); bool supportUserLogonPacket = false; foreach (CAPABILITY_SET capSet in capRsp.CapabilityMessage) { if (capSet is GENERAL_CAPS_SET) { if (((GENERAL_CAPS_SET)capSet).extendedPDU.HasFlag(extendedPDU_Values.RDPDR_USER_LOGGEDON_PDU)) { supportUserLogonPacket = true; } } } if (supportUserLogonPacket) { // Send Server User logged on packet data = RdpefsUtility.EncodeServerUserLoggedOn(RdpefsUtility.CreateServerUserLoggedOn()); SendVirtualChannelPDU(RDPDR_ChannelId, data, StaticVirtualChannel_InvalidType.None); } //Expecting Client Device List. WaitForVirtualChannelPdu(RDPDR_ChannelId, out receivedData, pduWaitTimeSpan); } else { //Sending Server Announce Request. byte[] data = RdpefsUtility.EncodeServerAnnounceRequest(RdpefsUtility.CreateServerAnnounceRequest()); SendVirtualChannelPDU(RDPDR_ChannelId, data, invalidType); //WaitForVirtualChannelPdu(RDPDR_ChannelId, out receivedData, timeout); } }