int rts_command_length(rdpRpc* rpc, UINT32 CommandType, BYTE* buffer, UINT32 length) { int CommandLength = 0; switch (CommandType) { case RTS_CMD_RECEIVE_WINDOW_SIZE: CommandLength = RTS_CMD_RECEIVE_WINDOW_SIZE_LENGTH; break; case RTS_CMD_FLOW_CONTROL_ACK: CommandLength = RTS_CMD_FLOW_CONTROL_ACK_LENGTH; break; case RTS_CMD_CONNECTION_TIMEOUT: CommandLength = RTS_CMD_CONNECTION_TIMEOUT_LENGTH; break; case RTS_CMD_COOKIE: CommandLength = RTS_CMD_COOKIE_LENGTH; break; case RTS_CMD_CHANNEL_LIFETIME: CommandLength = RTS_CMD_CHANNEL_LIFETIME_LENGTH; break; case RTS_CMD_CLIENT_KEEPALIVE: CommandLength = RTS_CMD_CLIENT_KEEPALIVE_LENGTH; break; case RTS_CMD_VERSION: CommandLength = RTS_CMD_VERSION_LENGTH; break; case RTS_CMD_EMPTY: CommandLength = RTS_CMD_EMPTY_LENGTH; break; case RTS_CMD_PADDING: /* variable-size */ CommandLength = rts_padding_command_read(rpc, buffer, length); break; case RTS_CMD_NEGATIVE_ANCE: CommandLength = RTS_CMD_NEGATIVE_ANCE_LENGTH; break; case RTS_CMD_ANCE: CommandLength = RTS_CMD_ANCE_LENGTH; break; case RTS_CMD_CLIENT_ADDRESS: /* variable-size */ CommandLength = rts_client_address_command_read(rpc, buffer, length); break; case RTS_CMD_ASSOCIATION_GROUP_ID: CommandLength = RTS_CMD_ASSOCIATION_GROUP_ID_LENGTH; break; case RTS_CMD_DESTINATION: CommandLength = RTS_CMD_DESTINATION_LENGTH; break; case RTS_CMD_PING_TRAFFIC_SENT_NOTIFY: CommandLength = RTS_CMD_PING_TRAFFIC_SENT_NOTIFY_LENGTH; break; default: WLog_ERR(TAG, "Error: Unknown RTS Command Type: 0x%x", CommandType); return -1; break; } return CommandLength; }
int rts_recv_pdu_commands(rdpRpc* rpc, RTS_PDU* rts_pdu) { int i; STREAM* s; UINT32 CommandType; DEBUG_RTS("numberOfCommands:%d", rts_pdu->header.numberOfCommands); if (rts_pdu->header.flags & RTS_FLAG_PING) { rts_send_keep_alive_pdu(rpc); return 0; } s = stream_new(0); stream_attach(s, rts_pdu->content, rts_pdu->header.frag_length); for (i = 0; i < rts_pdu->header.numberOfCommands; i++) { stream_read_UINT32(s, CommandType); /* CommandType (4 bytes) */ DEBUG_RTS("CommandType: %s (0x%08X)", RTS_CMD_STRINGS[CommandType % 14], CommandType); switch (CommandType) { case RTS_CMD_RECEIVE_WINDOW_SIZE: rts_receive_window_size_command_read(rpc, s); break; case RTS_CMD_FLOW_CONTROL_ACK: rts_flow_control_ack_command_read(rpc, s); break; case RTS_CMD_CONNECTION_TIMEOUT: rts_connection_timeout_command_read(rpc, s); break; case RTS_CMD_COOKIE: rts_cookie_command_read(rpc, s); break; case RTS_CMD_CHANNEL_LIFETIME: rts_channel_lifetime_command_read(rpc, s); break; case RTS_CMD_CLIENT_KEEPALIVE: rts_client_keepalive_command_read(rpc, s); break; case RTS_CMD_VERSION: rts_version_command_read(rpc, s); break; case RTS_CMD_EMPTY: rts_empty_command_read(rpc, s); break; case RTS_CMD_PADDING: rts_padding_command_read(rpc, s); break; case RTS_CMD_NEGATIVE_ANCE: rts_negative_ance_command_read(rpc, s); break; case RTS_CMD_ANCE: rts_ance_command_read(rpc, s); break; case RTS_CMD_CLIENT_ADDRESS: rts_client_address_command_read(rpc, s); break; case RTS_CMD_ASSOCIATION_GROUP_ID: rts_association_group_id_command_read(rpc, s); break; case RTS_CMD_DESTINATION: rts_destination_command_read(rpc, s); break; case RTS_CMD_PING_TRAFFIC_SENT_NOTIFY: rts_ping_traffic_sent_notify_command_read(rpc, s); break; default: printf("Error: Unknown RTS Command Type: 0x%x\n", CommandType); stream_detach(s) ; stream_free(s) ; return -1; break; } } stream_detach(s); stream_free(s); return 0; }