static BOOL autodetect_send_netchar_result(rdpContext* context, UINT16 sequenceNumber) { wStream* s; s = rdp_message_channel_pdu_init(context->rdp); if (!s) return FALSE; WLog_DBG(AUTODETECT_TAG, "sending Bandwidth Network Characteristics Result PDU"); if (context->rdp->autodetect->netCharBandwidth > 0) { Stream_Write_UINT8(s, 0x12); /* headerLength (1 byte) */ Stream_Write_UINT8(s, TYPE_ID_AUTODETECT_REQUEST); /* headerTypeId (1 byte) */ Stream_Write_UINT16(s, sequenceNumber); /* sequenceNumber (2 bytes) */ Stream_Write_UINT16(s, 0x08C0); /* requestType (2 bytes) */ Stream_Write_UINT32(s, context->rdp->autodetect->netCharBaseRTT); /* baseRTT (4 bytes) */ Stream_Write_UINT32(s, context->rdp->autodetect->netCharBandwidth); /* bandwidth (4 bytes) */ Stream_Write_UINT32(s, context->rdp->autodetect->netCharAverageRTT); /* averageRTT (4 bytes) */ } else { Stream_Write_UINT8(s, 0x0E); /* headerLength (1 byte) */ Stream_Write_UINT8(s, TYPE_ID_AUTODETECT_REQUEST); /* headerTypeId (1 byte) */ Stream_Write_UINT16(s, sequenceNumber); /* sequenceNumber (2 bytes) */ Stream_Write_UINT16(s, 0x0840); /* requestType (2 bytes) */ Stream_Write_UINT32(s, context->rdp->autodetect->netCharBaseRTT); /* baseRTT (4 bytes) */ Stream_Write_UINT32(s, context->rdp->autodetect->netCharAverageRTT); /* averageRTT (4 bytes) */ } return rdp_send_message_channel_pdu(context->rdp, s, SEC_AUTODETECT_REQ); }
static BOOL autodetect_send_bandwidth_measure_stop(rdpContext* context, UINT16 payloadLength, UINT16 sequenceNumber, UINT16 requestType) { UINT16 i; wStream* s; s = rdp_message_channel_pdu_init(context->rdp); if (!s) return FALSE; WLog_DBG(AUTODETECT_TAG, "sending Bandwidth Measure Stop PDU -> payloadLength=%u"); /* 4-bytes aligned */ payloadLength &= ~3; Stream_Write_UINT8(s, requestType == RDP_BW_STOP_REQUEST_TYPE_CONNECTTIME ? 0x08 : 0x06); /* headerLength (1 byte) */ Stream_Write_UINT8(s, TYPE_ID_AUTODETECT_REQUEST); /* headerTypeId (1 byte) */ Stream_Write_UINT16(s, sequenceNumber); /* sequenceNumber (2 bytes) */ Stream_Write_UINT16(s, requestType); /* requestType (2 bytes) */ if (requestType == RDP_BW_STOP_REQUEST_TYPE_CONNECTTIME) { Stream_Write_UINT16(s, payloadLength); /* payloadLength (2 bytes) */ if (payloadLength > 0) { Stream_EnsureRemainingCapacity(s, payloadLength); /* Random data (better measurement in case the line is compressed) */ for (i = 0; i < payloadLength / 4; i++) { Stream_Write_UINT32(s, rand()); } } } return rdp_send_message_channel_pdu(context->rdp, s, SEC_AUTODETECT_REQ); }
static void rfx_compose_message_context(RFX_CONTEXT* context, wStream* s) { UINT16 properties; Stream_Write_UINT16(s, WBT_CONTEXT); /* CodecChannelT.blockType */ Stream_Write_UINT32(s, 13); /* CodecChannelT.blockLen */ Stream_Write_UINT8(s, 1); /* CodecChannelT.codecId */ Stream_Write_UINT8(s, 0); /* CodecChannelT.channelId */ Stream_Write_UINT8(s, 0); /* ctxId */ Stream_Write_UINT16(s, CT_TILE_64x64); /* tileSize */ /* properties */ properties = context->flags; /* flags */ properties |= (COL_CONV_ICT << 3); /* cct */ properties |= (CLW_XFORM_DWT_53_A << 5); /* xft */ properties |= ((context->mode == RLGR1 ? CLW_ENTROPY_RLGR1 : CLW_ENTROPY_RLGR3) << 9); /* et */ properties |= (SCALAR_QUANTIZATION << 13); /* qt */ Stream_Write_UINT16(s, properties); /* properties in tilesets: note that this has different format from the one in TS_RFX_CONTEXT */ properties = 1; /* lt */ properties |= (context->flags << 1); /* flags */ properties |= (COL_CONV_ICT << 4); /* cct */ properties |= (CLW_XFORM_DWT_53_A << 6); /* xft */ properties |= ((context->mode == RLGR1 ? CLW_ENTROPY_RLGR1 : CLW_ENTROPY_RLGR3) << 10); /* et */ properties |= (SCALAR_QUANTIZATION << 14); /* qt */ context->properties = properties; }
/* server is getting a feel of the round trip time */ void guac_rdpsnd_training_handler(guac_rdpsndPlugin* rdpsnd, wStream* input_stream, guac_rdpsnd_pdu_header* header) { int data_size; wStream* output_stream; /* Get associated client data */ guac_client* client = rdpsnd->client; guac_rdp_client* rdp_client = (guac_rdp_client*) client->data; /* Read timestamp and data size */ Stream_Read_UINT16(input_stream, rdpsnd->server_timestamp); Stream_Read_UINT16(input_stream, data_size); /* Send training response */ output_stream = Stream_New(NULL, 8); Stream_Write_UINT8(output_stream, SNDC_TRAINING); Stream_Write_UINT8(output_stream, 0); Stream_Write_UINT16(output_stream, 4); Stream_Write_UINT16(output_stream, rdpsnd->server_timestamp); Stream_Write_UINT16(output_stream, data_size); pthread_mutex_lock(&(rdp_client->rdp_lock)); svc_plugin_send((rdpSvcPlugin*) rdpsnd, output_stream); pthread_mutex_unlock(&(rdp_client->rdp_lock)); }
BOOL autodetect_send_bandwidth_measure_payload(rdpContext* context, UINT16 payloadLength, UINT16 sequenceNumber) { UINT16 i; wStream* s; s = rdp_message_channel_pdu_init(context->rdp); if (!s) return FALSE; WLog_DBG(AUTODETECT_TAG, "sending Bandwidth Measure Payload PDU -> payloadLength=%u"); /* 4-bytes aligned */ payloadLength &= ~3; if (!Stream_EnsureRemainingCapacity(s, 8 + payloadLength)) { Stream_Release(s); return FALSE; } Stream_Write_UINT8(s, 0x08); /* headerLength (1 byte) */ Stream_Write_UINT8(s, TYPE_ID_AUTODETECT_REQUEST); /* headerTypeId (1 byte) */ Stream_Write_UINT16(s, sequenceNumber); /* sequenceNumber (2 bytes) */ Stream_Write_UINT16(s, RDP_BW_PAYLOAD_REQUEST_TYPE); /* requestType (2 bytes) */ Stream_Write_UINT16(s, payloadLength); /* payloadLength (2 bytes) */ /* Random data (better measurement in case the line is compressed) */ for (i = 0; i < payloadLength / 4; i++) { Stream_Write_UINT32(s, rand()); } return rdp_send_message_channel_pdu(context->rdp, s, SEC_AUTODETECT_REQ); }
static void update_send_cache_glyph_v2(rdpContext* context, CACHE_GLYPH_V2_ORDER* cache_glyph_v2) { wStream* s; UINT16 flags; int bm, em; int headerLength; INT16 orderLength; rdpUpdate* update = context->update; flags = 0; headerLength = 6; s = update->us; bm = Stream_GetPosition(s); Stream_EnsureRemainingCapacity(s, headerLength); Stream_Seek(s, headerLength); update_write_cache_glyph_v2_order(s, cache_glyph_v2, &flags); em = Stream_GetPosition(s); orderLength = (em - bm) - 13; Stream_SetPosition(s, bm); Stream_Write_UINT8(s, ORDER_STANDARD | ORDER_SECONDARY | ORDER_TYPE_CHANGE); /* controlFlags (1 byte) */ Stream_Write_UINT16(s, orderLength); /* orderLength (2 bytes) */ Stream_Write_UINT16(s, flags); /* extraFlags (2 bytes) */ Stream_Write_UINT8(s, ORDER_TYPE_CACHE_GLYPH); /* orderType (1 byte) */ Stream_SetPosition(s, em); update->numberOrders++; }
void license_write_preamble(wStream* s, BYTE bMsgType, BYTE flags, UINT16 wMsgSize) { /* preamble (4 bytes) */ Stream_Write_UINT8(s, bMsgType); /* bMsgType (1 byte) */ Stream_Write_UINT8(s, flags); /* flags (1 byte) */ Stream_Write_UINT16(s, wMsgSize); /* wMsgSize (2 bytes) */ }
static void rfx_compose_message_region(RFX_CONTEXT* context, wStream* s, const RFX_RECT* rects, int num_rects) { int size; int i; size = 15 + num_rects * 8; Stream_EnsureRemainingCapacity(s, size); Stream_Write_UINT16(s, WBT_REGION); /* CodecChannelT.blockType */ Stream_Write_UINT32(s, size); /* set CodecChannelT.blockLen later */ Stream_Write_UINT8(s, 1); /* CodecChannelT.codecId */ Stream_Write_UINT8(s, 0); /* CodecChannelT.channelId */ Stream_Write_UINT8(s, 1); /* regionFlags */ Stream_Write_UINT16(s, num_rects); /* numRects */ for (i = 0; i < num_rects; i++) { Stream_Write_UINT16(s, rects[i].x); Stream_Write_UINT16(s, rects[i].y); Stream_Write_UINT16(s, rects[i].width); Stream_Write_UINT16(s, rects[i].height); } Stream_Write_UINT16(s, CBT_REGION); /* regionType */ Stream_Write_UINT16(s, 1); /* numTilesets */ }
static BOOL rdpsnd_server_close(RdpsndServerContext* context) { int pos; BOOL status; wStream* s = context->priv->rdpsnd_pdu; if (context->selected_client_format < 0) return FALSE; if (context->priv->out_pending_frames > 0) { if (!rdpsnd_server_send_audio_pdu(context)) return FALSE; } context->selected_client_format = -1; Stream_Write_UINT8(s, SNDC_CLOSE); Stream_Write_UINT8(s, 0); Stream_Seek_UINT16(s); pos = Stream_GetPosition(s); Stream_SetPosition(s, 2); Stream_Write_UINT16(s, pos - 4); Stream_SetPosition(s, pos); status = WTSVirtualChannelWrite(context->priv->ChannelHandle, (PCHAR) Stream_Buffer(s), Stream_GetPosition(s), NULL); Stream_SetPosition(s, 0); return status; }
static void update_send_cache_brush(rdpContext* context, CACHE_BRUSH_ORDER* cache_brush) { wStream* s; UINT16 flags; int bm, em; int headerLength; INT16 orderLength; rdpUpdate* update = context->update; flags = 0; headerLength = 6; update_check_flush(context, headerLength + update_approximate_cache_brush_order(cache_brush, &flags)); s = update->us; bm = Stream_GetPosition(s); Stream_EnsureRemainingCapacity(s, headerLength); Stream_Seek(s, headerLength); update_write_cache_brush_order(s, cache_brush, &flags); em = Stream_GetPosition(s); orderLength = (em - bm) - 13; Stream_SetPosition(s, bm); Stream_Write_UINT8(s, ORDER_STANDARD | ORDER_SECONDARY); /* controlFlags (1 byte) */ Stream_Write_UINT16(s, orderLength); /* orderLength (2 bytes) */ Stream_Write_UINT16(s, flags); /* extraFlags (2 bytes) */ Stream_Write_UINT8(s, ORDER_TYPE_CACHE_BRUSH); /* orderType (1 byte) */ Stream_SetPosition(s, em); update->numberOrders++; }
/** * Function description * * @return 0 on success, otherwise a Win32 error code */ static UINT rdpgfx_write_h264_metablock(wStream* s, RDPGFX_H264_METABLOCK* meta) { UINT32 index; RECTANGLE_16* regionRect; RDPGFX_H264_QUANT_QUALITY* quantQualityVal; UINT error = CHANNEL_RC_OK; Stream_Write_UINT32(s, meta->numRegionRects); /* numRegionRects (4 bytes) */ for (index = 0; index < meta->numRegionRects; index++) { regionRect = &(meta->regionRects[index]); if ((error = rdpgfx_write_rect16(s, regionRect))) { WLog_ERR(TAG, "rdpgfx_write_rect16 failed with error %u!", error); return error; } } for (index = 0; index < meta->numRegionRects; index++) { quantQualityVal = &(meta->quantQualityVals[index]); Stream_Write_UINT8(s, quantQualityVal->qp | (quantQualityVal->r << 6) | (quantQualityVal->p << 7)); /* qpVal (1 byte) */ /* qualityVal (1 byte) */ Stream_Write_UINT8(s, quantQualityVal->qualityVal); } return error; }
static BOOL rdg_send_handshake(rdpRdg* rdg) { wStream* s; BOOL status; s = Stream_New(NULL, 14); if (!s) return FALSE; Stream_Write_UINT16(s, PKT_TYPE_HANDSHAKE_REQUEST); /* Type (2 bytes) */ Stream_Write_UINT16(s, 0); /* Reserved (2 bytes) */ Stream_Write_UINT32(s, 14); /* PacketLength (4 bytes) */ Stream_Write_UINT8(s, 1); /* VersionMajor (1 byte) */ Stream_Write_UINT8(s, 0); /* VersionMinor (1 byte) */ Stream_Write_UINT16(s, 0); /* ClientVersion (2 bytes), must be 0 */ Stream_Write_UINT16(s, rdg->extAuth); /* ExtendedAuthentication (2 bytes) */ Stream_SealLength(s); status = rdg_write_packet(rdg, s); Stream_Free(s, TRUE); if (status) { rdg->state = RDG_CLIENT_STATE_HANDSHAKE; } return status; }
BOOL rfx_write_message_region(RFX_CONTEXT* context, wStream* s, RFX_MESSAGE* message) { int i; UINT32 blockLen; blockLen = 15 + (message->numRects * 8); if (!Stream_EnsureRemainingCapacity(s, blockLen)) return FALSE; Stream_Write_UINT16(s, WBT_REGION); /* CodecChannelT.blockType (2 bytes) */ Stream_Write_UINT32(s, blockLen); /* set CodecChannelT.blockLen (4 bytes) */ Stream_Write_UINT8(s, 1); /* CodecChannelT.codecId (1 byte) */ Stream_Write_UINT8(s, 0); /* CodecChannelT.channelId (1 byte) */ Stream_Write_UINT8(s, 1); /* regionFlags (1 byte) */ Stream_Write_UINT16(s, message->numRects); /* numRects (2 bytes) */ for (i = 0; i < message->numRects; i++) { /* Clipping rectangles are relative to destLeft, destTop */ Stream_Write_UINT16(s, message->rects[i].x); /* x (2 bytes) */ Stream_Write_UINT16(s, message->rects[i].y); /* y (2 bytes) */ Stream_Write_UINT16(s, message->rects[i].width); /* width (2 bytes) */ Stream_Write_UINT16(s, message->rects[i].height); /* height (2 bytes) */ } Stream_Write_UINT16(s, CBT_REGION); /* regionType (2 bytes) */ Stream_Write_UINT16(s, 1); /* numTilesets (2 bytes) */ return TRUE; }
BOOL input_send_fastpath_focus_in_event(rdpInput* input, UINT16 toggleStates) { wStream* s; rdpRdp* rdp = input->context->rdp; BYTE eventFlags = 0; s = fastpath_input_pdu_init_header(rdp->fastpath); if (!s) return FALSE; /* send a tab up like mstsc.exe */ eventFlags = FASTPATH_INPUT_KBDFLAGS_RELEASE | FASTPATH_INPUT_EVENT_SCANCODE << 5; Stream_Write_UINT8(s, eventFlags); /* Key Release event (1 byte) */ Stream_Write_UINT8(s, 0x0f); /* keyCode (1 byte) */ /* send the toggle key states */ eventFlags = (toggleStates & 0x1F) | FASTPATH_INPUT_EVENT_SYNC << 5; Stream_Write_UINT8(s, eventFlags); /* toggle state (1 byte) */ /* send another tab up like mstsc.exe */ eventFlags = FASTPATH_INPUT_KBDFLAGS_RELEASE | FASTPATH_INPUT_EVENT_SCANCODE << 5; Stream_Write_UINT8(s, eventFlags); /* Key Release event (1 byte) */ Stream_Write_UINT8(s, 0x0f); /* keyCode (1 byte) */ return fastpath_send_multiple_input_pdu(rdp->fastpath, s, 3); }
static BOOL autodetect_send_bandwidth_measure_results(rdpRdp* rdp, UINT16 responseType, UINT16 sequenceNumber) { wStream* s; UINT32 timeDelta; /* Compute the total time */ timeDelta = GetTickCount() - rdp->autodetect->bandwidthMeasureStartTime; /* Send the result PDU to the server */ s = rdp_message_channel_pdu_init(rdp); if (!s) return FALSE; WLog_DBG(AUTODETECT_TAG, "sending Bandwidth Measure Results PDU -> timeDelta=%u, byteCount=%u", timeDelta, rdp->autodetect->bandwidthMeasureByteCount); Stream_Write_UINT8(s, 0x0E); /* headerLength (1 byte) */ Stream_Write_UINT8(s, TYPE_ID_AUTODETECT_RESPONSE); /* headerTypeId (1 byte) */ Stream_Write_UINT16(s, sequenceNumber); /* sequenceNumber (2 bytes) */ Stream_Write_UINT16(s, responseType); /* responseType (1 byte) */ Stream_Write_UINT32(s, timeDelta); /* timeDelta (4 bytes) */ Stream_Write_UINT32(s, rdp->autodetect->bandwidthMeasureByteCount); /* byteCount (4 bytes) */ return rdp_send_message_channel_pdu(rdp, s, SEC_AUTODETECT_RSP); }
void guac_rdpdr_fs_process_query_standard_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id) { wStream* output_stream; guac_rdp_fs_file* file; BOOL is_directory = FALSE; /* Get file */ file = guac_rdp_fs_get_file((guac_rdp_fs*) device->data, file_id); if (file == NULL) return; GUAC_RDP_DEBUG(2, "[file_id=%i]", file_id); if (file->attributes & FILE_ATTRIBUTE_DIRECTORY) is_directory = TRUE; output_stream = guac_rdpdr_new_io_completion(device, completion_id, STATUS_SUCCESS, 26); Stream_Write_UINT32(output_stream, 22); Stream_Write_UINT64(output_stream, file->size); /* AllocationSize */ Stream_Write_UINT64(output_stream, file->size); /* EndOfFile */ Stream_Write_UINT32(output_stream, 1); /* NumberOfLinks */ Stream_Write_UINT8(output_stream, 0); /* DeletePending */ Stream_Write_UINT8(output_stream, is_directory); /* Directory */ /* Reserved field must not be sent */ svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); }
static void rfx_write_message_codec_versions(RFX_CONTEXT* context, wStream* s) { Stream_Write_UINT16(s, WBT_CODEC_VERSIONS); /* BlockT.blockType (2 bytes) */ Stream_Write_UINT32(s, 10); /* BlockT.blockLen (4 bytes) */ Stream_Write_UINT8(s, 1); /* numCodecs (1 byte) */ Stream_Write_UINT8(s, 1); /* codecs.codecId (1 byte) */ Stream_Write_UINT16(s, WF_VERSION_1_0); /* codecs.version (2 bytes) */ }
/** * Function description * * @return 0 on success, otherwise a Win32 error code */ UINT rdpgfx_write_color32(wStream* s, RDPGFX_COLOR32* color32) { Stream_Write_UINT8(s, color32->B); /* B (1 byte) */ Stream_Write_UINT8(s, color32->G); /* G (1 byte) */ Stream_Write_UINT8(s, color32->R); /* R (1 byte) */ Stream_Write_UINT8(s, color32->XA); /* XA (1 byte) */ return CHANNEL_RC_OK; }
static void rfx_compose_message_codec_versions(RFX_CONTEXT* context, wStream* s) { Stream_Write_UINT16(s, WBT_CODEC_VERSIONS); /* BlockT.blockType */ Stream_Write_UINT32(s, 10); /* BlockT.blockLen */ Stream_Write_UINT8(s, 1); /* numCodecs */ Stream_Write_UINT8(s, 1); /* codecs.codecId */ Stream_Write_UINT16(s, WF_VERSION_1_0); /* codecs.version */ }
void ntlm_write_version_info(wStream* s, NTLM_VERSION_INFO* versionInfo) { Stream_Write_UINT8(s, versionInfo->ProductMajorVersion); /* ProductMajorVersion (1 byte) */ Stream_Write_UINT8(s, versionInfo->ProductMinorVersion); /* ProductMinorVersion (1 byte) */ Stream_Write_UINT16(s, versionInfo->ProductBuild); /* ProductBuild (2 bytes) */ Stream_Write(s, versionInfo->Reserved, sizeof(versionInfo->Reserved)); /* Reserved (3 bytes) */ Stream_Write_UINT8(s, versionInfo->NTLMRevisionCurrent); /* NTLMRevisionCurrent (1 byte) */ }
BOOL drive_file_query_information(DRIVE_FILE* file, UINT32 FsInformationClass, wStream* output) { struct STAT st; if (STAT(file->fullpath, &st) != 0) { Stream_Write_UINT32(output, 0); /* Length */ return FALSE; } switch (FsInformationClass) { case FileBasicInformation: /* http://msdn.microsoft.com/en-us/library/cc232094.aspx */ if (!Stream_EnsureRemainingCapacity(output, 4 + 36)) goto out_fail; Stream_Write_UINT32(output, 36); /* Length */ 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 */ Stream_Write_UINT64(output, FILE_TIME_SYSTEM_TO_RDP(st.st_ctime)); /* ChangeTime */ Stream_Write_UINT32(output, FILE_ATTR_SYSTEM_TO_RDP(file, st)); /* FileAttributes */ /* Reserved(4), MUST NOT be added! */ break; case FileStandardInformation: /* http://msdn.microsoft.com/en-us/library/cc232088.aspx */ if (!Stream_EnsureRemainingCapacity(output, 4 + 22)) goto out_fail; Stream_Write_UINT32(output, 22); /* Length */ Stream_Write_UINT64(output, st.st_size); /* AllocationSize */ Stream_Write_UINT64(output, st.st_size); /* EndOfFile */ Stream_Write_UINT32(output, st.st_nlink); /* NumberOfLinks */ Stream_Write_UINT8(output, file->delete_pending ? 1 : 0); /* DeletePending */ Stream_Write_UINT8(output, file->is_dir ? 1 : 0); /* Directory */ /* Reserved(2), MUST NOT be added! */ break; case FileAttributeTagInformation: /* http://msdn.microsoft.com/en-us/library/cc232093.aspx */ if (!Stream_EnsureRemainingCapacity(output, 4 + 8)) goto out_fail; Stream_Write_UINT32(output, 8); /* Length */ Stream_Write_UINT32(output, FILE_ATTR_SYSTEM_TO_RDP(file, st)); /* FileAttributes */ Stream_Write_UINT32(output, 0); /* ReparseTag */ break; default: /* Unhandled FsInformationClass */ Stream_Write_UINT32(output, 0); /* Length */ return FALSE; } return TRUE; out_fail: Stream_Write_UINT32(output, 0); /* Length */ return FALSE; }
static void rfx_write_message_channels(RFX_CONTEXT* context, wStream* s) { Stream_Write_UINT16(s, WBT_CHANNELS); /* BlockT.blockType (2 bytes) */ Stream_Write_UINT32(s, 12); /* BlockT.blockLen (4 bytes) */ Stream_Write_UINT8(s, 1); /* numChannels (1 byte) */ Stream_Write_UINT8(s, 0); /* Channel.channelId (1 byte) */ Stream_Write_UINT16(s, context->width); /* Channel.width (2 bytes) */ Stream_Write_UINT16(s, context->height); /* Channel.height (2 bytes) */ }
static void rfx_compose_message_channels(RFX_CONTEXT* context, wStream* s) { Stream_Write_UINT16(s, WBT_CHANNELS); /* BlockT.blockType */ Stream_Write_UINT32(s, 12); /* BlockT.blockLen */ Stream_Write_UINT8(s, 1); /* numChannels */ Stream_Write_UINT8(s, 0); /* Channel.channelId */ Stream_Write_UINT16(s, context->width); /* Channel.width */ Stream_Write_UINT16(s, context->height); /* Channel.height */ }
static void rfx_compose_message_frame_end(RFX_CONTEXT* context, wStream* s) { Stream_EnsureRemainingCapacity(s, 8); Stream_Write_UINT16(s, WBT_FRAME_END); /* CodecChannelT.blockType */ Stream_Write_UINT32(s, 8); /* CodecChannelT.blockLen */ Stream_Write_UINT8(s, 1); /* CodecChannelT.codecId */ Stream_Write_UINT8(s, 0); /* CodecChannelT.channelId */ }
BOOL rail_write_client_sysparam_order(wStream* s, RAIL_SYSPARAM_ORDER* sysparam) { BYTE body; BOOL ret = TRUE; Stream_Write_UINT32(s, sysparam->param); /* systemParam (4 bytes) */ switch (sysparam->param) { case SPI_SET_DRAG_FULL_WINDOWS: body = sysparam->dragFullWindows; Stream_Write_UINT8(s, body); break; case SPI_SET_KEYBOARD_CUES: body = sysparam->keyboardCues; Stream_Write_UINT8(s, body); break; case SPI_SET_KEYBOARD_PREF: body = sysparam->keyboardPref; Stream_Write_UINT8(s, body); break; case SPI_SET_MOUSE_BUTTON_SWAP: body = sysparam->mouseButtonSwap; Stream_Write_UINT8(s, body); break; case SPI_SET_WORK_AREA: Stream_Write_UINT16(s, sysparam->workArea.left); /* left (2 bytes) */ Stream_Write_UINT16(s, sysparam->workArea.top); /* top (2 bytes) */ Stream_Write_UINT16(s, sysparam->workArea.right); /* right (2 bytes) */ Stream_Write_UINT16(s, sysparam->workArea.bottom); /* bottom (2 bytes) */ break; case SPI_DISPLAY_CHANGE: Stream_Write_UINT16(s, sysparam->displayChange.left); /* left (2 bytes) */ Stream_Write_UINT16(s, sysparam->displayChange.top); /* top (2 bytes) */ Stream_Write_UINT16(s, sysparam->displayChange.right); /* right (2 bytes) */ Stream_Write_UINT16(s, sysparam->displayChange.bottom); /* bottom (2 bytes) */ break; case SPI_TASKBAR_POS: Stream_Write_UINT16(s, sysparam->taskbarPos.left); /* left (2 bytes) */ Stream_Write_UINT16(s, sysparam->taskbarPos.top); /* top (2 bytes) */ Stream_Write_UINT16(s, sysparam->taskbarPos.right); /* right (2 bytes) */ Stream_Write_UINT16(s, sysparam->taskbarPos.bottom); /* bottom (2 bytes) */ break; case SPI_SET_HIGH_CONTRAST: ret = rail_write_high_contrast(s, &sysparam->highContrast); break; } return ret; }
static UINT32 rdp_security_stream_out(rdpRdp* rdp, wStream* s, int length) { BYTE* data; UINT32 sec_flags; UINT32 pad = 0; sec_flags = rdp->sec_flags; if (sec_flags != 0) { rdp_write_security_header(s, sec_flags); if (sec_flags & SEC_ENCRYPT) { if (rdp->settings->EncryptionMethods == ENCRYPTION_METHOD_FIPS) { data = Stream_Pointer(s) + 12; length = length - (data - Stream_Buffer(s)); Stream_Write_UINT16(s, 0x10); /* length */ Stream_Write_UINT8(s, 0x1); /* TSFIPS_VERSION 1*/ /* handle padding */ pad = 8 - (length % 8); if (pad == 8) pad = 0; if (pad) memset(data+length, 0, pad); Stream_Write_UINT8(s, pad); security_hmac_signature(data, length, Stream_Pointer(s), rdp); Stream_Seek(s, 8); security_fips_encrypt(data, length + pad, rdp); } else { data = Stream_Pointer(s) + 8; length = length - (data - Stream_Buffer(s)); if (sec_flags & SEC_SECURE_CHECKSUM) security_salted_mac_signature(rdp, data, length, TRUE, Stream_Pointer(s)); else security_mac_signature(rdp, data, length, Stream_Pointer(s)); Stream_Seek(s, 8); security_encrypt(Stream_Pointer(s), length, rdp); } } rdp->sec_flags = 0; } return pad; }
void rfx_write_message_frame_begin(RFX_CONTEXT* context, wStream* s, RFX_MESSAGE* message) { Stream_EnsureRemainingCapacity(s, 14); Stream_Write_UINT16(s, WBT_FRAME_BEGIN); /* CodecChannelT.blockType */ Stream_Write_UINT32(s, 14); /* CodecChannelT.blockLen */ Stream_Write_UINT8(s, 1); /* CodecChannelT.codecId */ Stream_Write_UINT8(s, 0); /* CodecChannelT.channelId */ Stream_Write_UINT32(s, message->frameIdx); /* frameIdx */ Stream_Write_UINT16(s, 1); /* numRegions */ }
BOOL rfx_write_message_frame_end(RFX_CONTEXT* context, wStream* s, RFX_MESSAGE* message) { if (!Stream_EnsureRemainingCapacity(s, 8)) return FALSE; Stream_Write_UINT16(s, WBT_FRAME_END); /* CodecChannelT.blockType */ Stream_Write_UINT32(s, 8); /* CodecChannelT.blockLen */ Stream_Write_UINT8(s, 1); /* CodecChannelT.codecId */ Stream_Write_UINT8(s, 0); /* CodecChannelT.channelId */ return TRUE; }
static BOOL autodetect_send_bandwidth_measure_stop(rdpContext* context, UINT16 payloadLength, UINT16 sequenceNumber, UINT16 requestType) { wStream* s; UCHAR *buffer = NULL; BOOL bResult = FALSE; s = rdp_message_channel_pdu_init(context->rdp); if (!s) return FALSE; WLog_VRB(AUTODETECT_TAG, "sending Bandwidth Measure Stop PDU -> payloadLength=%u", payloadLength); /* 4-bytes aligned */ payloadLength &= ~3; Stream_Write_UINT8(s, requestType == RDP_BW_STOP_REQUEST_TYPE_CONNECTTIME ? 0x08 : 0x06); /* headerLength (1 byte) */ Stream_Write_UINT8(s, TYPE_ID_AUTODETECT_REQUEST); /* headerTypeId (1 byte) */ Stream_Write_UINT16(s, sequenceNumber); /* sequenceNumber (2 bytes) */ Stream_Write_UINT16(s, requestType); /* requestType (2 bytes) */ if (requestType == RDP_BW_STOP_REQUEST_TYPE_CONNECTTIME) { Stream_Write_UINT16(s, payloadLength); /* payloadLength (2 bytes) */ if (payloadLength > 0) { if (!Stream_EnsureRemainingCapacity(s, payloadLength)) { Stream_Release(s); return FALSE; } /* Random data (better measurement in case the line is compressed) */ buffer = malloc(payloadLength); if (NULL == buffer) { Stream_Release(s); return FALSE; } winpr_RAND(buffer, payloadLength); Stream_Write(s, buffer, payloadLength); } } bResult = rdp_send_message_channel_pdu(context->rdp, s, SEC_AUTODETECT_REQ); if (!bResult) { Stream_Release(s); } free(buffer); return bResult; }
static void rfx_compose_message_frame_begin(RFX_CONTEXT* context, wStream* s) { Stream_EnsureRemainingCapacity(s, 14); Stream_Write_UINT16(s, WBT_FRAME_BEGIN); /* CodecChannelT.blockType */ Stream_Write_UINT32(s, 14); /* CodecChannelT.blockLen */ Stream_Write_UINT8(s, 1); /* CodecChannelT.codecId */ Stream_Write_UINT8(s, 0); /* CodecChannelT.channelId */ Stream_Write_UINT32(s, context->frame_idx); /* frameIdx */ Stream_Write_UINT16(s, 1); /* numRegions */ context->frame_idx++; }