Ejemplo n.º 1
0
int bulk_compress_validate(rdpBulk* bulk, BYTE* pSrcData, UINT32 SrcSize, BYTE** ppDstData, UINT32* pDstSize, UINT32* pFlags)
{
    int status;
    BYTE* _pSrcData = NULL;
    BYTE* _pDstData = NULL;
    UINT32 _SrcSize = 0;
    UINT32 _DstSize = 0;
    UINT32 _Flags = 0;

    _pSrcData = *ppDstData;
    _SrcSize = *pDstSize;
    _Flags = *pFlags | bulk->CompressionLevel;

    status = bulk_decompress(bulk, _pSrcData, _SrcSize, &_pDstData, &_DstSize, _Flags);

    if (status < 0)
    {
        printf("compression/decompression failure\n");
        return status;
    }

    if (_DstSize != SrcSize)
    {
        printf("compression/decompression size mismatch: Actual: %d, Expected: %d\n", _DstSize, SrcSize);
        return -1;
    }

    if (memcmp(_pDstData, pSrcData, SrcSize) != 0)
    {
        printf("compression/decompression input/output mismatch! flags: 0x%04X\n", _Flags);

#if 1
        printf("Actual:\n");
        winpr_HexDump(_pDstData, SrcSize);

        printf("Expected:\n");
        winpr_HexDump(pSrcData, SrcSize);
#endif

        return -1;
    }

    return status;
}
Ejemplo n.º 2
0
int rdp_recv_data_pdu(rdpRdp* rdp, wStream* s)
{
    BYTE type;
    wStream* cs;
    UINT16 length;
    UINT32 shareId;
    BYTE compressedType;
    UINT16 compressedLength;

    if (!rdp_read_share_data_header(s, &length, &type, &shareId, &compressedType, &compressedLength))
        return -1;

    cs = s;

    if (compressedType & PACKET_COMPRESSED)
    {
        UINT32 DstSize = 0;
        BYTE* pDstData = NULL;
        UINT32 SrcSize = compressedLength - 18;

        if (Stream_GetRemainingLength(s) < (size_t) SrcSize)
        {
            DEBUG_WARN( "bulk_decompress: not enough bytes for compressedLength %d\n", compressedLength);
            return -1;
        }

        if (bulk_decompress(rdp->bulk, Stream_Pointer(s), SrcSize, &pDstData, &DstSize, compressedType))
        {
            cs = StreamPool_Take(rdp->transport->ReceivePool, DstSize);

            Stream_SetPosition(cs, 0);
            Stream_Write(cs, pDstData, DstSize);
            Stream_SealLength(cs);
            Stream_SetPosition(cs, 0);
        }
        else
        {
            DEBUG_WARN( "bulk_decompress() failed\n");
            return -1;
        }

        Stream_Seek(s, SrcSize);
    }

#ifdef WITH_DEBUG_RDP
    DEBUG_MSG("recv %s Data PDU (0x%02X), length: %d\n",
              type < ARRAYSIZE(DATA_PDU_TYPE_STRINGS) ? DATA_PDU_TYPE_STRINGS[type] : "???", type, length);
#endif

    switch (type)
    {
    case DATA_PDU_TYPE_UPDATE:
        if (!update_recv(rdp->update, cs))
            return -1;
        break;

    case DATA_PDU_TYPE_CONTROL:
        if (!rdp_recv_server_control_pdu(rdp, cs))
            return -1;
        break;

    case DATA_PDU_TYPE_POINTER:
        if (!update_recv_pointer(rdp->update, cs))
            return -1;
        break;

    case DATA_PDU_TYPE_SYNCHRONIZE:
        if (!rdp_recv_synchronize_pdu(rdp, cs))
            return -1;
        break;

    case DATA_PDU_TYPE_PLAY_SOUND:
        if (!update_recv_play_sound(rdp->update, cs))
            return -1;
        break;

    case DATA_PDU_TYPE_SHUTDOWN_DENIED:
        if (!rdp_recv_server_shutdown_denied_pdu(rdp, cs))
            return -1;
        break;

    case DATA_PDU_TYPE_SAVE_SESSION_INFO:
        if (!rdp_recv_save_session_info(rdp, cs))
            return -1;
        break;

    case DATA_PDU_TYPE_FONT_MAP:
        if (!rdp_recv_font_map_pdu(rdp, cs))
            return -1;
        break;

    case DATA_PDU_TYPE_SET_KEYBOARD_INDICATORS:
        if (!rdp_recv_server_set_keyboard_indicators_pdu(rdp, cs))
            return -1;
        break;

    case DATA_PDU_TYPE_SET_KEYBOARD_IME_STATUS:
        if (!rdp_recv_server_set_keyboard_ime_status_pdu(rdp, cs))
            return -1;
        break;

    case DATA_PDU_TYPE_SET_ERROR_INFO:
        if (!rdp_recv_set_error_info_data_pdu(rdp, cs))
            return -1;
        break;

    case DATA_PDU_TYPE_ARC_STATUS:
        if (!rdp_recv_server_auto_reconnect_status_pdu(rdp, cs))
            return -1;
        break;

    case DATA_PDU_TYPE_STATUS_INFO:
        if (!rdp_recv_server_status_info_pdu(rdp, cs))
            return -1;
        break;

    case DATA_PDU_TYPE_MONITOR_LAYOUT:
        if (!rdp_recv_monitor_layout_pdu(rdp, cs))
            return -1;
        break;

    default:
        break;
    }

    if (cs != s)
        Stream_Release(cs);

    return 0;
}