CmpDoAccessCheckOnLayeredSubtree

INT64 __fastcall CmpDoAccessCheckOnLayeredSubtree(INT64 a1, INT64 a2, INT16 *a3, INT64 a4, INT64 a5, INT64 a6){
  INT64 v9; 
  int v10; 
  unsigned int v11; 
  int v12; 
  int i; 
  _LIST_ENTRY *v15; 
  INT64 v16; 
  _LIST_ENTRY *SecurityCacheEntryForKcbStack; 
  int v18; 
  INT64 a2a; 
  INT16 *a1a; 
  INT16 v21[56]; 

  a2a = 0i64;
  a1a = 0i64;
  memset(&v21[1], 0i64, 0x66u);
  v21[0] = -2;
  CmpInitializeKeyNodeStack((INT64)&v21[8]);
  if( (a6 & 1) == 0
    || (a1 ? (v15 = CmpGetSecurityCacheEntryForKcbStack(a1, a2, v9), v10 = CmpCheckKeySecurityDescriptorAccess(&v15[2])) : (v10 = CmpCheckKeyNodeStackAccess(a3)),
        v11 = v10,
        v10 >= 0) )
  {
    v12 = a1 ? CmpSubtreeEnumeratorStartForKcbStack((INT64)v21, a1) : CmpSubtreeEnumeratorStartForKeyNodeStack(
                                                                        (INT64)v21,
                                                                        a3);
    v11 = v12;
    if( v12 >= 0 )
    {
      for( i = CmpSubtreeEnumeratorAdvance((INT64)v21); i != -2147483622; i = CmpSubtreeEnumeratorAdvance((INT64)v21) )
      {
        CmpSubtreeEnumeratorGetCurrentKeyStacks(v21, &a2a, &a1a);
        if( a2a )
        {
          SecurityCacheEntryForKcbStack = CmpGetSecurityCacheEntryForKcbStack(a2a, a2, v16);
          v18 = CmpCheckKeySecurityDescriptorAccess(&SecurityCacheEntryForKcbStack[2]);
        }
        else
        {
          v18 = CmpCheckKeyNodeStackAccess(a1a);
        }
        v11 = v18;
        if( v18 < 0 )
          goto LABEL_11;
      }
      v11 = 0;
    }
  }
LABEL_11:
  CmpSubtreeEnumeratorCleanup((INT64)v21);
  return v11;
}

Referenced by:

CmRenameKey
CmSaveKey