SeAccessCheckWithHintWithAdminlessChecks

BOOL __fastcall SeAccessCheckWithHintWithAdminlessChecks(
        UINT64 *SecurityDescriptor,
        CHAR a2,
        INT64 a3,
        CHAR a4,
        UINT64 a5,
        INT64 a6,
        PRIVILEGE_SET **a7,
        INT64 *a8,
        CHAR a9,
        UINT64 *a10,
        INT64 *a11,
        CHAR a12){
  INT64 *v12; 
  UINT64 *Permissive; 
  unsigned int v14; 
  INT64 *v16; 
  int v18; 
  __int16 v19; 
  unsigned int v20; 
  char *v21; 
  char *v22; 
  unsigned int v23; 
  int v24; 
  __int64 v25; 
  int *v26; 
  char v27; 
  char v28; 
  CHAR v29; 
  int *v30; 
  char v31; 
  unsigned __int8 *v32; 
  unsigned int *v33; 
  int v34; 
  __int64 v35; 
  unsigned int v36; 
  unsigned __int64 v37; 
  __int64 v38; 
  int v39; 
  unsigned __int64 v40; 
  int v41; 
  __int64 v42; 
  __int64 v43; 
  char v44; 
  __int16 v45; 
  char *v46; 
  _WORD *SeOwnerRightsSid; 
  unsigned int v48; 
  int v49; 
  unsigned int v50; 
  unsigned int v51; 
  SECURITY_SUBJECT_CONTEXT *v52; 
  void *ClientToken; 
  void *PrimaryToken; 
  RTL_DYNAMIC_HASH_TABLE_ENTRY *v55; 
  char v56; 
  int *v57; 
  unsigned int *v58; 
  char v59; 
  char v60; 
  PVOID v61; 
  __int64 v62; 
  __int64 v63; 
  __int64 v64; 
  unsigned __int8 *v65; 
  unsigned int v66; 
  int v67; 
  unsigned int v68; 
  __int64 v69; 
  unsigned __int8 *v70; 
  unsigned __int64 v71; 
  unsigned int v72; 
  UINT64 v73; 
  int v74; 
  void *v75; 
  void *v76; 
  bool v77; 
  VOID *v78; 
  UINT64 v79; 
  __int16 v80; 
  __int64 v81; 
  ACL *v82; 
  void *v83; 
  NTSTATUS Cap; 
  RTL_DYNAMIC_HASH_TABLE_ENTRY *v85; 
  __int64 v86; 
  unsigned int v87; 
  unsigned int v88; 
  unsigned int v89; 
  RTL_DYNAMIC_HASH_TABLE_ENTRY *v90; 
  PVOID v91; 
  int v92; 
  int v93; 
  _QWORD *v94; 
  __int64 v95; 
  __int64 v96; 
  __int64 v97; 
  __int64 v98; 
  int v99; 
  int v100; 
  int v101; 
  _QWORD *v102; 
  __int64 v103; 
  __int64 v104; 
  __int64 v105; 
  __int64 v106; 
  NTSTATUS v107; 
  int v108; 
  unsigned int v109; 
  unsigned int v110; 
  volatile INT64 *Blink; 
  volatile INT64 *v112; 
  int v113; 
  int v114; 
  int v115; 
  volatile INT64 *v116; 
  unsigned __int8 v118; 
  CHAR v119; 
  char v120; 
  UINT8 pbDominate; 
  UINT8 v122; 
  char v123; 
  unsigned int v124; 
  unsigned int v125; 
  char v126; 
  int v127; 
  INT64 *v128; 
  RTL_DYNAMIC_HASH_TABLE_ENTRY *v129; 
  unsigned int *v130; 
  int v131; 
  PVOID P; 
  int v133; 
  int v134; 
  RTL_DYNAMIC_HASH_TABLE_ENTRY *v135; 
  unsigned int v136; 
  int v137; 
  PSECURITY_SUBJECT_CONTEXT SubjectContext; 
  int v139; 
  UINT8 v140[8]; 
  ACL *Sacl; 
  _WORD *v142; 
  __int128 v143; 
  int *v144; 
  int v145; 
  __int64 v146; 
  LUID **v147; 
  __int128 SecurityDescriptora[2]; 
  __int64 v149; 
  _OWORD v150[2]; 
  v12 = a11;
  Permissive = SecurityDescriptor;
  v14 = a5;
  *(_QWORD *)v140 = SecurityDescriptor;
  *(_QWORD *)&v150[1] = 0i64;
  LODWORD(v16) = (unsigned __int8)a4;
  DWORD2(v150[1]) = 0;
  v149 = 0i64;
  v120 = 0;
  v18 = -1;
  v145 = -1;
  SubjectContext = (PSECURITY_SUBJECT_CONTEXT)a3;
  v119 = a4;
  v124 = a6;
  v128 = a11;
  *(_DWORD *)a10 = 0;
  v130 = (unsigned int *)a10;
  v147 = (LUID **)a7;
  v144 = (int *)a8;
  v118 = 0;
  Sacl = 0i64;
  v135 = 0i64;
  v125 = 0;
  P = 0i64;
  v133 = 0;
  *(_DWORD *)a11 = -1073741790;
  v136 = 0;
  v139 = -1073741790;
  v137 = a2 & 8;
  v143 = 0i64;
  v150[0] = 0i64;
  memset(SecurityDescriptora, 0, sizeof(SecurityDescriptora));
  if( a7 )
    *a7 = 0i64;
  if( !a9 )
  {
    if( (a5 & 0x2000000) != 0 )
      LODWORD(v16) = a6 | a5 & 0xFDFFFFFF | *((_DWORD *)a8 + 3);
    else
      LODWORD(v16) = a6 | a5;
    *(_DWORD *)a10 = (_DWORD)v16;
    LOBYTE(v16) = 1;
    *(_DWORD *)a11 = 0;
    return(int)v16;
  }
  if( !SecurityDescriptor )
    goto LABEL_308;
  if( *(_QWORD *)a3 && *(int *)(a3 + 8) < 2 )
  {
    *(_DWORD *)a11 = -1073741659;
    LOBYTE(v16) = 0;
    return(int)v16;
  }
  if( (_DWORD)a5 )
  {
    if( !a4 )
      SeLockSubjectContext((_SECURITY_SUBJECT_CONTEXT *)a3);
    v19 = *((_WORD *)Permissive + 1);
    v20 = 0;
    pbDominate = 0;
    v122 = 0;
    while( (v19 & 0x10) != 0 )
    {
      if( v19 < 0 )
      {
        v63 = *((unsigned int *)Permissive + 3);
        if( !(_DWORD)v63 )
          break;
        v21 = (char *)Permissive + v63;
      }
      else
      {
        v21 = (char *)Permissive[3];
      }
      if( !v21 )
        break;
      v22 = v21 + 8;
      v23 = 0;
      if( !*((_WORD *)v21 + 2) )
        break;
      while( v23 < v20 || *v22 != 20 )
      {
        ++v23;
        v22 += *((unsigned __int16 *)v22 + 1);
        if( v23 >= *((unsigned __int16 *)v21 + 2) )
          goto LABEL_18;
      }
      v20 = v23;
      if( (v22[1] & 8) == 0 )
      {
        if( v22 )
        {
          v74 = *((_DWORD *)v22 + 1);
          v75 = v22 + 8;
          if( v22 == (char *)-8i64 )
          {
            v12 = v128;
          }
          else
          {
            if( !*(_QWORD *)a3 )
              goto LABEL_178;
            v76 = *(void **)(*(_QWORD *)a3 + 1104i64);
            LODWORD(v16) = RtlSidDominatesForTrust(*(PVOID *)(*(_QWORD *)(a3 + 16) + 1104i64), v76, &v122);
            if( (int)v16 >= 0 )
            {
              if( !v122 )
LABEL_178:
                v76 = *(void **)(*(_QWORD *)(a3 + 16) + 1104i64);
              LODWORD(v16) = RtlSidDominatesForTrust(v76, v75, &pbDominate);
              if( (int)v16 >= 0 )
              {
                v18 = v74 | 0x1000000;
                if( pbDominate )
                  v18 = -1;
              }
            }
            v12 = v128;
            *(_DWORD *)v128 = (_DWORD)v16;
            if( (int)v16 < 0 )
            {
LABEL_183:
              if( v119 )
                goto LABEL_156;
              goto LABEL_155;
            }
          }
        }
LABEL_20:
        v24 = a5 & 0xFDFFFFFF;
        LODWORD(v16) = v18 & a5 & 0xFDFFFFFF;
        if( (_DWORD)v16 != (a5 & 0xFDFFFFFF) )
        {
          v77 = v137 == 0;
          *(_DWORD *)v12 = -1073741790;
          if( v77 )
          {
            v78 = *(VOID **)a3;
            if( !*(_QWORD *)a3 )
              v78 = *(VOID **)(a3 + 16);
            LODWORD(v79) = SepLocateTokenTrustLevel((SECURITY_SUBJECT_CONTEXT *)a3);
            SeLogAccessFailure(v78, 0i64, 0i64, v79, (UINT8)Permissive);
          }
          if( v119 )
            goto LABEL_156;
          goto LABEL_155;
        }
        *(_DWORD *)v12 = 0;
        v25 = *(_QWORD *)a3;
        if( !*(_QWORD *)a3 )
          v25 = *(_QWORD *)(a3 + 16);
        if( (a2 & 4) == 0 )
        {
          LODWORD(v16) = SepFilterCheck((__int64)Permissive, (__int64 *)&P, v25, 0, (char *)&v145);
          v26 = (int *)v128;
          *(_DWORD *)v128 = (_DWORD)v16;
          if( (int)v16 < 0 )
            goto LABEL_183;
          LODWORD(v16) = v145 & v24;
          if( (v145 & v24) == v24 )
          {
            *v26 = 0;
            goto LABEL_27;
          }
          v77 = v137 == 0;
          *v26 = -1073741790;
          if( v77 )
            SeLogAccessFailure((VOID *)v25, 0i64, 0i64, 0i64, (UINT8)Permissive);
          if( v119 )
            goto LABEL_156;
LABEL_155:
          SeUnlockSubjectContext((SECURITY_SUBJECT_CONTEXT *)a3);
          goto LABEL_156;
        }
        v26 = (int *)v128;
LABEL_27:
        if( (a2 & 2) == 0 )
        {
          v27 = 0;
          goto LABEL_29;
        }
        v27 = 1;
        if( (*(_DWORD *)(v25 + 200) & 0x2000) != 0 )
          v28 = 1;
        else
LABEL_29:
          v28 = 0;
        v126 = v28;
        v123 = 0;
        if( !SepAllowAccessUponLogoff && (*(_DWORD *)(v25 + 200) & 0x20) == 0 )
        {
          v16 = *(INT64 **)(v25 + 216);
          if( v16 )
          {
            LODWORD(v16) = *((_DWORD *)v16 + 8);
            if( ((unsigned __int8)v16 & 0x20) != 0 )
            {
              v77 = v119 == 0;
              *v130 = 0;
              *v26 = -1073741790;
              if( !v77 )
                goto LABEL_156;
              goto LABEL_155;
            }
          }
        }
        v29 = a12;
        if( !v28 )
        {
          LODWORD(v16) = SepMandatoryIntegrityCheck(v144, (__int64)Permissive, v27, v25, 0, a12, (__int64)&v143);
          v30 = (int *)v128;
          *(_DWORD *)v128 = (_DWORD)v16;
          if( (int)v16 < 0 )
            goto LABEL_183;
          if( DWORD2(v143) && (LODWORD(v16) = v24 & v143, (v24 & (unsigned int)v143) != v24) )
          {
            *v30 = -1073741790;
            if( (*(_DWORD *)(v25 + 200) & 0x4000) == 0 || HIDWORD(v143) > 0x2000 )
            {
              if( v119 )
                goto LABEL_156;
              goto LABEL_155;
            }
          }
          else
          {
            *v30 = 0;
            if( (a5 & 0x2000000) == 0 || (*(_DWORD *)(v25 + 200) & 0x4000) == 0 || HIDWORD(v143) > 0x2000 )
            {
LABEL_36:
              v29 = a12;
              goto LABEL_37;
            }
          }
          v123 = 1;
          goto LABEL_36;
        }
LABEL_37:
        if( !SepRmEnforceCap )
        {
LABEL_38:
          v31 = 0;
          goto LABEL_39;
        }
        v80 = *((_WORD *)Permissive + 1);
        if( (v80 & 0x10) != 0 && KeGetCurrentIrql() < 2u )
        {
          if( v80 >= 0 )
          {
            v82 = (ACL *)Permissive[3];
          }
          else
          {
            v81 = *((unsigned int *)Permissive + 3);
            if( !(_DWORD)v81 )
            {
              Sacl = 0i64;
              goto LABEL_215;
            }
            v82 = (ACL *)((char *)Permissive + v81);
          }
          Sacl = v82;
          if( v82 )
          {
            LODWORD(v83) = SepGetScopedPolicySid(v82);
            if( v83 )
            {
              Cap = SepRmReferenceFindCap(v83, &v135);
              v85 = v135;
              v29 = a12;
              v31 = 1;
              if( Cap < 0 )
                v85 = (RTL_DYNAMIC_HASH_TABLE_ENTRY *)SepRmDefaultCap;
              v135 = v85;
              v120 = 1;
LABEL_39:
              if( (a2 & 1) != 0 )
              {
                v122 = 1;
                if( (a5 & 0x2060000) == 0 && !v31 )
                {
                  v44 = 0;
                  goto LABEL_70;
                }
              }
              else
              {
                v122 = 0;
              }
              if( *((__int16 *)Permissive + 1) < 0 )
              {
                v62 = *((unsigned int *)Permissive + 1);
                if( (_DWORD)v62 )
                  v32 = (unsigned __int8 *)Permissive + v62;
                else
                  v32 = 0i64;
              }
              else
              {
                v32 = (unsigned __int8 *)Permissive[1];
              }
              v33 = (unsigned int *)(v25 + 232);
              if( v29 && v32 && RtlEqualSid(SeAliasAdminsSid, v32) )
              {
                v44 = 0;
                goto LABEL_56;
              }
              if( v25 == -232 || !v32 )
                goto LABEL_68;
              v34 = v32[1];
              v35 = *(unsigned __int16 *)v32;
              v146 = v35;
              v36 = 4 * v34 + 8;
              v131 = v36;
              v37 = (unsigned __int64)v32[4 * ((unsigned __int64)(unsigned int)v35 >> 8) + 4] >> 4;
              v38 = v32[4 * ((unsigned __int64)(unsigned int)v35 >> 8) + 4] & 0xF;
              LOBYTE(v39) = 0;
              pbDominate = 0;
              v40 = *(_QWORD *)&v33[2 * v38 + 4] & *(_QWORD *)&v33[2 * v37 + 36];
              if( !v40 )
                goto LABEL_66;
LABEL_47:
              LOBYTE(v41) = v40;
              v127 = (unsigned __int8)v40;
              if( !(_BYTE)v40 )
                goto LABEL_135;
              v42 = *(_QWORD *)(v25 + 240);
              v39 = (unsigned __int8)v39;
              v142 = (_WORD *)v42;
              v134 = (unsigned __int8)v39;
              while( 1 )
              {
                LODWORD(v129) = *((unsigned __int8 *)SidHashByteToIndexLookupTable + (unsigned __int8)v41);
                v43 = v42 + 16i64 * (unsigned int)(v39 + (_DWORD)v129);
                if( **(_WORD **)v43 == (_WORD)v35 )
                {
                  if( !memcmp(v32, *(PVOID *)v43, v36) )
                  {
LABEL_51:
                    if( v43 == *(_QWORD *)(v25 + 240) && (*(_DWORD *)(v43 + 8) & 0x10) == 0
                      || (*(_DWORD *)(v43 + 8) & 4) != 0 )
                    {
                      if( *(_DWORD *)(v25 + 128) )
                        v44 = SepSidInTokenSidHash((SID_AND_ATTRIBUTES_HASH *)(v25 + 504), 0i64, v32, 0, 1u, 0);
                      else
                        v44 = 1;
                    }
                    else
                    {
                      v44 = 0;
                    }
                    Permissive = *(UINT64 **)v140;
LABEL_56:
                    if( !v44 || (a5 & 0x2060000) == 0 )
                      goto LABEL_69;
                    if( v122 )
                      goto LABEL_62;
                    v45 = *((_WORD *)Permissive + 1);
                    if( (v45 & 4) != 0 )
                    {
                      if( v45 >= 0 )
                      {
                        v46 = (char *)Permissive[4];
                      }
                      else
                      {
                        v64 = *((unsigned int *)Permissive + 4);
                        v46 = (_DWORD)v64 ? (char *)Permissive + v64 : 0i64;
                      }
                    }
                    else
                    {
                      v46 = 0i64;
                    }
                    SeOwnerRightsSid = SeExports->SeOwnerRightsSid;
                    v142 = SeOwnerRightsSid;
                    if( !v46
                      || (v65 = (unsigned __int8 *)(v46 + 8),
                          LODWORD(v129) = *((unsigned __int16 *)v46 + 2),
                          v66 = 0,
                          !(_DWORD)v129) )
                    {
LABEL_62:
                      v31 = v120;
                      v48 = 393216;
                      if( (a5 & 0x2000000) == 0 )
                        v48 = a5 & 0x60000;
                      v14 = a5 & 0xFFF9FFFF;
                      v49 = v124 | v48;
                      v124 = v49;
                      v50 = v49;
                      if( !v120 )
                      {
                        v44 = 0;
                        v124 = v49;
                      }
                      goto LABEL_71;
                    }
                    v67 = 104928;
                    while( 2 )
                    {
                      if( (v65[1] & 8) != 0 )
                        goto LABEL_117;
                      v68 = *v65;
                      if( (unsigned __int8)v68 <= 0x10u && _bittest(&v67, v68) )
                      {
                        v69 = 16i64 * (*((_DWORD *)v65 + 2) & 1) + ((8i64 * (*((_DWORD *)v65 + 2) & 2)) | 0xC);
                      }
                      else
                      {
                        if( (_BYTE)v68 != 4 )
                        {
                          if( (unsigned __int8)v68 < 0xBu || (unsigned __int8)(v68 - 13) <= 1u )
                          {
                            v69 = 8i64;
                            break;
                          }
LABEL_117:
                          ++v66;
                          v65 += *((unsigned __int16 *)v65 + 1);
                          if( v66 >= (unsigned int)v129 )
                            goto LABEL_62;
                          continue;
                        }
                        v69 = 12i64;
                      }
                      break;
                    }
                    v70 = &v65[v69];
                    if( v70 )
                    {
                      v71 = *(unsigned __int16 *)v70;
                      if( (_WORD)v71 == *SeOwnerRightsSid )
                      {
                        if( !memcmp(v70, SeOwnerRightsSid, 4 * (v71 >> 8) + 8) )
                          goto LABEL_69;
                        SeOwnerRightsSid = v142;
                        v67 = 104928;
                      }
                    }
                    goto LABEL_117;
                  }
                  LOWORD(v35) = v146;
                  v36 = v131;
                  v39 = v134;
                }
                v41 = (unsigned __int8)v127 ^ (1 << (char)v129);
                v42 = (__int64)v142;
                v127 = v41;
                if( !(_BYTE)v41 )
                {
                  LOBYTE(v39) = pbDominate;
LABEL_135:
                  LOBYTE(v39) = v39 + 8;
                  v40 >>= 8;
                  pbDominate = v39;
                  if( !v40 )
                  {
LABEL_66:
                    v51 = *v33;
                    if( *v33 > 0x40 )
                    {
                      v86 = *(_QWORD *)(v25 + 240);
                      v87 = 64;
                      v127 = 64;
                      v142 = (_WORD *)v86;
                      do
                      {
                        v43 = v86 + 16i64 * v87;
                        if( **(_WORD **)v43 == (_WORD)v35 )
                        {
                          if( !memcmp(v32, *(PVOID *)v43, v36) )
                            goto LABEL_51;
                          LOWORD(v35) = v146;
                          v36 = v131;
                          v87 = v127;
                          v86 = (__int64)v142;
                        }
                        v127 = ++v87;
                      }
                      while( v87 < v51 );
                    }
                    Permissive = *(UINT64 **)v140;
LABEL_68:
                    v44 = 0;
LABEL_69:
                    v31 = v120;
LABEL_70:
                    v48 = v125;
                    v50 = v124;
LABEL_71:
                    if( !v14 && !v31 && ((*(_DWORD *)(v25 + 200) & 0x2000) != 0 || !v48) )
                    {
                      if( !v119 )
                        SeUnlockSubjectContext(SubjectContext);
                      v16 = v128;
                      *v130 = v50;
                      *(_DWORD *)v16 = 0;
                      LOBYTE(v16) = 1;
                      return(int)v16;
                    }
                    v52 = SubjectContext;
                    ClientToken = SubjectContext->ClientToken;
                    PrimaryToken = SubjectContext->PrimaryToken;
                    LODWORD(v150[0]) = v48;
                    memset((char *)v150 + 4, 0, 24);
                    LODWORD(v16) = SepAccessCheck(
                                     (__int64)Permissive,
                                     0i64,
                                     (__int64)PrimaryToken,
                                     (__int64)ClientToken,
                                     v14,
                                     0i64,
                                     0,
                                     v144,
                                     v50,
                                     a9,
                                     v130,
                                     v147,
                                     (int *)v128,
                                     0,
                                     v44,
                                     (int *)v150,
                                     (__int64 *)&P,
                                     (char *)&v118,
                                     0i64,
                                     a12);
                    v55 = v135;
                    v56 = (char)v16;
                    v129 = v135;
                    if( !SepRmEnforceCap || (LODWORD(v16) = *(_DWORD *)v128, v131 = (int)v16, (int)v16 < 0) || !v120 )
                    {
                      v57 = (int *)v128;
                      v58 = v130;
                      goto LABEL_74;
                    }
                    v88 = 0;
                    pbDominate = 0;
                    LOBYTE(v127) = 0;
                    v134 = 0;
                    v89 = *v130;
                    v125 = *v130;
                    if( !HIDWORD(v135[2].Linkage.Blink) )
                      goto LABEL_288;
                    while( 2 )
                    {
                      v90 = (RTL_DYNAMIC_HASH_TABLE_ENTRY *)*(&v55[2].Signature + v88);
                      v135 = v90;
                      if( v90[1].Linkage.Flink )
                      {
                        v91 = P;
                        if( !P )
                        {
                          v92 = AuthzBasepInitializeResourceClaimsFromSacl((__int64)Sacl, (__int64)&P);
                          v91 = P;
                          v93 = (unsigned __int8)v127;
                          if( v92 < 0 )
                            v93 = 1;
                          v127 = v93;
                        }
                        v94 = *(_QWORD **)(v25 + 1096);
                        if( v94 )
                        {
                          v95 = v94[75];
                          v96 = v94[73];
                          v97 = v94[74];
                          v98 = v94[72];
                        }
                        else
                        {
                          v95 = 0i64;
                          v96 = 0i64;
                          v97 = 0i64;
                          v98 = 0i64;
                        }
                        v99 = AuthzBasepEvaluateAceCondition(
                                v25,
                                *(_QWORD *)(v25 + 776),
                                (__int64)v91,
                                v98,
                                v97,
                                v96,
                                v95,
                                (char *)v90[1].Linkage.Flink,
                                v90->Signature,
                                1,
                                0,
                                &v133);
                        v100 = v133;
                        v101 = v99;
                        if( v133 != 1 )
                        {
                          if( v99 < 0 )
                          {
                            if( !v119 )
                              SeUnlockSubjectContext(SubjectContext);
                            Blink = (volatile INT64 *)v129[1].Linkage.Blink;
                            if( Blink )
LABEL_277:
                              SepRmDereferenceCapTable(Blink);
LABEL_278:
                            *v130 = 0;
                            *(_DWORD *)v128 = v101;
LABEL_280:
                            SepFreeResourceInfo(P);
                            goto LABEL_156;
                          }
                          if( (*(_DWORD *)(v25 + 200) & 0x10) != 0 )
                          {
                            v102 = *(_QWORD **)(v25 + 1096);
                            if( v102 )
                            {
                              v103 = v102[75];
                              v104 = v102[73];
                              v105 = v102[74];
                              v106 = v102[72];
                            }
                            else
                            {
                              v103 = 0i64;
                              v104 = 0i64;
                              v105 = 0i64;
                              v106 = 0i64;
                            }
                            v101 = AuthzBasepEvaluateAceCondition(
                                     v25,
                                     *(_QWORD *)(v25 + 776),
                                     (__int64)P,
                                     v106,
                                     v105,
                                     v104,
                                     v103,
                                     (char *)v135[1].Linkage.Flink,
                                     v135->Signature,
                                     1,
                                     1,
                                     &v133);
                            if( v101 < 0 )
                            {
                              if( !v119 )
                                SeUnlockSubjectContext(SubjectContext);
                              Blink = (volatile INT64 *)v129[1].Linkage.Blink;
                              if( Blink )
                                goto LABEL_277;
                              goto LABEL_278;
                            }
                            v100 = v133;
                          }
                          if( !(_BYTE)v127 && v100 != 1 )
                          {
                            LODWORD(v16) = v131;
                            v52 = SubjectContext;
LABEL_272:
                            v55 = v129;
                            v88 = v134 + 1;
                            v134 = v88;
                            if( v88 >= HIDWORD(v129[2].Linkage.Blink) )
                              goto LABEL_287;
                            continue;
                          }
                        }
                        v90 = v135;
                      }
                      break;
                    }
                    v107 = SepBuildCapeSecurityDescriptor(SecurityDescriptora, v90[1].Linkage.Blink, Sacl);
                    if( v107 < 0 )
                    {
                      if( !v119 )
                        SeUnlockSubjectContext(SubjectContext);
                      v112 = (volatile INT64 *)v129[1].Linkage.Blink;
                      if( v112 )
                        SepRmDereferenceCapTable(v112);
                      *v130 = 0;
                      *(_DWORD *)v128 = v107;
                      goto LABEL_280;
                    }
                    v108 = v14;
                    if( ((__int64)v90[2].Linkage.Flink & 1) != 0 )
                    {
                      v109 = 0;
                      if( (v14 & 0x2000000) == 0 )
                        v108 = v124 | v14;
                    }
                    else
                    {
                      v109 = v124;
                    }
                    v52 = SubjectContext;
                    v56 = SepAccessCheck(
                            (__int64)SecurityDescriptora,
                            0i64,
                            (__int64)SubjectContext->PrimaryToken,
                            (__int64)SubjectContext->ClientToken,
                            v108,
                            0i64,
                            0,
                            v144,
                            v109,
                            a9,
                            &v136,
                            0i64,
                            &v139,
                            0,
                            v44,
                            (int *)v150,
                            (__int64 *)&P,
                            (char *)&v118,
                            0i64,
                            a12);
                    if( pbDominate )
                      v110 = v136 & v125;
                    else
                      v110 = v136;
                    v125 = v110;
                    if( !v110 )
                    {
                      LODWORD(v16) = -1073741790;
LABEL_286:
                      v55 = v129;
LABEL_287:
                      v89 = v125;
LABEL_288:
                      v57 = (int *)v128;
                      v58 = v130;
                      *(_DWORD *)v128 = (_DWORD)v16;
                      LODWORD(v16) = v118;
                      *v58 &= v89;
                      if( *v57 < 0 )
                        LODWORD(v16) = 0;
                      v118 = (unsigned __int8)v16;
LABEL_74:
                      if( !v126 && (v14 & 0x2000000) != 0 )
                      {
                        if( (!v123 || !*(_WORD *)((char *)&v150[1] + 5))
                          && DWORD2(v143)
                          && (!BYTE4(v143) || !BYTE5(v143) || !BYTE6(v143)) )
                        {
                          LODWORD(v16) = *v58;
                          v72 = *v58 & v143;
                          if( v72 != *v58 )
                          {
                            *v58 = v72;
                            if( v72 )
                            {
                              *v57 = 0;
                              v118 = 1;
                            }
                            else
                            {
                              *v57 = -1073741790;
LABEL_166:
                              v118 = 0;
                            }
                          }
                        }
                      }
                      else if( v123 && !*(_WORD *)((char *)&v150[1] + 5) )
                      {
                        *v57 = -1073741790;
                        *v58 = 0;
                        goto LABEL_166;
                      }
                      v59 = 0;
                      if( (v14 & 0x2000000) != 0 )
                      {
                        if( v18 != -1 )
                        {
                          v113 = v18 & *v58;
                          if( v113 != *v58 )
                          {
                            *v58 = v113;
                            v59 = 1;
                            if( v113 )
                            {
                              *v57 = 0;
                              v118 = 1;
                            }
                            else
                            {
                              *v57 = -1073741790;
                              v118 = 0;
                            }
                          }
                        }
                        v60 = 0;
                        LODWORD(v16) = -1;
                        if( v145 != -1 )
                        {
                          LODWORD(v16) = *v58;
                          v114 = v145 & *v58;
                          if( v114 != (_DWORD)v16 )
                          {
                            LODWORD(v16) = (_DWORD)v130;
                            v60 = 1;
                            *v130 = v114;
                            if( v114 )
                            {
                              *v57 = 0;
                              v118 = 1;
                            }
                            else
                            {
                              *v57 = -1073741790;
                              v118 = 0;
                            }
                          }
                        }
                      }
                      else
                      {
                        v60 = 0;
                      }
                      if( v25 )
                      {
                        if( (v59
                           || v60
                           || !HIDWORD(v150[0])
                           && (*(_DWORD *)(v25 + 200) & 0x4000) != 0
                           && (*v57 < 0 || BYTE7(v150[1])))
                          && !v137 )
                        {
                          LODWORD(v73) = SepLocateTokenTrustLevel(v52);
                          SeLogAccessFailure((VOID *)v25, 0i64, 0i64, v73, (UINT8)Permissive);
                          v55 = v129;
                          v57 = (int *)v128;
                        }
                        if( *v57 < 0 && !HIDWORD(v150[0]) && (*(_DWORD *)(v25 + 200) & 0x4000) != 0 )
                        {
                          if( BYTE8(v150[1]) )
                          {
                            v115 = v14 & ~(DWORD1(v150[0]) | DWORD2(v150[0]) | 0x2000000);
                            LODWORD(v16) = v115 & v150[1];
                            if( (v115 & v150[1]) == v115 )
                            {
                              LODWORD(v16) = SepLogLpacAccessFailure();
                              v55 = v129;
                            }
                          }
                        }
                      }
                      if( v120 )
                      {
                        v116 = (volatile INT64 *)v55[1].Linkage.Blink;
                        if( v116 )
                          SepRmDereferenceCapTable(v116);
                      }
                      if( !v119 )
                        SeUnlockSubjectContext(v52);
                      v61 = P;
                      if( P )
                      {
                        AuthzBasepFreeSecurityAttributesList(P);
                        ExFreePoolWithTag(v61, 0);
                      }
                      if( v56 && v118 )
                      {
                        LOBYTE(v16) = 1;
                        return(int)v16;
                      }
LABEL_156:
                      LOBYTE(v16) = 0;
                      return(int)v16;
                    }
                    LODWORD(v16) = v139;
                    v131 = v139;
                    pbDominate = 1;
                    if( v139 < 0 )
                      goto LABEL_286;
                    goto LABEL_272;
                  }
                  goto LABEL_47;
                }
              }
            }
          }
        }
LABEL_215:
        v29 = a12;
        goto LABEL_38;
      }
LABEL_19:
      ++v20;
      if( !v22 )
        goto LABEL_20;
    }
LABEL_18:
    v22 = 0i64;
    goto LABEL_19;
  }
  if( !(_DWORD)a6 )
  {
LABEL_308:
    *(_DWORD *)a11 = -1073741790;
    goto LABEL_156;
  }
  *(_DWORD *)a10 = a6;
  *(_DWORD *)a11 = 0;
  if( a7 )
    *a7 = 0i64;
  LOBYTE(v16) = 1;
  return(int)v16;
}

Referenced by:

SeAccessCheck
SeAccessCheckWithHint