PiAuCheckTokenMembership
VOID __stdcall PiAuCheckTokenMembership(PVOID SidToCheck, UINT8 *IsMember){
unsigned int v4;
ACL *PoolWithTag;
ACL *v6;
UINT64 PreviouslyGrantedAccess;
INT64 GrantedAccess;
struct _SECURITY_SUBJECT_CONTEXT SubjectContext;
GENERIC_MAPPING GenericMapping;
GrantedAccess = 0i64;
memset(&SubjectContext, 0, sizeof(SubjectContext));
GenericMapping.GenericWrite = 0x20000;
GenericMapping.GenericExecute = 0x20000;
GenericMapping.GenericRead = 131073;
GenericMapping.GenericAll = 2031617;
*IsMember = 0;
v4 = 3 * (RtlLengthSid(SidToCheck) + 20);
PoolWithTag = (ACL *)ExAllocatePoolWithTag(PagedPool, v4, 0x20207050ui64);
v6 = PoolWithTag;
if( PoolWithTag )
{
memset((INT64)PoolWithTag, 0i64);
RtlCreateSecurityDescriptor(v6, 1ui64);
RtlSetOwnerSecurityDescriptor(v6, SidToCheck, 0);
RtlSetGroupSecurityDescriptor(v6, SidToCheck, 0);
if( RtlCreateAcl(v6 + 5, v4 - 40, 2u) >= 0
&& (int)RtlpAddKnownAce(v6 + 5, 2ui64, 0i64, 1ui64, SidToCheck, 0) >= 0
&& RtlSetDaclSecurityDescriptor(v6, 1u, v6 + 5, 0) >= 0 )
{
SeCaptureSubjectContext(&SubjectContext);
LODWORD(PreviouslyGrantedAccess) = 0;
*IsMember = SeAccessCheck(
v6,
&SubjectContext,
0,
1ui64,
PreviouslyGrantedAccess,
0i64,
&GenericMapping,
*((_BYTE *)KeGetCurrentThread() + 562),
(UINT64 *)((char *)&GrantedAccess + 4),
&GrantedAccess);
SeReleaseSubjectContext(&SubjectContext);
}
ExFreePoolWithTag(v6, 0);
}
}Referenced by:
PiAuCheckClientInteractive