/// <summary> /// Parse TS_UD_CS_CORE /// (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_CORE</returns> private TS_UD_CS_CORE ParseTsUdCsCore(byte[] data, ref int currentIndex, int length) { int endIndex = currentIndex + length - 1; TS_UD_CS_CORE coreData = new TS_UD_CS_CORE(); coreData.header.type = (TS_UD_HEADER_type_Values)ParseUInt16(data, ref currentIndex, false); coreData.header.length = ParseUInt16(data, ref currentIndex, false); coreData.version = (version_Values)ParseUInt32(data, ref currentIndex, false); coreData.desktopWidth = ParseUInt16(data, ref currentIndex, false); coreData.desktopHeight = ParseUInt16(data, ref currentIndex, false); coreData.colorDepth = (colorDepth_Values)ParseUInt16(data, ref currentIndex, false); coreData.SASSequence = ParseUInt16(data, ref currentIndex, false); coreData.keyboardLayout = ParseUInt32(data, ref currentIndex, false); coreData.clientBuild = ParseUInt32(data, ref currentIndex, false); coreData.clientName = ParseString(data, ref currentIndex, 32); coreData.keyboardType = (keyboardType_Values)ParseUInt32(data, ref currentIndex, false); coreData.keyboardSubType = ParseUInt32(data, ref currentIndex, false); coreData.keyboardFunctionKey = ParseUInt32(data, ref currentIndex, false); coreData.imeFileName = ParseString(data, ref currentIndex, 64); //below fields are optional fields, verify the length before parsing. if(currentIndex < endIndex) coreData.postBeta2ColorDepth = new UInt16Class(ParseUInt16(data, ref currentIndex, false)); if (currentIndex < endIndex) coreData.clientProductId = new UInt16Class(ParseUInt16(data, ref currentIndex, false)); if (currentIndex < endIndex) coreData.serialNumber = new UInt32Class(ParseUInt32(data, ref currentIndex, false)); if (currentIndex < endIndex) coreData.highColorDepth = new UInt16Class(ParseUInt16(data, ref currentIndex, false)); if (currentIndex < endIndex) coreData.supportedColorDepths = new UInt16Class(ParseUInt16(data, ref currentIndex, false)); if (currentIndex < endIndex) coreData.earlyCapabilityFlags = new UInt16Class(ParseUInt16(data, ref currentIndex, false)); if (currentIndex < endIndex) coreData.clientDigProductId = ParseString(data, ref currentIndex, 64); if (currentIndex < endIndex) coreData.connnectionType = new ByteClass(ParseByte(data, ref currentIndex)); if (currentIndex < endIndex) coreData.pad1octets = new ByteClass(ParseByte(data, ref currentIndex)); if (currentIndex < endIndex) coreData.serverSelectedProtocol = new UInt32Class(ParseUInt32(data, ref currentIndex, false)); if (currentIndex < endIndex) coreData.desktopPhysicalWidth = new UInt32Class(ParseUInt32(data, ref currentIndex, false)); if (currentIndex < endIndex) coreData.desktopPhysicalHeight = new UInt32Class(ParseUInt32(data, ref currentIndex, false)); if (currentIndex < endIndex) coreData.desktopOrientation = (TS_UD_CS_CORE_desktopOrientation_values)ParseUInt16(data, ref currentIndex, false); if (currentIndex < endIndex) coreData.desktopScaleFactor = new UInt32Class(ParseUInt32(data, ref currentIndex, false)); if (currentIndex < endIndex) coreData.deviceScaleFactor = new UInt32Class(ParseUInt32(data, ref currentIndex, false)); return coreData; }
public void VerifyStructure(TS_UD_CS_CORE core) { Site.CaptureRequirementIfIsTrue(core.header.type == TS_UD_HEADER_type_Values.CS_CORE, 93, "In Client Core Data, The User Data Header type field MUST be set to CS_CORE (0xC001)."); //<capture> also capture 97 Site.CaptureRequirementIfIsTrue(core.version == version_Values.V1 || core.version == version_Values.V2 || core.version == version_Values.V3 || core.version == version_Values.V4 || core.version == version_Values.V5, 98, "In Client Core Data, for RDP 4.0 clients, the major version number will be 0x00080001."); Site.CaptureRequirementIfIsTrue(core.desktopWidth >= 0, 100, "In Client Core Data, desktopWidth must be positive."); Site.CaptureRequirementIfIsTrue(core.desktopHeight >= 0, 103, "In Client Core Data, desktopHeight must be positive."); Site.CaptureRequirementIfIsTrue((int)core.colorDepth == 51712 || core.colorDepth == colorDepth_Values.RNS_UD_COLOR_8BPP, 107, "In Client Core Data (TS_UD_CS_CORE), colorDepth (2 bytes): colorDepth field can have the following " + @"values :\r\n1.RNS_UD_COLOR_4BPP 0xCA00.\r\n2.RNS_UD_COLOR_8BPP 0xCA01."); Site.CaptureRequirementIfIsTrue(core.SASSequence == 0xAA03, 111, "In Client Core Data, SASSequence SHOULD be set to RNS_UD_SAS_DEL (0xAA03)."); Site.CaptureRequirementIfIsTrue(core.clientName.Length <= 15, 118, "In Client Core Data, clientName field contains up to 15 Unicode characters plus a null terminator."); Site.CaptureRequirementIfIsTrue(core.keyboardType >= keyboardType_Values.None && core.keyboardType <= keyboardType_Values.V7, 120, "In Client Core Data, keyboardType can take one of the following values:"); Site.CaptureRequirementIfIsTrue(core.imeFileName.Length <= 31, 133, "In Client Core Data, the imeFileName field contains up to 31 Unicode characters plus a null terminator."); bool isR136Satisfied = (postBeta2ColorDepth_Values)core.postBeta2ColorDepth.actualData == postBeta2ColorDepth_Values.RNS_UD_COLOR_4BPP || (postBeta2ColorDepth_Values)core.postBeta2ColorDepth.actualData == postBeta2ColorDepth_Values.RNS_UD_COLOR_8BPP || (postBeta2ColorDepth_Values)core.postBeta2ColorDepth.actualData == postBeta2ColorDepth_Values.RNS_UD_COLOR_16BPP_555 || (postBeta2ColorDepth_Values)core.postBeta2ColorDepth.actualData == postBeta2ColorDepth_Values.RNS_UD_COLOR_16BPP_565 || (postBeta2ColorDepth_Values)core.postBeta2ColorDepth.actualData == postBeta2ColorDepth_Values.RNS_UD_COLOR_24BPP; site.CaptureRequirementIfIsTrue(isR136Satisfied, 136, @"In Client Core Data, postBeta2ColorDepth can take one of the following values: RNS_UD_COLOR_4BPP 0xCA00," + @" RNS_UD_COLOR_8BPP 0xCA01, RNS_UD_COLOR_16BPP_555 0xCA02, RNS_UD_COLOR_16BPP_565 0xCA03, RNS_UD_COLOR_24BPP 0xCA04"); Site.CaptureRequirementIfIsTrue((int)core.clientProductId.actualData == 1, 145, "In Client Core Data, clientProductId SHOULD be initialized to 1."); Site.CaptureRequirementIfAreEqual<int>(0, (int)core.serialNumber.actualData, 149, "In Client Core Data, serialNumber SHOULD be initialized to 0. "); bool isR154Satisfied = (highColorDepth_Values)core.highColorDepth.actualData == highColorDepth_Values.V1 || (highColorDepth_Values)core.highColorDepth.actualData == highColorDepth_Values.V2 || (highColorDepth_Values)core.highColorDepth.actualData == highColorDepth_Values.V3 || (highColorDepth_Values)core.highColorDepth.actualData == highColorDepth_Values.V4 || (highColorDepth_Values)core.highColorDepth.actualData == highColorDepth_Values.V5; site.CaptureRequirementIfIsTrue(isR154Satisfied, 154, @"In Client Core Data, highColorDepth can have one of the following values 4,8,15,16,24"); site.CaptureRequirementIfIsTrue(core.supportedColorDepths.actualData <= 15, 164, @"In Client Core Data, supportedColorDepths can have one of the following values RNS_UD_24BPP_SUPPORT 0x0001, " + @"RNS_UD_16BPP_SUPPORT 0x0002, RNS_UD_15BPP_SUPPORT 0x0004, RNS_UD_32BPP_SUPPORT 0x0008"); ushort earlyCapabilityFlags = (ushort)earlyCapabilityFlags_Values.RNS_UD_CS_SUPPORT_ERRINFO_PDU | (ushort)earlyCapabilityFlags_Values.RNS_UD_CS_WANT_32BPP_SESSION | (ushort)earlyCapabilityFlags_Values.RNS_UD_CS_SUPPORT_STATUSINFO_PDU | (ushort)earlyCapabilityFlags_Values.RNS_UD_CS_STRONG_ASYMMETRIC_KEYS | (ushort)earlyCapabilityFlags_Values.RNS_UD_CS_UNUSED | (ushort)earlyCapabilityFlags_Values.RNS_UD_CS_VALID_CONNECTION_TYPE | (ushort)earlyCapabilityFlags_Values.RNS_UD_CS_SUPPORT_MONITOR_LAYOUT_PDU | (ushort)earlyCapabilityFlags_Values.RNS_UD_CS_SUPPORT_NETWORK_AUTODETECT | (ushort)earlyCapabilityFlags_Values.RNS_UD_CS_SUPPORT_DYNVC_GFX_PROTOCOL | (ushort)earlyCapabilityFlags_Values.RNS_UD_CS_SUPPORT_DYNAMIC_TIME_ZONE | (ushort)earlyCapabilityFlags_Values.RNS_UD_CS_SUPPORT_HEARTBEAT_PDU; ushort negEarlyCapabilityFlags = (ushort)~earlyCapabilityFlags; bool isR173Satisfy = ((ushort)core.earlyCapabilityFlags.actualData & negEarlyCapabilityFlags) == 0; site.CaptureRequirementIfIsTrue(isR173Satisfy, 173, @"[In Client Core Data (TS_UD_CS_CORE)] earlyCapabilityFlags (2 bytes):In Client Core Data, the earlyCapabilityFlags" + @" can be any of the following values: RNS_UD_CS_SUPPORT_ERRINFO_PDU 0x0001, RNS_UD_CS_WANT_32BPP_SESSION 0x0002, " + @"RNS_UD_CS_SUPPORT_STATUSINFO_PDU 0x0004, RNS_UD_CS_STRONG_ASYMMETRIC_KEYS 0x0008, RNS_UD_CS_VALID_CONNECTION_TYPE" + @" 0x0020, RNS_UD_CS_SUPPORT_MONITOR_LAYOUT_PDU 0x0040"); }
public ConnectGCC() { clientCoreData = new TS_UD_CS_CORE(); clientSecurityData = new TS_UD_CS_SEC(); }