public void VerifyStructure(TS_UD_CS_NET net) { Site.CaptureRequirementIfAreEqual<TS_UD_HEADER_type_Values>(net.header.type, TS_UD_HEADER_type_Values.CS_NET, 225, "In Client Network Data (TS_UD_CS_NET), the User Data Header type field MUST be set to CS_NET (0xC003)."); Site.CaptureRequirementIfIsTrue(net.channelCount <= 31, 228, "[In Client Network Data (TS_UD_CS_NET)]channelCount (4 bytes): In Client Network Data, the maximum allowed value for channelCount is 31."); Site.CaptureRequirementIfAreEqual<int>(net.channelDefArray.Count, (int)net.channelCount, 230, "In Client Network Data, the number of CHANNEL_DEF structures which follows is given by the channelCount field."); const uint options = (uint)Channel_Options.INITIALIZED | (uint)Channel_Options.ENCRYPT_RDP | (uint)Channel_Options.ENCRYPT_SC | (uint)Channel_Options.ENCRYPT_CS | (uint)Channel_Options.PRI_HIGH | (uint)Channel_Options.PRI_MED | (uint)Channel_Options.PRI_LOW | (uint)Channel_Options.COMPRESS_RDP | (uint)Channel_Options.COMPRESS | (uint)Channel_Options.SHOW_PROTOCOL | (uint)Channel_Options.REMOTE_CONTROL_PERSISTENT; const uint negOptions = ~options; for (int i = 0; i < net.channelCount; i++) { site.CaptureRequirementIfIsTrue(((uint)net.channelDefArray[i].options & negOptions) == 0, 234, @"In Channel Definition Structure (CHANNEL_DEF), the options field can take one of the following values" + @" CHANNEL_OPTION_INITIALIZED 0x80000000, CHANNEL_OPTION_ENCRYPT_RDP 0x40000000, CHANNEL_OPTION_ENCRYPT_SC" + @" 0x20000000, CHANNEL_OPTION_ENCRYPT_CS 0x10000000, CHANNEL_OPTION_PRI_HIGH 0x08000000, CHANNEL_OPTION_PRI_MED" + @" 0x04000000,CHANNEL_OPTION_PRI_LOW 0x02000000, CHANNEL_OPTION_COMPRESS_RDP 0x00800000, CHANNEL_OPTION_COMPRESS" + @" 0x00400000, CHANNEL_OPTION_SHOW_PROTOCOL 0x00200000, REMOTE_CONTROL_PERSISTENT 0x00100000"); } }
/// <summary> /// Parse TS_UD_CS_NET /// (parser index is updated according to parsed length) /// </summary> /// <param name="data">data to be parsed</param> /// <param name="currentIndex">current parser index</param> /// <returns>TS_UD_CS_NET</returns> private TS_UD_CS_NET ParseTsUdCsNet(byte[] data, ref int currentIndex) { TS_UD_CS_NET netData = new TS_UD_CS_NET(); // TS_UD_CS_NET: Header netData.header.type = (TS_UD_HEADER_type_Values)ParseUInt16(data, ref currentIndex, false); netData.header.length = ParseUInt16(data, ref currentIndex, false); // TS_UD_SC_NET: channelCount netData.channelCount = ParseUInt32(data, ref currentIndex, false); // TS_UD_SC_NET: channelIdArray netData.channelDefArray = new List<CHANNEL_DEF>(); for (int i = 0; i < netData.channelCount; i++) { CHANNEL_DEF channelDef; byte[] name = GetBytes(data, ref currentIndex, 8); ASCIIEncoding converter = new ASCIIEncoding(); channelDef.name = converter.GetString(name) ; channelDef.options = (Channel_Options)ParseUInt32(data, ref currentIndex, false); netData.channelDefArray.Add(channelDef); } return netData; }