RtlReserveChunkLZNT1

INT64 __stdcall RtlReserveChunkLZNT1(
        UINT8 **CompressedBuffer,
        UINT8 *EndOfCompressedBufferPlus1,
        UINT8 **ChunkBuffer,
        UINT64 ChunkSize){
  UINT8 *v4; 
  UINT8 *v6; 
  __int64 v9; 
  int v10; 
  unsigned int v11; 
  int v12; 
  UINT8 *v13; 
  unsigned int v14; 
  UINT8 *CompressedBuffera; 
  void *ChunkBuffera[6]; 
  UINT64 ChunkSizea; 
  v4 = *CompressedBuffer;
  ChunkBuffera[0] = 0i64;
  v6 = v4;
  LODWORD(ChunkSizea) = 0;
  CompressedBuffera = v4;
  v9 = (unsigned int)ChunkSize;
  while( 1 )
  {
    v10 = RtlDescribeChunkLZNT1(&CompressedBuffera, EndOfCompressedBufferPlus1, (UINT8 **)ChunkBuffera, &ChunkSizea);
    v11 = v10;
    if( v10 < 0 )
      break;
    if( v6 == v4 )
      v6 = CompressedBuffera;
  }
  if( v10 == -2147483622 )
  {
    v12 = (_DWORD)CompressedBuffera - (_DWORD)v6;
    *ChunkBuffer = v4;
    v13 = *CompressedBuffer;
    v14 = v12 + 2;
    v11 = -1073741789;
    if( *CompressedBuffer <= &EndOfCompressedBufferPlus1[-v9] )
    {
      if( (_DWORD)v9 == 4096 )
      {
        LODWORD(v9) = 4098;
        if( &v13[v14 + 4098] <= EndOfCompressedBufferPlus1 )
        {
          memmove(v13 + 4098, v6, v14);
          *(_WORD *)*CompressedBuffer = 0x3FFF;
          *ChunkBuffer += 2;
LABEL_15:
          v11 = 0;
        }
      }
      else if( (_DWORD)v9 )
      {
        if( &v13[v9 + v14] <= EndOfCompressedBufferPlus1 )
        {
          memmove(&v13[v9], v6, v14);
          goto LABEL_15;
        }
      }
      else
      {
        LODWORD(v9) = 6;
        if( &v13[v14 + 6] <= EndOfCompressedBufferPlus1 )
        {
          memmove(v13 + 6, v6, v14);
          *(_WORD *)*CompressedBuffer = -20477;
          *((_WORD *)*CompressedBuffer + 1) = 2;
          *((_WORD *)*CompressedBuffer + 2) = 4092;
          goto LABEL_15;
        }
      }
      *CompressedBuffer += (unsigned int)v9;
    }
  }
  return v11;
}

Referenced by:

No references.