SePrivilegePolicyCheck
NTSTATUS __stdcall SePrivilegePolicyCheck(
UINT64 *RemainingDesiredAccess,
UINT64 *PreviouslyGrantedAccess,
_SECURITY_SUBJECT_CONTEXT *SubjectSecurityContext,
VOID *ExplicitToken,
PRIVILEGE_SET **PrivilegeSet,
INT8 PreviousMode){
unsigned int v6;
char v7;
int v11;
int v12;
char v13;
char v14;
UINT64 v16;
char v17;
VOID **PoolWithTag;
int v19;
__int64 v20;
__int64 v21;
__int64 v22;
_LUID_AND_ATTRIBUTES RequiredPrivileges;
v6 = 0;
v7 = 0;
v11 = 0;
if( SubjectSecurityContext )
{
ExplicitToken = SubjectSecurityContext->ClientToken;
if( !SubjectSecurityContext->ClientToken )
ExplicitToken = SubjectSecurityContext->PrimaryToken;
}
v12 = *(_DWORD *)RemainingDesiredAccess;
if( (*(_DWORD *)RemainingDesiredAccess & 0x1000000) != 0 )
{
RequiredPrivileges.Luid = SeSecurityPrivilege;
RequiredPrivileges.Attributes = 0;
if( !SepPrivilegeCheck((_TOKEN *)ExplicitToken, &RequiredPrivileges, 1ui64, 1ui64, PreviousMode) )
return -1073741727;
*(_DWORD *)RemainingDesiredAccess &= ~0x1000000u;
v11 = v19;
*(_DWORD *)PreviouslyGrantedAccess |= 0x1000000u;
v7 = v19;
v12 = *(_DWORD *)RemainingDesiredAccess;
}
if( (v12 & 0x80000) == 0 )
goto LABEL_4;
RequiredPrivileges.Luid = (_LUID)SeTakeOwnershipPrivilege;
RequiredPrivileges.Attributes = 0;
if( SepPrivilegeCheck((_TOKEN *)ExplicitToken, &RequiredPrivileges, 1ui64, 1ui64, PreviousMode) )
{
*(_DWORD *)RemainingDesiredAccess &= ~0x80000u;
++v11;
*(_DWORD *)PreviouslyGrantedAccess |= 0x80000u;
v14 = v16;
v13 = 0;
goto LABEL_6;
}
RequiredPrivileges.Luid = (_LUID)SeRelabelPrivilege;
RequiredPrivileges.Attributes = 0;
if( SepPrivilegeCheck((_TOKEN *)ExplicitToken, &RequiredPrivileges, v16, (unsigned int)v16, PreviousMode) )
{
*(_DWORD *)RemainingDesiredAccess &= ~0x80000u;
++v11;
*(_DWORD *)PreviouslyGrantedAccess |= 0x80000u;
v13 = v17;
}
else
{
LABEL_4:
v13 = 0;
}
v14 = 0;
LABEL_6:
if( !v11 )
return 0;
PoolWithTag = ExAllocatePoolWithTag(1ui64, (unsigned int)(12 * v11 + 8), 1917871443i64);
*PrivilegeSet = (PRIVILEGE_SET *)PoolWithTag;
if( PoolWithTag )
{
*(_DWORD *)PoolWithTag = v11;
(*PrivilegeSet)->Control = 0;
if( v14 )
{
v6 = 1;
(*PrivilegeSet)->Privilege[0].Luid = (_LUID)SeTakeOwnershipPrivilege;
(*PrivilegeSet)->Privilege[0].Attributes = 0x80000000;
}
if( v7 )
{
v20 = v6++;
v21 = v20;
(*PrivilegeSet)->Privilege[v21].Luid = SeSecurityPrivilege;
(*PrivilegeSet)->Privilege[v21].Attributes = 0x80000000;
}
if( v13 )
{
v22 = v6;
(*PrivilegeSet)->Privilege[v22].Luid = (_LUID)SeRelabelPrivilege;
(*PrivilegeSet)->Privilege[v22].Attributes = 0x80000000;
}
return 0;
}
return -1073741670;
}Referenced by:
SeAccessCheckByTypeWithAdminlessChecks
SepAccessCheckAndAuditAlarmWithAdminlessChecks