SmDecompressBuffer

__int64 __fastcall SmDecompressBuffer(PUCHAR Buffer, unsigned int a2, _QWORD *a3, _DWORD *a4, __int64 a5, __int64 a6){
  NTSTATUS CompressionWorkSpaceSize; 
  void *WorkSpace; 
  int v10; 
  unsigned int v11; 
  UINT8 *v12; 
  UINT64 v13; 
  __int64 v14; 
  UINT8 *v15; 
  unsigned __int8 v16; 
  UINT16 v17; 
  PUCHAR v19; 
  unsigned int v20; 
  unsigned int v21; 
  UINT64 CompressedBufferSize; 
  UCHAR Buffera[4]; 
  int CompressBufferWorkSpaceSize[21]; 
  ULONG CompressFragmentWorkSpaceSize; 
  UINT64 FinalUncompressedSize; 
  _QWORD *v27; 
  _DWORD *v28; 
  v28 = a4;
  v27 = a3;
  CompressionWorkSpaceSize = 0;
  LODWORD(FinalUncompressedSize) = 0;
  CompressFragmentWorkSpaceSize = 0;
  WorkSpace = 0i64;
  CompressBufferWorkSpaceSize[0] = 0;
  if( a2 < 8 )
    return(unsigned int)-1073741246;
  v10 = *(_DWORD *)Buffer;
  v11 = a2 - 8;
  if( (v10 & 0xFFFFFF) != 5062989 )
    return(unsigned int)-1073741672;
  if( v10 < 0 )
  {
    if( v11 >= 4 )
    {
      v19 = Buffer + 8;
      *(_DWORD *)Buffera = 0;
      v12 = Buffer + 12;
      v11 = a2 - 12;
      v20 = RtlComputeCrc32(0i64, Buffer, 8ui64);
      v21 = RtlComputeCrc32(v20, Buffera, 4ui64);
      if( (unsigned int)RtlComputeCrc32(v21, v12, v11) == *(_DWORD *)v19 )
      {
        CompressionWorkSpaceSize = 0;
        goto LABEL_5;
      }
    }
    return(unsigned int)-1073741246;
  }
  v12 = Buffer + 8;
LABEL_5:
  v13 = *((unsigned int *)Buffer + 1);
  if( a5 && (unsigned int)v13 > *(_DWORD *)a5 )
    return(unsigned int)-1073739516;
  v14 = a6;
  v15 = (UINT8 *)(*(__int64(__fastcall **)(_QWORD))a6)((unsigned int)v13);
  if( !v15 )
    return(unsigned int)-1073741670;
  v16 = Buffer[3] & 0x7F;
  v17 = v16;
  if( !v16 )
  {
    if( v11 == (_DWORD)v13 )
    {
      memmove(v15, v12, v13);
      LODWORD(FinalUncompressedSize) = v13;
      goto LABEL_15;
    }
LABEL_21:
    CompressionWorkSpaceSize = -1073741246;
    goto LABEL_16;
  }
  CompressionWorkSpaceSize = RtlGetCompressionWorkSpaceSize(
                               v16,
                               (PULONG)CompressBufferWorkSpaceSize,
                               &CompressFragmentWorkSpaceSize);
  if( CompressionWorkSpaceSize >= 0 )
  {
    if( CompressFragmentWorkSpaceSize )
    {
      WorkSpace = (void *)(*(__int64(**)(void))v14)();
      if( !WorkSpace )
      {
        CompressionWorkSpaceSize = -1073741670;
        goto LABEL_16;
      }
    }
    LODWORD(CompressedBufferSize) = v11;
    CompressionWorkSpaceSize = RtlDecompressBufferEx(
                                 v17,
                                 v15,
                                 (unsigned int)v13,
                                 v12,
                                 CompressedBufferSize,
                                 &FinalUncompressedSize,
                                 WorkSpace);
    if( CompressionWorkSpaceSize >= 0 )
    {
      if( (_DWORD)v13 == (_DWORD)FinalUncompressedSize )
      {
        CompressionWorkSpaceSize = 0;
LABEL_15:
        *v27 = v15;
        v15 = 0i64;
        *v28 = v13;
        goto LABEL_16;
      }
      goto LABEL_21;
    }
  }
LABEL_16:
  if( v15 )
    (*(void(__fastcall **)(UINT8 *))(v14 + 8))(v15);
  if( WorkSpace )
    (*(void(__fastcall **)(void *))(v14 + 8))(WorkSpace);
  return(unsigned int)CompressionWorkSpaceSize;
}

Referenced by:

PfSnGetPrefetchInstructions