libfreerdp-core: hook new MPPC decompressor
This commit is contained in:
parent
f31676e4e4
commit
891a10c4f6
@ -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)
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user