SmDecompressBuffer

NTSTATUS __stdcall SmDecompressBuffer(
        VOID *CompressedBuffer,
        UINT64 CompressedSize,
        VOID **DecompressedBufferOut,
        UINT64 *DecompressedSizeOut,
        UINT64 *MaxDecompressedSize,
        _SM_COMPRESSION_CALLBACKS *Callbacks){
  int CompressionWorkSpaceSize; 
  VOID *WorkSpace; 
  int v10; 
  unsigned int v11; 
  UINT8 *v12; 
  size_t v13; 
  _SM_COMPRESSION_CALLBACKS *v14; 
  VOID *v15; 
  unsigned __int8 v16; 
  UINT16 v17; 
  _DWORD *v19; 
  unsigned int v20; 
  unsigned int v21; 
  UINT64 CompressedBufferSize; 
  UINT8 Buffer[4]; 
  int CompressBufferWorkSpaceSize[21]; 
  UINT64 CompressFragmentWorkSpaceSize; 
  UINT64 FinalUncompressedSize; 
  VOID **v27; 
  UINT64 *v28; 

  v28 = DecompressedSizeOut;
  v27 = DecompressedBufferOut;
  CompressionWorkSpaceSize = 0;
  LODWORD(FinalUncompressedSize) = 0;
  LODWORD(CompressFragmentWorkSpaceSize) = 0;
  WorkSpace = 0i64;
  CompressBufferWorkSpaceSize[0] = 0;
  if( (unsigned int)CompressedSize < 8 )
    return -1073741246;
  v10 = *(_DWORD *)CompressedBuffer;
  v11 = CompressedSize - 8;
  if( (v10 & 0xFFFFFF) != 5062989 )
    return -1073741672;
  if( v10 < 0 )
  {
    if( v11 >= 4 )
    {
      v19 = (char *)CompressedBuffer + 8;
      *(_DWORD *)Buffer = 0;
      v12 = (UINT8 *)CompressedBuffer + 12;
      v11 = CompressedSize - 12;
      v20 = RtlComputeCrc32(0i64, (UINT8 *)CompressedBuffer, 8ui64);
      v21 = RtlComputeCrc32(v20, Buffer, 4ui64);
      if( (unsigned int)RtlComputeCrc32(v21, v12, v11) == *v19 )
      {
        CompressionWorkSpaceSize = 0;
        goto LABEL_5;
      }
    }
    return -1073741246;
  }
  v12 = (UINT8 *)CompressedBuffer + 8;
LABEL_5:
  v13 = *((_DWORD *)CompressedBuffer + 1);
  if( MaxDecompressedSize && v13 > *(_DWORD *)MaxDecompressedSize )
    return -1073739516;
  v14 = Callbacks;
  v15 = (VOID *)(*(__int64(__fastcall **)(_QWORD))Callbacks)(v13);
  if( !v15 )
    return -1073741670;
  v16 = *((_BYTE *)CompressedBuffer + 3) & 0x7F;
  v17 = v16;
  if( !v16 )
  {
    if( v11 == v13 )
    {
      memmove(v15, v12, v13);
      LODWORD(FinalUncompressedSize) = v13;
      goto LABEL_15;
    }
LABEL_21:
    CompressionWorkSpaceSize = -1073741246;
    goto LABEL_16;
  }
  CompressionWorkSpaceSize = RtlGetCompressionWorkSpaceSize(
                               v16,
                               (UINT64 *)CompressBufferWorkSpaceSize,
                               &CompressFragmentWorkSpaceSize);
  if( CompressionWorkSpaceSize >= 0 )
  {
    if( (_DWORD)CompressFragmentWorkSpaceSize )
    {
      WorkSpace = (VOID *)(*(__int64(**)(void))v14)();
      if( !WorkSpace )
      {
        CompressionWorkSpaceSize = -1073741670;
        goto LABEL_16;
      }
    }
    LODWORD(CompressedBufferSize) = v11;
    CompressionWorkSpaceSize = RtlDecompressBufferEx(
                                 v17,
                                 (UINT8 *)v15,
                                 v13,
                                 v12,
                                 CompressedBufferSize,
                                 &FinalUncompressedSize,
                                 WorkSpace);
    if( CompressionWorkSpaceSize >= 0 )
    {
      if( v13 == (_DWORD)FinalUncompressedSize )
      {
        CompressionWorkSpaceSize = 0;
LABEL_15:
        *v27 = v15;
        v15 = 0i64;
        *(_DWORD *)v28 = v13;
        goto LABEL_16;
      }
      goto LABEL_21;
    }
  }
LABEL_16:
  if( v15 )
    (*((void(__fastcall **)(VOID *))v14 + 1))(v15);
  if( WorkSpace )
    (*((void(__fastcall **)(VOID *))v14 + 1))(WorkSpace);
  return CompressionWorkSpaceSize;
}

Referenced by:

PfSnGetPrefetchInstructions