int tsmf_ifman_update_geometry_info(TSMF_IFMAN * ifman) { TSMF_PRESENTATION * presentation; uint32 numGeometryInfo; uint32 Left; uint32 Top; uint32 Width; uint32 Height; uint32 cbVisibleRect; RD_RECT * rects = NULL; int num_rects = 0; int i; int error = 0; numGeometryInfo = GET_UINT32(ifman->input_buffer, 16); Width = GET_UINT32(ifman->input_buffer, 20 + 12); Height = GET_UINT32(ifman->input_buffer, 20 + 16); Left = GET_UINT32(ifman->input_buffer, 20 + 20); Top = GET_UINT32(ifman->input_buffer, 20 + 24); cbVisibleRect = GET_UINT32(ifman->input_buffer, 20 + numGeometryInfo); num_rects = cbVisibleRect / 16; LLOGLN(10, ("tsmf_ifman_update_geometry_info: numGeometryInfo %d " "Width %d Height %d Left %d Top %d cbVisibleRect %d num_rects %d", numGeometryInfo, Width, Height, Left, Top, cbVisibleRect, num_rects)); presentation = tsmf_presentation_find_by_id(ifman->input_buffer); if (presentation == NULL) error = 1; else { if (num_rects > 0) { rects = (RD_RECT *) malloc(sizeof(RD_RECT) * num_rects); for (i = 0; i < num_rects; i++) { rects[i].x = (uint16) GET_UINT32(ifman->input_buffer, 24 + numGeometryInfo + i * 16 + 4); rects[i].y = (uint16) GET_UINT32(ifman->input_buffer, 24 + numGeometryInfo + i * 16); rects[i].width = (uint16) GET_UINT32(ifman->input_buffer, 24 + numGeometryInfo + i * 16 + 12) - rects[i].x; rects[i].height = (uint16) GET_UINT32(ifman->input_buffer, 24 + numGeometryInfo + i * 16 + 8) - rects[i].y; LLOGLN(10, ("rect %d: %d %d %d %d", i, rects[i].x, rects[i].y, rects[i].width, rects[i].height)); } } tsmf_presentation_set_geometry_info(presentation, Left, Top, Width, Height, num_rects, rects); } ifman->output_pending = 1; return 0; }
int tsmf_ifman_update_geometry_info(TSMF_IFMAN* ifman) { TSMF_PRESENTATION* presentation; UINT32 numGeometryInfo; UINT32 Left; UINT32 Top; UINT32 Width; UINT32 Height; UINT32 cbVisibleRect; RDP_RECT* rects = NULL; int num_rects = 0; int error = 0; int i; int pos; presentation = tsmf_presentation_find_by_id(Stream_Pointer(ifman->input)); Stream_Seek(ifman->input, 16); Stream_Read_UINT32(ifman->input, numGeometryInfo); pos = Stream_GetPosition(ifman->input); Stream_Seek(ifman->input, 12); /* VideoWindowId (8 bytes), VideoWindowState (4 bytes) */ Stream_Read_UINT32(ifman->input, Width); Stream_Read_UINT32(ifman->input, Height); Stream_Read_UINT32(ifman->input, Left); Stream_Read_UINT32(ifman->input, Top); Stream_SetPosition(ifman->input, pos + numGeometryInfo); Stream_Read_UINT32(ifman->input, cbVisibleRect); num_rects = cbVisibleRect / 16; DEBUG_DVC("numGeometryInfo %d Width %d Height %d Left %d Top %d cbVisibleRect %d num_rects %d", numGeometryInfo, Width, Height, Left, Top, cbVisibleRect, num_rects); if (presentation == NULL) { error = 1; } else { if (num_rects > 0) { rects = (RDP_RECT*) malloc(sizeof(RDP_RECT) * num_rects); ZeroMemory(rects, sizeof(RDP_RECT) * num_rects); for (i = 0; i < num_rects; i++) { Stream_Read_UINT16(ifman->input, rects[i].y); /* Top */ Stream_Seek_UINT16(ifman->input); Stream_Read_UINT16(ifman->input, rects[i].x); /* Left */ Stream_Seek_UINT16(ifman->input); Stream_Read_UINT16(ifman->input, rects[i].height); /* Bottom */ Stream_Seek_UINT16(ifman->input); Stream_Read_UINT16(ifman->input, rects[i].width); /* Right */ Stream_Seek_UINT16(ifman->input); rects[i].width -= rects[i].x; rects[i].height -= rects[i].y; DEBUG_DVC("rect %d: %d %d %d %d", i, rects[i].x, rects[i].y, rects[i].width, rects[i].height); } } tsmf_presentation_set_geometry_info(presentation, Left, Top, Width, Height, num_rects, rects); } ifman->output_pending = TRUE; return error; }
/** * Function description * * @return 0 on success, otherwise a Win32 error code */ UINT tsmf_ifman_update_geometry_info(TSMF_IFMAN* ifman) { TSMF_PRESENTATION* presentation; UINT32 numGeometryInfo; UINT32 Left; UINT32 Top; UINT32 Width; UINT32 Height; UINT32 cbVisibleRect; RDP_RECT *rects = NULL; int num_rects = 0; UINT error = CHANNEL_RC_OK; int i; int pos; if (Stream_GetRemainingLength(ifman->input) < GUID_SIZE + 32) return ERROR_INVALID_DATA; presentation = tsmf_presentation_find_by_id(Stream_Pointer(ifman->input)); if (!presentation) return ERROR_NOT_FOUND; Stream_Seek(ifman->input, 16); Stream_Read_UINT32(ifman->input, numGeometryInfo); pos = Stream_GetPosition(ifman->input); Stream_Seek(ifman->input, 12); /* VideoWindowId (8 bytes), VideoWindowState (4 bytes) */ Stream_Read_UINT32(ifman->input, Width); Stream_Read_UINT32(ifman->input, Height); Stream_Read_UINT32(ifman->input, Left); Stream_Read_UINT32(ifman->input, Top); Stream_SetPosition(ifman->input, pos + numGeometryInfo); Stream_Read_UINT32(ifman->input, cbVisibleRect); num_rects = cbVisibleRect / 16; DEBUG_TSMF("numGeometryInfo %d Width %d Height %d Left %d Top %d cbVisibleRect %d num_rects %d", numGeometryInfo, Width, Height, Left, Top, cbVisibleRect, num_rects); if (num_rects > 0) { rects = (RDP_RECT*) calloc(num_rects, sizeof(RDP_RECT)); for (i = 0; i < num_rects; i++) { Stream_Read_UINT16(ifman->input, rects[i].y); /* Top */ Stream_Seek_UINT16(ifman->input); Stream_Read_UINT16(ifman->input, rects[i].x); /* Left */ Stream_Seek_UINT16(ifman->input); Stream_Read_UINT16(ifman->input, rects[i].height); /* Bottom */ Stream_Seek_UINT16(ifman->input); Stream_Read_UINT16(ifman->input, rects[i].width); /* Right */ Stream_Seek_UINT16(ifman->input); rects[i].width -= rects[i].x; rects[i].height -= rects[i].y; DEBUG_TSMF("rect %d: %d %d %d %d", i, rects[i].x, rects[i].y, rects[i].width, rects[i].height); } } if (!tsmf_presentation_set_geometry_info(presentation, Left, Top, Width, Height, num_rects, rects)) return ERROR_INVALID_OPERATION; ifman->output_pending = TRUE; return error; }