/// <summary> /// Update some members of context with the specified pdu. /// </summary> /// <param name="pdu">The sending or receiving pdu.</param> public void UpdateContext(StackPacket pdu) { lock (contextLock) { if (!isSwitchOn) { // Don't update context but wait for upper layer TSD to do so. return; } if (pdu.GetType() == typeof(Client_X_224_Connection_Request_Pdu)) { x224ConnectionRequestPdu = (Client_X_224_Connection_Request_Pdu)pdu.Clone(); } else if (pdu.GetType() == typeof(Server_X_224_Connection_Confirm_Pdu)) { x224ConnectionConfirmPdu = ((Server_X_224_Connection_Confirm_Pdu)pdu.Clone()).rdpNegData; } else if (pdu.GetType() == typeof(Server_X_224_Negotiate_Failure_Pdu)) { x224NegotiateFailurePdu = ((Server_X_224_Negotiate_Failure_Pdu)pdu.Clone()).rdpNegFailure; } else if (pdu.GetType() == typeof(Client_MCS_Connect_Initial_Pdu_with_GCC_Conference_Create_Request)) { mcsConnectInitialPdu = ((Client_MCS_Connect_Initial_Pdu_with_GCC_Conference_Create_Request) pdu.Clone()).mcsCi; } else if (pdu is Server_MCS_Connect_Response_Pdu_with_GCC_Conference_Create_Response) { mcsConnectResponsePdu = (Server_MCS_Connect_Response_Pdu_with_GCC_Conference_Create_Response) pdu.Clone(); serverRandom = RdpbcgrUtility.CloneByteArray(mcsConnectResponsePdu.mcsCrsp.gccPdu.serverSecurityData.serverRandom); ioChannelId = mcsConnectResponsePdu.mcsCrsp.gccPdu.serverNetworkData.MCSChannelId; if(mcsConnectResponsePdu.mcsCrsp.gccPdu.serverMessageChannelData != null) mcsMsgChannelId = mcsConnectResponsePdu.mcsCrsp.gccPdu.serverMessageChannelData.MCSChannelID; encryptionAlgorithm = new EncryptionAlgorithm(RdpEncryptionMethod); } else if (pdu.GetType() == typeof(Server_MCS_Attach_User_Confirm_Pdu)) { if (((Server_MCS_Attach_User_Confirm_Pdu)pdu).attachUserConfirm.initiator != null) { userChannelId = (ushort)((Server_MCS_Attach_User_Confirm_Pdu)pdu).attachUserConfirm.initiator.Value; } } else if (pdu.GetType() == typeof(Client_Security_Exchange_Pdu)) { securityExchangePdu = (Client_Security_Exchange_Pdu)pdu.Clone(); clientRandom = RdpbcgrUtility.CloneByteArray( ((Client_Security_Exchange_Pdu)pdu).securityExchangePduData.clientRandom); GenerateSessionKey(); } else if (pdu.GetType() == typeof(Client_Info_Pdu)) { clientInfo = ((Client_Info_Pdu)pdu.Clone()).infoPacket; if (clientInfo != null && (clientInfo.flags & flags_Values.INFO_COMPRESSION) == flags_Values.INFO_COMPRESSION) { ioDecompressor = new Decompressor(SlidingWindowSize.EightKB); ioCompressor = new Compressor(SlidingWindowSize.EightKB); } isWaitingLicenseErrorPdu = true; } else if (pdu.GetType() == typeof(Server_Auto_Detect_Request_PDU)) { NETWORK_DETECTION_REQUEST requestData = ((Server_Auto_Detect_Request_PDU)pdu).autoDetectReqData.Clone(); if (requestData.requestType == AUTO_DETECT_REQUEST_TYPE.RDP_RTT_REQUEST_IN_CONNECTTIME || requestData.requestType == AUTO_DETECT_REQUEST_TYPE.RDP_RTT_REQUEST_AFTER_CONNECTTIME) { RDP_RTT_REQUEST rttRequest = (RDP_RTT_REQUEST)requestData; rttRequest.sendTime = DateTime.Now; this.serverAutoDetectRequestData.Add(rttRequest.sequenceNumber, rttRequest); } } else if (pdu.GetType() == typeof(Client_Auto_Detect_Response_PDU)) { clientAutoDetectResponsePdu = (Client_Auto_Detect_Response_PDU)pdu.Clone(); NETWORK_DETECTION_RESPONSE responseData = clientAutoDetectResponsePdu.autodetectRspPduData; if (responseData.responseType == AUTO_DETECT_RESPONSE_TYPE.RDP_RTT_RESPONSE) { RDP_RTT_REQUEST rttRequest = (RDP_RTT_REQUEST)serverAutoDetectRequestData[responseData.sequenceNumber]; if (rttRequest != null) { TimeSpan interval = DateTime.Now - rttRequest.sendTime; this.autoDetectedRTTList.Add((uint)interval.TotalMilliseconds); serverAutoDetectRequestData.Remove(responseData.sequenceNumber); } } else if (responseData.responseType == AUTO_DETECT_RESPONSE_TYPE.RDP_BW_RESULTS_AFTER_CONNECT || responseData.responseType == AUTO_DETECT_RESPONSE_TYPE.RDP_BW_RESULTS_DURING_CONNECT) { RDP_BW_RESULTS bwResult = (RDP_BW_RESULTS)responseData; if(bwResult.timeDelta != 0) this.autoDetectedBandwidth = (uint)(bwResult.byteCount / bwResult.timeDelta); } else if (responseData.responseType == AUTO_DETECT_RESPONSE_TYPE.RDP_NETCHAR_SYNC) { RDP_NETCHAR_SYNC netSync = (RDP_NETCHAR_SYNC)responseData; this.autoDetectedRTTList.Add(netSync.rtt); this.autoDetectedBandwidth = netSync.bandwidth; } } else if (pdu.GetType() == typeof(Server_License_Error_Pdu_Valid_Client)) { licenseErrorPdu = (Server_License_Error_Pdu_Valid_Client)pdu.Clone(); serverChannelId = licenseErrorPdu.commonHeader.initiator; } else if (pdu.GetType() == typeof(Server_Initiate_Multitransport_Request_PDU)) { Server_Initiate_Multitransport_Request_PDU requestPDU = (Server_Initiate_Multitransport_Request_PDU)pdu; serverInitiateMultitransportRequestPduDictionary.Add(requestPDU.requestId, requestPDU); } else if (pdu.GetType() == typeof(Client_Initiate_Multitransport_Response_PDU)) { clientInitiateMultitransportResponsePdu = (Client_Initiate_Multitransport_Response_PDU)pdu; } else if (pdu.GetType() == typeof(Server_Demand_Active_Pdu)) { serverChannelId = ((Server_Demand_Active_Pdu)pdu.Clone()).commonHeader.initiator; demandActivePdu = ((Server_Demand_Active_Pdu)pdu.Clone()).demandActivePduData; } else if (pdu.GetType() == typeof(Client_Confirm_Active_Pdu)) { comfirmActivePdu = ((Client_Confirm_Active_Pdu)pdu.Clone()).confirmActivePduData; if (channelManager == null) { channelManager = new ServerStaticVirtualChannelManager(this); } } else if (pdu.GetType() == typeof(MCS_Disconnect_Provider_Ultimatum_Server_Pdu)) { lastDisconnectReason = (int)((MCS_Disconnect_Provider_Ultimatum_Server_Pdu) pdu).disconnectProvider.reason.Value; } else if (pdu.GetType() == typeof(MCS_Disconnect_Provider_Ultimatum_Pdu)) { lastDisconnectReason = (int)((MCS_Disconnect_Provider_Ultimatum_Pdu) pdu).disconnectProvider.reason.Value; } else if (pdu.GetType() == typeof(Server_Set_Error_Info_Pdu)) { lastErrorInfo = ((Server_Set_Error_Info_Pdu)pdu).errorInfoPduData.errorInfo; } else if (pdu.GetType() == typeof(Server_Status_Info_Pdu)) { lastStatusInfo = ((Server_Status_Info_Pdu)pdu).statusCode; } else if (pdu.GetType() == typeof(Server_Save_Session_Info_Pdu)) { Server_Save_Session_Info_Pdu saveSessionInfoPdu = (Server_Save_Session_Info_Pdu)pdu.Clone(); switch (saveSessionInfoPdu.saveSessionInfoPduData.infoType) { case infoType_Values.INFOTYPE_LOGON: logonInfoV1 = (TS_LOGON_INFO)saveSessionInfoPdu.saveSessionInfoPduData.infoData; break; case infoType_Values.INFOTYPE_LOGON_LONG: logonInfoV2 = (TS_LOGON_INFO_VERSION_2)saveSessionInfoPdu.saveSessionInfoPduData.infoData; break; case infoType_Values.INFOTYPE_LOGON_EXTENDED_INF: TS_LOGON_INFO_EXTENDED infoExtended = (TS_LOGON_INFO_EXTENDED)saveSessionInfoPdu.saveSessionInfoPduData.infoData; switch (infoExtended.FieldsPresent) { case FieldsPresent_Values.LOGON_EX_AUTORECONNECTCOOKIE | FieldsPresent_Values.LOGON_EX_LOGONERRORS: autoReconnectCookie = (ARC_SC_PRIVATE_PACKET)infoExtended.LogonFields[0].FieldData; logonErrorsInfo = (TS_LOGON_ERRORS_INFO)infoExtended.LogonFields[1].FieldData; break; case FieldsPresent_Values.LOGON_EX_AUTORECONNECTCOOKIE: autoReconnectCookie = (ARC_SC_PRIVATE_PACKET)infoExtended.LogonFields[0].FieldData; break; case FieldsPresent_Values.LOGON_EX_LOGONERRORS: logonErrorsInfo = (TS_LOGON_ERRORS_INFO)infoExtended.LogonFields[0].FieldData; break; default: break; } break; default: break; } } } }
/// <summary> /// Decode a Client Initiate Multitransport Response PDU /// </summary> /// <param name="data"></param> /// <param name="decryptedUserData"></param> /// <param name="type"></param> /// <returns></returns> public StackPacket DecodeClientInitiateMultitransportResponsePDU(byte[] data, byte[] decryptedUserData, SecurityHeaderType type) { Client_Initiate_Multitransport_Response_PDU pdu = new Client_Initiate_Multitransport_Response_PDU(); int dataIndex = 0; pdu.commonHeader = ParseMcsCommonHeader(data, ref dataIndex, type); int userDataIndex = 0; pdu.requestId = ParseUInt32(decryptedUserData, ref userDataIndex, false); pdu.hrResponse = (HrResponse_Value)ParseUInt32(decryptedUserData, ref userDataIndex, false); // ETW Provider Dump Message if (pdu.commonHeader.securityHeader != null) { // RDP Standard Security string messageName = "RDPBCGR:" + pdu.GetType().Name; ExtendedLogger.DumpMessage(messageName, RdpbcgrUtility.DumpLevel_Layer3, pdu.GetType().Name, decryptedUserData); } // Check if data length exceeded expectation VerifyDataLength(decryptedUserData.Length, userDataIndex, ConstValue.ERROR_MESSAGE_DATA_LENGTH_EXCEEDED); return pdu; }
/// <summary> /// Verify Client Initiate Multitransport Response PDU /// </summary> /// <param name="multitransportResponsePdu">Client Initiate Multitransport Response PDU</param> /// <param name="expectedRequestId">Expected requestId</param> /// <param name="value">Expected response value</param> private void VerifyClientInitiateMultitransportResponsePDU(Client_Initiate_Multitransport_Response_PDU multitransportResponsePdu, uint expectedRequestId, HrResponse_Value value = HrResponse_Value.E_ABORT) { if (multitransportResponsePdu == null) { Site.Assert.Fail("Not get Client Initiate Multitransport Error PDU"); } Site.Assert.AreEqual(expectedRequestId, multitransportResponsePdu.requestId, "Expected request id is {0}, but request id in received Multitransport Error Pdu is {1}.", expectedRequestId, multitransportResponsePdu.requestId); Site.Assert.AreEqual(value, multitransportResponsePdu.hrResponse, "hrResponse field must be {0}", value); }
public override StackPacket Clone() { Client_Initiate_Multitransport_Response_PDU errorPDU = new Client_Initiate_Multitransport_Response_PDU(context); errorPDU.commonHeader = commonHeader.Clone(); errorPDU.requestId = requestId; errorPDU.hrResponse = hrResponse; return errorPDU; }