SepMandatoryIntegrityCheck

NTSTATUS __stdcall SepMandatoryIntegrityCheck(
        _GENERIC_MAPPING *GenericMapping,
        _SECURITY_DESCRIPTOR *SecurityDescriptor,
        UINT8 bNoLabelAce,
        _TOKEN *Token,
        UINT8 bTakeLock,
        _SEP_MANDATORY_INFORMATION *MandatoryInformation){
  unsigned int MandatoryPolicy; 
  char v7; 
  unsigned int v8; 
  signed __int16 Control; 
  _ACL *Sacl; 
  _ACL *v12; 
  unsigned int v13; 
  int v14; 
  _ACL *v15; 
  __int64 IntegrityLevelIndex; 
  _SID_AND_ATTRIBUTES *v17; 
  _WORD *Sid; 
  int Sbz1; 
  int v20; 
  unsigned __int16 v21; 
  unsigned __int16 v22; 
  int v23; 
  int v24; 
  NTSTATUS v25; 
  __int16 v26; 
  bool v27; 
  unsigned int v29; 
  NTSTATUS v30; 
  char v31; 
  char v32; 
  char v33; 
  char v34; 
  NTSTATUS result; 
  __int64 Owner_high; 
  char v37; 
  unsigned int v38; 
  unsigned int GenericRead; 
  unsigned int v40; 
  _ETHREAD *CurrentThread; 
  _ERESOURCE *TokenLock; 
  __int16 v43; 
  unsigned __int8 CurrentIrql; 
  _ETHREAD *v45; 
  UINT8 *OwnerEntryForLegacyShim; 
  unsigned int v47; 
  unsigned int v48; 
  char v49; 
  char v50; 
  __int64 v52; 

  MandatoryPolicy = Token->MandatoryPolicy;
  v7 = 0;
  v8 = 0;
  v49 = 0;
  *(_DWORD *)(v52 + 8) = MandatoryPolicy;
  if( (MandatoryPolicy & 0xFFFFFFFD) != 0 )
  {
    if( bNoLabelAce )
      goto LABEL_47;
    Control = SecurityDescriptor->Control;
    if( (Control & 0x10) == 0 )
      goto LABEL_47;
    if( Control < 0 )
    {
      Owner_high = HIDWORD(SecurityDescriptor->Owner);
      if( !(_DWORD)Owner_high )
        goto LABEL_47;
      Sacl = (_ACL *)(&SecurityDescriptor->Revision + Owner_high);
    }
    else
    {
      Sacl = SecurityDescriptor->Sacl;
    }
    if( Sacl )
    {
      v12 = Sacl + 1;
      v13 = 0;
      if( Sacl->AceCount )
      {
        while( v12->AclRevision != 17 )
        {
          ++v13;
          v12 = (_ACL *)((char *)v12 + v12->AclSize);
          if( v13 >= Sacl->AceCount )
            goto LABEL_47;
        }
        if( (v12->Sbz1 & 8) == 0 )
        {
          v14 = *(_DWORD *)&v12->AceCount;
          v15 = v12 + 1;
          v50 = v14;
LABEL_11:
          if( bTakeLock )
          {
            CurrentThread = (_ETHREAD *)KeGetCurrentThread();
            --CurrentThread->Tcb.KernelApcDisable;
            TokenLock = Token->TokenLock;
            if( (TokenLock->Flag & 0x41) == 1 )
              KeBugCheckEx(0x1C6u, (PVOID)0xF, TokenLock, 0i64, 0i64);
            v43 = TokenLock->Flag & 1;
            if( v43 )
            {
              CurrentIrql = KeGetCurrentIrql();
              v45 = (_ETHREAD *)KeGetCurrentThread();
              if( CurrentIrql > 1u )
                KeBugCheckEx(0x1C6u, 0i64, (PVOID)CurrentIrql, (PVOID)1, 0i64);
              if( (v45->Tcb.ApcState.InProgressFlags & 2) != 0 )
                KeBugCheckEx(0x1C6u, (PVOID)6, 0i64, 0i64, 0i64);
              if( !CurrentIrql && (v45->Tcb._bf_0 & 0x400) == 0 && !v45->Tcb.WaitBlock[3].SpareLong )
                KeBugCheckEx(0x1C6u, (PVOID)7, 0i64, 0i64, 0i64);
            }
            if( v43 )
            {
              OwnerEntryForLegacyShim = ExpAllocateOwnerEntryForLegacyShim();
              if( !(unsigned __int8)ExAcquireFastResourceShared(
                                       (ULONG_PTR)TokenLock,
                                       (ULONG_PTR)OwnerEntryForLegacyShim) )
                ExFreePoolWithTag(OwnerEntryForLegacyShim, 0);
            }
            else
            {
              ExpAcquireResourceSharedLite(Token->TokenLock, 1);
            }
          }
          IntegrityLevelIndex = Token->IntegrityLevelIndex;
          if( (_DWORD)IntegrityLevelIndex == -1 || (v17 = &Token->UserAndGroups[IntegrityLevelIndex]) == 0i64 )
            Sid = SeUntrustedMandatorySid;
          else
            Sid = v17->Sid;
          if( (_BYTE)MandatoryInformation )
            Sid = (_WORD *)SepDefaultMandatorySid;
          if( bTakeLock )
          {
            ExReleaseResourceLite(Token->TokenLock);
            KeLeaveCriticalRegion();
          }
          Sbz1 = v15->Sbz1;
          if( (_BYTE)Sbz1 )
            v20 = *((_DWORD *)&v15[1].AclRevision + (unsigned int)(Sbz1 - 1));
          else
            v20 = 0;
          *(_DWORD *)(v52 + 12) = v20;
          v21 = *(_WORD *)&v15->AclRevision;
          v22 = *Sid;
          if( *(_WORD *)&v15->AclRevision == *Sid
            && !memcmp(v15, Sid, 4 * ((unsigned __int64)*(unsigned __int16 *)&v15->AclRevision >> 8) + 8) )
          {
            goto LABEL_50;
          }
          v23 = *(_DWORD *)(Sid + 1);
          if( !v23 )
            v23 = (unsigned __int16)Sid[3] - 4096;
          if( v23 )
            goto LABEL_92;
          v24 = *(_DWORD *)&v15->AclSize;
          if( !v24 )
            v24 = v15->Sbz2 - 4096;
          if( v24 )
          {
LABEL_92:
            v33 = 0;
            v30 = -1073741811;
            v34 = 0;
LABEL_45:
            result = v30;
            *(_BYTE *)(v52 + 4) = v34;
            *(_DWORD *)v52 = v8;
            *(_BYTE *)(v52 + 5) = v7;
            *(_BYTE *)(v52 + 6) = v33;
            return result;
          }
          LOWORD(v25) = HIBYTE(v22);
          v26 = HIBYTE(v21);
          if( v22 == v21
            && (v25 = memcmp(Sid, v15, 4i64 * HIBYTE(v22) + 8),
                LOBYTE(v26) = HIBYTE(v21),
                v27 = v25 == 0,
                LOBYTE(v25) = HIBYTE(v22),
                v27) )
          {
LABEL_50:
            v30 = 0;
          }
          else
          {
            if( (_BYTE)v25 )
            {
              v29 = *(_DWORD *)&Sid[2 * (unsigned __int8)v25 + 2];
              v30 = 0;
            }
            else
            {
              v30 = 0;
              v29 = 0;
            }
            if( (_BYTE)v26 && v29 < *((_DWORD *)&v15->AceCount + (unsigned int)(unsigned __int8)v26) )
            {
              v31 = 0;
LABEL_38:
              if( (*(_DWORD *)(v52 + 8) & 1) != 0
                && (v7 = 1,
                    v8 = GenericMapping->GenericRead | ~GenericMapping->GenericRead & GenericMapping->GenericExecute | 0x120000,
                    v31) )
              {
                v32 = 1;
                v49 = 1;
                v8 |= GenericMapping->GenericAll | 0x11FFFFF;
              }
              else
              {
                v32 = 0;
              }
              v33 = v7;
              if( v31 )
              {
                v34 = v49;
              }
              else
              {
                v37 = 0;
                if( (v50 & 2) == 0 )
                  v37 = v7;
                if( (v50 & 4) != 0 )
                  v33 = 0;
                v34 = 0;
                if( (v50 & 1) == 0 )
                  v34 = v32;
                if( (v50 & 2) != 0 )
                {
                  v38 = 0;
                  if( v34 )
                    v38 = GenericMapping->GenericWrite | 0x10D0000;
                  GenericRead = GenericMapping->GenericRead;
                  if( v33 )
                    v38 |= ~GenericRead & GenericMapping->GenericExecute | 0x100000;
                  v8 &= v38 | ~(GenericRead | 0x20000);
                }
                if( (v50 & 4) != 0 )
                {
                  v47 = 0;
                  if( v34 )
                    v47 = GenericMapping->GenericWrite | 0x10D0000;
                  v48 = GenericMapping->GenericRead;
                  if( v37 )
                    v47 |= v48 | 0x20000;
                  v8 &= ~(~v47 & (~v48 & GenericMapping->GenericExecute | 0x100000));
                }
                v7 = v37;
                if( (v50 & 1) != 0 )
                {
                  v40 = 0;
                  if( v33 )
                    v40 = ~GenericMapping->GenericRead & GenericMapping->GenericExecute | 0x100000;
                  if( v37 )
                    v40 |= GenericMapping->GenericRead | 0x20000;
                  v8 &= ~(~v40 & (GenericMapping->GenericWrite | 0x10D0000));
                }
              }
              if( (Token->Privileges.Enabled & 0x100000000i64) != 0 )
                v8 |= 0x80000u;
              goto LABEL_45;
            }
          }
          v31 = 1;
          goto LABEL_38;
        }
      }
    }
LABEL_47:
    v15 = (_ACL *)SepDefaultMandatorySid;
    v50 = 1;
    goto LABEL_11;
  }
  *(_DWORD *)v52 = GenericMapping->GenericAll;
  result = 0;
  *(_WORD *)(v52 + 4) = 257;
  *(_BYTE *)(v52 + 6) = 1;
  return result;
}

Referenced by:

SeAccessCheckByTypeWithAdminlessChecks
SeAccessCheckWithHintWithAdminlessChecks
SepAccessCheckAndAuditAlarmWithAdminlessChecks
SepCommonAccessCheckExWithAdminlessChecks