SepValidOwnerSubjectContext
UINT8 __stdcall SepValidOwnerSubjectContext(_SECURITY_SUBJECT_CONTEXT *SubjectContext, VOID *Owner, UINT8 ServerObject){
bool v3;
void *PrimaryToken;
_ETHREAD *CurrentThread;
unsigned int v8;
unsigned int v9;
__int64 v10;
_KPROCESSOR_MODE v11;
v3 = 0;
if( !Owner )
return 0;
if( ServerObject || (PrimaryToken = SubjectContext->ClientToken) == 0i64 )
PrimaryToken = SubjectContext->PrimaryToken;
if( *((_DWORD *)PrimaryToken + 48) == 2 && *((int *)PrimaryToken + 49) < 2 )
return 0;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v8 = 0;
--CurrentThread->Tcb.KernelApcDisable;
ExAcquireResourceSharedLite(*((_QWORD *)PrimaryToken + 6), 1);
v9 = *((_DWORD *)PrimaryToken + 31);
if( v9 )
{
v10 = *((_QWORD *)PrimaryToken + 19);
while( !RtlEqualSid(Owner, *(PVOID *)(v10 + 16i64 * v8)) )
{
if( ++v8 >= v9 )
goto LABEL_10;
}
v3 = SepIdAssignableAsOwner((_TOKEN *)PrimaryToken, v8) != 0;
}
LABEL_10:
ExReleaseResourceLite(*((PERESOURCE *)PrimaryToken + 6));
KeLeaveCriticalRegion();
if( !v3 )
{
LOBYTE(v11) = 1;
return SeSinglePrivilegeCheckEx(SeRestorePrivilege, SubjectContext, v11);
}
return v3;
}Referenced by:
RtlpNewSecurityObject
RtlpSetSecurityObject