CmSetKeyFlags

__int64 __fastcall CmSetKeyFlags(__int64 a1, int a2, int a3){
  _CM_KEY_BODY *v3; 
  ULONG_PTR v5; 
  int v7; 
  __int64 v8; 
  INT64 KeyControlBlock; 
  _CM_TRANS *v10; 
  _CM_TRANS *v11; 
  INT64 v12; 
  INT64 v13; 
  int v14; 
  INT64 v15; 
  INT64 KeyNodeForKcb; 
  INT64 v17; 
  int v18; 
  int v19; 
  int v20; 
  __int16 v21; 
  unsigned int v22; 
  _CM_KCB_UOW *UnitOfWork; 
  int v24; 
  _CM_TRANS *CmTrans; 
  INT64 v27; 
  int a1a; 
  _CM_KEY_BODY *v29; 
  UINT64 v30[2]; 
  INT64 v31[2]; 
  __int128 v32; 
  KAPC_STATE ApcState; 
  v29 = (_CM_KEY_BODY *)a1;
  v3 = (_CM_KEY_BODY *)a1;
  v5 = 0i64;
  v27 = 0xFFFFFFFFi64;
  *(_OWORD *)v31 = 0i64;
  WORD1(v31[0]) = -1;
  CmTrans = 0i64;
  a1a = 0;
  memset(&ApcState, 0, sizeof(ApcState));
  v32 = 0i64;
  *(_OWORD *)v30 = 0i64;
  CmpAttachToRegistryProcess(&ApcState);
  if( a2 == 1 && (a3 & 0xFFFFFFF0) != 0 )
  {
    v7 = -1073741811;
  }
  else
  {
    while( (CmpShutdownRundown & 1) == 0 )
    {
      v8 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
      CmpLockRegistry();
      KeyControlBlock = (INT64)v3->KeyControlBlock;
      CmpStartKcbStackForTopLayerKcb((INT64)v31, KeyControlBlock);
      CmpLockKcbStackTopExclusiveRestShared((__int64)v31);
      v7 = CmpPerformKeyBodyDeletionCheck((__int64)v3, 0i64);
      if( v7 < 0 )
        goto LABEL_55;
      if( *(_QWORD *)&v3->Trans.0 || v3->KtmUow )
      {
        v7 = CmpTransSearchAddTransFromKeyBody(v3, &CmTrans);
        if( v7 < 0 )
          goto LABEL_55;
        if( (*(_DWORD *)(*(_QWORD *)(KeyControlBlock + 32) + 160i64) & 2) != 0 )
        {
          v7 = -1072103423;
          goto LABEL_55;
        }
        v10 = CmTrans;
        v7 = CmpPerformKeyBodyDeletionCheck((__int64)v29, (__int64)CmTrans);
        if( v7 < 0 )
          goto LABEL_55;
      }
      else
      {
        v10 = CmTrans;
      }
      if( (unsigned int)CmpGetEffectiveKcbSemantics((_CM_KEY_CONTROL_BLOCK *)KeyControlBlock) == 1 )
      {
        v7 = -1073741790;
        goto LABEL_55;
      }
      if( (unsigned int)(a2 - 2) <= 2 )
        v10 = v11;
      CmTrans = v10;
      if( v10 )
      {
        UnitOfWork = CmpAllocateUnitOfWork();
        v5 = (ULONG_PTR)UnitOfWork;
        if( UnitOfWork )
        {
          CmpTransEnlistUowInKcb(UnitOfWork, KeyControlBlock);
          CmpTransEnlistUowInCmTrans((_CM_KCB_UOW *)v5, v10);
          v7 = v24;
          if( v24 < 0 )
            goto LABEL_43;
          if( !CmpLockIXLockIntent((UINT64 *)(KeyControlBlock + 248), v5)
            || !CmpLockIXLockExclusive(KeyControlBlock + 264, (_QWORD *)v5, 1) )
          {
            v7 = -1072103423;
            goto LABEL_43;
          }
          *(_DWORD *)(v5 + 68) = 7;
          *(_DWORD *)(v5 + 88) = a3;
          v7 = CmAddLogForAction(v5, 1u);
          if( v7 < 0 )
            goto LABEL_43;
          v7 = 0;
        }
        else
        {
          v7 = -1073741670;
        }
LABEL_55:
        CmpUnlockKcbStack((__int64)v31);
LABEL_56:
        CmpUnlockRegistry();
        goto LABEL_58;
      }
      v14 = CmpTryAcquireKcbIXLocks(v12, 0, v13, v30);
      v7 = v14;
      if( v14 == -1073741267 )
      {
        CmpLogTransactionAbortedForRollbackPacket(KeyControlBlock, 3i64, v30, v15);
        CmpUnlockKcbStack((__int64)v31);
        CmpUnlockRegistry();
        v7 = CmpAbortRollbackPacket((INT64)v30);
        if( v7 < 0 )
          goto LABEL_58;
        CmpRetryBackOff(&a1a);
        CmpCleanupRollbackPacket((INT64)v30);
        *(_OWORD *)v30 = 0i64;
      }
      else
      {
        if( v14 < 0 )
          goto LABEL_55;
        if( *(_DWORD *)(KeyControlBlock + 40) != -1 )
        {
          HvLockHiveFlusherShared(*(_QWORD *)(KeyControlBlock + 32));
          if( HvMarkCellDirty(*(_QWORD *)(KeyControlBlock + 32), *(unsigned int *)(KeyControlBlock + 40), 0) )
          {
            KeyNodeForKcb = CmpGetKeyNodeForKcb(KeyControlBlock, (INT64)&v27, 1);
            v17 = KeyNodeForKcb;
            v18 = a2 - 1;
            if( v18 )
            {
              v19 = v18 - 1;
              if( v19 )
              {
                v20 = v19 - 1;
                if( v20 )
                {
                  if( v20 == 1 )
                  {
                    *(_BYTE *)(KeyNodeForKcb + 55) = a3;
                    *(_BYTE *)(KeyControlBlock + 185) = a3;
                  }
                }
                else
                {
                  v21 = *(_WORD *)(KeyNodeForKcb + 2);
                  if( (a3 & 4) != 0 )
                  {
                    *(_WORD *)(v17 + 2) = v21 | 0x80;
                    *(_WORD *)(KeyControlBlock + 186) |= 0x80u;
                  }
                  else
                  {
                    if( (a3 & 1) != 0 )
                    {
                      *(_WORD *)(v17 + 2) = v21 | 0x300;
                      *(_WORD *)(KeyControlBlock + 186) |= 0x300u;
                    }
                    else
                    {
                      *(_WORD *)(v17 + 2) = v21 & 0xFEFF;
                      *(_WORD *)(KeyControlBlock + 186) &= ~0x100u;
                    }
                    if( (a3 & 2) != 0 )
                    {
                      *(_WORD *)(v17 + 2) |= 0x200u;
                      *(_WORD *)(KeyControlBlock + 186) |= 0x200u;
                    }
                  }
                }
              }
              else
              {
                *(_DWORD *)(KeyNodeForKcb + 52) ^= (*(_DWORD *)(KeyNodeForKcb + 52) ^ (a3 << 20)) & 0xF00000;
                *(_DWORD *)(KeyControlBlock + 184) ^= (*(_DWORD *)(KeyControlBlock + 184) ^ *(unsigned __int16 *)(KeyNodeForKcb + 54)) & 0xF0;
                if( (a3 & 2) != 0 )
                {
                  *(_WORD *)(KeyNodeForKcb + 2) &= ~0x80u;
                  *(_WORD *)(KeyControlBlock + 186) = *(_WORD *)(KeyNodeForKcb + 2);
                }
              }
            }
            else
            {
              v22 = *(_DWORD *)(KeyNodeForKcb + 52) ^ (*(_DWORD *)(KeyNodeForKcb + 52) ^ (a3 << 16)) & 0xF0000;
              *(_DWORD *)(KeyNodeForKcb + 52) = v22;
              *(_DWORD *)(KeyControlBlock + 184) ^= (*(_DWORD *)(KeyControlBlock + 184) ^ HIWORD(v22)) & 0xF;
            }
            *(_QWORD *)(v17 + 4) = v8;
            ++*(_QWORD *)(KeyControlBlock + 304);
            *(_QWORD *)(KeyControlBlock + 168) = v8;
            v7 = 0;
            CmpReleaseKeyNodeForKcb((_CM_KEY_CONTROL_BLOCK *)KeyControlBlock, (_HV_GET_CELL_CONTEXT *)&v27);
          }
          else
          {
            v7 = -1073741443;
          }
          HvUnlockHiveFlusherShared(*(_QWORD *)(KeyControlBlock + 32));
LABEL_43:
          if( v5 )
          {
            CmpRundownUnitOfWork(v5);
            CmpFreeUnitOfWork((void *)v5);
          }
          goto LABEL_55;
        }
        CmpUnlockKcbStack((__int64)v31);
        v7 = CmpPromoteKey((__int64)v31, 0, 0);
        if( v7 < 0 )
          goto LABEL_56;
        CmpUnlockRegistry();
        CmpCleanupKcbStack((INT64)v31);
        *(_OWORD *)v31 = 0i64;
        WORD1(v31[0]) = -1;
        v32 = 0i64;
      }
      v3 = v29;
    }
    v7 = -1073741431;
  }
LABEL_58:
  CmpDetachFromRegistryProcess(&ApcState);
  CmpCleanupKcbStack((INT64)v31);
  CmpCleanupRollbackPacket((INT64)v30);
  return(unsigned int)v7;
}

Referenced by:

NtSetInformationKey