RtlDecompressChunks

NTSTATUS __stdcall RtlDecompressChunks(
        UINT8 *UncompressedBuffer,
        UINT64 UncompressedBufferSize,
        UINT8 *CompressedBuffer,
        UINT64 CompressedBufferSize,
        UINT8 *CompressedTail,
        UINT64 CompressedTailSize,
        _COMPRESSED_DATA_INFO *CompressedDataInfo){
  UINT8 *v7; 
  size_t v8; 
  __int64 v9; 
  int NumberOfChunks; 
  unsigned int v12; 
  UINT8 *v13; 
  unsigned int *CompressedChunkSizes; 
  __int64 v15; 
  unsigned int v16; 
  int v17; 
  __int64 v18; 
  __int64 v19; 
  UINT8 *v20; 
  char *v21; 
  NTSTATUS result; 
  __int64 v23; 
  UINT64 CompressedBufferSizea; 
  unsigned int v25; 
  UINT8 *v26; 
  UINT64 FinalUncompressedSize; 
  int v28; 

  LODWORD(FinalUncompressedSize) = 0;
  v7 = UncompressedBuffer;
  v8 = CompressedBufferSize;
  v9 = (unsigned int)UncompressedBufferSize;
  NumberOfChunks = CompressedDataInfo->NumberOfChunks;
  v12 = 1 << CompressedDataInfo->ChunkShift;
  v13 = &UncompressedBuffer[v9];
  v28 = NumberOfChunks;
  v25 = v12;
  v26 = v13;
  if( v13 >= v7 )
  {
    CompressedChunkSizes = CompressedDataInfo->CompressedChunkSizes;
    while( 1 )
    {
      v15 = (unsigned int)v9;
      if( (unsigned int)v9 >= v12 )
        v15 = v12;
      if( NumberOfChunks && (v16 = *CompressedChunkSizes) != 0 )
      {
        if( v16 == v12 )
        {
          if( (unsigned int)v15 < v8 )
          {
            memmove(v7, CompressedBuffer, v15);
          }
          else
          {
            v17 = CompressedTailSize;
            if( !(_DWORD)CompressedTailSize && (unsigned int)v15 > v8 )
              return -1073741246;
            v18 = v8;
            memmove(v7, CompressedBuffer, v8);
            memmove(&v7[v8], CompressedTail, v15 - v8);
            v8 += v17;
            CompressedBuffer = &CompressedTail[-v18];
            NumberOfChunks = v28;
            LODWORD(CompressedTailSize) = 0;
          }
        }
        else
        {
          if( v16 <= v8 )
          {
            v19 = v8;
          }
          else
          {
            if( !(_DWORD)CompressedTailSize )
              return -1073741246;
            v19 = v8;
            v20 = &v7[(unsigned int)v9 - (unsigned __int64)v12];
            v21 = (char *)&v20[v8];
            if( v21 < (char *)v20 )
              return -1073741811;
            if( v20 < v7 || v21 > (char *)v13 )
              return -1073741246;
            memmove(v20, CompressedBuffer, v8);
            memmove(&v20[v8], CompressedTail, *CompressedChunkSizes - v8);
            v16 = *CompressedChunkSizes;
            CompressedBuffer = v20;
            NumberOfChunks = v28;
          }
          LODWORD(CompressedBufferSizea) = v16;
          result = RtlDecompressBuffer(
                     CompressedDataInfo->CompressionFormatAndEngine,
                     v7,
                     (unsigned int)v15,
                     CompressedBuffer,
                     CompressedBufferSizea,
                     &FinalUncompressedSize);
          if( result < 0 )
            return result;
          if( (unsigned int)v15 > (unsigned int)FinalUncompressedSize )
            memset(&v7[(unsigned int)FinalUncompressedSize], 0i64, v15 - FinalUncompressedSize);
          if( *CompressedChunkSizes >= v8 )
          {
            v8 += CompressedTailSize;
            CompressedBuffer = &CompressedTail[-v19];
            LODWORD(CompressedTailSize) = 0;
          }
        }
      }
      else
      {
        if( &v7[v15] > v13 )
          return -1073741246;
        memset(v7, 0i64, v15);
        if( !NumberOfChunks )
        {
          NumberOfChunks = 1;
          --CompressedChunkSizes;
        }
      }
      v13 = v26;
      v7 += (unsigned int)v15;
      if( v7 > v26 || (unsigned int)v15 > (unsigned int)v9 )
        return -1073741246;
      v23 = *CompressedChunkSizes;
      --NumberOfChunks;
      CompressedBuffer += v23;
      v28 = NumberOfChunks;
      v8 -= v23;
      ++CompressedChunkSizes;
      LODWORD(v9) = v9 - v15;
      if( !(_DWORD)v9 )
        return 0;
      v12 = v25;
    }
  }
  return -1073741811;
}

Referenced by:

No references.