SepValidLabelSubjectContext
UINT8 __stdcall SepValidLabelSubjectContext(_SECURITY_SUBJECT_CONTEXT *SubjectContext, VOID *Label, UINT8 Flags){
VOID *SeMediumMandatorySid;
void *ClientToken;
_ETHREAD *CurrentThread;
_KPROCESSOR_MODE v8;
UINT8 result;
_SID_AND_ATTRIBUTES IntegritySA;
UINT8 pbDominate;
pbDominate = 0;
SeMediumMandatorySid = Label;
IntegritySA = 0i64;
if( !Label )
SeMediumMandatorySid = SeExports->SeMediumMandatorySid;
ClientToken = SubjectContext->ClientToken;
if( !SubjectContext->ClientToken )
ClientToken = SubjectContext->PrimaryToken;
if( *((_DWORD *)ClientToken + 48) == 2 && *((int *)ClientToken + 49) < 2 )
return 0;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquireResourceSharedLite(*((_QWORD *)ClientToken + 6), 1);
SepCopyTokenIntegrity((_TOKEN *)ClientToken, &IntegritySA);
ExReleaseResourceLite(*((PERESOURCE *)ClientToken + 6));
KeLeaveCriticalRegionThread(KeGetCurrentThread());
if( (Flags & 8) != 0 )
{
if( RtlSidDominates(SeMediumMandatorySid, SeExports->SeMediumMandatorySid, &pbDominate) < 0 )
return 0;
if( !pbDominate )
SeMediumMandatorySid = SeExports->SeMediumMandatorySid;
}
if( RtlSidDominates(IntegritySA.Sid, SeMediumMandatorySid, &pbDominate) < 0 )
return 0;
result = pbDominate;
if( !pbDominate )
{
LOBYTE(v8) = 1;
return SeSinglePrivilegeCheckEx((_LUID)SeRelabelPrivilege, SubjectContext, v8);
}
return result;
}Referenced by:
RtlpSetSecurityObject