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