ObpVerifyCreatorAccessCheck
__int64 __fastcall ObpVerifyCreatorAccessCheck(_DWORD *a1){
_ETHREAD *CurrentThread;
_DWORD *PrimaryToken;
_DWORD *v4;
int v5;
int v6;
_SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
VOID *TokenInformation;
_SECURITY_SUBJECT_CONTEXT SubjectContext;
PVOID P[2];
__int64 v12;
char Sid[80];
*(_DWORD *)IdentifierAuthority.Value = 0;
*(_WORD *)&IdentifierAuthority.Value[4] = 4096;
memset(Sid, 0i64, 0x44u);
TokenInformation = 0i64;
memset(&SubjectContext, 0, sizeof(SubjectContext));
v12 = 0i64;
*(_OWORD *)P = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
SeCaptureSubjectContextEx(CurrentThread, CurrentThread->Tcb.ApcState.Process, &SubjectContext);
PrimaryToken = SubjectContext.PrimaryToken;
if( SubjectContext.ClientToken )
PrimaryToken = SubjectContext.ClientToken;
if( PrimaryToken[48] == 2 && (int)PrimaryToken[49] < 2 )
goto LABEL_14;
SeQueryInformationToken(PrimaryToken, TokenIsAppContainer, &TokenInformation);
if( !(_DWORD)TokenInformation
|| (LODWORD(v12) = SeQueryInformationToken(PrimaryToken, TokenAppContainerSid, P), (int)v12 >= 0) )
{
SeQueryInformationToken(PrimaryToken, TokenIntegrityLevel, (VOID **)((char *)&TokenInformation + 4));
RtlInitializeSid(Sid, &IdentifierAuthority, 1u);
LODWORD(v4) = RtlSubAuthoritySid((INT64)Sid, 0i64);
*v4 = HIDWORD(TokenInformation);
P[1] = Sid;
SeLockSubjectContext(&SubjectContext);
v5 = RtlEnumerateBoundaryDescriptorEntries(
a1,
(unsigned int(__fastcall *)(_DWORD *, __int64))ObpVerifyAccessToBoundaryEntry,
(__int64)&SubjectContext);
SeUnlockSubjectContext(&SubjectContext);
v6 = v12;
if( (int)v12 >= 0 )
{
if( v5 < 0 )
v6 = v5;
LODWORD(v12) = v6;
if( v6 >= 0 && P[0] && (v12 & 0x100000000i64) == 0 )
LABEL_14:
LODWORD(v12) = -1073741790;
}
}
SeReleaseSubjectContext(&SubjectContext);
if( P[0] )
ExFreePoolWithTag(P[0], 0);
return(unsigned int)v12;
}Referenced by:
NtCreatePrivateNamespace
NtDeletePrivateNamespace