[rdpdr] improved version handling

This commit is contained in:
Armin Novak 2023-01-09 10:41:46 +01:00 committed by Martin Fleisz
parent 58c4517700
commit 920d5ee7a1
3 changed files with 28 additions and 13 deletions

View File

@ -49,8 +49,8 @@ static void rdpdr_write_general_capset(rdpdrPlugin* rdpdr, wStream* s)
rdpdr_write_capset_header(s, CAP_GENERAL_TYPE, 44, GENERAL_CAPABILITY_VERSION_02);
Stream_Write_UINT32(s, 0); /* osType, ignored on receipt */
Stream_Write_UINT32(s, 0); /* osVersion, unused and must be set to zero */
Stream_Write_UINT16(s, rdpdr->versionMajor); /* protocolMajorVersion, must be set to 1 */
Stream_Write_UINT16(s, rdpdr->versionMinor); /* protocolMinorVersion */
Stream_Write_UINT16(s, rdpdr->clientVersionMajor); /* protocolMajorVersion, must be set to 1 */
Stream_Write_UINT16(s, rdpdr->clientVersionMinor); /* protocolMinorVersion */
Stream_Write_UINT32(s, 0x0000FFFF); /* ioCode1 */
Stream_Write_UINT32(s, 0); /* ioCode2, must be set to zero, reserved for future use */
Stream_Write_UINT32(s, RDPDR_DEVICE_REMOVE_PDUS | RDPDR_CLIENT_DISPLAY_NAME_PDU |

View File

@ -1128,10 +1128,18 @@ static UINT rdpdr_process_server_announce_request(rdpdrPlugin* rdpdr, wStream* s
if (!Stream_CheckAndLogRequiredLengthWLog(rdpdr->log, s, 8))
return ERROR_INVALID_DATA;
Stream_Read_UINT16(s, rdpdr->versionMajor);
Stream_Read_UINT16(s, rdpdr->versionMinor);
Stream_Read_UINT16(s, rdpdr->serverVersionMajor);
Stream_Read_UINT16(s, rdpdr->serverVersionMinor);
Stream_Read_UINT32(s, rdpdr->clientID);
rdpdr->sequenceId++;
rdpdr->clientVersionMajor = MIN(RDPDR_VERSION_MAJOR, rdpdr->serverVersionMajor);
rdpdr->clientVersionMinor = MIN(RDPDR_VERSION_MINOR_RDP10X, rdpdr->serverVersionMinor);
WLog_Print(rdpdr->log, WLOG_DEBUG,
"[rdpdr] server announces version %" PRIu32 ".%" PRIu32 ", client uses %" PRIu32
".%" PRIu32,
rdpdr->serverVersionMajor, rdpdr->serverVersionMinor, rdpdr->clientVersionMajor,
rdpdr->clientVersionMinor);
return CHANNEL_RC_OK;
}
@ -1156,8 +1164,8 @@ static UINT rdpdr_send_client_announce_reply(rdpdrPlugin* rdpdr)
Stream_Write_UINT16(s, RDPDR_CTYP_CORE); /* Component (2 bytes) */
Stream_Write_UINT16(s, PAKID_CORE_CLIENTID_CONFIRM); /* PacketId (2 bytes) */
Stream_Write_UINT16(s, rdpdr->versionMajor);
Stream_Write_UINT16(s, rdpdr->versionMinor);
Stream_Write_UINT16(s, rdpdr->clientVersionMajor);
Stream_Write_UINT16(s, rdpdr->clientVersionMinor);
Stream_Write_UINT32(s, (UINT32)rdpdr->clientID);
return rdpdr_send(rdpdr, s);
}
@ -1225,10 +1233,15 @@ static UINT rdpdr_process_server_clientid_confirm(rdpdrPlugin* rdpdr, wStream* s
Stream_Read_UINT16(s, versionMinor);
Stream_Read_UINT32(s, clientID);
if (versionMajor != rdpdr->versionMajor || versionMinor != rdpdr->versionMinor)
if (versionMajor != rdpdr->clientVersionMajor || versionMinor != rdpdr->clientVersionMinor)
{
rdpdr->versionMajor = versionMajor;
rdpdr->versionMinor = versionMinor;
WLog_Print(rdpdr->log, WLOG_WARN,
"[rdpdr] server announced version %" PRIu32 ".%" PRIu32 ", client uses %" PRIu32
".%" PRIu32 " but clientid confirm requests version %" PRIu32 ".%" PRIu32,
rdpdr->serverVersionMajor, rdpdr->serverVersionMinor, rdpdr->clientVersionMajor,
rdpdr->clientVersionMinor, versionMajor, versionMinor);
rdpdr->clientVersionMajor = versionMajor;
rdpdr->clientVersionMinor = versionMinor;
}
if (clientID != rdpdr->clientID)
@ -1267,8 +1280,8 @@ static BOOL device_announce(ULONG_PTR key, void* element, void* data)
* 3. other devices are sent only after user_loggedon
*/
if ((rdpdr->versionMinor == 0x0005) || (device->type == RDPDR_DTYP_SMARTCARD) ||
arg->userLoggedOn)
if ((rdpdr->clientVersionMinor == RDPDR_VERSION_MINOR_RDP51) ||
(device->type == RDPDR_DTYP_SMARTCARD) || arg->userLoggedOn)
{
size_t i;
size_t data_len = (device->data == NULL ? 0 : Stream_GetPosition(device->data));

View File

@ -55,8 +55,10 @@ typedef struct
DEVMAN* devman;
UINT16 versionMajor;
UINT16 versionMinor;
UINT16 serverVersionMajor;
UINT16 serverVersionMinor;
UINT16 clientVersionMajor;
UINT16 clientVersionMinor;
UINT32 clientID;
char computerName[256];