int bulk_compress(rdpBulk* bulk, BYTE* pSrcData, UINT32 SrcSize, BYTE** ppDstData, UINT32* pDstSize, UINT32* pFlags) { int status = -1; rdpMetrics* metrics; UINT32 CompressedBytes; UINT32 UncompressedBytes; double CompressionRatio; metrics = bulk->context->metrics; if ((SrcSize <= 50) || (SrcSize >= 16384)) { *ppDstData = pSrcData; *pDstSize = SrcSize; return 0; } *ppDstData = bulk->OutputBuffer; *pDstSize = sizeof(bulk->OutputBuffer); bulk_compression_level(bulk); bulk_compression_max_size(bulk); if ((bulk->CompressionLevel == PACKET_COMPR_TYPE_8K) || (bulk->CompressionLevel == PACKET_COMPR_TYPE_64K)) { mppc_set_compression_level(bulk->mppcSend, bulk->CompressionLevel); status = mppc_compress(bulk->mppcSend, pSrcData, SrcSize, ppDstData, pDstSize, pFlags); } else if (bulk->CompressionLevel == PACKET_COMPR_TYPE_RDP6) { status = ncrush_compress(bulk->ncrushSend, pSrcData, SrcSize, ppDstData, pDstSize, pFlags); } else if (bulk->CompressionLevel == PACKET_COMPR_TYPE_RDP61) { status = xcrush_compress(bulk->xcrushSend, pSrcData, SrcSize, ppDstData, pDstSize, pFlags); } else { status = -1; } if (status >= 0) { CompressedBytes = *pDstSize; UncompressedBytes = SrcSize; CompressionRatio = metrics_write_bytes(metrics, UncompressedBytes, CompressedBytes); #ifdef WITH_BULK_DEBUG { DEBUG_MSG("Compress Type: %d Flags: %s (0x%04X) Compression Ratio: %f (%d / %d), Total: %f (%u / %u)\n", bulk->CompressionLevel, bulk_get_compression_flags_string(*pFlags), *pFlags, CompressionRatio, CompressedBytes, UncompressedBytes, metrics->TotalCompressionRatio, (UINT32) metrics->TotalCompressedBytes, (UINT32) metrics->TotalUncompressedBytes); } #endif } #if 0 if (bulk_compress_validate(bulk, pSrcData, SrcSize, ppDstData, pDstSize, pFlags) < 0) status = -1; #endif return status; }
int xcrush_compress(XCRUSH_CONTEXT* xcrush, BYTE* pSrcData, UINT32 SrcSize, BYTE** ppDstData, UINT32* pDstSize, UINT32* pFlags) { int status = 0; UINT32 DstSize = 0; BYTE* pDstData = NULL; BYTE* CompressedData = NULL; UINT32 CompressedDataSize = 0; BYTE* OriginalData = NULL; UINT32 OriginalDataSize = 0; UINT32 Level1ComprFlags = 0; UINT32 Level2ComprFlags = 0; UINT32 CompressionLevel = 3; if (SrcSize > 16384) return -1001; if ((SrcSize + 2) > *pDstSize) return -1002; OriginalData = *ppDstData; OriginalDataSize = SrcSize; pDstData = xcrush->BlockBuffer; CompressedDataSize = SrcSize; status = xcrush_compress_l1(xcrush, pSrcData, SrcSize, &pDstData, &CompressedDataSize, &Level1ComprFlags); if (status < 0) return status; if (Level1ComprFlags & L1_COMPRESSED) { CompressedData = pDstData; if (CompressedDataSize > SrcSize) return -1003; } else { CompressedData = pSrcData; if (CompressedDataSize != SrcSize) return -1004; } status = 0; pDstData = &OriginalData[2]; DstSize = OriginalDataSize - 2; if (CompressedDataSize > 50) { status = mppc_compress(xcrush->mppc, CompressedData, CompressedDataSize, &pDstData, &DstSize, &Level2ComprFlags); } if (status < 0) return status; if (!status || (Level2ComprFlags & PACKET_FLUSHED)) { if (CompressedDataSize > DstSize) { xcrush_context_reset(xcrush, TRUE); *ppDstData = pSrcData; *pDstSize = SrcSize; *pFlags = 0; return 1; } DstSize = CompressedDataSize; CopyMemory(&OriginalData[2], CompressedData, CompressedDataSize); } if (Level2ComprFlags & PACKET_COMPRESSED) { Level2ComprFlags |= xcrush->CompressionFlags; xcrush->CompressionFlags = 0; } else if (Level2ComprFlags & PACKET_FLUSHED) { xcrush->CompressionFlags = PACKET_FLUSHED; } Level1ComprFlags |= L1_INNER_COMPRESSION; OriginalData[0] = (BYTE) Level1ComprFlags; OriginalData[1] = (BYTE) Level2ComprFlags; #if 0 WLog_DBG(TAG, "XCrushCompress: Level1ComprFlags: %s Level2ComprFlags: %s", xcrush_get_level_1_compression_flags_string(Level1ComprFlags), xcrush_get_level_2_compression_flags_string(Level2ComprFlags)); #endif if (*pDstSize < (DstSize + 2)) return -1006; *pDstSize = DstSize + 2; *pFlags = PACKET_COMPRESSED | CompressionLevel; return 1; }
int bulk_compress(rdpBulk* bulk, BYTE* pSrcData, UINT32 SrcSize, BYTE** ppDstData, UINT32* pDstSize, UINT32* pFlags) { int status = -1; UINT32 CompressedBytes; UINT32 UncompressedBytes; if ((SrcSize <= 50) || (SrcSize >= 16384)) { *ppDstData = pSrcData; *pDstSize = SrcSize; return 0; } *ppDstData = bulk->OutputBuffer; *pDstSize = sizeof(bulk->OutputBuffer); bulk_compression_level(bulk); bulk_compression_max_size(bulk); if (bulk->CompressionLevel < PACKET_COMPR_TYPE_RDP6) { mppc_set_compression_level(bulk->mppcSend, bulk->CompressionLevel); status = mppc_compress(bulk->mppcSend, pSrcData, SrcSize, ppDstData, pDstSize, pFlags); } else { status = ncrush_compress(bulk->ncrushSend, pSrcData, SrcSize, ppDstData, pDstSize, pFlags); } if (status >= 0) { CompressedBytes = *pDstSize; UncompressedBytes = SrcSize; bulk->TotalUncompressedBytes += UncompressedBytes; bulk->TotalCompressedBytes += CompressedBytes; #ifdef WITH_BULK_DEBUG { UINT32 type; double CompressionRatio; double TotalCompressionRatio; type = bulk->CompressionLevel; CompressionRatio = ((double) CompressedBytes) / ((double) UncompressedBytes); TotalCompressionRatio = ((double) bulk->TotalCompressedBytes) / ((double) bulk->TotalUncompressedBytes); printf("Compress Type: %d Flags: %s (0x%04X) Compression Ratio: %f (%d / %d), Total: %f (%d / %d)\n", type, bulk_get_compression_flags_string(*pFlags), *pFlags, CompressionRatio, CompressedBytes, UncompressedBytes, TotalCompressionRatio, bulk->TotalCompressedBytes, bulk->TotalUncompressedBytes); } #endif } #if 0 if (bulk_compress_validate(bulk, pSrcData, SrcSize, ppDstData, pDstSize, pFlags) < 0) status = -1; #endif return status; }