// Sending Server Announce Request. private void SendServerPDUOverDVC(PacketId_Values packetType, uint?clientId = null) { RdpefsPDU pdu = null; switch (packetType) { case PacketId_Values.PAKID_CORE_SERVER_ANNOUNCE: pdu = CreateServerAnnounceReqest(); break; case PacketId_Values.PAKID_CORE_SERVER_CAPABILITY: pdu = CreateServerCoreCapabilityRequest(); break; case PacketId_Values.PAKID_CORE_CLIENTID_CONFIRM: pdu = CreateServerClientIdConfirm(clientId); break; case PacketId_Values.PAKID_CORE_USER_LOGGEDON: pdu = new DR_CORE_USER_LOGGEDON(); break; } if (pdu != null && rdpefsServer != null) { rdpefsServer.SendRdpefsPdu(pdu); } else { throw new InvalidOperationException("The sending pdu type is null: " + packetType.ToString()); } }
private void OnDataReceived(byte[] data, uint channelId) { lock (receivedList) { RdpefsPDU pdu = new RdpefsPDU(); bool fSucceed = false; bool fResult = PduMarshaler.Unmarshal(data, pdu); if (fResult) { if (pdu.Header.PacketId == PacketId_Values.PAKID_CORE_CLIENTID_CONFIRM) { // Header(4) + VersionMajor(2) + VersionMinor(2) + ClientId(4) = 12 DR_CORE_CLIENT_ANNOUNCE_RSP response = new DR_CORE_CLIENT_ANNOUNCE_RSP(); if (PduMarshaler.Unmarshal(data, response)) { receivedList.Add(response); } } else if (pdu.Header.PacketId == PacketId_Values.PAKID_CORE_CLIENT_NAME) { // Header(4) + UnicodeFlag(4) + CodePage(4) + ComputerNameLen(4) + ComputerNmae(ComputerNameLen) DR_CORE_CLIENT_NAME_REQ request = new DR_CORE_CLIENT_NAME_REQ(); if (PduMarshaler.Unmarshal(data, request)) { receivedList.Add(request); } } else if (pdu.Header.PacketId == PacketId_Values.PAKID_CORE_CLIENT_CAPABILITY) { // Header(4) + numCapabilities(2) + Padding(2) + CapabilityMessage(numCapabilities * CAPABILITE_SET) DR_CORE_CAPABILITY_RSP response = new DR_CORE_CAPABILITY_RSP(); if (PduMarshaler.Unmarshal(data, response)) { receivedList.Add(response); } } else if (pdu.Header.PacketId == PacketId_Values.PAKID_CORE_DEVICELIST_ANNOUNCE) { // Header(4) + DeviceCount(4) + DeviceList(DeviceCount * DEVICE_ANNONUNCE) DR_CORE_DEVICELIST_ANNOUNCE_REQ request = new DR_CORE_DEVICELIST_ANNOUNCE_REQ(); if (PduMarshaler.Unmarshal(data, request)) { receivedList.Add(request); } } } if (!fSucceed || !fResult) { RdpefsUnknownPdu unknown = new RdpefsUnknownPdu(); if (PduMarshaler.Unmarshal(data, unknown)) { receivedList.Add(unknown); } } } }
/// <summary> /// Send EFS PDU. /// </summary> /// <param name="pdu">the PDU sent to Client</param> public void SendRdpefsPdu(RdpefsPDU pdu) { byte[] data = PduMarshaler.Marshal(pdu); if (rdpefsDVC == null) { throw new InvalidOperationException("DVC instance of RDPEFS is null, Dynamic virtual channel must be created before sending data."); } //Will send compressed packet with "true" as parameter: rdpefsDVC.Send(data, true); rdpefsDVC.Send(data); }