SeExamineSacl
VOID __stdcall SeExamineSacl(
PACL Sacl,
PACL ResourceSacl,
PACCESS_TOKEN Token,
ACCESS_MASK DesiredAccess,
BOOLEAN AccessGranted,
PBOOLEAN GenerateAudit,
PBOOLEAN GenerateAlarm){
_DWORD *v7;
PBOOLEAN v8;
unsigned int v9;
_QWORD **v10;
PBOOLEAN v11;
PACL v12;
unsigned int AceCount;
BOOLEAN v15;
char v16;
_WORD *v17;
NTSTATUS v18;
unsigned int v19;
PACL v20;
char Sbz1;
struct _ACL *v22;
unsigned int v23;
int v24;
unsigned int v25;
_QWORD *v26;
__int64 v27;
__int64 v28;
__int64 v29;
__int64 v30;
int v31;
unsigned int v32;
__int64 v33[10];
int v34;
PACL v35;
PVOID Tokena;
ACCESS_MASK v37;
v37 = DesiredAccess;
Tokena = Token;
v35 = ResourceSacl;
v34 = -1;
v7 = 0i64;
v8 = GenerateAudit;
v9 = 0;
v33[0] = 0i64;
v10 = (_QWORD **)Token;
v11 = GenerateAlarm;
v12 = ResourceSacl;
*GenerateAudit = 0;
*v11 = 0;
if( Sacl )
{
AceCount = Sacl->AceCount;
v32 = AceCount;
if( Sacl->AceCount )
{
v15 = AccessGranted;
v16 = 0;
if( (DesiredAccess & 0x2000000) != 0 )
v16 = AccessGranted != 0 ? 64 : 0x80;
v17 = (_WORD *)*v10[19];
if( *v17 == *(_WORD *)SeAnonymousLogonSid )
{
v18 = memcmp(v17, SeAnonymousLogonSid, 4i64 * *((unsigned __int8 *)SeAnonymousLogonSid + 1) + 8);
v10 = (_QWORD **)Tokena;
v12 = v35;
if( !v18 )
v9 = 4 * *((unsigned __int8 *)SeWorldSid + 1) + 8;
}
v19 = 0;
v20 = Sacl + 1;
LODWORD(GenerateAudit) = 0;
if( AceCount )
{
while( 1 )
{
if( *v8 )
{
LABEL_51:
if( v7 )
{
AuthzBasepFreeSecurityAttributesList(v7);
ExFreePoolWithTag(v7, 0);
}
return;
}
Sbz1 = v20->Sbz1;
if( (Sbz1 & 8) == 0 )
break;
LABEL_50:
++v19;
v10 = (_QWORD **)Tokena;
v20 = (PACL)((char *)v20 + v20->AclSize);
v12 = v35;
LODWORD(GenerateAudit) = v19;
if( v19 >= v32 )
goto LABEL_51;
}
if( v20->AclRevision == 2 )
{
if( !SepSidInToken(v10, 0i64, &v20[1], 1u, 0, 0)
&& (!v9 || *(_WORD *)SeWorldSid != *(_WORD *)&v20[1].AclRevision || memcmp(SeWorldSid, &v20[1], v9)) )
{
goto LABEL_49;
}
if( (*(_DWORD *)&v20->AceCount & v37) == 0 )
{
v19 = (unsigned int)GenerateAudit;
if( ((unsigned __int8)v16 & (unsigned __int8)Sbz1) != 0 )
*v8 = 1;
goto LABEL_50;
}
}
else
{
if( v20->AclRevision != 13 )
goto LABEL_50;
v22 = v20 + 1;
v23 = 4 * v20[1].Sbz1 + 8;
v24 = *(_DWORD *)&v20->AceCount;
LODWORD(GenerateAlarm) = v23;
v31 = v24;
if( v12 && !v7 )
{
AuthzBasepInitializeResourceClaimsFromSacl((__int64)v12, (__int64)v33);
v23 = (unsigned int)GenerateAlarm;
v19 = (unsigned int)GenerateAudit;
v7 = (_DWORD *)v33[0];
}
v25 = v20->AclSize - v23;
if( (int)(v25 - 8) <= 0 )
goto LABEL_50;
v26 = (_QWORD *)*((_QWORD *)Tokena + 137);
if( v26 )
v27 = v26[75];
else
v27 = 0i64;
if( v26 )
v28 = v26[73];
else
v28 = 0i64;
if( v26 )
v29 = v26[74];
else
v29 = 0i64;
if( v26 )
v30 = v26[72];
else
v30 = 0i64;
AuthzBasepEvaluateAceCondition(
(__int64)Tokena,
*((_QWORD *)Tokena + 97),
(__int64)v7,
v30,
v29,
v28,
v27,
(char *)v22 + v23,
v25 - 8,
1,
0,
&v34);
if( ((v34 + 1) & 0xFFFFFFFD) != 0
|| !SepSidInToken(Tokena, 0i64, &v20[1], 1u, 0, 0)
&& (!v9 || *(_WORD *)SeWorldSid != *(_WORD *)&v22->AclRevision || memcmp(SeWorldSid, &v20[1], v9)) )
{
goto LABEL_49;
}
if( (v37 & v31) == 0 )
{
if( ((unsigned __int8)v16 & (unsigned __int8)Sbz1) == 0 )
{
LABEL_49:
v19 = (unsigned int)GenerateAudit;
goto LABEL_50;
}
LABEL_48:
*v8 = 1;
goto LABEL_49;
}
}
if( ((Sbz1 & 0x40) == 0 || !v15) && (Sbz1 >= 0 || v15) )
goto LABEL_49;
goto LABEL_48;
}
}
}
}Referenced by:
CmpExamineSaclForAuditEvent
NtOpenObjectAuditAlarm
SeAdtRegistryValueChangedAuditAlarm
SeExamineGlobalSacl
SeObjectReferenceAuditAlarm
SeOpenObjectAuditAlarmForNonObObject
SeOpenObjectAuditAlarmWithTransaction
SeOpenObjectForDeleteAuditAlarmWithTransaction