RtlCompressChunks

NTSTATUS __stdcall RtlCompressChunks(
        UINT8 *UncompressedBuffer,
        UINT64 UncompressedBufferSize,
        UINT8 *CompressedBuffer,
        UINT64 CompressedBufferSize,
        _COMPRESSED_DATA_INFO *CompressedDataInfo,
        UINT64 CompressedDataInfoLength,
        VOID *WorkSpace){
  _COMPRESSED_DATA_INFO *v7; 
  NTSTATUS v8; 
  unsigned int v9; 
  UINT8 *v10; 
  unsigned int v11; 
  _COMPRESSED_DATA_INFO *CompressedChunkSizes; 
  unsigned int v13; 
  __int64 v15; 
  NTSTATUS v16; 
  unsigned int v17; 
  UINT64 CompressedBufferSizea; 
  UINT64 UncompressedChunkSize; 
  UINT8 *Src; 
  UINT64 FinalCompressedSize; 

  Src = UncompressedBuffer;
  v7 = CompressedDataInfo;
  v8 = 0;
  v9 = UncompressedBufferSize;
  LODWORD(FinalCompressedSize) = 0;
  v10 = UncompressedBuffer;
  v11 = 1 << CompressedDataInfo->ChunkShift;
  CompressedChunkSizes = (_COMPRESSED_DATA_INFO *)CompressedDataInfo->CompressedChunkSizes;
  v13 = v9 - (v9 >> 4);
  CompressedDataInfo->NumberOfChunks = 0;
  CompressedDataInfo = (_COMPRESSED_DATA_INFO *)v7->CompressedChunkSizes;
  while( 1 )
  {
    v15 = v9;
    if( v9 >= v11 )
      v15 = v11;
    LODWORD(UncompressedChunkSize) = v11;
    LODWORD(CompressedBufferSizea) = v13;
    v16 = RtlCompressBuffer(
            v7->CompressionFormatAndEngine,
            v10,
            (unsigned int)v15,
            CompressedBuffer,
            CompressedBufferSizea,
            UncompressedChunkSize,
            &FinalCompressedSize,
            WorkSpace);
    if( v16 == 279 )
    {
      v17 = 0;
      LODWORD(FinalCompressedSize) = 0;
    }
    else if( v16 >= 0 )
    {
      v17 = FinalCompressedSize;
    }
    else
    {
      if( v13 < v11 )
        return -1073741789;
      memmove(CompressedBuffer, Src, v15);
      if( v11 > (unsigned int)v15 )
        memset(&CompressedBuffer[v15], 0i64, v11 - v15);
      CompressedChunkSizes = CompressedDataInfo;
      v17 = v11;
      LODWORD(FinalCompressedSize) = v11;
    }
    *(_DWORD *)&CompressedChunkSizes->CompressionFormatAndEngine = v17;
    CompressedChunkSizes = (_COMPRESSED_DATA_INFO *)((char *)CompressedChunkSizes + 4);
    ++v7->NumberOfChunks;
    v10 = &Src[(unsigned int)v15];
    CompressedDataInfo = CompressedChunkSizes;
    Src = v10;
    if( (unsigned int)v15 > v9 )
      break;
    v13 -= v17;
    CompressedBuffer += v17;
    v9 -= v15;
    if( !v9 )
      return v8;
  }
  return -1073741246;
}

Referenced by:

No references.