libfreerdp-core: got the server to send some dumped RemoteFX frames
This commit is contained in:
parent
9f256c8374
commit
25e761e58b
3
.gitignore
vendored
3
.gitignore
vendored
@ -30,6 +30,9 @@ docs/api
|
|||||||
ipch
|
ipch
|
||||||
Debug
|
Debug
|
||||||
|
|
||||||
|
# test files
|
||||||
|
*.pcap
|
||||||
|
|
||||||
# Binaries
|
# Binaries
|
||||||
*.a
|
*.a
|
||||||
*.so
|
*.so
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include <freerdp/rail.h>
|
#include <freerdp/rail.h>
|
||||||
#include <freerdp/types.h>
|
#include <freerdp/types.h>
|
||||||
#include <freerdp/utils/pcap.h>
|
#include <freerdp/utils/pcap.h>
|
||||||
|
#include <freerdp/utils/stream.h>
|
||||||
|
|
||||||
/* Common */
|
/* Common */
|
||||||
|
|
||||||
@ -1064,6 +1065,7 @@ typedef void (*pcMonitoredDesktop)(rdpUpdate* update, WINDOW_ORDER_INFO* orderIn
|
|||||||
typedef void (*pcNonMonitoredDesktop)(rdpUpdate* update, WINDOW_ORDER_INFO* orderInfo);
|
typedef void (*pcNonMonitoredDesktop)(rdpUpdate* update, WINDOW_ORDER_INFO* orderInfo);
|
||||||
|
|
||||||
typedef void (*pcSurfaceBits)(rdpUpdate* update, SURFACE_BITS_COMMAND* surface_bits_command);
|
typedef void (*pcSurfaceBits)(rdpUpdate* update, SURFACE_BITS_COMMAND* surface_bits_command);
|
||||||
|
typedef void (*pcSurfaceCommand)(rdpUpdate* update, STREAM* s);
|
||||||
|
|
||||||
struct rdp_update
|
struct rdp_update
|
||||||
{
|
{
|
||||||
@ -1146,6 +1148,7 @@ struct rdp_update
|
|||||||
pcNonMonitoredDesktop NonMonitoredDesktop;
|
pcNonMonitoredDesktop NonMonitoredDesktop;
|
||||||
|
|
||||||
pcSurfaceBits SurfaceBits;
|
pcSurfaceBits SurfaceBits;
|
||||||
|
pcSurfaceCommand SurfaceCommand;
|
||||||
|
|
||||||
BITMAP_UPDATE bitmap_update;
|
BITMAP_UPDATE bitmap_update;
|
||||||
PALETTE_UPDATE palette_update;
|
PALETTE_UPDATE palette_update;
|
||||||
|
@ -76,6 +76,8 @@ FREERDP_API void pcap_close(rdpPcap* pcap);
|
|||||||
FREERDP_API void pcap_add_record(rdpPcap* pcap, void* data, uint32 length);
|
FREERDP_API void pcap_add_record(rdpPcap* pcap, void* data, uint32 length);
|
||||||
FREERDP_API boolean pcap_has_next_record(rdpPcap* pcap);
|
FREERDP_API boolean pcap_has_next_record(rdpPcap* pcap);
|
||||||
FREERDP_API boolean pcap_get_next_record(rdpPcap* pcap, pcap_record* record);
|
FREERDP_API boolean pcap_get_next_record(rdpPcap* pcap, pcap_record* record);
|
||||||
|
FREERDP_API boolean pcap_get_next_record_header(rdpPcap* pcap, pcap_record* record);
|
||||||
|
FREERDP_API boolean pcap_get_next_record_content(rdpPcap* pcap, pcap_record* record);
|
||||||
FREERDP_API void pcap_flush(rdpPcap* pcap);
|
FREERDP_API void pcap_flush(rdpPcap* pcap);
|
||||||
|
|
||||||
#endif /* __UTILS_PCAP_H */
|
#endif /* __UTILS_PCAP_H */
|
||||||
|
@ -394,7 +394,7 @@ boolean fastpath_recv_inputs(rdpFastPath* fastpath, STREAM* s)
|
|||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* If numberEvents is not provided in fpInputHeader, it will be provided
|
* If numberEvents is not provided in fpInputHeader, it will be provided
|
||||||
* as onee additional byte here.
|
* as one additional byte here.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (stream_get_left(s) < 1)
|
if (stream_get_left(s) < 1)
|
||||||
@ -475,6 +475,36 @@ boolean fastpath_send_update_pdu(rdpFastPath* fastpath, STREAM* s)
|
|||||||
return True;
|
return True;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean fastpath_send_fragmented_update_pdu(rdpFastPath* fastpath, STREAM* s)
|
||||||
|
{
|
||||||
|
uint16 length;
|
||||||
|
uint32 totalLength;
|
||||||
|
STREAM* update;
|
||||||
|
|
||||||
|
totalLength = stream_get_length(s);
|
||||||
|
update = fastpath_update_pdu_init(fastpath);
|
||||||
|
|
||||||
|
if (totalLength <= FASTPATH_MAX_PACKET_SIZE)
|
||||||
|
{
|
||||||
|
stream_write_uint8(update, FASTPATH_UPDATETYPE_SURFCMDS | (FASTPATH_FRAGMENT_SINGLE << 4));
|
||||||
|
stream_write_uint16(update, totalLength);
|
||||||
|
stream_write(update, s->data, totalLength);
|
||||||
|
return fastpath_send_update_pdu(fastpath, update);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (totalLength > 0)
|
||||||
|
{
|
||||||
|
if (totalLength < FASTPATH_MAX_PACKET_SIZE)
|
||||||
|
length = totalLength;
|
||||||
|
else
|
||||||
|
length = FASTPATH_MAX_PACKET_SIZE;
|
||||||
|
|
||||||
|
totalLength -= length;
|
||||||
|
}
|
||||||
|
|
||||||
|
return True;
|
||||||
|
}
|
||||||
|
|
||||||
boolean fastpath_send_surfcmd_frame_marker(rdpFastPath* fastpath, uint16 frameAction, uint32 frameId)
|
boolean fastpath_send_surfcmd_frame_marker(rdpFastPath* fastpath, uint16 frameAction, uint32 frameId)
|
||||||
{
|
{
|
||||||
STREAM* s;
|
STREAM* s;
|
||||||
|
@ -100,6 +100,7 @@ boolean fastpath_send_input_pdu(rdpFastPath* fastpath, STREAM* s);
|
|||||||
|
|
||||||
STREAM* fastpath_update_pdu_init(rdpFastPath* fastpath);
|
STREAM* fastpath_update_pdu_init(rdpFastPath* fastpath);
|
||||||
boolean fastpath_send_update_pdu(rdpFastPath* fastpath, STREAM* s);
|
boolean fastpath_send_update_pdu(rdpFastPath* fastpath, STREAM* s);
|
||||||
|
boolean fastpath_send_fragmented_update_pdu(rdpFastPath* fastpath, STREAM* s);
|
||||||
|
|
||||||
boolean fastpath_send_surfcmd_frame_marker(rdpFastPath* fastpath, uint16 frameAction, uint32 frameId);
|
boolean fastpath_send_surfcmd_frame_marker(rdpFastPath* fastpath, uint16 frameAction, uint32 frameId);
|
||||||
boolean fastpath_send_surfcmd_surface_bits(rdpFastPath* fastpath, SURFACE_BITS_COMMAND* cmd);
|
boolean fastpath_send_surfcmd_surface_bits(rdpFastPath* fastpath, SURFACE_BITS_COMMAND* cmd);
|
||||||
|
@ -23,8 +23,8 @@
|
|||||||
|
|
||||||
static int update_recv_surfcmd_surface_bits(rdpUpdate* update, STREAM* s)
|
static int update_recv_surfcmd_surface_bits(rdpUpdate* update, STREAM* s)
|
||||||
{
|
{
|
||||||
SURFACE_BITS_COMMAND* cmd = &update->surface_bits_command;
|
|
||||||
int pos;
|
int pos;
|
||||||
|
SURFACE_BITS_COMMAND* cmd = &update->surface_bits_command;
|
||||||
|
|
||||||
stream_read_uint16(s, cmd->destLeft);
|
stream_read_uint16(s, cmd->destLeft);
|
||||||
stream_read_uint16(s, cmd->destTop);
|
stream_read_uint16(s, cmd->destTop);
|
||||||
@ -62,14 +62,14 @@ boolean update_recv_surfcmds(rdpUpdate* update, uint16 size, STREAM* s)
|
|||||||
{
|
{
|
||||||
uint16 cmdType;
|
uint16 cmdType;
|
||||||
|
|
||||||
|
if (update->dump_rfx)
|
||||||
|
{
|
||||||
|
pcap_add_record(update->pcap_rfx, s->p, size);
|
||||||
|
pcap_flush(update->pcap_rfx);
|
||||||
|
}
|
||||||
|
|
||||||
while (size > 2)
|
while (size > 2)
|
||||||
{
|
{
|
||||||
if (update->dump_rfx)
|
|
||||||
{
|
|
||||||
pcap_add_record(update->pcap_rfx, s->p, size);
|
|
||||||
pcap_flush(update->pcap_rfx);
|
|
||||||
}
|
|
||||||
|
|
||||||
stream_read_uint16(s, cmdType);
|
stream_read_uint16(s, cmdType);
|
||||||
size -= 2;
|
size -= 2;
|
||||||
|
|
||||||
|
@ -322,10 +322,15 @@ static void update_end_paint(rdpUpdate* update)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void update_send_surface_command(rdpUpdate* update, STREAM* s)
|
||||||
|
{
|
||||||
|
rdpRdp* rdp = (rdpRdp*) update->rdp;
|
||||||
|
fastpath_send_fragmented_update_pdu(rdp->fastpath, s);
|
||||||
|
}
|
||||||
|
|
||||||
static void update_send_surface_bits(rdpUpdate* update, SURFACE_BITS_COMMAND* surface_bits_command)
|
static void update_send_surface_bits(rdpUpdate* update, SURFACE_BITS_COMMAND* surface_bits_command)
|
||||||
{
|
{
|
||||||
rdpRdp* rdp = (rdpRdp*)update->rdp;
|
rdpRdp* rdp = (rdpRdp*)update->rdp;
|
||||||
|
|
||||||
fastpath_send_surfcmd_surface_bits(rdp->fastpath, surface_bits_command);
|
fastpath_send_surfcmd_surface_bits(rdp->fastpath, surface_bits_command);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -362,6 +367,7 @@ void update_register_server_callbacks(rdpUpdate* update)
|
|||||||
update->Synchronize = update_send_synchronize;
|
update->Synchronize = update_send_synchronize;
|
||||||
update->PointerSystem = update_send_pointer_system;
|
update->PointerSystem = update_send_pointer_system;
|
||||||
update->SurfaceBits = update_send_surface_bits;
|
update->SurfaceBits = update_send_surface_bits;
|
||||||
|
update->SurfaceCommand = update_send_surface_command;
|
||||||
}
|
}
|
||||||
|
|
||||||
rdpUpdate* update_new(rdpRdp* rdp)
|
rdpUpdate* update_new(rdpRdp* rdp)
|
||||||
|
@ -101,6 +101,24 @@ boolean pcap_has_next_record(rdpPcap* pcap)
|
|||||||
return True;
|
return True;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boolean pcap_get_next_record_header(rdpPcap* pcap, pcap_record* record)
|
||||||
|
{
|
||||||
|
if (pcap_has_next_record(pcap) != True)
|
||||||
|
return False;
|
||||||
|
|
||||||
|
pcap_read_record_header(pcap, &record->header);
|
||||||
|
record->length = record->header.incl_len;
|
||||||
|
record->data = xmalloc(record->length);
|
||||||
|
|
||||||
|
return True;
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean pcap_get_next_record_content(rdpPcap* pcap, pcap_record* record)
|
||||||
|
{
|
||||||
|
fread(record->data, record->length, 1, pcap->fp);
|
||||||
|
return True;
|
||||||
|
}
|
||||||
|
|
||||||
boolean pcap_get_next_record(rdpPcap* pcap, pcap_record* record)
|
boolean pcap_get_next_record(rdpPcap* pcap, pcap_record* record)
|
||||||
{
|
{
|
||||||
if (pcap_has_next_record(pcap) != True)
|
if (pcap_has_next_record(pcap) != True)
|
||||||
|
@ -232,6 +232,33 @@ static void test_peer_draw_icon(freerdp_peer* client, int x, int y)
|
|||||||
info->icon_y = y;
|
info->icon_y = y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_peer_dump_rfx(freerdp_peer* client)
|
||||||
|
{
|
||||||
|
STREAM* s;
|
||||||
|
rdpUpdate* update;
|
||||||
|
rdpPcap* pcap_rfx;
|
||||||
|
pcap_record record;
|
||||||
|
|
||||||
|
s = stream_new(512);
|
||||||
|
update = client->update;
|
||||||
|
client->update->pcap_rfx = pcap_open("rfx_test.pcap", False);
|
||||||
|
pcap_rfx = client->update->pcap_rfx;
|
||||||
|
|
||||||
|
while (pcap_has_next_record(pcap_rfx))
|
||||||
|
{
|
||||||
|
pcap_get_next_record_header(pcap_rfx, &record);
|
||||||
|
|
||||||
|
s->data = xrealloc(s->data, record.length);
|
||||||
|
record.data = s->data;
|
||||||
|
s->size = record.length;
|
||||||
|
|
||||||
|
pcap_get_next_record_content(pcap_rfx, &record);
|
||||||
|
s->p = s->data + s->size;
|
||||||
|
|
||||||
|
update->SurfaceCommand(update, s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
boolean test_peer_post_connect(freerdp_peer* client)
|
boolean test_peer_post_connect(freerdp_peer* client)
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
@ -259,6 +286,11 @@ boolean test_peer_post_connect(freerdp_peer* client)
|
|||||||
test_peer_draw_background(client);
|
test_peer_draw_background(client);
|
||||||
test_peer_load_icon(client);
|
test_peer_load_icon(client);
|
||||||
|
|
||||||
|
if (client->update->dump_rfx)
|
||||||
|
{
|
||||||
|
test_peer_dump_rfx(client);
|
||||||
|
}
|
||||||
|
|
||||||
/* Return False here would stop the execution of the peer mainloop. */
|
/* Return False here would stop the execution of the peer mainloop. */
|
||||||
return True;
|
return True;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user