libfreerdp-core: hook new MPPC decompressor

This commit is contained in:
Marc-André Moreau 2014-03-10 15:57:39 -04:00
parent f31676e4e4
commit 891a10c4f6
2 changed files with 58 additions and 24 deletions

View File

@ -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)

View File

@ -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;