Cleaned up remdesk

This commit is contained in:
Armin Novak 2021-09-06 16:11:48 +02:00 committed by akallabeth
parent 467f7c3f6a
commit f794a8c7d4
3 changed files with 92 additions and 27 deletions

View File

@ -24,6 +24,7 @@
#endif
#include <winpr/crt.h>
#include <winpr/assert.h>
#include <winpr/print.h>
#include <freerdp/assistance.h>
@ -49,6 +50,7 @@ static UINT remdesk_virtual_channel_write(remdeskPlugin* remdesk, wStream* s)
return CHANNEL_RC_INVALID_INSTANCE;
}
WINPR_ASSERT(remdesk->channelEntryPoints.pVirtualChannelWriteEx);
status = remdesk->channelEntryPoints.pVirtualChannelWriteEx(
remdesk->InitHandle, remdesk->OpenHandle, Stream_Buffer(s), (UINT32)Stream_Length(s), s);
@ -71,7 +73,12 @@ static UINT remdesk_generate_expert_blob(remdeskPlugin* remdesk)
char* name;
char* pass;
char* password;
rdpSettings* settings = remdesk->settings;
rdpSettings* settings;
WINPR_ASSERT(remdesk);
settings = remdesk->settings;
WINPR_ASSERT(settings);
if (remdesk->ExpertBlob)
return CHANNEL_RC_OK;
@ -133,6 +140,9 @@ static UINT remdesk_read_channel_header(wStream* s, REMDESK_CHANNEL_HEADER* head
UINT32 ChannelNameLen;
char* pChannelName = NULL;
WINPR_ASSERT(s);
WINPR_ASSERT(header);
if (Stream_GetRemainingLength(s) < 8)
{
WLog_ERR(TAG, "Not enough data!");
@ -184,8 +194,10 @@ static UINT remdesk_write_channel_header(wStream* s, REMDESK_CHANNEL_HEADER* hea
{
int index;
UINT32 ChannelNameLen;
WCHAR ChannelNameW[32];
ZeroMemory(ChannelNameW, sizeof(ChannelNameW));
WCHAR ChannelNameW[32] = { 0 };
WINPR_ASSERT(s);
WINPR_ASSERT(header);
for (index = 0; index < 32; index++)
{
@ -206,7 +218,10 @@ static UINT remdesk_write_channel_header(wStream* s, REMDESK_CHANNEL_HEADER* hea
*/
static UINT remdesk_write_ctl_header(wStream* s, REMDESK_CTL_HEADER* ctlHeader)
{
remdesk_write_channel_header(s, (REMDESK_CHANNEL_HEADER*)ctlHeader);
WINPR_ASSERT(s);
WINPR_ASSERT(ctlHeader);
remdesk_write_channel_header(s, &ctlHeader->ch);
Stream_Write_UINT32(s, ctlHeader->msgType); /* msgType (4 bytes) */
return CHANNEL_RC_OK;
}
@ -219,9 +234,12 @@ static UINT remdesk_write_ctl_header(wStream* s, REMDESK_CTL_HEADER* ctlHeader)
static UINT remdesk_prepare_ctl_header(REMDESK_CTL_HEADER* ctlHeader, UINT32 msgType,
UINT32 msgSize)
{
WINPR_ASSERT(ctlHeader);
ctlHeader->msgType = msgType;
sprintf_s(ctlHeader->ChannelName, ARRAYSIZE(ctlHeader->ChannelName), REMDESK_CHANNEL_CTL_NAME);
ctlHeader->DataLength = 4 + msgSize;
sprintf_s(ctlHeader->ch.ChannelName, ARRAYSIZE(ctlHeader->ch.ChannelName),
REMDESK_CHANNEL_CTL_NAME);
ctlHeader->ch.DataLength = 4 + msgSize;
return CHANNEL_RC_OK;
}
@ -233,6 +251,10 @@ static UINT remdesk_prepare_ctl_header(REMDESK_CTL_HEADER* ctlHeader, UINT32 msg
static UINT remdesk_recv_ctl_server_announce_pdu(remdeskPlugin* remdesk, wStream* s,
REMDESK_CHANNEL_HEADER* header)
{
WINPR_ASSERT(remdesk);
WINPR_ASSERT(s);
WINPR_ASSERT(header);
return CHANNEL_RC_OK;
}
@ -247,6 +269,10 @@ static UINT remdesk_recv_ctl_version_info_pdu(remdeskPlugin* remdesk, wStream* s
UINT32 versionMajor;
UINT32 versionMinor;
WINPR_ASSERT(remdesk);
WINPR_ASSERT(s);
WINPR_ASSERT(header);
if (Stream_GetRemainingLength(s) < 8)
{
WLog_ERR(TAG, "Not enough data!");
@ -276,10 +302,13 @@ static UINT remdesk_send_ctl_version_info_pdu(remdeskPlugin* remdesk)
wStream* s;
REMDESK_CTL_VERSION_INFO_PDU pdu;
UINT error;
WINPR_ASSERT(remdesk);
remdesk_prepare_ctl_header(&(pdu.ctlHeader), REMDESK_CTL_VERSIONINFO, 8);
pdu.versionMajor = 1;
pdu.versionMinor = 2;
s = Stream_New(NULL, REMDESK_CHANNEL_CTL_SIZE + pdu.ctlHeader.DataLength);
s = Stream_New(NULL, REMDESK_CHANNEL_CTL_SIZE + pdu.ctlHeader.ch.DataLength);
if (!s)
{
@ -308,6 +337,11 @@ static UINT remdesk_recv_ctl_result_pdu(remdeskPlugin* remdesk, wStream* s,
{
UINT32 result;
WINPR_ASSERT(remdesk);
WINPR_ASSERT(s);
WINPR_ASSERT(header);
WINPR_ASSERT(pResult);
if (Stream_GetRemainingLength(s) < 4)
{
WLog_ERR(TAG, "Not enough data!");
@ -336,6 +370,8 @@ static UINT remdesk_send_ctl_authenticate_pdu(remdeskPlugin* remdesk)
WCHAR* raConnectionStringW = NULL;
REMDESK_CTL_AUTHENTICATE_PDU pdu = { 0 };
WINPR_ASSERT(remdesk);
if ((error = remdesk_generate_expert_blob(remdesk)))
{
WLog_ERR(TAG, "remdesk_generate_expert_blob failed with error %" PRIu32 "", error);
@ -343,6 +379,7 @@ static UINT remdesk_send_ctl_authenticate_pdu(remdeskPlugin* remdesk)
}
pdu.expertBlob = remdesk->ExpertBlob;
WINPR_ASSERT(remdesk->settings);
pdu.raConnectionString = remdesk->settings->RemoteAssistanceRCTicket;
status = ConvertToUnicode(CP_UTF8, 0, pdu.raConnectionString, -1, &raConnectionStringW, 0);
@ -365,7 +402,7 @@ static UINT remdesk_send_ctl_authenticate_pdu(remdeskPlugin* remdesk)
cbExpertBlobW = status * 2;
remdesk_prepare_ctl_header(&(pdu.ctlHeader), REMDESK_CTL_AUTHENTICATE,
cbRaConnectionStringW + cbExpertBlobW);
s = Stream_New(NULL, REMDESK_CHANNEL_CTL_SIZE + pdu.ctlHeader.DataLength);
s = Stream_New(NULL, REMDESK_CHANNEL_CTL_SIZE + pdu.ctlHeader.ch.DataLength);
if (!s)
{
@ -402,6 +439,10 @@ static UINT remdesk_send_ctl_remote_control_desktop_pdu(remdeskPlugin* remdesk)
int cbRaConnectionStringW = 0;
WCHAR* raConnectionStringW = NULL;
REMDESK_CTL_REMOTE_CONTROL_DESKTOP_PDU pdu;
WINPR_ASSERT(remdesk);
WINPR_ASSERT(remdesk->settings);
pdu.raConnectionString = remdesk->settings->RemoteAssistanceRCTicket;
status = ConvertToUnicode(CP_UTF8, 0, pdu.raConnectionString, -1, &raConnectionStringW, 0);
@ -414,7 +455,7 @@ static UINT remdesk_send_ctl_remote_control_desktop_pdu(remdeskPlugin* remdesk)
cbRaConnectionStringW = status * 2;
remdesk_prepare_ctl_header(&(pdu.ctlHeader), REMDESK_CTL_REMOTE_CONTROL_DESKTOP,
cbRaConnectionStringW);
s = Stream_New(NULL, REMDESK_CHANNEL_CTL_SIZE + pdu.ctlHeader.DataLength);
s = Stream_New(NULL, REMDESK_CHANNEL_CTL_SIZE + pdu.ctlHeader.ch.DataLength);
if (!s)
{
@ -450,6 +491,8 @@ static UINT remdesk_send_ctl_verify_password_pdu(remdeskPlugin* remdesk)
WCHAR* expertBlobW = NULL;
REMDESK_CTL_VERIFY_PASSWORD_PDU pdu;
WINPR_ASSERT(remdesk);
if ((error = remdesk_generate_expert_blob(remdesk)))
{
WLog_ERR(TAG, "remdesk_generate_expert_blob failed with error %" PRIu32 "!", error);
@ -467,7 +510,7 @@ static UINT remdesk_send_ctl_verify_password_pdu(remdeskPlugin* remdesk)
cbExpertBlobW = status * 2;
remdesk_prepare_ctl_header(&(pdu.ctlHeader), REMDESK_CTL_VERIFY_PASSWORD, cbExpertBlobW);
s = Stream_New(NULL, REMDESK_CHANNEL_CTL_SIZE + pdu.ctlHeader.DataLength);
s = Stream_New(NULL, REMDESK_CHANNEL_CTL_SIZE + pdu.ctlHeader.ch.DataLength);
if (!s)
{
@ -500,6 +543,8 @@ static UINT remdesk_send_ctl_expert_on_vista_pdu(remdeskPlugin* remdesk)
wStream* s;
REMDESK_CTL_EXPERT_ON_VISTA_PDU pdu;
WINPR_ASSERT(remdesk);
if ((error = remdesk_generate_expert_blob(remdesk)))
{
WLog_ERR(TAG, "remdesk_generate_expert_blob failed with error %" PRIu32 "!", error);
@ -510,7 +555,7 @@ static UINT remdesk_send_ctl_expert_on_vista_pdu(remdeskPlugin* remdesk)
pdu.EncryptedPassword = remdesk->EncryptedPassStub;
remdesk_prepare_ctl_header(&(pdu.ctlHeader), REMDESK_CTL_EXPERT_ON_VISTA,
pdu.EncryptedPasswordLength);
s = Stream_New(NULL, REMDESK_CHANNEL_CTL_SIZE + pdu.ctlHeader.DataLength);
s = Stream_New(NULL, REMDESK_CHANNEL_CTL_SIZE + pdu.ctlHeader.ch.DataLength);
if (!s)
{
@ -535,6 +580,10 @@ static UINT remdesk_recv_ctl_pdu(remdeskPlugin* remdesk, wStream* s, REMDESK_CHA
UINT32 msgType = 0;
UINT32 result = 0;
WINPR_ASSERT(remdesk);
WINPR_ASSERT(s);
WINPR_ASSERT(header);
if (Stream_GetRemainingLength(s) < 4)
{
WLog_ERR(TAG, "Not enough data!");
@ -659,6 +708,10 @@ static UINT remdesk_process_receive(remdeskPlugin* remdesk, wStream* s)
{
UINT status;
REMDESK_CHANNEL_HEADER header;
WINPR_ASSERT(remdesk);
WINPR_ASSERT(s);
#if 0
WLog_DBG(TAG, "RemdeskReceive: %"PRIuz"", Stream_GetRemainingLength(s));
winpr_HexDump(Stream_Pointer(s), Stream_GetRemainingLength(s));
@ -698,6 +751,7 @@ static UINT remdesk_process_receive(remdeskPlugin* remdesk, wStream* s)
static void remdesk_process_connect(remdeskPlugin* remdesk)
{
WINPR_ASSERT(remdesk);
remdesk->settings = (rdpSettings*)remdesk->channelEntryPoints.pExtendedData;
}
@ -712,6 +766,8 @@ static UINT remdesk_virtual_channel_event_data_received(remdeskPlugin* remdesk,
{
wStream* data_in;
WINPR_ASSERT(remdesk);
if ((dataFlags & CHANNEL_FLAG_SUSPEND) || (dataFlags & CHANNEL_FLAG_RESUME))
{
return CHANNEL_RC_OK;
@ -815,6 +871,9 @@ static DWORD WINAPI remdesk_virtual_channel_client_thread(LPVOID arg)
wMessage message;
remdeskPlugin* remdesk = (remdeskPlugin*)arg;
UINT error = CHANNEL_RC_OK;
WINPR_ASSERT(remdesk);
remdesk_process_connect(remdesk);
while (1)
@ -908,21 +967,28 @@ static UINT remdesk_virtual_channel_event_disconnected(remdeskPlugin* remdesk)
{
UINT rc;
WINPR_ASSERT(remdesk);
if (remdesk->OpenHandle == 0)
return CHANNEL_RC_OK;
if (MessageQueue_PostQuit(remdesk->queue, 0) &&
(WaitForSingleObject(remdesk->thread, INFINITE) == WAIT_FAILED))
if (remdesk->queue && remdesk->thread)
{
rc = GetLastError();
WLog_ERR(TAG, "WaitForSingleObject failed with error %" PRIu32 "", rc);
return rc;
if (MessageQueue_PostQuit(remdesk->queue, 0) &&
(WaitForSingleObject(remdesk->thread, INFINITE) == WAIT_FAILED))
{
rc = GetLastError();
WLog_ERR(TAG, "WaitForSingleObject failed with error %" PRIu32 "", rc);
return rc;
}
}
MessageQueue_Free(remdesk->queue);
CloseHandle(remdesk->thread);
remdesk->queue = NULL;
remdesk->thread = NULL;
WINPR_ASSERT(remdesk->channelEntryPoints.pVirtualChannelCloseEx);
rc = remdesk->channelEntryPoints.pVirtualChannelCloseEx(remdesk->InitHandle,
remdesk->OpenHandle);
@ -934,17 +1000,16 @@ static UINT remdesk_virtual_channel_event_disconnected(remdeskPlugin* remdesk)
remdesk->OpenHandle = 0;
if (remdesk->data_in)
{
Stream_Free(remdesk->data_in, TRUE);
remdesk->data_in = NULL;
}
Stream_Free(remdesk->data_in, TRUE);
remdesk->data_in = NULL;
return rc;
}
static void remdesk_virtual_channel_event_terminated(remdeskPlugin* remdesk)
{
WINPR_ASSERT(remdesk);
remdesk->InitHandle = 0;
free(remdesk->context);
free(remdesk);

View File

@ -148,8 +148,9 @@ static UINT remdesk_prepare_ctl_header(REMDESK_CTL_HEADER* ctlHeader, UINT32 msg
UINT32 msgSize)
{
ctlHeader->msgType = msgType;
sprintf_s(ctlHeader->ChannelName, ARRAYSIZE(ctlHeader->ChannelName), REMDESK_CHANNEL_CTL_NAME);
ctlHeader->DataLength = 4 + msgSize;
sprintf_s(ctlHeader->ch.ChannelName, ARRAYSIZE(ctlHeader->ch.ChannelName),
REMDESK_CHANNEL_CTL_NAME);
ctlHeader->ch.DataLength = 4 + msgSize;
return CHANNEL_RC_OK;
}
@ -171,7 +172,7 @@ static UINT remdesk_send_ctl_result_pdu(RemdeskServerContext* context, UINT32 re
return error;
}
s = Stream_New(NULL, REMDESK_CHANNEL_CTL_SIZE + pdu.ctlHeader.DataLength);
s = Stream_New(NULL, REMDESK_CHANNEL_CTL_SIZE + pdu.ctlHeader.ch.DataLength);
if (!s)
{
@ -215,7 +216,7 @@ static UINT remdesk_send_ctl_version_info_pdu(RemdeskServerContext* context)
pdu.versionMajor = 1;
pdu.versionMinor = 2;
s = Stream_New(NULL, REMDESK_CHANNEL_CTL_SIZE + pdu.ctlHeader.DataLength);
s = Stream_New(NULL, REMDESK_CHANNEL_CTL_SIZE + pdu.ctlHeader.ch.DataLength);
if (!s)
{

View File

@ -86,8 +86,7 @@ typedef struct _REMDESK_CHANNEL_HEADER REMDESK_CHANNEL_HEADER;
struct _REMDESK_CTL_HEADER
{
UINT32 DataLength;
char ChannelName[32];
REMDESK_CHANNEL_HEADER ch;
UINT32 msgType;
};