boolean rdp_client_connect_demand_active(rdpRdp* rdp, STREAM* s) { uint8* mark; uint16 width; uint16 height; width = rdp->settings->width; height = rdp->settings->height; stream_get_mark(s, mark); if (!rdp_recv_demand_active(rdp, s)) { stream_set_mark(s, mark); stream_seek(s, RDP_PACKET_HEADER_LENGTH); if (rdp_recv_out_of_sequence_pdu(rdp, s) != True) return False; return True; } if (!rdp_send_confirm_active(rdp)) return False; /** * The server may request a different desktop size during Deactivation-Reactivation sequence. * In this case, the UI should be informed and do actual window resizing at this point. */ if (width != rdp->settings->width || height != rdp->settings->height) { IFCALL(rdp->update->DesktopResize, rdp->update); } /** * [MS-RDPBCGR] 1.3.1.1 - 8. * The client-to-server PDUs sent during this phase have no dependencies on any of the server-to- * client PDUs; they may be sent as a single batch, provided that sequencing is maintained. */ if (!rdp_send_client_synchronize_pdu(rdp)) return False; if (!rdp_send_client_control_pdu(rdp, CTRLACTION_COOPERATE)) return False; if (!rdp_send_client_control_pdu(rdp, CTRLACTION_REQUEST_CONTROL)) return False; if (!rdp_send_client_persistent_key_list_pdu(rdp)) return False; if (!rdp_send_client_font_list_pdu(rdp, FONTLIST_FIRST | FONTLIST_LAST)) return False; rdp->state = CONNECTION_STATE_ACTIVE; update_reset_state(rdp->update); return True; }
tbool rdp_client_connect_demand_active(rdpRdp* rdp, STREAM* s) { uint8* mark; uint16 width; uint16 height; uint16 channelId; width = rdp->settings->width; height = rdp->settings->height; stream_get_mark(s, mark); if (!rdp_recv_demand_active(rdp, s)) { stream_set_mark(s, mark); rdp_recv_get_active_header(rdp, s, &channelId); /* Was stream_seek(s, RDP_PACKET_HEADER_MAX_LENGTH); * but the headers aren't always that length, * so that could result in a bad offset. */ if (rdp_recv_out_of_sequence_pdu(rdp, s) == false) return false; return true; } if (rdp->disconnect) return true; if (!rdp_send_confirm_active(rdp)) return false; input_register_client_callbacks(rdp->input); /** * The server may request a different desktop size during Deactivation-Reactivation sequence. * In this case, the UI should be informed and do actual window resizing at this point. */ if (width != rdp->settings->width || height != rdp->settings->height) { IFCALL(rdp->update->DesktopResize, rdp->update->context); } rdp->state = CONNECTION_STATE_FINALIZATION; update_reset_state(rdp->update); rdp_client_connect_finalize(rdp); return true; }
BOOL rdp_client_connect_demand_active(rdpRdp* rdp, wStream* s) { BYTE* mark; UINT16 width; UINT16 height; width = rdp->settings->DesktopWidth; height = rdp->settings->DesktopHeight; Stream_GetPointer(s, mark); if (!rdp_recv_demand_active(rdp, s)) { UINT16 channelId; Stream_SetPointer(s, mark); rdp_recv_get_active_header(rdp, s, &channelId); /* Was Stream_Seek(s, RDP_PACKET_HEADER_MAX_LENGTH); * but the headers aren't always that length, * so that could result in a bad offset. */ if (rdp_recv_out_of_sequence_pdu(rdp, s) != TRUE) return FALSE; return TRUE; } if (rdp->disconnect) return TRUE; if (!rdp_send_confirm_active(rdp)) return FALSE; input_register_client_callbacks(rdp->input); /** * The server may request a different desktop size during Deactivation-Reactivation sequence. * In this case, the UI should be informed and do actual window resizing at this point. */ if (width != rdp->settings->DesktopWidth || height != rdp->settings->DesktopHeight) { IFCALL(rdp->update->DesktopResize, rdp->update->context); } rdp->state = CONNECTION_STATE_FINALIZATION; update_reset_state(rdp->update); return rdp_client_connect_finalize(rdp); }
boolean rdp_server_accept_confirm_active(rdpRdp* rdp, STREAM* s) { if (!rdp_recv_confirm_active(rdp, s)) return false; rdp->state = CONNECTION_STATE_ACTIVE; update_reset_state(rdp->update); if (!rdp_send_server_synchronize_pdu(rdp)) return false; if (!rdp_send_server_control_cooperate_pdu(rdp)) return false; return true; }
BOOL rdp_server_accept_confirm_active(rdpRdp* rdp, wStream* s) { if (!rdp_recv_confirm_active(rdp, s)) return FALSE; rdp->state = CONNECTION_STATE_ACTIVE; update_reset_state(rdp->update); if (!rdp_send_server_synchronize_pdu(rdp)) return FALSE; if (!rdp_send_server_control_cooperate_pdu(rdp)) return FALSE; return TRUE; }
boolean rdp_server_accept_confirm_active(rdpRdp* rdp, STREAM* s) { /** * During reactivation sequence the client might sent some input before receiving * the Deactivate All PDU. We need to ignore those noises here. */ if (!rdp_recv_confirm_active(rdp, s)) return True; rdp->state = CONNECTION_STATE_ACTIVE; update_reset_state(rdp->update); if (!rdp_send_server_synchronize_pdu(rdp)) return False; if (!rdp_send_server_control_cooperate_pdu(rdp)) return False; return True; }
int rdp_client_transition_to_state(rdpRdp* rdp, int state) { int status = 0; switch (state) { case CONNECTION_STATE_INITIAL: rdp->state = CONNECTION_STATE_INITIAL; break; case CONNECTION_STATE_NEGO: rdp->state = CONNECTION_STATE_NEGO; break; case CONNECTION_STATE_MCS_CONNECT: rdp->state = CONNECTION_STATE_MCS_CONNECT; break; case CONNECTION_STATE_MCS_ERECT_DOMAIN: rdp->state = CONNECTION_STATE_MCS_ERECT_DOMAIN; break; case CONNECTION_STATE_MCS_ATTACH_USER: rdp->state = CONNECTION_STATE_MCS_ATTACH_USER; break; case CONNECTION_STATE_MCS_CHANNEL_JOIN: rdp->state = CONNECTION_STATE_MCS_CHANNEL_JOIN; break; case CONNECTION_STATE_RDP_SECURITY_COMMENCEMENT: rdp->state = CONNECTION_STATE_RDP_SECURITY_COMMENCEMENT; break; case CONNECTION_STATE_SECURE_SETTINGS_EXCHANGE: rdp->state = CONNECTION_STATE_SECURE_SETTINGS_EXCHANGE; break; case CONNECTION_STATE_CONNECT_TIME_AUTO_DETECT: rdp->state = CONNECTION_STATE_CONNECT_TIME_AUTO_DETECT; break; case CONNECTION_STATE_LICENSING: rdp->state = CONNECTION_STATE_LICENSING; break; case CONNECTION_STATE_MULTITRANSPORT_BOOTSTRAPPING: rdp->state = CONNECTION_STATE_MULTITRANSPORT_BOOTSTRAPPING; break; case CONNECTION_STATE_CAPABILITIES_EXCHANGE: rdp->state = CONNECTION_STATE_CAPABILITIES_EXCHANGE; break; case CONNECTION_STATE_FINALIZATION: rdp->state = CONNECTION_STATE_FINALIZATION; update_reset_state(rdp->update); rdp->finalize_sc_pdus = 0; break; case CONNECTION_STATE_ACTIVE: rdp->state = CONNECTION_STATE_ACTIVE; break; default: status = -1; break; } return status; }
int rdp_server_transition_to_state(rdpRdp* rdp, int state) { int status = 0; freerdp_peer* client = NULL; if (rdp->state >= CONNECTION_STATE_RDP_SECURITY_COMMENCEMENT) client = rdp->context->peer; if (rdp->state < CONNECTION_STATE_ACTIVE) { if (client) client->activated = FALSE; } switch (state) { case CONNECTION_STATE_INITIAL: rdp->state = CONNECTION_STATE_INITIAL; break; case CONNECTION_STATE_NEGO: rdp->state = CONNECTION_STATE_NEGO; break; case CONNECTION_STATE_MCS_CONNECT: rdp->state = CONNECTION_STATE_MCS_CONNECT; break; case CONNECTION_STATE_MCS_ERECT_DOMAIN: rdp->state = CONNECTION_STATE_MCS_ERECT_DOMAIN; break; case CONNECTION_STATE_MCS_ATTACH_USER: rdp->state = CONNECTION_STATE_MCS_ATTACH_USER; break; case CONNECTION_STATE_MCS_CHANNEL_JOIN: rdp->state = CONNECTION_STATE_MCS_CHANNEL_JOIN; break; case CONNECTION_STATE_RDP_SECURITY_COMMENCEMENT: rdp->state = CONNECTION_STATE_RDP_SECURITY_COMMENCEMENT; break; case CONNECTION_STATE_SECURE_SETTINGS_EXCHANGE: rdp->state = CONNECTION_STATE_SECURE_SETTINGS_EXCHANGE; break; case CONNECTION_STATE_CONNECT_TIME_AUTO_DETECT: rdp->state = CONNECTION_STATE_CONNECT_TIME_AUTO_DETECT; break; case CONNECTION_STATE_LICENSING: rdp->state = CONNECTION_STATE_LICENSING; break; case CONNECTION_STATE_MULTITRANSPORT_BOOTSTRAPPING: rdp->state = CONNECTION_STATE_MULTITRANSPORT_BOOTSTRAPPING; break; case CONNECTION_STATE_CAPABILITIES_EXCHANGE: rdp->state = CONNECTION_STATE_CAPABILITIES_EXCHANGE; rdp->AwaitCapabilities = FALSE; break; case CONNECTION_STATE_FINALIZATION: rdp->state = CONNECTION_STATE_FINALIZATION; rdp->finalize_sc_pdus = 0; break; case CONNECTION_STATE_ACTIVE: rdp->state = CONNECTION_STATE_ACTIVE; update_reset_state(rdp->update); if (client) { if (!client->connected) { /** * PostConnect should only be called once and should not * be called after a reactivation sequence. */ IFCALLRET(client->PostConnect, client->connected, client); if (!client->connected) return -1; } IFCALLRET(client->Activate, client->activated, client); if (!client->activated) return -1; } break; default: status = -1; break; } return status; }