BOOL WINAPI FreeRDP_WTSVirtualChannelWrite(HANDLE hChannelHandle, PCHAR Buffer, ULONG Length, PULONG pBytesWritten) { wStream* s; int cbLen; int cbChId; int first; BYTE* buffer; UINT32 length; UINT32 written; rdpPeerChannel* channel = (rdpPeerChannel*) hChannelHandle; if (!channel) return FALSE; if (channel->channelType == RDP_PEER_CHANNEL_TYPE_SVC) { length = Length; buffer = (BYTE*) malloc(length); CopyMemory(buffer, Buffer, length); wts_queue_send_item(channel, buffer, length); } else if (!channel->vcm->drdynvc_channel || (channel->vcm->drdynvc_state != DRDYNVC_STATE_READY)) { DEBUG_DVC("drdynvc not ready"); return FALSE; } else { first = TRUE; while (Length > 0) { s = Stream_New(NULL, channel->client->settings->VirtualChannelChunkSize); buffer = Stream_Buffer(s); Stream_Seek_UINT8(s); cbChId = wts_write_variable_uint(s, channel->channelId); if (first && (Length > (UINT32) Stream_GetRemainingLength(s))) { cbLen = wts_write_variable_uint(s, Length); buffer[0] = (DATA_FIRST_PDU << 4) | (cbLen << 2) | cbChId; } else { buffer[0] = (DATA_PDU << 4) | cbChId; } first = FALSE; written = Stream_GetRemainingLength(s); if (written > Length) written = Length; Stream_Write(s, Buffer, written); length = Stream_GetPosition(s); Stream_Free(s, FALSE); Length -= written; Buffer += written; wts_queue_send_item(channel->vcm->drdynvc_channel, buffer, length); } } if (pBytesWritten) *pBytesWritten = Length; return TRUE; }
BOOL WTSVirtualChannelWrite( /* __in */ void* hChannelHandle, /* __in */ BYTE* Buffer, /* __in */ UINT32 Length, /* __out */ UINT32* pBytesWritten) { rdpPeerChannel* channel = (rdpPeerChannel*) hChannelHandle; wts_data_item* item; wStream* s; int cbLen; int cbChId; int first; UINT32 written; if (channel == NULL) return FALSE; if (channel->channel_type == RDP_PEER_CHANNEL_TYPE_SVC) { item = (wts_data_item*) malloc(sizeof(wts_data_item)); ZeroMemory(item, sizeof(wts_data_item)); item->buffer = malloc(Length); item->length = Length; CopyMemory(item->buffer, Buffer, Length); wts_queue_send_item(channel, item); } else if (channel->vcm->drdynvc_channel == NULL || channel->vcm->drdynvc_state != DRDYNVC_STATE_READY) { DEBUG_DVC("drdynvc not ready"); return FALSE; } else { s = stream_new(0); first = TRUE; while (Length > 0) { item = (wts_data_item*) malloc(sizeof(wts_data_item)); ZeroMemory(item, sizeof(wts_data_item)); item->buffer = malloc(channel->client->settings->VirtualChannelChunkSize); stream_attach(s, item->buffer, channel->client->settings->VirtualChannelChunkSize); stream_seek_BYTE(s); cbChId = wts_write_variable_uint(s, channel->channel_id); if (first && (Length > (UINT32) stream_get_left(s))) { cbLen = wts_write_variable_uint(s, Length); item->buffer[0] = (DATA_FIRST_PDU << 4) | (cbLen << 2) | cbChId; } else { item->buffer[0] = (DATA_PDU << 4) | cbChId; } first = FALSE; written = stream_get_left(s); if (written > Length) written = Length; stream_write(s, Buffer, written); item->length = stream_get_length(s); stream_detach(s); Length -= written; Buffer += written; wts_queue_send_item(channel->vcm->drdynvc_channel, item); } stream_free(s); } if (pBytesWritten != NULL) *pBytesWritten = Length; return TRUE; }
boolean WTSVirtualChannelWrite( /* __in */ void* hChannelHandle, /* __in */ uint8* Buffer, /* __in */ uint32 Length, /* __out */ uint32* pBytesWritten) { rdpPeerChannel* channel = (rdpPeerChannel*) hChannelHandle; wts_data_item* item; STREAM* s; int cbLen; int cbChId; int first; uint32 written; if (channel == NULL) return false; if (channel->channel_type == RDP_PEER_CHANNEL_TYPE_SVC) { item = xnew(wts_data_item); item->buffer = xmalloc(Length); item->length = Length; memcpy(item->buffer, Buffer, Length); wts_queue_send_item(channel, item); } else if (channel->vcm->drdynvc_channel == NULL || channel->vcm->drdynvc_state != DRDYNVC_STATE_READY) { DEBUG_DVC("drdynvc not ready"); return false; } else { s = stream_new(0); first = true; while (Length > 0) { item = xnew(wts_data_item); item->buffer = xmalloc(channel->client->settings->vc_chunk_size); stream_attach(s, item->buffer, channel->client->settings->vc_chunk_size); stream_seek_uint8(s); cbChId = wts_write_variable_uint(s, channel->channel_id); if (first && (Length > (uint32) stream_get_left(s))) { cbLen = wts_write_variable_uint(s, Length); item->buffer[0] = (DATA_FIRST_PDU << 4) | (cbLen << 2) | cbChId; } else { item->buffer[0] = (DATA_PDU << 4) | cbChId; } first = false; written = stream_get_left(s); if (written > Length) written = Length; stream_write(s, Buffer, written); item->length = stream_get_length(s); stream_detach(s); Length -= written; Buffer += written; wts_queue_send_item(channel->vcm->drdynvc_channel, item); } stream_free(s); } if (pBytesWritten != NULL) *pBytesWritten = Length; return true; }