ST_STORE::StStart

void __fastcall ST_STORE::StStart(__int64 a1, __int64 a2){
  unsigned int v4; 
  int v5; 
  unsigned int v6; 
  bool v7; 
  int v8; 
  int v9; 
  UINT64 v10; 
  VOID **PoolWithTag; 
  unsigned int v12; 
  UINT16 v13; 
  UINT64 v14; 
  unsigned int v15; 
  unsigned int v16; 
  bool v17; 
  VOID **v18; 
  __int64 v19; 
  unsigned int v20; 
  unsigned int v21; 
  VOID **v22; 
  __int64 v23; 
  unsigned int v24; 
  unsigned int v25; 
  int v26; 
  int v27; 
  int v28; 
  int v29; 
  __int64 v30; 
  int v31; 
  unsigned int v32; 
  _DWORD *v33; 
  size_t v34; 
  VOID **v35; 
  size_t v36; 
  VOID **v37; 
  int v38; 
  int v39; 
  unsigned int v40; 
  UINT64 CompressBufferWorkSpaceSize; 
  UINT64 CompressFragmentWorkSpaceSize; 

  LODWORD(CompressBufferWorkSpaceSize) = 0;
  LODWORD(CompressFragmentWorkSpaceSize) = 0;
  v4 = *(_DWORD *)(a2 + 8);
  if( !v4 )
    return;
  if( ((v4 - 1) & v4) != 0 )
    return;
  if( v4 - 4096 > 0x1F000 )
    return;
  v5 = *(_DWORD *)(a2 + 12);
  if( (unsigned int)(v5 - 1) > 0x3FFFF )
    return;
  v6 = *(_DWORD *)a2;
  if( (*(_DWORD *)a2 & 0x100) != 0 )
    return;
  if( (unsigned __int8)v6 == 1 )
  {
    v32 = *(_DWORD *)(a2 + 16);
    if( !v32 )
      return;
    if( ((v32 - 1) & v32) != 0 )
      return;
    if( v32 > v4 )
      return;
    v33 = *(_DWORD **)(a2 + 56);
    if( !v33 )
      return;
    v7 = *v33 == v5;
  }
  else
  {
    if( (_BYTE)v6 )
    {
      if( (unsigned __int8)v6 >= 2u )
        return;
      goto LABEL_11;
    }
    if( *(_DWORD *)(a2 + 16) )
      return;
    v7 = *(_QWORD *)(a2 + 56) == 0i64;
  }
  if( !v7 )
    return;
LABEL_11:
  if( v6 < 0x200000
    && (*(_DWORD *)a2 & 0x600) != 1536
    && (v6 & 0x10400) != 66560
    && (*(_QWORD *)(a2 + 32) == 0i64) == (*(_DWORD *)(a2 + 40) == 0) )
  {
    v8 = 0;
    if( v4 > 0x10 )
    {
      do
        ++v8;
      while( 16 << v8 < v4 );
    }
    *(_DWORD *)(a1 + 36) = v8;
    v9 = 1 << v8;
    *(_DWORD *)(a1 + 40) = 1 << v8;
    *(_DWORD *)(a1 + 32) = (1 << v8) - 1;
    if( *(_DWORD *)(a2 + 8) == 0x20000 )
      v9 = (1 << v8) - 1;
    *(_DWORD *)(a1 + 40) = v9;
    if( *(_BYTE *)a2 )
      *(_DWORD *)(a1 + 48) = *(_DWORD *)(a2 + 40) != 0 ? 16 : 4;
    *(_DWORD *)(a1 + 44) = (unsigned int)(*(_DWORD *)(a1 + 48) + 4111) >> 4;
    if( *(_DWORD *)(a2 + 12) <= (unsigned int)(1 << (32 - v8)) )
    {
      *(_OWORD *)a1 = *(_OWORD *)a2;
      *(_OWORD *)(a1 + 16) = *(_OWORD *)(a2 + 16);
      v10 = (unsigned int)(2 * *(_DWORD *)(a2 + 12));
      PoolWithTag = ExAllocatePoolWithTag(0x200ui64, v10, 1951624563i64);
      *(_QWORD *)(a1 + 56) = PoolWithTag;
      if( PoolWithTag )
      {
        memset(PoolWithTag, 0i64, v10);
        v12 = *(_DWORD *)a2;
        if( (unsigned __int8)*(_DWORD *)a2 == 1 )
        {
          v34 = *(_DWORD *)(a2 + 12);
          v35 = ExAllocatePoolWithTag(0x200ui64, v34, 1951624563i64);
          *(_QWORD *)(a1 + 64) = v35;
          if( !v35 )
            return;
          memset(v35, 0i64, v34);
          v36 = *(_DWORD *)(a2 + 12);
          v37 = ExAllocatePoolWithTag(0x200ui64, v36, 1951624563i64);
          *(_QWORD *)(a1 + 72) = v37;
          if( !v37 )
            return;
          memset(v37, 0i64, v36);
          v12 = *(_DWORD *)a2;
        }
        v13 = 4 - ((v12 & 0x10000) != 0);
        *(_WORD *)(a1 + 4032) = v13;
        if( RtlGetCompressionWorkSpaceSize(v13, &CompressBufferWorkSpaceSize, &CompressFragmentWorkSpaceSize) >= 0 )
        {
          v15 = CompressBufferWorkSpaceSize;
          v16 = CompressFragmentWorkSpaceSize;
          v17 = (unsigned int)CompressBufferWorkSpaceSize <= (unsigned int)CompressFragmentWorkSpaceSize;
          *(_DWORD *)(a1 + 4028) = CompressBufferWorkSpaceSize;
          if( v17 )
            v15 = v16;
          *(_DWORD *)(a1 + 4024) = v16;
          LODWORD(CompressBufferWorkSpaceSize) = v15;
          if( !v15
            || (v18 = ExAllocatePoolWithTag(0x200ui64, v15, 1951624563i64), (*(_QWORD *)(a1 + 4016) = v18) != 0i64) )
          {
            v19 = *(_QWORD *)(a2 + 48);
            if( v19 || (v19 = a1 + 3960, (int)StEtaHelper::StartHelper(a1 + 3960, 0) >= 0) )
            {
              *(_QWORD *)(a1 + 3952) = v19;
              v20 = *(_DWORD *)a2;
              v21 = *(_DWORD *)(a2 + 40);
              if( (unsigned __int8)*(_DWORD *)a2 )
              {
                if( v21
                  && (SmCrEncStart((_SMCR_ENCRYPT_CONTEXT *)(a1 + 4064), *(INT8 **)(a2 + 32), v21, v14) < 0
                   || (-*(_DWORD *)(a1 + 4072) & (*(_DWORD *)(a1 + 4072) + 15)) != 16) )
                {
                  return;
                }
                v20 = *(_DWORD *)a2;
              }
              else if( v21 )
              {
                return;
              }
              v22 = ExAllocatePoolWithTag(0x200ui64, (-(__int64)((v20 & 0x8000) != 0) & 0x1000) + 4096, 1951624563i64);
              *(_QWORD *)(a1 + 4208) = v22;
              if( !v22 )
                return;
              v24 = *(_DWORD *)a2;
              if( (unsigned __int8)*(_DWORD *)a2 == 1 )
              {
                v26 = 1;
                v25 = RtlNumberOfSetBits(*(UINT64 **)(a2 + 56));
                if( v25 <= 1 )
                  return;
                v24 = *(_DWORD *)a2;
              }
              else
              {
                v25 = *(_DWORD *)(a2 + 12);
                v26 = 0;
              }
              if( !v26 || (v24 & 0x4000) != 0 )
                v27 = 0;
              else
                v27 = 8;
              v28 = v27 | (v24 >> 8) & 1;
              if( !(_BYTE)v24 )
              {
                v29 = v28 | 0x40;
                v40 = v29;
                if( (v24 & 0x40000) == 0 )
                  goto LABEL_42;
                v28 = v29 | 0x60;
              }
              v40 = v28;
LABEL_42:
              ST_STORE::StDmStart(a1, a1 + 80, (int *)&v40, v23, v38, v25 - v26);
              if( v31 >= 0 )
              {
                if( v26 )
                {
                  v40 = v40 & 0xFFFFFFE0 | 0x16;
                  ST_STORE::StDmStart(a1, a1 + 2016, (int *)&v40, v30, v39, v26);
                }
              }
            }
          }
        }
      }
    }
  }
}

Referenced by:

No references.