xfreerdp-server: fix RemoteFX encoding

This commit is contained in:
Marc-André Moreau 2013-05-01 18:15:55 -04:00
parent 65d6e135ad
commit b4cac74136
28 changed files with 126 additions and 110 deletions

View File

@ -175,7 +175,7 @@ static int audin_process_formats(IWTSVirtualChannelCallback* pChannelCallback, w
/* Store the agreed format in the corresponding index */
callback->formats[callback->formats_count++] = format;
/* Put the format to output buffer */
stream_check_size(out, 18 + format.cbSize);
Stream_EnsureRemainingCapacity(out, 18 + format.cbSize);
stream_write(out, fm, 18 + format.cbSize);
}
}

View File

@ -111,7 +111,9 @@ static void audin_server_send_formats(audin_server* audin, wStream* s)
nAvgBytesPerSec = audin->context.server_formats[i].nSamplesPerSec *
audin->context.server_formats[i].nChannels *
audin->context.server_formats[i].wBitsPerSample / 8;
stream_check_size(s, 18);
Stream_EnsureRemainingCapacity(s, 18);
stream_write_UINT16(s, audin->context.server_formats[i].wFormatTag);
stream_write_UINT16(s, audin->context.server_formats[i].nChannels);
stream_write_UINT32(s, audin->context.server_formats[i].nSamplesPerSec);
@ -119,9 +121,10 @@ static void audin_server_send_formats(audin_server* audin, wStream* s)
stream_write_UINT16(s, audin->context.server_formats[i].nBlockAlign);
stream_write_UINT16(s, audin->context.server_formats[i].wBitsPerSample);
stream_write_UINT16(s, audin->context.server_formats[i].cbSize);
if (audin->context.server_formats[i].cbSize)
{
stream_check_size(s, audin->context.server_formats[i].cbSize);
Stream_EnsureRemainingCapacity(s, audin->context.server_formats[i].cbSize);
stream_write(s, audin->context.server_formats[i].data,
audin->context.server_formats[i].cbSize);
}
@ -333,7 +336,7 @@ static void* audin_server_thread_func(void* arg)
if (bytes_returned == 0)
break;
stream_check_size(s, (int) bytes_returned);
Stream_EnsureRemainingCapacity(s, (int) bytes_returned);
if (WTSVirtualChannelRead(audin->audin_channel, 0, stream_get_head(s),
Stream_Capacity(s), &bytes_returned) == FALSE)

View File

