SeAppendPrivileges
NTSTATUS __stdcall SeAppendPrivileges(PACCESS_STATE AccessState, PRIVILEGE_SET *Privileges){
PVOID *v2;
unsigned int PrivilegeCount;
PRIVILEGE_SET *v6;
int v7;
size_t v9;
int v10;
int v11;
PRIVILEGE_SET *PoolWithTag;
_DWORD *v13;
PRIVILEGE_SET *v14;
v2 = (PVOID *)*((_QWORD *)AccessState + 9);
PrivilegeCount = Privileges->PrivilegeCount;
v6 = (PRIVILEGE_SET *)*v2;
v7 = *(_DWORD *)*v2;
if( v7 + Privileges->PrivilegeCount <= 3 )
{
SepConcatenatePrivileges(v6, Privileges, Privileges);
return 0;
}
v9 = 8;
if( PrivilegeCount )
v10 = 12 * PrivilegeCount + 8;
else
v10 = 8;
if( v6 )
{
if( v7 )
v11 = 12 * v7 + 8;
else
v11 = 8;
}
else
{
v11 = 0;
}
PoolWithTag = (PRIVILEGE_SET *)ExAllocatePoolWithTag(1ui64, (unsigned int)(v11 + v10), 1917871443i64);
if( PoolWithTag )
{
v13 = *v2;
if( *v2 )
{
if( *v13 )
v9 = 12 * *v13 + 8;
}
else
{
v9 = 0;
}
memmove(PoolWithTag, v13, v9);
SepConcatenatePrivileges(PoolWithTag, v14, Privileges);
if( *((_BYTE *)AccessState + 11) )
ExFreePoolWithTag(*v2, 0);
*v2 = PoolWithTag;
*((_BYTE *)AccessState + 11) = 1;
return 0;
}
return -1073741670;
}Referenced by:
CMFCheckAccess
CmpCheckKeyBodyAccess
CmpCheckOpenAccessOnKeyBody
IopCheckBackupRestorePrivilege
IopCreateSecurityCheck
IopParseDevice
ObCheckCreateObjectAccess
ObCheckObjectAccess
ObpAdjustCreatorAccessState
ObpCheckTraverseAccess
ObpCreateHandle