21#include <winpr/wtsapi.h>
23#include <freerdp/peer.h>
24#include <freerdp/constants.h>
25#include <freerdp/channels/channels.h>
26#include <freerdp/channels/wtsvc.h>
31#define TEST_SVC_CHANNEL_ID 1004
33static BOOL recv_pdu(freerdp_peer* client,
const BYTE* data,
size_t size)
35 return client->ReceiveChannelData(client, TEST_SVC_CHANNEL_ID, data, size,
36 CHANNEL_FLAG_FIRST | CHANNEL_FLAG_LAST, size);
41static BOOL test_truncated_dynvc_pdu(
void)
44 HANDLE vcm = INVALID_HANDLE_VALUE;
46 freerdp_peer* client = calloc(1,
sizeof(freerdp_peer));
50 client->ContextSize =
sizeof(rdpContext);
51 if (!freerdp_peer_context_new(client))
54 rdpMcs* mcs = client->context->rdp->mcs;
55 mcs->channelCount = 1;
56 (void)strncpy(mcs->channels[0].Name, DRDYNVC_SVC_CHANNEL_NAME, CHANNEL_NAME_LEN);
57 mcs->channels[0].ChannelId = TEST_SVC_CHANNEL_ID;
58 mcs->channels[0].joined = TRUE;
60 vcm = WTSOpenServerA((LPSTR)client->context);
61 if (!vcm || (vcm == INVALID_HANDLE_VALUE))
64 if (!WTSVirtualChannelManagerOpen(vcm))
68 const BYTE capsRsp[] = { 0x50, 0x00, 0x01, 0x00 };
69 if (!recv_pdu(client, capsRsp,
sizeof(capsRsp)))
72 HANDLE dvc = WTSVirtualChannelOpenEx(1,
"testdvc", WTS_CHANNEL_OPTION_DYNAMIC);
77 const BYTE createRsp[] = { 0x10, 0x01, 0x00, 0x00, 0x00, 0x00 };
78 if (!recv_pdu(client, createRsp,
sizeof(createRsp)))
83 const BYTE truncated[] = { 0x10 };
84 if (recv_pdu(client, truncated,
sizeof(truncated)))
86 (void)fprintf(stderr,
"truncated DYNVC PDU accepted\n");
92 if (vcm != INVALID_HANDLE_VALUE)
94 freerdp_peer_context_free(client);
99int TestServerChannels(WINPR_ATTR_UNUSED
int argc, WINPR_ATTR_UNUSED
char* argv[])
101 WTSRegisterWtsApiFunctionTable(FreeRDP_InitWtsApi());
103 if (!test_truncated_dynvc_pdu())