SeIsTokenAssignableToProcess

NTSTATUS __stdcall SeIsTokenAssignableToProcess(VOID *pAccessToken, UINT8 *pbIsAssignable, UINT64 a3){
  UINT8 v3; 
  _EPROCESS *Process; 
  VOID *v7; 
  _ETHREAD *CurrentThread; 
  _ETHREAD *v9; 
  int v10; 
  int v11; 
  NTSTATUS result; 
  UINT64 v13; 
  UINT8 v14; 
  _SID_AND_ATTRIBUTES v15; 
  _SID_AND_ATTRIBUTES IntegritySA; 
  UINT8 IsChild; 
  UINT8 pbDominate; 
  UINT8 IsSibling; 

  v3 = 0;
  *pbIsAssignable = 0;
  IsChild = 0;
  v15 = 0i64;
  IsSibling = 0;
  Process = KeGetCurrentThread()->ApcState.Process;
  IntegritySA = 0i64;
  pbDominate = 0;
  v7 = PsReferencePrimaryToken(Process);
  if( !v7 )
    return -1073741823;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquireResourceSharedLite(*((_QWORD *)v7 + 6), 1);
  SepCopyTokenIntegrity((_TOKEN *)v7, &IntegritySA);
  ExReleaseResourceLite(*((PERESOURCE *)v7 + 6));
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  ObFastDereferenceObject(&KeGetCurrentThread()->ApcState.Process->Token, v7);
  v9 = (_ETHREAD *)KeGetCurrentThread();
  --v9->Tcb.KernelApcDisable;
  ExAcquireResourceSharedLite(*((_QWORD *)pAccessToken + 6), 1);
  SepCopyTokenIntegrity((_TOKEN *)pAccessToken, &v15);
  v10 = *((_DWORD *)pAccessToken + 48);
  v11 = *((_DWORD *)pAccessToken + 49);
  ExReleaseResourceLite(*((PERESOURCE *)pAccessToken + 6));
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  if( v10 == 2 && v11 < 2 )
    return -1073741659;
  result = RtlSidDominates(IntegritySA.Sid, v15.Sid, &pbDominate);
  if( result >= 0 )
  {
    if( pbDominate )
    {
      result = SepIsChildTokenByPointer(pAccessToken, &IsChild);
      v14 = IsChild;
      if( !IsChild )
      {
        if( result < 0 )
          return result;
        result = SepIsSiblingTokenByPointer(pAccessToken, &IsSibling, v13);
      }
    }
    else
    {
      v14 = IsChild;
    }
    if( result >= 0 )
    {
      if( v14 || IsSibling )
        v3 = 1;
      *pbIsAssignable = v3;
    }
  }
  return result;
}

Referenced by:

PspAllocateProcess
PspAssignPrimaryToken