From 891a10c4f6bb3e22af9f70d0699d2d93f73b1aca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Mon, 10 Mar 2014 15:57:39 -0400 Subject: [PATCH] libfreerdp-core: hook new MPPC decompressor --- libfreerdp/codec/mppc.c | 66 ++++++++++++++++++++++++++++++----------- libfreerdp/core/bulk.c | 16 ++++++---- 2 files changed, 58 insertions(+), 24 deletions(-) diff --git a/libfreerdp/codec/mppc.c b/libfreerdp/codec/mppc.c index a0cc469a0..2b785ff82 100644 --- a/libfreerdp/codec/mppc.c +++ b/libfreerdp/codec/mppc.c @@ -79,41 +79,49 @@ UINT32 mppc_decompress(MPPC_CONTEXT* mppc, BYTE* pSrcData, BYTE** ppDstData, UIN UINT32 CopyOffset; UINT32 LengthOfMatch; UINT32 accumulator; - BYTE* HistoryBuffer; BYTE* HistoryPtr; UINT32 HistoryOffset; + BYTE* HistoryBuffer; + BYTE* HistoryBufferEnd; + UINT32 HistoryBufferSize; UINT32 CompressionLevel; wBitStream* bs = mppc->bs; HistoryBuffer = mppc->HistoryBuffer; + HistoryBufferSize = mppc->HistoryBufferSize; + HistoryBufferEnd = &HistoryBuffer[HistoryBufferSize - 1]; CompressionLevel = mppc->CompressionLevel; - *ppDstData = HistoryBuffer; - BitStream_Attach(bs, pSrcData, *pSize); BitStream_Fetch(bs); if (flags & PACKET_AT_FRONT) { - mppc->HistoryPtr = &(HistoryBuffer[0]); + mppc->HistoryOffset = 0; + mppc->HistoryPtr = HistoryBuffer; } if (flags & PACKET_FLUSHED) { - mppc->HistoryPtr = &(HistoryBuffer[0]); + mppc->HistoryOffset = 0; + mppc->HistoryPtr = HistoryBuffer; ZeroMemory(HistoryBuffer, mppc->HistoryBufferSize); } - if (!(flags & PACKET_COMPRESSED)) - { - CopyMemory(mppc->HistoryPtr, pSrcData, *pSize); - mppc->HistoryPtr += *pSize; - return 0; - } - HistoryPtr = mppc->HistoryPtr; HistoryOffset = mppc->HistoryOffset; + if (!(flags & PACKET_COMPRESSED)) + { + CopyMemory(HistoryPtr, pSrcData, *pSize); + HistoryPtr += *pSize; + HistoryOffset += *pSize; + mppc->HistoryPtr = HistoryPtr; + mppc->HistoryOffset = HistoryOffset; + *ppDstData = HistoryPtr; + return 1; + } + while ((bs->length - bs->position) >= 8) { accumulator = bs->accumulator; @@ -414,22 +422,44 @@ UINT32 mppc_decompress(MPPC_CONTEXT* mppc, BYTE* pSrcData, BYTE** ppDstData, UIN SrcPtr = HistoryPtr - CopyOffset; - while (LengthOfMatch > 0) + if (SrcPtr >= HistoryBuffer) { - *(HistoryPtr) = *SrcPtr; + while (LengthOfMatch > 0) + { + *(HistoryPtr) = *SrcPtr; - HistoryPtr++; + HistoryPtr++; + SrcPtr++; + + LengthOfMatch--; + } + } + else + { + SrcPtr = HistoryBufferEnd - (CopyOffset - (HistoryPtr - HistoryBuffer)); SrcPtr++; - LengthOfMatch--; + while (LengthOfMatch && (SrcPtr <= HistoryBufferEnd)) + { + *HistoryPtr++ = *SrcPtr++; + LengthOfMatch--; + } + + SrcPtr = HistoryBuffer; + + while (LengthOfMatch > 0) + { + *HistoryPtr++ = *SrcPtr++; + LengthOfMatch--; + } } } *pSize = (UINT32) (HistoryPtr - mppc->HistoryPtr); - + *ppDstData = mppc->HistoryPtr; mppc->HistoryPtr = HistoryPtr; - return 0; + return 1; } UINT32 mppc_compress(MPPC_CONTEXT* mppc, BYTE* pSrcData, BYTE* pDstData, UINT32* pSize) diff --git a/libfreerdp/core/bulk.c b/libfreerdp/core/bulk.c index 607e765c7..ba905f533 100644 --- a/libfreerdp/core/bulk.c +++ b/libfreerdp/core/bulk.c @@ -26,6 +26,7 @@ int bulk_decompress(rdpBulk* bulk, BYTE* pSrcData, UINT32 SrcSize, BYTE** ppDstData, UINT32* pDstSize, UINT32 flags) { int status = -1; + UINT32 size; UINT32 roff = 0; UINT32 rlen = 0; UINT32 type = flags & 0x0F; @@ -33,15 +34,18 @@ int bulk_decompress(rdpBulk* bulk, BYTE* pSrcData, UINT32 SrcSize, BYTE** ppDstD switch (type) { case PACKET_COMPR_TYPE_8K: - status = decompress_rdp_4(bulk->mppc_dec, pSrcData, SrcSize, flags, &roff, &rlen); - *ppDstData = (bulk->mppc_dec->history_buf + roff); - *pDstSize = rlen; + size = SrcSize; + mppc_decompress(bulk->mppcRecv, pSrcData, ppDstData, &size, flags); + *pDstSize = size; + status = 1; + printf("BulkDecompress: SrcSize: %d DstSize: %d Flags: 0x%04X\n", SrcSize, *pDstSize, flags); break; case PACKET_COMPR_TYPE_64K: - status = decompress_rdp_5(bulk->mppc_dec, pSrcData, SrcSize, flags, &roff, &rlen); - *ppDstData = (bulk->mppc_dec->history_buf + roff); - *pDstSize = rlen; + size = SrcSize; + mppc_decompress(bulk->mppcRecv, pSrcData, ppDstData, &size, flags); + *pDstSize = size; + status = 1; printf("BulkDecompress: SrcSize: %d DstSize: %d Flags: 0x%04X\n", SrcSize, *pDstSize, flags); break;