SepMandatoryIntegrityCheck

__int64 __fastcall SepMandatoryIntegrityCheck(
        int *a1,
        __int64 CurrentIrql,
        char a3,
        __int64 a4,
        char a5,
        char a6,
        __int64 a7){
  int v7; 
  char v8; 
  int v9; 
  __int16 v11; 
  __int64 v12; 
  __int64 v13; 
  unsigned int v14; 
  int v15; 
  unsigned __int16 *v16; 
  __int64 v17; 
  _WORD **v18; 
  _WORD *v19; 
  int v20; 
  int v21; 
  unsigned __int16 v22; 
  unsigned __int16 v23; 
  int v24; 
  int v25; 
  NTSTATUS v26; 
  __int16 v27; 
  bool v28; 
  unsigned int v30; 
  unsigned int v31; 
  char v32; 
  char v33; 
  char v34; 
  char v35; 
  __int64 result; 
  __int64 v37; 
  char v38; 
  int v39; 
  int v40; 
  int v41; 
  _ETHREAD *CurrentThread; 
  _WORD *v43; 
  __int16 v44; 
  unsigned __int8 v45; 
  _ETHREAD *v46; 
  CHAR *OwnerEntryForLegacyShim; 
  int v48; 
  int v49; 
  char v50; 
  char v51; 
  v7 = *(_DWORD *)(a4 + 212);
  v8 = 0;
  v9 = 0;
  v50 = 0;
  *(_DWORD *)(a7 + 8) = v7;
  if( (v7 & 0xFFFFFFFD) != 0 )
  {
    if( a3 )
      goto LABEL_47;
    v11 = *(_WORD *)(CurrentIrql + 2);
    if( (v11 & 0x10) == 0 )
      goto LABEL_47;
    if( v11 < 0 )
    {
      v37 = *(unsigned int *)(CurrentIrql + 12);
      if( !(_DWORD)v37 )
        goto LABEL_47;
      v12 = CurrentIrql + v37;
    }
    else
    {
      v12 = *(_QWORD *)(CurrentIrql + 24);
    }
    if( v12 )
    {
      v13 = v12 + 8;
      v14 = 0;
      if( *(_WORD *)(v12 + 4) )
      {
        while( *(_BYTE *)v13 != 17 )
        {
          ++v14;
          v13 += *(unsigned __int16 *)(v13 + 2);
          if( v14 >= *(unsigned __int16 *)(v12 + 4) )
            goto LABEL_47;
        }
        if( (*(_BYTE *)(v13 + 1) & 8) == 0 )
        {
          v15 = *(_DWORD *)(v13 + 4);
          v16 = (unsigned __int16 *)(v13 + 8);
          v51 = v15;
LABEL_11:
          if( a5 )
          {
            CurrentThread = (_ETHREAD *)KeGetCurrentThread();
            --*((_WORD *)CurrentThread + 242);
            v43 = *(_WORD **)(a4 + 48);
            if( (v43[13] & 0x41) == 1 )
              KeBugCheckEx(0x1C6u, 0xFui64, (ULONG_PTR)v43, 0i64, 0i64);
            v44 = v43[13] & 1;
            if( v44 )
            {
              v45 = KeGetCurrentIrql();
              v46 = (_ETHREAD *)KeGetCurrentThread();
              if( v45 > 1u )
                KeBugCheckEx(0x1C6u, 0i64, v45, 1ui64, 0i64);
              if( (*((_BYTE *)v46 + 192) & 2) != 0 )
                KeBugCheckEx(0x1C6u, 6ui64, 0i64, 0i64, 0i64);
              if( !v45 && (*((_DWORD *)v46 + 29) & 0x400) == 0 && !*((_DWORD *)v46 + 121) )
                KeBugCheckEx(0x1C6u, 7ui64, 0i64, 0i64, 0i64);
            }
            if( v44 )
            {
              OwnerEntryForLegacyShim = ExpAllocateOwnerEntryForLegacyShim();
              if( !(unsigned __int8)ExAcquireFastResourceShared(v43, OwnerEntryForLegacyShim) )
                ExFreePoolWithTag(OwnerEntryForLegacyShim, 0);
            }
            else
            {
              ExpAcquireResourceSharedLite(*(PVOID *)(a4 + 48), 1);
            }
          }
          v17 = *(unsigned int *)(a4 + 208);
          if( (_DWORD)v17 == -1 || (v18 = (_WORD **)(*(_QWORD *)(a4 + 152) + 16 * v17)) == 0i64 )
            v19 = SeUntrustedMandatorySid;
          else
            v19 = *v18;
          if( a6 )
            v19 = SepDefaultMandatorySid;
          if( a5 )
          {
            ExReleaseResourceLite(*(PERESOURCE *)(a4 + 48));
            KeLeaveCriticalRegion();
          }
          v20 = *((unsigned __int8 *)v16 + 1);
          if( (_BYTE)v20 )
            v21 = *(_DWORD *)&v16[2 * (v20 - 1) + 4];
          else
            v21 = 0;
          *(_DWORD *)(a7 + 12) = v21;
          v22 = *v16;
          v23 = *v19;
          if( *v16 == *v19 && !memcmp(v16, v19, 4 * ((unsigned __int64)*v16 >> 8) + 8) )
            goto LABEL_50;
          v24 = *(_DWORD *)(v19 + 1);
          if( !v24 )
            v24 = (unsigned __int16)v19[3] - 4096;
          if( v24 )
            goto LABEL_92;
          v25 = *(_DWORD *)(v16 + 1);
          if( !v25 )
            v25 = v16[3] - 4096;
          if( v25 )
          {
LABEL_92:
            v34 = 0;
            v31 = -1073741811;
            v35 = 0;
LABEL_45:
            result = v31;
            *(_BYTE *)(a7 + 4) = v35;
            *(_DWORD *)a7 = v9;
            *(_BYTE *)(a7 + 5) = v8;
            *(_BYTE *)(a7 + 6) = v34;
            return result;
          }
          LOWORD(v26) = HIBYTE(v23);
          v27 = HIBYTE(v22);
          if( v23 == v22
            && (v26 = memcmp(v19, v16, 4i64 * HIBYTE(v23) + 8),
                LOBYTE(v27) = HIBYTE(v22),
                v28 = v26 == 0,
                LOBYTE(v26) = HIBYTE(v23),
                v28) )
          {
LABEL_50:
            v31 = 0;
          }
          else
          {
            if( (_BYTE)v26 )
            {
              v30 = *(_DWORD *)&v19[2 * (unsigned __int8)v26 + 2];
              v31 = 0;
            }
            else
            {
              v31 = 0;
              v30 = 0;
            }
            if( (_BYTE)v27 && v30 < *(_DWORD *)&v16[2 * (unsigned __int8)v27 + 2] )
            {
              v32 = 0;
LABEL_38:
              if( (*(_DWORD *)(a7 + 8) & 1) != 0 && (v8 = 1, v9 = *a1 | ~*a1 & a1[2] | 0x120000, v32) )
              {
                v33 = 1;
                v50 = 1;
                v9 |= a1[3] | 0x11FFFFF;
              }
              else
              {
                v33 = 0;
              }
              v34 = v8;
              if( v32 )
              {
                v35 = v50;
              }
              else
              {
                v38 = 0;
                if( (v51 & 2) == 0 )
                  v38 = v8;
                if( (v51 & 4) != 0 )
                  v34 = 0;
                v35 = 0;
                if( (v51 & 1) == 0 )
                  v35 = v33;
                if( (v51 & 2) != 0 )
                {
                  v39 = 0;
                  if( v35 )
                    v39 = a1[1] | 0x10D0000;
                  v40 = *a1;
                  if( v34 )
                    v39 |= ~v40 & a1[2] | 0x100000;
                  v9 &= v39 | ~(v40 | 0x20000);
                }
                if( (v51 & 4) != 0 )
                {
                  v48 = 0;
                  if( v35 )
                    v48 = a1[1] | 0x10D0000;
                  v49 = *a1;
                  if( v38 )
                    v48 |= v49 | 0x20000;
                  v9 &= ~(~v48 & (~v49 & a1[2] | 0x100000));
                }
                v8 = v38;
                if( (v51 & 1) != 0 )
                {
                  v41 = 0;
                  if( v34 )
                    v41 = ~*a1 & a1[2] | 0x100000;
                  if( v38 )
                    v41 |= *a1 | 0x20000;
                  v9 &= ~(~v41 & (a1[1] | 0x10D0000));
                }
              }
              if( (*(_QWORD *)(a4 + 72) & 0x100000000i64) != 0 )
                v9 |= 0x80000u;
              goto LABEL_45;
            }
          }
          v32 = 1;
          goto LABEL_38;
        }
      }
    }
LABEL_47:
    v16 = (unsigned __int16 *)SepDefaultMandatorySid;
    v51 = 1;
    goto LABEL_11;
  }
  *(_DWORD *)a7 = a1[3];
  result = 0i64;
  *(_WORD *)(a7 + 4) = 257;
  *(_BYTE *)(a7 + 6) = 1;
  return result;
}

Referenced by:

SeAccessCheckByTypeWithAdminlessChecks
SeAccessCheckWithHintWithAdminlessChecks
SepAccessCheckAndAuditAlarmWithAdminlessChecks
SepCommonAccessCheckExWithAdminlessChecks