BOOL update_recv(rdpUpdate* update, wStream* s) { UINT16 updateType; rdpContext* context = update->context; if (Stream_GetRemainingLength(s) < 2) return FALSE; Stream_Read_UINT16(s, updateType); /* updateType (2 bytes) */ //printf("%s Update Data PDU\n", UPDATE_TYPE_STRINGS[updateType]); IFCALL(update->BeginPaint, context); switch (updateType) { case UPDATE_TYPE_ORDERS: if (!update_recv_orders(update, s)) { /* XXX: Do we have to call EndPaint? */ return FALSE; } break; case UPDATE_TYPE_BITMAP: if (!update_read_bitmap_update(update, s, &update->bitmap_update)) return FALSE; IFCALL(update->BitmapUpdate, context, &update->bitmap_update); break; case UPDATE_TYPE_PALETTE: if (!update_read_palette(update, s, &update->palette_update)) return FALSE; IFCALL(update->Palette, context, &update->palette_update); break; case UPDATE_TYPE_SYNCHRONIZE: update_read_synchronize(update, s); IFCALL(update->Synchronize, context); break; } IFCALL(update->EndPaint, context); return TRUE; }
BOOL rail_read_server_minmaxinfo_order(wStream* s, RAIL_MINMAXINFO_ORDER* minmaxinfo) { if (Stream_GetRemainingLength(s) < 20) return FALSE; Stream_Read_UINT32(s, minmaxinfo->windowId); /* windowId (4 bytes) */ Stream_Read_UINT16(s, minmaxinfo->maxWidth); /* maxWidth (2 bytes) */ Stream_Read_UINT16(s, minmaxinfo->maxHeight); /* maxHeight (2 bytes) */ Stream_Read_UINT16(s, minmaxinfo->maxPosX); /* maxPosX (2 bytes) */ Stream_Read_UINT16(s, minmaxinfo->maxPosY); /* maxPosY (2 bytes) */ Stream_Read_UINT16(s, minmaxinfo->minTrackWidth); /* minTrackWidth (2 bytes) */ Stream_Read_UINT16(s, minmaxinfo->minTrackHeight); /* minTrackHeight (2 bytes) */ Stream_Read_UINT16(s, minmaxinfo->maxTrackWidth); /* maxTrackWidth (2 bytes) */ Stream_Read_UINT16(s, minmaxinfo->maxTrackHeight); /* maxTrackHeight (2 bytes) */ return TRUE; }
BOOL rdp_read_share_data_header(wStream* s, UINT16* length, BYTE* type, UINT32* shareId, BYTE* compressedType, UINT16* compressedLength) { if (Stream_GetRemainingLength(s) < 12) return FALSE; /* Share Data Header */ Stream_Read_UINT32(s, *shareId); /* shareId (4 bytes) */ Stream_Seek_UINT8(s); /* pad1 (1 byte) */ Stream_Seek_UINT8(s); /* streamId (1 byte) */ Stream_Read_UINT16(s, *length); /* uncompressedLength (2 bytes) */ Stream_Read_UINT8(s, *type); /* pduType2, Data PDU Type (1 byte) */ Stream_Read_UINT8(s, *compressedType); /* compressedType (1 byte) */ Stream_Read_UINT16(s, *compressedLength); /* compressedLength (2 bytes) */ return TRUE; }
static BOOL input_recv_event(rdpInput* input, wStream* s) { UINT16 messageType; if (Stream_GetRemainingLength(s) < 6) return FALSE; Stream_Seek(s, 4); /* eventTime (4 bytes), ignored by the server */ Stream_Read_UINT16(s, messageType); /* messageType (2 bytes) */ switch (messageType) { case INPUT_EVENT_SYNC: if (!input_recv_sync_event(input, s)) return FALSE; break; case INPUT_EVENT_SCANCODE: if (!input_recv_keyboard_event(input, s)) return FALSE; break; case INPUT_EVENT_UNICODE: if (!input_recv_unicode_keyboard_event(input, s)) return FALSE; break; case INPUT_EVENT_MOUSE: if (!input_recv_mouse_event(input, s)) return FALSE; break; case INPUT_EVENT_MOUSEX: if (!input_recv_extended_mouse_event(input, s)) return FALSE; break; default: fprintf(stderr, "Unknown messageType %u\n", messageType); /* Each input event uses 6 bytes. */ Stream_Seek(s, 6); break; } return TRUE; }
int rdp_recv_multitransport_packet(rdpRdp* rdp, wStream* s) { UINT32 requestId; UINT16 requestedProtocol; UINT16 reserved; BYTE securityCookie[16]; if (Stream_GetRemainingLength(s) < 24) return -1; Stream_Read_UINT32(s, requestId); /* requestId (4 bytes) */ Stream_Read_UINT16(s, requestedProtocol); /* requestedProtocol (2 bytes) */ Stream_Read_UINT16(s, reserved); /* reserved (2 bytes) */ Stream_Read(s, securityCookie, 16); /* securityCookie (16 bytes) */ return 0; }
BOOL rdp_recv_client_synchronize_pdu(rdpRdp* rdp, wStream* s) { UINT16 messageType; rdp->finalize_sc_pdus |= FINALIZE_SC_SYNCHRONIZE_PDU; if (Stream_GetRemainingLength(s) < 4) return FALSE; Stream_Read_UINT16(s, messageType); /* messageType (2 bytes) */ if (messageType != SYNCMSGTYPE_SYNC) return FALSE; /* targetUser (2 bytes) */ Stream_Seek_UINT16(s); return TRUE; }
/** * Function description * * @return 0 on success, otherwise a Win32 error code */ UINT tsmf_ifman_rim_exchange_capability_request(TSMF_IFMAN* ifman) { UINT32 CapabilityValue; if (Stream_GetRemainingLength(ifman->input) < 4) return ERROR_INVALID_DATA; Stream_Read_UINT32(ifman->input, CapabilityValue); DEBUG_TSMF("server CapabilityValue %d", CapabilityValue); if (!Stream_EnsureRemainingCapacity(ifman->output, 8)) return ERROR_INVALID_DATA; Stream_Write_UINT32(ifman->output, 1); /* CapabilityValue */ Stream_Write_UINT32(ifman->output, 0); /* Result */ return CHANNEL_RC_OK; }
/** * Function description * * @return 0 on success, otherwise a Win32 error code */ static UINT remdesk_recv_ctl_version_info_pdu(remdeskPlugin* remdesk, wStream* s, REMDESK_CHANNEL_HEADER* header) { UINT32 versionMajor; UINT32 versionMinor; if (Stream_GetRemainingLength(s) < 8) { WLog_ERR(TAG, "Not enought data!"); return ERROR_INVALID_DATA; } Stream_Read_UINT32(s, versionMajor); /* versionMajor (4 bytes) */ Stream_Read_UINT32(s, versionMinor); /* versionMinor (4 bytes) */ remdesk->Version = versionMajor; return CHANNEL_RC_OK; }
BOOL rdp_read_client_auto_reconnect_cookie(rdpRdp* rdp, wStream* s) { ARC_CS_PRIVATE_PACKET* autoReconnectCookie; rdpSettings* settings = rdp->settings; autoReconnectCookie = settings->ClientAutoReconnectCookie; if (Stream_GetRemainingLength(s) < 28) return FALSE; Stream_Read_UINT32(s, autoReconnectCookie->cbLen); /* cbLen (4 bytes) */ Stream_Read_UINT32(s, autoReconnectCookie->version); /* version (4 bytes) */ Stream_Read_UINT32(s, autoReconnectCookie->logonId); /* LogonId (4 bytes) */ Stream_Read(s, autoReconnectCookie->securityVerifier, 16); /* SecurityVerifier */ return TRUE; }
/** * Function description * * @return 0 on success, otherwise a Win32 error code */ static UINT cliprdr_server_receive_temporary_directory(CliprdrServerContext* context, wStream* s, CLIPRDR_HEADER* header) { int length; WCHAR* wszTempDir; CLIPRDR_TEMP_DIRECTORY tempDirectory; CliprdrServerPrivate* cliprdr = (CliprdrServerPrivate*) context->handle; size_t slength; UINT error = CHANNEL_RC_OK; if ((slength = Stream_GetRemainingLength(s)) < 520) { WLog_ERR(TAG, "Stream_GetRemainingLength returned %d but should at least be 520", slength); return CHANNEL_RC_NO_MEMORY; } wszTempDir = (WCHAR*) Stream_Pointer(s); if (wszTempDir[260] != 0) { WLog_ERR(TAG, "wszTempDir[260] was not 0"); return ERROR_INVALID_DATA; } free(cliprdr->temporaryDirectory); cliprdr->temporaryDirectory = NULL; ConvertFromUnicode(CP_UTF8, 0, wszTempDir, -1, &(cliprdr->temporaryDirectory), 0, NULL, NULL); length = strlen(cliprdr->temporaryDirectory); if (length > 519) length = 519; CopyMemory(tempDirectory.szTempDir, cliprdr->temporaryDirectory, length); tempDirectory.szTempDir[length] = '\0'; WLog_DBG(TAG, "CliprdrTemporaryDirectory: %s", cliprdr->temporaryDirectory); IFCALLRET(context->TempDirectory, error, context, &tempDirectory); if (error) WLog_ERR(TAG, "TempDirectory failed with error %lu!", error); return error; }
int rdpgfx_recv_wire_to_surface_2_pdu(RDPGFX_CHANNEL_CALLBACK* callback, wStream* s) { RDPGFX_SURFACE_COMMAND cmd; RDPGFX_WIRE_TO_SURFACE_PDU_2 pdu; RDPGFX_PLUGIN* gfx = (RDPGFX_PLUGIN*) callback->plugin; RdpgfxClientContext* context = (RdpgfxClientContext*) gfx->iface.pInterface; if (Stream_GetRemainingLength(s) < 13) return -1; Stream_Read_UINT16(s, pdu.surfaceId); /* surfaceId (2 bytes) */ Stream_Read_UINT16(s, pdu.codecId); /* codecId (2 bytes) */ Stream_Read_UINT32(s, pdu.codecContextId); /* codecContextId (4 bytes) */ Stream_Read_UINT8(s, pdu.pixelFormat); /* pixelFormat (1 byte) */ Stream_Read_UINT32(s, pdu.bitmapDataLength); /* bitmapDataLength (4 bytes) */ pdu.bitmapData = Stream_Pointer(s); Stream_Seek(s, pdu.bitmapDataLength); WLog_DBG(TAG, "RecvWireToSurface2Pdu: surfaceId: %d codecId: %s (0x%04X) " "codecContextId: %d pixelFormat: 0x%04X bitmapDataLength: %d", (int) pdu.surfaceId, rdpgfx_get_codec_id_string(pdu.codecId), pdu.codecId, pdu.codecContextId, pdu.pixelFormat, pdu.bitmapDataLength); cmd.surfaceId = pdu.surfaceId; cmd.codecId = pdu.codecId; cmd.contextId = pdu.codecContextId; cmd.format = pdu.pixelFormat; cmd.left = 0; cmd.top = 0; cmd.right = 0; cmd.bottom = 0; cmd.width = 0; cmd.height = 0; cmd.length = pdu.bitmapDataLength; cmd.data = pdu.bitmapData; if (context && context->SurfaceCommand) { context->SurfaceCommand(context, &cmd); } return 1; }
/** * Function description * * @return 0 on success, otherwise a Win32 error code */ static UINT read_dismiss_hovering_contact(RdpeiServerContext *context, wStream *s) { BYTE contactId; UINT error = CHANNEL_RC_OK; if (Stream_GetRemainingLength(s) < 1) { WLog_ERR(TAG, "Not enought data!"); return ERROR_INVALID_DATA; } Stream_Read_UINT8(s, contactId); IFCALLRET(context->onTouchReleased, error, context, contactId); if (error) WLog_ERR(TAG, "context->onTouchReleased failed with error %lu", error); return error; }
static int drdynvc_process_data_first(drdynvcPlugin* drdynvc, int Sp, int cbChId, wStream* s) { int status; UINT32 Length; UINT32 ChannelId; ChannelId = drdynvc_read_variable_uint(s, cbChId); Length = drdynvc_read_variable_uint(s, Sp); DEBUG_DVC("ChannelId=%d Length=%d", ChannelId, Length); status = dvcman_receive_channel_data_first(drdynvc->channel_mgr, ChannelId, Length); if (status) return status; return dvcman_receive_channel_data(drdynvc->channel_mgr, ChannelId, Stream_Pointer(s), Stream_GetRemainingLength(s)); }
static BOOL rfx_process_message_frame_begin(RFX_CONTEXT* context, RFX_MESSAGE* message, wStream* s) { UINT32 frameIdx; UINT16 numRegions; if (Stream_GetRemainingLength(s) < 6) { DEBUG_WARN("RfxMessageFrameBegin packet too small"); return FALSE; } Stream_Read_UINT32(s, frameIdx); /* frameIdx (4 bytes), if codec is in video mode, must be ignored */ Stream_Read_UINT16(s, numRegions); /* numRegions (2 bytes) */ WLog_Print(context->priv->log, WLOG_DEBUG, "RFX_FRAME_BEGIN: frameIdx: %d numRegions: %d", frameIdx, numRegions); return TRUE; }
BOOL rdp_recv_set_error_info_data_pdu(rdpRdp* rdp, wStream* s) { if (Stream_GetRemainingLength(s) < 4) return FALSE; Stream_Read_UINT32(s, rdp->errorInfo); /* errorInfo (4 bytes) */ if (rdp->errorInfo != ERRINFO_SUCCESS) { rdpClient* client = rdp->instance->context->client; rdp_print_errinfo(rdp->errorInfo); IFCALL(client->OnErrorInfo, rdp->instance, rdp->errorInfo); } return TRUE; }
BOOL rail_read_server_localmovesize_order(wStream* s, RAIL_LOCALMOVESIZE_ORDER* localMoveSize) { UINT16 isMoveSizeStart; if (Stream_GetRemainingLength(s) < 12) return FALSE; Stream_Read_UINT32(s, localMoveSize->windowId); /* windowId (4 bytes) */ Stream_Read_UINT16(s, isMoveSizeStart); /* isMoveSizeStart (2 bytes) */ localMoveSize->isMoveSizeStart = (isMoveSizeStart != 0) ? TRUE : FALSE; Stream_Read_UINT16(s, localMoveSize->moveSizeType); /* moveSizeType (2 bytes) */ Stream_Read_UINT16(s, localMoveSize->posX); /* posX (2 bytes) */ Stream_Read_UINT16(s, localMoveSize->posY); /* posY (2 bytes) */ return TRUE; }
static BOOL autodetect_recv_bandwidth_measure_payload(rdpRdp* rdp, wStream* s, AUTODETECT_REQ_PDU* autodetectReqPdu) { UINT16 payloadLength; if (autodetectReqPdu->headerLength != 0x08) return FALSE; if (Stream_GetRemainingLength(s) < 2) return FALSE; Stream_Read_UINT16(s, payloadLength); /* payloadLength (2 bytes) */ WLog_DBG(AUTODETECT_TAG, "received Bandwidth Measure Payload PDU -> payloadLength=%"PRIu16"", payloadLength); /* Add the payload length to the bandwidth measurement parameters */ rdp->autodetect->bandwidthMeasureByteCount += payloadLength; return TRUE; }
BOOL license_read_error_alert_packet(rdpLicense* license, wStream* s) { UINT32 dwErrorCode; UINT32 dwStateTransition; if (Stream_GetRemainingLength(s) < 8) return FALSE; Stream_Read_UINT32(s, dwErrorCode); /* dwErrorCode (4 bytes) */ Stream_Read_UINT32(s, dwStateTransition); /* dwStateTransition (4 bytes) */ if (!license_read_binary_blob(s, license->ErrorInfo)) /* bbErrorInfo */ return FALSE; #ifdef WITH_DEBUG_LICENSE WLog_DBG(TAG, "dwErrorCode: %s, dwStateTransition: %s", error_codes[dwErrorCode], state_transitions[dwStateTransition]); #endif if (dwErrorCode == STATUS_VALID_CLIENT) { license->state = LICENSE_STATE_COMPLETED; return TRUE; } switch (dwStateTransition) { case ST_TOTAL_ABORT: license->state = LICENSE_STATE_ABORTED; break; case ST_NO_TRANSITION: license->state = LICENSE_STATE_COMPLETED; break; case ST_RESET_PHASE_TO_START: license->state = LICENSE_STATE_AWAIT; break; case ST_RESEND_LAST_MESSAGE: break; default: break; } return TRUE; }
static BOOL rfx_process_message_context(RFX_CONTEXT* context, wStream* s) { BYTE ctxId; UINT16 tileSize; UINT16 properties; if (Stream_GetRemainingLength(s) < 5) { DEBUG_WARN("RfxMessageContext packet too small"); return FALSE; } Stream_Read_UINT8(s, ctxId); /* ctxId (1 byte), must be set to 0x00 */ Stream_Read_UINT16(s, tileSize); /* tileSize (2 bytes), must be set to CT_TILE_64x64 (0x0040) */ Stream_Read_UINT16(s, properties); /* properties (2 bytes) */ DEBUG_RFX("ctxId %d tileSize %d properties 0x%X.", ctxId, tileSize, properties); context->properties = properties; context->flags = (properties & 0x0007); if (context->flags == CODEC_MODE) DEBUG_RFX("codec is in image mode."); else DEBUG_RFX("codec is in video mode."); switch ((properties & 0x1E00) >> 9) { case CLW_ENTROPY_RLGR1: context->mode = RLGR1; DEBUG_RFX("RLGR1."); break; case CLW_ENTROPY_RLGR3: context->mode = RLGR3; DEBUG_RFX("RLGR3."); break; default: DEBUG_WARN("unknown RLGR algorithm."); break; } return TRUE; }
/** * Function description * * @return 0 on success, otherwise a Win32 error code */ static UINT dvcman_receive_channel_data(IWTSVirtualChannelManager* pChannelMgr, UINT32 ChannelId, wStream* data) { UINT status = CHANNEL_RC_OK; DVCMAN_CHANNEL* channel; size_t dataSize = Stream_GetRemainingLength(data); channel = (DVCMAN_CHANNEL*) dvcman_find_channel_by_id(pChannelMgr, ChannelId); if (!channel) { WLog_ERR(TAG, "ChannelId %d not found!", ChannelId); return ERROR_INTERNAL_ERROR; } if (channel->dvc_data) { /* Fragmented data */ if (Stream_GetPosition(channel->dvc_data) + dataSize > (UINT32) Stream_Capacity(channel->dvc_data)) { WLog_ERR(TAG, "data exceeding declared length!"); Stream_Release(channel->dvc_data); channel->dvc_data = NULL; return ERROR_INVALID_DATA; } Stream_Write(channel->dvc_data, Stream_Pointer(data), dataSize); if (((size_t) Stream_GetPosition(channel->dvc_data)) >= channel->dvc_data_length) { Stream_SealLength(channel->dvc_data); Stream_SetPosition(channel->dvc_data, 0); status = channel->channel_callback->OnDataReceived(channel->channel_callback, channel->dvc_data); Stream_Release(channel->dvc_data); channel->dvc_data = NULL; } } else { status = channel->channel_callback->OnDataReceived(channel->channel_callback, data); } return status; }
void nego_process_negotiation_response(rdpNego* nego, wStream* s) { UINT16 length; WLog_DBG(TAG, "RDP_NEG_RSP"); if (Stream_GetRemainingLength(s) < 7) { WLog_ERR(TAG, "Invalid RDP_NEG_RSP"); nego->state = NEGO_STATE_FAIL; return; } Stream_Read_UINT8(s, nego->flags); Stream_Read_UINT16(s, length); Stream_Read_UINT32(s, nego->SelectedProtocol); nego->state = NEGO_STATE_FINAL; }
int dvcman_receive_channel_data(IWTSVirtualChannelManager* pChannelMgr, UINT32 ChannelId, wStream* data) { int status = 0; DVCMAN_CHANNEL* channel; UINT32 dataSize = Stream_GetRemainingLength(data); channel = (DVCMAN_CHANNEL*) dvcman_find_channel_by_id(pChannelMgr, ChannelId); if (!channel) { DEBUG_WARN("ChannelId %d not found!", ChannelId); return 1; } if (channel->dvc_data) { /* Fragmented data */ if (Stream_GetPosition(channel->dvc_data) + dataSize > (UINT32) Stream_Capacity(channel->dvc_data)) { DEBUG_WARN("data exceeding declared length!"); Stream_Release(channel->dvc_data); channel->dvc_data = NULL; return 1; } Stream_Write(channel->dvc_data, Stream_Pointer(data), dataSize); if (((size_t) Stream_GetPosition(channel->dvc_data)) >= Stream_Capacity(channel->dvc_data)) { Stream_SealLength(channel->dvc_data); Stream_SetPosition(channel->dvc_data, 0); status = channel->channel_callback->OnDataReceived(channel->channel_callback, channel->dvc_data); Stream_Release(channel->dvc_data); channel->dvc_data = NULL; } } else { status = channel->channel_callback->OnDataReceived(channel->channel_callback, data); } return status; }
BOOL rdp_read_server_auto_reconnect_cookie(rdpRdp* rdp, wStream* s, logon_info_ex *info) { BYTE* p; ARC_SC_PRIVATE_PACKET* autoReconnectCookie; rdpSettings* settings = rdp->settings; autoReconnectCookie = settings->ServerAutoReconnectCookie; if (Stream_GetRemainingLength(s) < 28) return FALSE; Stream_Read_UINT32(s, autoReconnectCookie->cbLen); /* cbLen (4 bytes) */ if (autoReconnectCookie->cbLen != 28) { WLog_ERR(TAG, "ServerAutoReconnectCookie.cbLen != 28"); return FALSE; } Stream_Read_UINT32(s, autoReconnectCookie->version); /* Version (4 bytes) */ Stream_Read_UINT32(s, autoReconnectCookie->logonId); /* LogonId (4 bytes) */ Stream_Read(s, autoReconnectCookie->arcRandomBits, 16); /* ArcRandomBits (16 bytes) */ p = autoReconnectCookie->arcRandomBits; WLog_DBG(TAG, "ServerAutoReconnectCookie: Version: %d LogonId: %d SecurityVerifier: " "%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", autoReconnectCookie->version, autoReconnectCookie->logonId, p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9], p[10], p[11], p[12], p[13], p[14], p[15]); info->LogonId = autoReconnectCookie->logonId; CopyMemory(info->ArcRandomBits, p, 16); if ((settings->PrintReconnectCookie) && (autoReconnectCookie->cbLen > 0)) { char* base64; base64 = crypto_base64_encode((BYTE*) autoReconnectCookie, sizeof(ARC_SC_PRIVATE_PACKET)); WLog_INFO(TAG, "Reconnect-cookie: %s", base64); free(base64); } return TRUE; }
BOOL ber_read_enumerated(wStream* s, BYTE* enumerated, BYTE count) { int length; if (!ber_read_universal_tag(s, BER_TAG_ENUMERATED, FALSE) || !ber_read_length(s, &length)) return FALSE; if (length != 1 || Stream_GetRemainingLength(s) < 1) return FALSE; Stream_Read_UINT8(s, *enumerated); /* check that enumerated value falls within expected range */ if (*enumerated + 1 > count) return FALSE; return TRUE; }
void nego_process_negotiation_response(rdpNego* nego, wStream* s) { UINT16 length; DEBUG_NEGO("RDP_NEG_RSP"); if (Stream_GetRemainingLength(s) < 7) { DEBUG_NEGO("RDP_INVALID_NEG_RSP"); nego->state = NEGO_STATE_FAIL; return; } Stream_Read_UINT8(s, nego->flags); Stream_Read_UINT16(s, length); Stream_Read_UINT32(s, nego->selected_protocol); nego->state = NEGO_STATE_FINAL; }
static UINT serial_process_irp_write(SERIAL_DEVICE* serial, IRP* irp) { UINT32 Length; UINT64 Offset; DWORD nbWritten = 0; if (Stream_GetRemainingLength(irp->input) < 32) return ERROR_INVALID_DATA; Stream_Read_UINT32(irp->input, Length); /* Length (4 bytes) */ Stream_Read_UINT64(irp->input, Offset); /* Offset (8 bytes) */ Stream_Seek(irp->input, 20); /* Padding (20 bytes) */ /* MS-RDPESP 3.2.5.1.5: The Offset field is ignored * assert(Offset == 0); * * Using a serial printer, noticed though this field could be * set. */ WLog_Print(serial->log, WLOG_DEBUG, "writing %"PRIu32" bytes to %s", Length, serial->device.name); /* FIXME: CommWriteFile to be replaced by WriteFile */ if (CommWriteFile(serial->hComm, Stream_Pointer(irp->input), Length, &nbWritten, NULL)) { irp->IoStatus = STATUS_SUCCESS; } else { WLog_Print(serial->log, WLOG_DEBUG, "write failure to %s, nbWritten=%"PRIu32", last-error: 0x%08"PRIX32"", serial->device.name, nbWritten, GetLastError()); irp->IoStatus = _GetLastErrorToIoStatus(serial); } WLog_Print(serial->log, WLOG_DEBUG, "%"PRIu32" bytes written to %s", nbWritten, serial->device.name); Stream_Write_UINT32(irp->output, nbWritten); /* Length (4 bytes) */ Stream_Write_UINT8(irp->output, 0); /* Padding (1 byte) */ return CHANNEL_RC_OK; }
/** * Function description * * @return 0 on success, otherwise a Win32 error code */ UINT tsmf_ifman_add_stream(TSMF_IFMAN* ifman, rdpContext* rdpcontext) { UINT32 StreamId; UINT status = CHANNEL_RC_OK; TSMF_STREAM* stream; TSMF_PRESENTATION* presentation; DEBUG_TSMF(""); if (Stream_GetRemainingLength(ifman->input) < GUID_SIZE + 8) return ERROR_INVALID_DATA; presentation = tsmf_presentation_find_by_id(Stream_Pointer(ifman->input)); Stream_Seek(ifman->input, GUID_SIZE); if (!presentation) { WLog_ERR(TAG, "unknown presentation id"); status = ERROR_NOT_FOUND; } else { Stream_Read_UINT32(ifman->input, StreamId); Stream_Seek_UINT32(ifman->input); /* numMediaType */ stream = tsmf_stream_new(presentation, StreamId, rdpcontext); if (!stream) { WLog_ERR(TAG, "failed to create stream"); return ERROR_OUTOFMEMORY; } if (!tsmf_stream_set_format(stream, ifman->decoder_name, ifman->input)) { WLog_ERR(TAG, "failed to set stream format"); return ERROR_OUTOFMEMORY; } } ifman->output_pending = TRUE; return status; }
int rdpgfx_recv_delete_surface_pdu(RDPGFX_CHANNEL_CALLBACK* callback, wStream* s) { RDPGFX_DELETE_SURFACE_PDU pdu; RDPGFX_PLUGIN* gfx = (RDPGFX_PLUGIN*) callback->plugin; RdpgfxClientContext* context = (RdpgfxClientContext*) gfx->iface.pInterface; if (Stream_GetRemainingLength(s) < 2) return -1; Stream_Read_UINT16(s, pdu.surfaceId); /* surfaceId (2 bytes) */ WLog_Print(gfx->log, WLOG_DEBUG, "RecvDeleteSurfacePdu: surfaceId: %d", pdu.surfaceId); if (context && context->DeleteSurface) { context->DeleteSurface(context, &pdu); } return 1; }
int rdpgfx_recv_evict_cache_entry_pdu(RDPGFX_CHANNEL_CALLBACK* callback, wStream* s) { RDPGFX_EVICT_CACHE_ENTRY_PDU pdu; RDPGFX_PLUGIN* gfx = (RDPGFX_PLUGIN*) callback->plugin; RdpgfxClientContext* context = (RdpgfxClientContext*) gfx->iface.pInterface; if (Stream_GetRemainingLength(s) < 2) return -1; Stream_Read_UINT16(s, pdu.cacheSlot); /* cacheSlot (2 bytes) */ WLog_Print(gfx->log, WLOG_DEBUG, "RecvEvictCacheEntryPdu: cacheSlot: %d", pdu.cacheSlot); if (context && context->EvictCacheEntry) { context->EvictCacheEntry(context, &pdu); } return 1; }
BOOL update_recv_altsec_window_order(rdpUpdate* update, wStream* s) { UINT16 orderSize; rdpWindowUpdate* window = update->window; if (Stream_GetRemainingLength(s) < 6) return FALSE; Stream_Read_UINT16(s, orderSize); /* orderSize (2 bytes) */ Stream_Read_UINT32(s, window->orderInfo.fieldFlags); /* FieldsPresentFlags (4 bytes) */ if (window->orderInfo.fieldFlags & WINDOW_ORDER_TYPE_WINDOW) return update_recv_window_info_order(update, s, &window->orderInfo); else if (window->orderInfo.fieldFlags & WINDOW_ORDER_TYPE_NOTIFY) return update_recv_notification_icon_info_order(update, s, &window->orderInfo); else if (window->orderInfo.fieldFlags & WINDOW_ORDER_TYPE_DESKTOP) return update_recv_desktop_info_order(update, s, &window->orderInfo); return TRUE; }