CmpGenerateFlushControlData

CHAR __fastcall CmpGenerateFlushControlData(INT64 a1, CHAR a2, INT64 *a3){
  int *v3; 
  char v7; 
  char v8; 
  int v9; 
  int v10; 
  int v11; 
  int v12; 
  int v13; 
  int v14; 
  int v15; 
  int v16; 
  char v17; 
  int v18; 
  int v19; 
  int v20; 
  int v21; 
  int v22; 

  v3 = (int *)(a3 + 1);
  *a3 = 0i64;
  *((_DWORD *)a3 + 2) = 0;
  *((_DWORD *)a3 + 5) = 0;
  *((_DWORD *)a3 + 3) = 0;
  v7 = *(_BYTE *)(a1 + 191);
  if( !v7 && !*(_DWORD *)(a1 + 104) && !*(_DWORD *)(a1 + 128) )
  {
    v8 = 0;
LABEL_29:
    v10 = 0;
    if( !v7 )
      goto LABEL_9;
    goto LABEL_4;
  }
  v8 = 1;
  if( !*(_DWORD *)(a1 + 104) )
    goto LABEL_29;
LABEL_4:
  v9 = 9;
  *(_DWORD *)a3 = 9;
  if( *(_BYTE *)(a1 + 190) )
  {
    v9 = 27;
    *(_DWORD *)a3 = 27;
  }
  if( *(_DWORD *)(a1 + 4268) )
    *(_DWORD *)a3 = v9 | 0x82;
  *((_DWORD *)a3 + 6) = HvGetEffectiveLogSizeCapForHive((_HHIVE *)a1);
LABEL_9:
  v11 = v10;
  if( v8 && (a2 & 4) != 0 )
  {
    v11 = v10 | 0x42;
    *(_DWORD *)a3 = v10 | 0x42;
  }
  v12 = *(_DWORD *)(a1 + 160);
  if( (v12 & 2) == 0 )
  {
    LOBYTE(v12) = (*(&CmpDummyThreadEvent + 376) & 1) == 0;
    if( (((*(_DWORD *)(a1 + 4152) & 0x800) == 0) & (unsigned __int8)v12) != 0 )
    {
      if( (a2 & 8) != 0 && (!*(_BYTE *)(a1 + 190) || (v11 & 0x10) != 0) )
      {
        v18 = v11 | 0x107;
        *(_DWORD *)a3 = v18;
        if( (v18 & 8) != 0 )
        {
          HvGetHiveLogFileStatus(a1, *((_DWORD *)a3 + 6), v3);
          v12 = *v3;
          if( (*v3 & 0xC) != 0 )
            *(_DWORD *)a3 |= 0x400u;
        }
        return v12;
      }
      if( (v11 & 0x48) == 8 )
      {
        HvGetHiveLogFileStatus(a1, *((_DWORD *)a3 + 6), v3);
        v12 = *v3;
        if( (*v3 & 1) != 0 )
        {
          *(_DWORD *)a3 |= 2u;
          return v12;
        }
        if( (v12 & 0xA) != 0 )
        {
          *(_DWORD *)a3 |= 0x42u;
        }
        else if( (v12 & 4) != 0 )
        {
          *(_DWORD *)a3 |= 2u;
          if( HvIsCurrentLogSwappable((_HHIVE *)a1) )
            v22 = v21 | 0x22;
          else
            v22 = v21 | 0x42;
          *(_DWORD *)a3 = v22;
        }
      }
      v13 = *(_DWORD *)a3;
      if( (*(_DWORD *)a3 & 0x40) == 0 )
        goto LABEL_20;
      LOBYTE(v12) = PoIsInitializedStopWatch((_QWORD *)(a1 + 4248));
      if( (_BYTE)v12 )
        return v12;
      if( (*v3 & 8) != 0 )
      {
        v13 = v15 | 0x504;
      }
      else
      {
        *(_DWORD *)a3 = v15 | 1;
        if( HvIsCurrentLogSwappable((_HHIVE *)a1) )
        {
          v13 = v16 | 0x21;
        }
        else
        {
          v13 = v16 | 5;
          *(_DWORD *)a3 = v13;
          if( (v17 & 4) == 0 )
            goto LABEL_20;
          v13 |= 0x400u;
        }
      }
      *(_DWORD *)a3 = v13;
LABEL_20:
      if( (v13 & 0x48) == 8 )
      {
        v14 = v13;
        if( !*(_DWORD *)(a1 + 128) )
        {
          v14 = v13 | 0x800;
          *(_DWORD *)a3 = v13 | 0x800;
        }
        v13 = v14;
        if( (*v3 & 0x14) != 0 )
        {
          v13 = v14 | 0x1000;
          *(_DWORD *)a3 = v14 | 0x1000;
        }
      }
      v12 = *(_DWORD *)(a1 + 4264);
      if( (v12 & 1) == 0 )
      {
        if( *(_QWORD *)(a1 + 1536) )
        {
          LOBYTE(v12) = (a2 & 0x20) == 0;
          if( (((v13 & 8) == 0) & (unsigned __int8)v12) == 0 )
            *(_DWORD *)a3 = v13 | 0x202;
        }
      }
      return v12;
    }
  }
  if( *(_DWORD *)(a1 + 104) || *(_BYTE *)(a1 + 191) )
  {
    v19 = v11 | 0x46;
    *(_DWORD *)a3 = v19;
    if( *(_BYTE *)(a1 + 190) )
      v19 |= 0x10u;
    v20 = v19 | 0x500;
  }
  else
  {
    LOBYTE(v12) = (a2 & 0x20) != 0;
    if( (((*(_BYTE *)(a1 + 4264) & 1) == 0) & (unsigned __int8)v12) == 0 )
      return v12;
    v20 = v11 | 0x202;
  }
  *(_DWORD *)a3 = v20;
  return v12;
}

Referenced by:

CmpFlushHive