static void wts_read_drdynvc_pdu(rdpPeerChannel* channel) { UINT32 length; int value; int Cmd; int Sp; int cbChId; UINT32 ChannelId; rdpPeerChannel* dvc; length = stream_get_pos(channel->receive_data); if (length < 1) return; stream_set_pos(channel->receive_data, 0); stream_read_BYTE(channel->receive_data, value); length--; Cmd = (value & 0xf0) >> 4; Sp = (value & 0x0c) >> 2; cbChId = (value & 0x03) >> 0; if (Cmd == CAPABILITY_REQUEST_PDU) { wts_read_drdynvc_capabilities_response(channel, length); } else if (channel->vcm->drdynvc_state == DRDYNVC_STATE_READY) { value = wts_read_variable_uint(channel->receive_data, cbChId, &ChannelId); if (value == 0) return; length -= value; DEBUG_DVC("Cmd %d ChannelId %d length %d", Cmd, ChannelId, length); dvc = wts_get_dvc_channel_by_id(channel->vcm, ChannelId); if (dvc) { switch (Cmd) { case CREATE_REQUEST_PDU: wts_read_drdynvc_create_response(dvc, channel->receive_data, length); break; case DATA_FIRST_PDU: wts_read_drdynvc_data_first(dvc, channel->receive_data, Sp, length); break; case DATA_PDU: wts_read_drdynvc_data(dvc, channel->receive_data, length); break; case CLOSE_REQUEST_PDU: wts_read_drdynvc_close_response(dvc); break; default: fprintf(stderr, "wts_read_drdynvc_pdu: Cmd %d not recognized.\n", Cmd); break; } } else { DEBUG_DVC("ChannelId %d not exists.", ChannelId); } } else { fprintf(stderr, "wts_read_drdynvc_pdu: received Cmd %d but channel is not ready.\n", Cmd); } }
static BOOL wts_read_drdynvc_pdu(rdpPeerChannel* channel) { UINT32 length; int value; int Cmd; int Sp; int cbChId; UINT32 ChannelId; rdpPeerChannel* dvc; length = Stream_GetPosition(channel->receiveData); if (length < 1) return FALSE; Stream_SetPosition(channel->receiveData, 0); Stream_Read_UINT8(channel->receiveData, value); length--; Cmd = (value & 0xf0) >> 4; Sp = (value & 0x0c) >> 2; cbChId = (value & 0x03) >> 0; if (Cmd == CAPABILITY_REQUEST_PDU) { return wts_read_drdynvc_capabilities_response(channel, length); } else if (channel->vcm->drdynvc_state == DRDYNVC_STATE_READY) { value = wts_read_variable_uint(channel->receiveData, cbChId, &ChannelId); if (value == 0) return FALSE; length -= value; DEBUG_DVC("Cmd %d ChannelId %d length %d", Cmd, ChannelId, length); dvc = wts_get_dvc_channel_by_id(channel->vcm, ChannelId); if (dvc) { switch (Cmd) { case CREATE_REQUEST_PDU: return wts_read_drdynvc_create_response(dvc, channel->receiveData, length); case DATA_FIRST_PDU: return wts_read_drdynvc_data_first(dvc, channel->receiveData, Sp, length); case DATA_PDU: return wts_read_drdynvc_data(dvc, channel->receiveData, length); case CLOSE_REQUEST_PDU: wts_read_drdynvc_close_response(dvc); break; default: WLog_ERR(TAG, "Cmd %d not recognized.", Cmd); break; } } else { DEBUG_DVC("ChannelId %d not exists.", ChannelId); } } else { WLog_ERR(TAG, "received Cmd %d but channel is not ready.", Cmd); } return TRUE; }