@ -87,7 +87,7 @@ void cliprdr_process_format_list_event(cliprdrPlugin* cliprdr, RDP_CB_FORMAT_LIS
if (!cliprdr->use_long_format_names)
name_length = 32;
stream_extend(body, Stream_Capacity(body) + 4 + name_length);
Stream_EnsureRemainingCapacity(body, Stream_Capacity(body) + 4 + name_length);
stream_write_UINT32(body, cb_event->formats[i]);
stream_write(body, name, name_length);

View File

@ -391,7 +391,7 @@ BOOL drive_file_query_information(DRIVE_FILE* file, UINT32 FsInformationClass, w
case FileBasicInformation:
/* http://msdn.microsoft.com/en-us/library/cc232094.aspx */
stream_write_UINT32(output, 36); /* Length */
stream_check_size(output, 36);
Stream_EnsureRemainingCapacity(output, 36);
stream_write_UINT64(output, FILE_TIME_SYSTEM_TO_RDP(st.st_mtime)); /* CreationTime */
stream_write_UINT64(output, FILE_TIME_SYSTEM_TO_RDP(st.st_atime)); /* LastAccessTime */
stream_write_UINT64(output, FILE_TIME_SYSTEM_TO_RDP(st.st_mtime)); /* LastWriteTime */
@ -403,7 +403,7 @@ BOOL drive_file_query_information(DRIVE_FILE* file, UINT32 FsInformationClass, w
case FileStandardInformation:
/* http://msdn.microsoft.com/en-us/library/cc232088.aspx */
stream_write_UINT32(output, 22); /* Length */
stream_check_size(output, 22);
Stream_EnsureRemainingCapacity(output, 22);
stream_write_UINT64(output, st.st_size); /* AllocationSize */
stream_write_UINT64(output, st.st_size); /* EndOfFile */
stream_write_UINT32(output, st.st_nlink); /* NumberOfLinks */
@ -415,7 +415,7 @@ BOOL drive_file_query_information(DRIVE_FILE* file, UINT32 FsInformationClass, w
case FileAttributeTagInformation:
/* http://msdn.microsoft.com/en-us/library/cc232093.aspx */
stream_write_UINT32(output, 8); /* Length */
stream_check_size(output, 8);
Stream_EnsureRemainingCapacity(output, 8);
stream_write_UINT32(output, FILE_ATTR_SYSTEM_TO_RDP(file, st)); /* FileAttributes */
stream_write_UINT32(output, 0); /* ReparseTag */
break;
@ -616,7 +616,7 @@ BOOL drive_file_query_directory(DRIVE_FILE* file, UINT32 FsInformationClass, BYT
case FileDirectoryInformation:
/* http://msdn.microsoft.com/en-us/library/cc232097.aspx */
stream_write_UINT32(output, 64 + length); /* Length */
stream_check_size(output, 64 + length);
Stream_EnsureRemainingCapacity(output, 64 + length);
stream_write_UINT32(output, 0); /* NextEntryOffset */
stream_write_UINT32(output, 0); /* FileIndex */
stream_write_UINT64(output, FILE_TIME_SYSTEM_TO_RDP(st.st_mtime)); /* CreationTime */
@ -633,7 +633,7 @@ BOOL drive_file_query_directory(DRIVE_FILE* file, UINT32 FsInformationClass, BYT
case FileFullDirectoryInformation:
/* http://msdn.microsoft.com/en-us/library/cc232068.aspx */
stream_write_UINT32(output, 68 + length); /* Length */
stream_check_size(output, 68 + length);
Stream_EnsureRemainingCapacity(output, 68 + length);
stream_write_UINT32(output, 0); /* NextEntryOffset */
stream_write_UINT32(output, 0); /* FileIndex */
stream_write_UINT64(output, FILE_TIME_SYSTEM_TO_RDP(st.st_mtime)); /* CreationTime */
@ -651,7 +651,7 @@ BOOL drive_file_query_directory(DRIVE_FILE* file, UINT32 FsInformationClass, BYT
case FileBothDirectoryInformation:
/* http://msdn.microsoft.com/en-us/library/cc232095.aspx */
stream_write_UINT32(output, 93 + length); /* Length */
stream_check_size(output, 93 + length);
Stream_EnsureRemainingCapacity(output, 93 + length);
stream_write_UINT32(output, 0); /* NextEntryOffset */
stream_write_UINT32(output, 0); /* FileIndex */
stream_write_UINT64(output, FILE_TIME_SYSTEM_TO_RDP(st.st_mtime)); /* CreationTime */
@ -672,7 +672,7 @@ BOOL drive_file_query_directory(DRIVE_FILE* file, UINT32 FsInformationClass, BYT
case FileNamesInformation:
/* http://msdn.microsoft.com/en-us/library/cc232077.aspx */
stream_write_UINT32(output, 12 + length); /* Length */
stream_check_size(output, 12 + length);
Stream_EnsureRemainingCapacity(output, 12 + length);
stream_write_UINT32(output, 0); /* NextEntryOffset */
stream_write_UINT32(output, 0); /* FileIndex */
stream_write_UINT32(output, length); /* FileNameLength */

View File

@ -267,7 +267,7 @@ static void drive_process_irp_read(DRIVE_DEVICE* disk, IRP* irp)
if (Length > 0)
{
stream_check_size(irp->output, (int) Length);
Stream_EnsureRemainingCapacity(irp->output, (int) Length);
stream_write(irp->output, buffer, Length);
}
@ -405,7 +405,7 @@ static void drive_process_irp_query_volume_information(DRIVE_DEVICE* disk, IRP*
/* http://msdn.microsoft.com/en-us/library/cc232108.aspx */
length = ConvertToUnicode(CP_UTF8, 0, volumeLabel, -1, &outStr, 0) * 2;
stream_write_UINT32(output, 17 + length); /* Length */
stream_check_size(output, 17 + length);
Stream_EnsureRemainingCapacity(output, 17 + length);
stream_write_UINT64(output, FILE_TIME_SYSTEM_TO_RDP(st.st_ctime)); /* VolumeCreationTime */
#ifdef ANDROID
stream_write_UINT32(output, svfst.f_fsid.__val[0]); /* VolumeSerialNumber */
@ -422,7 +422,7 @@ static void drive_process_irp_query_volume_information(DRIVE_DEVICE* disk, IRP*
case FileFsSizeInformation:
/* http://msdn.microsoft.com/en-us/library/cc232107.aspx */
stream_write_UINT32(output, 24); /* Length */
stream_check_size(output, 24);
Stream_EnsureRemainingCapacity(output, 24);
stream_write_UINT64(output, svfst.f_blocks); /* TotalAllocationUnits */
stream_write_UINT64(output, svfst.f_bavail); /* AvailableAllocationUnits */
stream_write_UINT32(output, 1); /* SectorsPerAllocationUnit */
@ -433,7 +433,7 @@ static void drive_process_irp_query_volume_information(DRIVE_DEVICE* disk, IRP*
/* http://msdn.microsoft.com/en-us/library/cc232101.aspx */
length = ConvertToUnicode(CP_UTF8, 0, diskType, -1, &outStr, 0) * 2;
stream_write_UINT32(output, 12 + length); /* Length */
stream_check_size(output, 12 + length);
Stream_EnsureRemainingCapacity(output, 12 + length);
stream_write_UINT32(output,
FILE_CASE_SENSITIVE_SEARCH |
FILE_CASE_PRESERVED_NAMES |
@ -451,7 +451,7 @@ static void drive_process_irp_query_volume_information(DRIVE_DEVICE* disk, IRP*
case FileFsFullSizeInformation:
/* http://msdn.microsoft.com/en-us/library/cc232104.aspx */
stream_write_UINT32(output, 32); /* Length */
stream_check_size(output, 32);
Stream_EnsureRemainingCapacity(output, 32);
stream_write_UINT64(output, svfst.f_blocks); /* TotalAllocationUnits */
stream_write_UINT64(output, svfst.f_bavail); /* CallerAvailableAllocationUnits */
stream_write_UINT64(output, svfst.f_bfree); /* AvailableAllocationUnits */
@ -462,7 +462,7 @@ static void drive_process_irp_query_volume_information(DRIVE_DEVICE* disk, IRP*
case FileFsDeviceInformation:
/* http://msdn.microsoft.com/en-us/library/cc232109.aspx */
stream_write_UINT32(output, 8); /* Length */
stream_check_size(output, 8);
Stream_EnsureRemainingCapacity(output, 8);
stream_write_UINT32(output, FILE_DEVICE_DISK); /* DeviceType */
stream_write_UINT32(output, 0); /* Characteristics */
break;

View File

@ -157,7 +157,7 @@ static void parallel_process_irp_read(PARALLEL_DEVICE* parallel, IRP* irp)
if (Length > 0)
{
stream_check_size(irp->output, Length);
Stream_EnsureRemainingCapacity(irp->output, Length);
stream_write(irp->output, buffer, Length);
}

View File

@ -176,7 +176,7 @@ static void rdpdr_send_device_list_announce_request(rdpdrPlugin* rdpdr, BOOL use
(device->type == RDPDR_DTYP_SMARTCARD) || user_loggedon)
{
data_len = (device->data == NULL ? 0 : Stream_GetPosition(device->data));
stream_check_size(data_out, 20 + data_len);
Stream_EnsureRemainingCapacity(data_out, 20 + data_len);
stream_write_UINT32(data_out, device->type); /* deviceType */
stream_write_UINT32(data_out, device->id); /* deviceID */

View File

@ -224,7 +224,7 @@ static void* rdpsnd_server_thread_func(void* arg)
if (bytes_returned == 0)
break;
stream_check_size(s, (int) bytes_returned);
Stream_EnsureRemainingCapacity(s, (int) bytes_returned);
if (WTSVirtualChannelRead(rdpsnd->rdpsnd_channel, 0, stream_get_head(s),
Stream_Capacity(s), &bytes_returned) == FALSE)
@ -414,7 +414,7 @@ static BOOL rdpsnd_server_send_audio_pdu(rdpsnd_server* rdpsnd)
Stream_SetPosition(s, 0);
/* Wave PDU */
stream_check_size(s, size + fill_size);
Stream_EnsureRemainingCapacity(s, size + fill_size);
stream_write_UINT32(s, 0); /* bPad */
stream_write(s, src + 4, size - 4);

View File

@ -193,7 +193,7 @@ static void serial_process_irp_read(SERIAL_DEVICE* serial, IRP* irp)
if (Length > 0)
{
stream_check_size(irp->output, Length);
Stream_EnsureRemainingCapacity(irp->output, Length);
stream_write(irp->output, buffer, Length);
}

View File

@ -206,7 +206,7 @@ static void wts_read_drdynvc_data_first(rdpPeerChannel* channel, wStream* s, int
return;
Stream_SetPosition(channel->receive_data, 0);
stream_check_size(channel->receive_data, (int) channel->dvc_total_length);
Stream_EnsureRemainingCapacity(channel->receive_data, (int) channel->dvc_total_length);
stream_write(channel->receive_data, Stream_Pointer(s), length);
}
@ -356,7 +356,7 @@ static void wts_write_drdynvc_create_request(wStream *s, UINT32 ChannelId, const
wts_write_drdynvc_header(s, CREATE_REQUEST_PDU, ChannelId);
len = strlen(ChannelName) + 1;
stream_check_size(s, (int) len);
Stream_EnsureRemainingCapacity(s, (int) len);
stream_write(s, ChannelName, len);
}
@ -367,7 +367,7 @@ static void WTSProcessChannelData(rdpPeerChannel* channel, int channelId, BYTE*
Stream_SetPosition(channel->receive_data, 0);
}
stream_check_size(channel->receive_data, size);
Stream_EnsureRemainingCapacity(channel->receive_data, size);
stream_write(channel->receive_data, data, size);
if (flags & CHANNEL_FLAG_LAST)

View File

@ -1395,7 +1395,7 @@ void smartcard_device_control(SMARTCARD_DEVICE* scard, IRP* irp)
// Stream_Seek(irp->input, 4); /* rpce len */
/* [MS-RDPESC] 3.2.5.1 Sending Outgoing Messages */
stream_extend(irp->output, 2048);
Stream_EnsureRemainingCapacity(irp->output, 2048);
irp_result_pos = Stream_GetPosition(irp->output);

View File

@ -44,7 +44,7 @@ int tsmf_ifman_rim_exchange_capability_request(TSMF_IFMAN* ifman)
stream_read_UINT32(ifman->input, CapabilityValue);
DEBUG_DVC("server CapabilityValue %d", CapabilityValue);
stream_check_size(ifman->output, 8);
Stream_EnsureRemainingCapacity(ifman->output, 8);
stream_write_UINT32(ifman->output, 1); /* CapabilityValue */
stream_write_UINT32(ifman->output, 0); /* Result */
@ -61,7 +61,7 @@ int tsmf_ifman_exchange_capability_request(TSMF_IFMAN* ifman)
UINT32 numHostCapabilities;
pos = Stream_GetPosition(ifman->output);
stream_check_size(ifman->output, ifman->input_size + 4);
Stream_EnsureRemainingCapacity(ifman->output, ifman->input_size + 4);
stream_copy(ifman->output, ifman->input, ifman->input_size);
Stream_SetPosition(ifman->output, pos);
@ -117,7 +117,7 @@ int tsmf_ifman_check_format_support_request(TSMF_IFMAN* ifman)
if (FormatSupported)
DEBUG_DVC("format ok.");
stream_check_size(ifman->output, 12);
Stream_EnsureRemainingCapacity(ifman->output, 12);
stream_write_UINT32(ifman->output, FormatSupported);
stream_write_UINT32(ifman->output, PlatformCookie);
stream_write_UINT32(ifman->output, 0); /* Result */
@ -191,7 +191,7 @@ int tsmf_ifman_set_topology_request(TSMF_IFMAN* ifman)
{
DEBUG_DVC("");
stream_check_size(ifman->output, 8);
Stream_EnsureRemainingCapacity(ifman->output, 8);
stream_write_UINT32(ifman->output, 1); /* TopologyReady */
stream_write_UINT32(ifman->output, 0); /* Result */
ifman->output_interface_id = TSMF_INTERFACE_DEFAULT | STREAM_ID_STUB;
@ -243,7 +243,7 @@ int tsmf_ifman_shutdown_presentation(TSMF_IFMAN* ifman)
pexisted = 0;
stream_check_size(ifman->output, 4);
Stream_EnsureRemainingCapacity(ifman->output, 4);
stream_write_UINT32(ifman->output, 0); /* Result */
ifman->output_interface_id = TSMF_INTERFACE_DEFAULT | STREAM_ID_STUB;
@ -489,7 +489,7 @@ int tsmf_ifman_on_end_of_stream(TSMF_IFMAN* ifman)
}
DEBUG_DVC("StreamId %d", StreamId);
stream_check_size(ifman->output, 16);
Stream_EnsureRemainingCapacity(ifman->output, 16);
stream_write_UINT32(ifman->output, CLIENT_EVENT_NOTIFICATION); /* FunctionId */
stream_write_UINT32(ifman->output, StreamId); /* StreamId */
stream_write_UINT32(ifman->output, TSMM_CLIENT_EVENT_ENDOFSTREAM); /* EventId */
@ -512,7 +512,7 @@ int tsmf_ifman_on_playback_started(TSMF_IFMAN* ifman)
else
DEBUG_WARN("unknown presentation id");
stream_check_size(ifman->output, 16);
Stream_EnsureRemainingCapacity(ifman->output, 16);
stream_write_UINT32(ifman->output, CLIENT_EVENT_NOTIFICATION); /* FunctionId */
stream_write_UINT32(ifman->output, 0); /* StreamId */
stream_write_UINT32(ifman->output, TSMM_CLIENT_EVENT_START_COMPLETED); /* EventId */
@ -573,7 +573,7 @@ int tsmf_ifman_on_playback_stopped(TSMF_IFMAN* ifman)
else
DEBUG_WARN("unknown presentation id");
stream_check_size(ifman->output, 16);
Stream_EnsureRemainingCapacity(ifman->output, 16);
stream_write_UINT32(ifman->output, CLIENT_EVENT_NOTIFICATION); /* FunctionId */
stream_write_UINT32(ifman->output, 0); /* StreamId */
stream_write_UINT32(ifman->output, TSMM_CLIENT_EVENT_STOP_COMPLETED); /* EventId */
@ -587,7 +587,7 @@ int tsmf_ifman_on_playback_rate_changed(TSMF_IFMAN * ifman)
{
DEBUG_DVC("");
stream_check_size(ifman->output, 16);
Stream_EnsureRemainingCapacity(ifman->output, 16);
stream_write_UINT32(ifman->output, CLIENT_EVENT_NOTIFICATION); /* FunctionId */
stream_write_UINT32(ifman->output, 0); /* StreamId */
stream_write_UINT32(ifman->output, TSMM_CLIENT_EVENT_MONITORCHANGED); /* EventId */

View File

@ -349,7 +349,7 @@ void nsc_compose_message(NSC_CONTEXT* context, wStream* s,
PROFILER_EXIT(context->priv->prof_nsc_rle_compress_data);
/* Assemble the NSCodec message into stream */
stream_check_size(s, 20);
Stream_EnsureRemainingCapacity(s, 20);
stream_write_UINT32(s, context->nsc_stream.PlaneByteCount[0]); /* LumaPlaneByteCount (4 bytes) */
stream_write_UINT32(s, context->nsc_stream.PlaneByteCount[1]); /* OrangeChromaPlaneByteCount (4 bytes) */
stream_write_UINT32(s, context->nsc_stream.PlaneByteCount[2]); /* GreenChromaPlaneByteCount (4 bytes) */
@ -362,7 +362,7 @@ void nsc_compose_message(NSC_CONTEXT* context, wStream* s,
{
if (context->nsc_stream.PlaneByteCount[i] > 0)
{
stream_check_size(s, (int) context->nsc_stream.PlaneByteCount[i]);
Stream_EnsureRemainingCapacity(s, (int) context->nsc_stream.PlaneByteCount[i]);
stream_write(s, context->priv->plane_buf[i], context->nsc_stream.PlaneByteCount[i]);
}
}

View File

@ -942,7 +942,7 @@ static void rfx_compose_message_context(RFX_CONTEXT* context, wStream* s)
void rfx_compose_message_header(RFX_CONTEXT* context, wStream* s)
{
stream_check_size(s, 12 + 10 + 12 + 13);
Stream_EnsureRemainingCapacity(s, 12 + 10 + 12 + 13);
rfx_compose_message_sync(context, s);
rfx_compose_message_context(context, s);
@ -954,7 +954,7 @@ void rfx_compose_message_header(RFX_CONTEXT* context, wStream* s)
static void rfx_compose_message_frame_begin(RFX_CONTEXT* context, wStream* s)
{
stream_check_size(s, 14);
Stream_EnsureRemainingCapacity(s, 14);
stream_write_UINT16(s, WBT_FRAME_BEGIN); /* CodecChannelT.blockType */
stream_write_UINT32(s, 14); /* CodecChannelT.blockLen */
@ -973,7 +973,7 @@ static void rfx_compose_message_region(RFX_CONTEXT* context, wStream* s,
int i;
size = 15 + num_rects * 8;
stream_check_size(s, size);
Stream_EnsureRemainingCapacity(s, size);
stream_write_UINT16(s, WBT_REGION); /* CodecChannelT.blockType */
stream_write_UINT32(s, size); /* set CodecChannelT.blockLen later */
@ -1004,7 +1004,7 @@ static void rfx_compose_message_tile(RFX_CONTEXT* context, wStream* s,
int CrLen = 0;
int start_pos, end_pos;
stream_check_size(s, 19);
Stream_EnsureRemainingCapacity(s, 19);
start_pos = Stream_GetPosition(s);
stream_write_UINT16(s, CBT_TILE); /* BlockT.blockType */
@ -1077,7 +1077,7 @@ static void rfx_compose_message_tileset(RFX_CONTEXT* context, wStream* s,
numTiles = numTilesX * numTilesY;
size = 22 + numQuants * 5;
stream_check_size(s, size);
Stream_EnsureRemainingCapacity(s, size);
start_pos = Stream_GetPosition(s);
stream_write_UINT16(s, WBT_EXTENSION); /* CodecChannelT.blockType */
@ -1127,7 +1127,7 @@ static void rfx_compose_message_tileset(RFX_CONTEXT* context, wStream* s,
static void rfx_compose_message_frame_end(RFX_CONTEXT* context, wStream* s)
{
stream_check_size(s, 8);
Stream_EnsureRemainingCapacity(s, 8);
stream_write_UINT16(s, WBT_FRAME_END); /* CodecChannelT.blockType */
stream_write_UINT32(s, 8); /* CodecChannelT.blockLen */

View File

@ -242,18 +242,18 @@ void rfx_encode_rgb(RFX_CONTEXT* context, const BYTE* rgb_data, int width, int h
PROFILER_EXIT(context->priv->prof_rfx_rgb_to_ycbcr);
/* Ensure the buffer is reasonably large enough */
stream_check_size(data_out, 4096);
Stream_EnsureRemainingCapacity(data_out, 4096);
rfx_encode_component(context, y_quants, pSrcDst[0],
Stream_Pointer(data_out), Stream_GetRemainingLength(data_out), y_size);
Stream_Seek(data_out, *y_size);
stream_check_size(data_out, 4096);
Stream_EnsureRemainingCapacity(data_out, 4096);
rfx_encode_component(context, cb_quants, pSrcDst[1],
Stream_Pointer(data_out), Stream_GetRemainingLength(data_out), cb_size);
Stream_Seek(data_out, *cb_size);
stream_check_size(data_out, 4096);
Stream_EnsureRemainingCapacity(data_out, 4096);
rfx_encode_component(context, cr_quants, pSrcDst[2],
Stream_Pointer(data_out), Stream_GetRemainingLength(data_out), cr_size);
Stream_Seek(data_out, *cr_size);

View File

@ -80,7 +80,7 @@ BOOL freerdp_channel_send(rdpRdp* rdp, UINT16 channel_id, BYTE* data, int size)
stream_write_UINT32(s, size);
stream_write_UINT32(s, flags);
stream_check_size(s, chunk_size);
Stream_EnsureCapacity(s, chunk_size);
stream_write(s, data, chunk_size);
rdp_send(rdp, s, channel_id);

View File

@ -96,7 +96,7 @@ UINT16 fastpath_read_header(rdpFastPath* fastpath, wStream* s)
stream_read_BYTE(s, header);
if (fastpath != NULL)
if (fastpath)
{
fastpath->encryptionFlags = (header & 0xC0) >> 6;
fastpath->numberEvents = (header & 0x3C) >> 2;
@ -133,7 +133,7 @@ BOOL fastpath_read_header_rdp(rdpFastPath* fastpath, wStream* s, UINT16 *length)
stream_read_BYTE(s, header);
if (fastpath != NULL)
if (fastpath)
{
fastpath->encryptionFlags = (header & 0xC0) >> 6;
fastpath->numberEvents = (header & 0x3C) >> 2;
@ -157,6 +157,7 @@ static BOOL fastpath_recv_orders(rdpFastPath* fastpath, wStream* s)
{
if (!update_recv_order(update, s))
return FALSE;
numberOrders--;
}
@ -500,6 +501,7 @@ static BOOL fastpath_recv_input_event_scancode(rdpFastPath* fastpath, wStream* s
stream_read_BYTE(s, code); /* keyCode (1 byte) */
flags = 0;
if ((eventFlags & FASTPATH_INPUT_KBDFLAGS_RELEASE))
flags |= KBD_FLAGS_RELEASE;
else
@ -567,6 +569,7 @@ static BOOL fastpath_recv_input_event_unicode(rdpFastPath* fastpath, wStream* s,
stream_read_UINT16(s, unicodeCode); /* unicodeCode (2 bytes) */
flags = 0;
if ((eventFlags & FASTPATH_INPUT_KBDFLAGS_RELEASE))
flags |= KBD_FLAGS_RELEASE;
else
@ -650,14 +653,16 @@ static UINT32 fastpath_get_sec_bytes(rdpRdp* rdp)
{
UINT32 sec_bytes;
sec_bytes = 0;
if (rdp->do_crypt)
{
sec_bytes = 8;
if (rdp->settings->EncryptionMethods == ENCRYPTION_METHOD_FIPS)
sec_bytes += 4;
}
else
sec_bytes = 0;
return sec_bytes;
}
@ -669,14 +674,20 @@ wStream* fastpath_input_pdu_init(rdpFastPath* fastpath, BYTE eventFlags, BYTE ev
rdp = fastpath->rdp;
s = transport_send_stream_init(rdp->transport, 256);
Stream_Seek(s, 3); /* fpInputHeader, length1 and length2 */
if (rdp->do_crypt) {
if (rdp->do_crypt)
{
rdp->sec_flags |= SEC_ENCRYPT;
if (rdp->do_secure_checksum)
rdp->sec_flags |= SEC_SECURE_CHECKSUM;
}
Stream_Seek(s, fastpath_get_sec_bytes(rdp));
stream_write_BYTE(s, eventFlags | (eventCode << 5)); /* eventHeader (1 byte) */
return s;
}
@ -690,6 +701,7 @@ BOOL fastpath_send_input_pdu(rdpFastPath* fastpath, wStream* s)
rdp = fastpath->rdp;
length = Stream_GetPosition(s);
if (length >= (2 << 14))
{
fprintf(stderr, "Maximum FastPath PDU length is 32767\n");
@ -698,6 +710,7 @@ BOOL fastpath_send_input_pdu(rdpFastPath* fastpath, wStream* s)
eventHeader = FASTPATH_INPUT_ACTION_FASTPATH;
eventHeader |= (1 << 2); /* numberEvents */
if (rdp->sec_flags & SEC_ENCRYPT)
eventHeader |= (FASTPATH_INPUT_ENCRYPTED << 6);
if (rdp->sec_flags & SEC_SECURE_CHECKSUM)
@ -706,6 +719,7 @@ BOOL fastpath_send_input_pdu(rdpFastPath* fastpath, wStream* s)
Stream_SetPosition(s, 0);
stream_write_BYTE(s, eventHeader);
sec_bytes = fastpath_get_sec_bytes(fastpath->rdp);
/*
* We always encode length in two bytes, even though we could use
* only one byte if length <= 0x7F. It is just easier that way,
@ -721,16 +735,19 @@ BOOL fastpath_send_input_pdu(rdpFastPath* fastpath, wStream* s)
fpInputEvents = Stream_Pointer(s) + sec_bytes;
fpInputEvents_length = length - 3 - sec_bytes;
if (rdp->sec_flags & SEC_SECURE_CHECKSUM)
security_salted_mac_signature(rdp, fpInputEvents, fpInputEvents_length, TRUE, Stream_Pointer(s));
else
security_mac_signature(rdp, fpInputEvents, fpInputEvents_length, Stream_Pointer(s));
security_encrypt(fpInputEvents, fpInputEvents_length, rdp);
}
rdp->sec_flags = 0;
Stream_SetPosition(s, length);
if (transport_write(fastpath->rdp->transport, s) < 0)
return FALSE;
@ -740,10 +757,13 @@ BOOL fastpath_send_input_pdu(rdpFastPath* fastpath, wStream* s)
wStream* fastpath_update_pdu_init(rdpFastPath* fastpath)
{
wStream* s;
s = transport_send_stream_init(fastpath->rdp->transport, FASTPATH_MAX_PACKET_SIZE);
Stream_Seek(s, 3); /* fpOutputHeader, length1 and length2 */
Stream_Seek(s, fastpath_get_sec_bytes(fastpath->rdp));
Stream_Seek(s, 3); /* updateHeader, size */
return s;
}
@ -783,7 +803,7 @@ BOOL fastpath_send_update_pdu(rdpFastPath* fastpath, BYTE updateCode, wStream* s
try_comp = rdp->settings->CompressionEnabled;
comp_update = stream_new(0);
for (fragment = 0; totalLength > 0 || fragment == 0; fragment++)
for (fragment = 0; (totalLength > 0) || (fragment == 0); fragment++)
{
stream_get_mark(s, holdp);
ls = s;
@ -792,6 +812,7 @@ BOOL fastpath_send_update_pdu(rdpFastPath* fastpath, BYTE updateCode, wStream* s
comp_flags = 0;
header_bytes = 6 + sec_bytes;
pdu_data_bytes = dlen;
if (try_comp)
{
if (compress_rdp(rdp->mppc_enc, ls->pointer + header_bytes, dlen))
@ -808,8 +829,10 @@ BOOL fastpath_send_update_pdu(rdpFastPath* fastpath, BYTE updateCode, wStream* s
}
}
else
{
fprintf(stderr, "fastpath_send_update_pdu: mppc_encode failed\n");
}
}
totalLength -= dlen;
pduLength = pdu_data_bytes + header_bytes;
@ -821,8 +844,10 @@ BOOL fastpath_send_update_pdu(rdpFastPath* fastpath, BYTE updateCode, wStream* s
stream_get_mark(ls, bm);
header = 0;
if (sec_bytes > 0)
header |= (FASTPATH_OUTPUT_ENCRYPTED << 6);
stream_write_BYTE(ls, header); /* fpOutputHeader (1 byte) */
stream_write_BYTE(ls, 0x80 | (pduLength >> 8)); /* length1 */
stream_write_BYTE(ls, pduLength & 0xFF); /* length2 */
@ -839,7 +864,9 @@ BOOL fastpath_send_update_pdu(rdpFastPath* fastpath, BYTE updateCode, wStream* s
bytes_to_crypt = pdu_data_bytes + 4;
}
else
{
bytes_to_crypt = pdu_data_bytes + 3;
}
stream_write_UINT16(ls, pdu_data_bytes);
@ -851,10 +878,12 @@ BOOL fastpath_send_update_pdu(rdpFastPath* fastpath, BYTE updateCode, wStream* s
/* does this work ? */
ptr_to_crypt = bm + 3 + sec_bytes;
ptr_sig = bm + 3;
if (rdp->sec_flags & SEC_SECURE_CHECKSUM)
security_salted_mac_signature(rdp, ptr_to_crypt, bytes_to_crypt, TRUE, ptr_sig);
else
security_mac_signature(rdp, ptr_to_crypt, bytes_to_crypt, ptr_sig);
security_encrypt(ptr_to_crypt, bytes_to_crypt, rdp);
}

View File

@ -136,7 +136,7 @@ int update_recv_surfcmds(rdpUpdate* update, UINT32 size, wStream* s)
void update_write_surfcmd_surface_bits_header(wStream* s, SURFACE_BITS_COMMAND* cmd)
{
stream_check_size(s, SURFCMD_SURFACE_BITS_HEADER_LENGTH);
Stream_EnsureRemainingCapacity(s, SURFCMD_SURFACE_BITS_HEADER_LENGTH);
stream_write_UINT16(s, CMDTYPE_STREAM_SURFACE_BITS);
@ -154,7 +154,7 @@ void update_write_surfcmd_surface_bits_header(wStream* s, SURFACE_BITS_COMMAND*
void update_write_surfcmd_frame_marker(wStream* s, UINT16 frameAction, UINT32 frameId)
{
stream_check_size(s, SURFCMD_FRAME_MARKER_LENGTH);
Stream_EnsureRemainingCapacity(s, SURFCMD_FRAME_MARKER_LENGTH);
stream_write_UINT16(s, CMDTYPE_FRAME_MARKER);

View File

@ -53,7 +53,7 @@ static void* transport_client_thread(void* arg);
wStream* transport_recv_stream_init(rdpTransport* transport, int size)
{
wStream* s = transport->ReceiveStream;
stream_check_size(s, size);
Stream_EnsureCapacity(s, size);
Stream_SetPosition(s, 0);
return s;
}
@ -61,7 +61,7 @@ wStream* transport_recv_stream_init(rdpTransport* transport, int size)
wStream* transport_send_stream_init(rdpTransport* transport, int size)
{
wStream* s = transport->SendStream;
stream_check_size(s, size);
Stream_EnsureCapacity(s, size);
Stream_SetPosition(s, 0);
return s;
}
@ -498,7 +498,7 @@ static int transport_read_nonblocking(rdpTransport* transport)
{
int status;
stream_check_size(transport->ReceiveBuffer, 32 * 1024);
Stream_EnsureCapacity(transport->ReceiveBuffer, 32 * 1024);
status = transport_read(transport, transport->ReceiveBuffer);
if (status <= 0)

View File

@ -511,7 +511,7 @@ static void update_send_surface_command(rdpContext* context, wStream* s)
rdpRdp* rdp = context->rdp;
update = fastpath_update_pdu_init(rdp->fastpath);
stream_check_size(update, Stream_GetPosition(s));
Stream_EnsureRemainingCapacity(update, Stream_GetPosition(s));
stream_write(update, stream_get_head(s), Stream_GetPosition(s));
fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_SURFCMDS, update);
}
@ -522,7 +522,7 @@ static void update_send_surface_bits(rdpContext* context, SURFACE_BITS_COMMAND*
rdpRdp* rdp = context->rdp;
s = fastpath_update_pdu_init(rdp->fastpath);
stream_check_size(s, SURFCMD_SURFACE_BITS_HEADER_LENGTH + (int) surface_bits_command->bitmapDataLength);
Stream_EnsureRemainingCapacity(s, SURFCMD_SURFACE_BITS_HEADER_LENGTH + (int) surface_bits_command->bitmapDataLength);
update_write_surfcmd_surface_bits_header(s, surface_bits_command);
stream_write(s, surface_bits_command->bitmapData, surface_bits_command->bitmapDataLength);
fastpath_send_update_pdu(rdp->fastpath, FASTPATH_UPDATETYPE_SURFCMDS, s);
@ -610,7 +610,7 @@ static void update_send_pointer_system(rdpContext* context, POINTER_SYSTEM_UPDAT
static void update_write_pointer_color(wStream* s, POINTER_COLOR_UPDATE* pointer_color)
{
stream_check_size(s, 15 + (int) pointer_color->lengthAndMask + (int) pointer_color->lengthXorMask);
Stream_EnsureRemainingCapacity(s, 15 + (int) pointer_color->lengthAndMask + (int) pointer_color->lengthXorMask);
stream_write_UINT16(s, pointer_color->cacheIndex);
stream_write_UINT16(s, pointer_color->xPos);
@ -674,6 +674,7 @@ BOOL update_read_refresh_rect(rdpUpdate* update, wStream* s)
if (Stream_GetRemainingLength(s) < numberOfAreas * 4 * 2)
return FALSE;
areas = (RECTANGLE_16*) malloc(sizeof(RECTANGLE_16) * numberOfAreas);
for (index = 0; index < numberOfAreas; index++)

View File

@ -68,7 +68,7 @@ BOOL rail_read_unicode_string(wStream* s, RAIL_UNICODE_STRING* unicode_string)
void rail_write_unicode_string(wStream* s, RAIL_UNICODE_STRING* unicode_string)
{
stream_check_size(s, 2 + unicode_string->length);
Stream_EnsureRemainingCapacity(s, 2 + unicode_string->length);
stream_write_UINT16(s, unicode_string->length); /* cbString (2 bytes) */
stream_write(s, unicode_string->string, unicode_string->length); /* string */
}
@ -77,7 +77,7 @@ void rail_write_unicode_string_value(wStream* s, RAIL_UNICODE_STRING* unicode_st
{
if (unicode_string->length > 0)
{
stream_check_size(s, unicode_string->length);
Stream_EnsureRemainingCapacity(s, unicode_string->length);
stream_write(s, unicode_string->string, unicode_string->length); /* string */
}
}

View File

@ -122,7 +122,7 @@ static void svc_plugin_process_received(rdpSvcPlugin* plugin, void* pData, UINT3
}
data_in = plugin->data_in;
stream_check_size(data_in, (int) dataLength);
Stream_EnsureRemainingCapacity(data_in, (int) dataLength);
stream_write(data_in, pData, dataLength);
if (dataFlags & CHANNEL_FLAG_LAST)

View File

@ -133,7 +133,7 @@ void mf_peer_rfx_update(freerdp_peer* client)
s = mfp->s;
stream_clear(s);
Stream_Clear(s);
Stream_SetPosition(s, 0);
UINT32 x = mfi->invalid.x / mfi->scale;

View File

@ -104,7 +104,7 @@ static void test_peer_init(freerdp_peer* client)
static wStream* test_peer_stream_init(testPeerContext* context)
{
stream_clear(context->s);
Stream_Clear(context->s);
Stream_SetPosition(context->s, 0);
return context->s;
}
@ -425,7 +425,7 @@ static void* tf_debug_channel_thread_func(void* arg)
if (bytes_returned == 0)
break;
stream_check_size(s, bytes_returned);
Stream_EnsureRemainingCapacity(s, bytes_returned);
if (WTSVirtualChannelRead(context->debug_channel, 0, stream_get_head(s),
Stream_Capacity(s), &bytes_returned) == FALSE)

View File

@ -134,7 +134,7 @@ void wf_update_encode(wfInfo* wfi)
//printf("x:%d y:%d w:%d h:%d\n", wfi->invalid.left, wfi->invalid.top, width, height);
stream_clear(wfi->s);
Stream_Clear(wfi->s);
rfx_compose_message(wfi->rfx_context, wfi->s, &rect, 1,
pDataBits, width, height, stride);

View File

@ -287,7 +287,8 @@ void xf_peer_context_new(freerdp_peer* client, xfPeerContext* context)
rfx_context_set_pixel_format(context->rfx_context, RDP_PIXEL_FORMAT_B8G8R8A8);
context->s = stream_new(65536);
context->s = Stream_New(NULL, 65536);
Stream_Clear(context->s);
}
void xf_peer_context_free(freerdp_peer* client, xfPeerContext* context)
@ -325,7 +326,7 @@ void xf_peer_init(freerdp_peer* client)
wStream* xf_peer_stream_init(xfPeerContext* context)
{
stream_clear(context->s);
Stream_Clear(context->s);
Stream_SetPosition(context->s, 0);
return context->s;
}
@ -409,7 +410,7 @@ void xf_peer_rfx_update(freerdp_peer* client, int x, int y, int width, int heigh
cmd->width = width;
cmd->height = height;
cmd->bitmapDataLength = Stream_GetPosition(s);
cmd->bitmapData = stream_get_head(s);
cmd->bitmapData = Stream_Buffer(s);
update->SurfaceBits(update->context, cmd);
}

View File

@ -43,6 +43,7 @@ struct _wStream
typedef struct _wStream wStream;
WINPR_API void Stream_EnsureCapacity(wStream* s, size_t size);
WINPR_API void Stream_EnsureRemainingCapacity(wStream* s, size_t size);
WINPR_API wStream* Stream_New(BYTE* buffer, size_t size);
WINPR_API void Stream_Free(wStream* s, BOOL bFreeBuffer);
@ -197,6 +198,8 @@ WINPR_API void Stream_Free(wStream* s, BOOL bFreeBuffer);
#define Stream_SealLength(_s) _s->length = (_s->pointer - _s->buffer)
#define Stream_GetRemainingLength(_s) (_s->length - (_s->pointer - _s->buffer))
#define Stream_Clear(_s) memset(_s->buffer, 0, _s->capacity)
/* Deprecated STREAM API */
WINPR_API wStream* stream_new(int size);
@ -208,12 +211,8 @@ WINPR_API void stream_free(wStream* stream);
_s->buffer = _buf; \
_s->pointer = _buf; } while (0)
#define stream_detach(_s) memset(_s, 0, sizeof(wStream))
#define stream_clear(_s) memset(_s->buffer, 0, _s->capacity)
WINPR_API void stream_extend(wStream* stream, int request_size);
#define stream_check_size(_s, _n) \
while (_s->pointer - _s->buffer + (_n) > _s->capacity) \
stream_extend(_s, _n)
#define stream_get_mark(_s,_mark) _mark = _s->pointer
#define stream_set_mark(_s,_mark) _s->pointer = _mark

View File

@ -30,16 +30,28 @@ void Stream_EnsureCapacity(wStream* s, size_t size)
if (s->capacity < size)
{
size_t position;
size_t old_capacity;
old_capacity = s->capacity;
s->capacity = size;
s->length = size;
position = Stream_GetPosition(s);
s->capacity = size;
s->buffer = (BYTE*) realloc(s->buffer, size);
s->buffer = (BYTE*) realloc(s->buffer, s->capacity);
ZeroMemory(&s->buffer[old_capacity], s->capacity - old_capacity);
Stream_SetPosition(s, position);
}
}
void Stream_EnsureRemainingCapacity(wStream* s, size_t size)
{
if (Stream_GetPosition(s) + size > Stream_Capacity(s))
Stream_EnsureCapacity(s, Stream_Capacity(s) + size);
}
wStream* Stream_New(BYTE* buffer, size_t size)
{
wStream* s;
@ -110,6 +122,7 @@ wStream* stream_new(int size)
ZeroMemory(stream->buffer, size);
stream->pointer = stream->buffer;
stream->capacity = size;
stream->length = size;
}
}
@ -135,33 +148,3 @@ void stream_free(wStream* stream)
free(stream);
}
}
/**
* This function is used to extend the size of an existing stream.
* It will infact extend the attached buffer, fill the newly allocated region with 0, and reset the current
* stream position.
* If the stream did not have a buffer attached, a new one will be allocated and attached.
*
* @param stream [in/out] pointer to the STREAM structure that needs to be extended.
* @param request_size [in] Number of bytes to add to the existing stream.
* If the value is < the existing size, then the existing size is doubled.
*/
void stream_extend(wStream* stream, int request_size)
{
int pos;
int original_size;
int increased_size;
pos = Stream_GetPosition(stream);
original_size = stream->capacity;
increased_size = (request_size > original_size ? request_size : original_size);
stream->capacity += increased_size;
if (original_size == 0)
stream->buffer = (BYTE*) malloc(stream->capacity);
else
stream->buffer = (BYTE*) realloc(stream->buffer, stream->capacity);
memset(stream->buffer + original_size, 0, increased_size);
Stream_SetPosition(stream, pos);
}