MiQueryAddressState

__int64 __fastcall MiQueryAddressState(
        unsigned __int64 a1,
        unsigned __int64 a2,
        unsigned __int8 a3,
        ULONG_PTR a4,
        __int64 a5,
        int *a6,
        int *a7,
        _WORD *a8,
        _QWORD *a9,
        int *a10){
  unsigned __int64 v10; 
  unsigned __int8 v11; 
  INT64 v12; 
  unsigned __int64 v13; 
  __int64 v14; 
  _MMPTE *PteBase; 
  INT64 v16; 
  unsigned __int64 v17; 
  unsigned __int64 v18; 
  __int64 v19; 
  BOOL v20; 
  _MMPTE *v21; 
  unsigned __int64 v22; 
  unsigned __int64 v23; 
  _MMPTE *PteLimit; 
  CHAR *AnyMultiplexedVm; 
  int v26; 
  unsigned int v27; 
  INT64 v28; 
  unsigned __int64 v29; 
  UINT64 v30; 
  unsigned __int64 v31; 
  __int64 v32; 
  unsigned __int64 v33; 
  int v34; 
  int v35; 
  unsigned int v36; 
  _MMPTE *Pml4eBase; 
  unsigned int v38; 
  UINT64 v39; 
  INT64 v40; 
  unsigned int v41; 
  __int64 v42; 
  ULONG_PTR v43; 
  UINT64 *v44; 
  INT64 ***LockedVadEvent; 
  INT16 **v46; 
  UINT64 v47; 
  UINT64 v48; 
  INT64 v49; 
  INT64 v50; 
  INT64 v51; 
  INT64 v52; 
  unsigned __int64 v53; 
  __int64 v54; 
  unsigned __int64 v55; 
  unsigned __int64 v56; 
  ULONG_PTR v57; 
  _QWORD *v58; 
  int v59; 
  unsigned __int64 v60; 
  unsigned __int64 v61; 
  INT64 v62; 
  unsigned __int64 v63; 
  UINT64 v64; 
  __int64 v65; 
  __int64 v66; 
  UINT64 v67; 
  __int64 v68; 
  unsigned int SessionId; 
  __int64 *SharedProtos; 
  unsigned __int64 v71; 
  unsigned __int64 v72; 
  __int16 v73; 
  __int64 v74; 
  unsigned __int64 v75; 
  unsigned __int64 v76; 
  unsigned __int64 v77; 
  char v78; 
  struct _KPRCB *CurrentPrcb; 
  bool v80; 
  __int64 v81; 
  _MMPTE *Pml4eLimit; 
  __int64 v83; 
  int v84; 
  CHAR *PageTableLockBuffer; 
  LONG *v86; 
  struct _KPRCB *v87; 
  int v88; 
  int v89; 
  __int64 v90; 
  INT64 v91; 
  ULONG_PTR v92; 
  __int16 v93; 
  unsigned int v94; 
  NTSTATUS ProtectionFromPte; 
  UINT64 LeafVa; 
  __int64 result; 
  int *v98; 
  int v99; 
  CHAR v100; 
  INT16 v102; 
  int v103; 
  int v104; 
  INT64 a1a; 
  INT64 v106; 
  INT16 v107; 
  _DWORD v108[3]; 
  ULONG_PTR BugCheckParameter3; 
  ULONG_PTR BugCheckParameter2; 
  int v111; 
  UINT64 v112; 
  unsigned int v113; 
  int v114; 
  INT64 v115; 
  unsigned int v116; 
  int a3a; 
  unsigned __int64 v118; 
  unsigned __int64 v119; 
  __int64 v120; 
  _QWORD *v121; 
  int *v122; 
  int *v123; 
  _WORD *v124; 
  __int128 v125; 
  __int64 v126; 
  int *v127; 
  INT64 v128; 
  __int16 v129; 
  _BYTE v130[14]; 
  __int64 v131; 
  CHAR *v132; 
  unsigned __int64 v133; 
  __int64 v134; 
  INT64(__fastcall *v135)(INT64); 
  __int128 *v136; 
  v10 = a1;
  v122 = a6;
  v11 = a3;
  v123 = a7;
  v124 = a8;
  v121 = a9;
  BugCheckParameter2 = a4;
  v12 = *((_QWORD *)KeGetCurrentThread() + 23) + 1664i64;
  v127 = a10;
  a1a = v12;
  v13 = a1 >> 9;
  *(_QWORD *)&v108[1] = 0i64;
  v14 = *(unsigned __int16 *)(v12 + 174);
  v115 = 0i64;
  LOWORD(v12) = **(_WORD **)(qword_140C4E388 + 8 * v14);
  *a10 = 1;
  v107 = v12;
  v102 = v12;
  PteBase = MmGetPteBase();
  v16 = (INT64)PteBase + (v13 & 0x7FFFFFFFF8i64);
  v128 = v16;
  v17 = (unsigned __int64)PteBase + ((a2 >> 9) & 0x7FFFFFFFF8i64);
  v106 = v16;
  v119 = v17;
  v116 = 0x2000;
  v18 = 0i64;
  v113 = 0;
  v114 = 0;
  v112 = 0i64;
  v19 = (_QWORD)PteBase << 25;
  v120 = (_QWORD)PteBase << 25;
  v126 = (__int64)((v17 << 25) - ((_QWORD)PteBase << 25)) >> 16;
LABEL_2:
  v118 = v17;
  v111 = 0;
  BugCheckParameter3 = 0i64;
  v20 = 0;
  v125 = 0i64;
  memset((INT64)v130, 0i64);
  v21 = MmGetPteBase();
  v129 = 2145;
  v22 = ((v16 << 25) - v19) >> 16;
  v23 = v22;
  if( v22 >= (unsigned __int64)v21 )
  {
    PteLimit = MmGetPteLimit();
    do
    {
      if( v23 > (unsigned __int64)PteLimit )
        break;
      v23 = (__int64)((v23 << 25) - v19) >> 16;
    }
    while( v23 >= (unsigned __int64)v21 );
    v11 = a3;
  }
  if( v23 < 0xFFFF800000000000ui64 || v23 >= qword_140C4F878 && v23 <= qword_140C4E0A8 )
    AnyMultiplexedVm = (CHAR *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1664i64);
  else
    AnyMultiplexedVm = MiGetAnyMultiplexedVm(1i64);
  v26 = MiFastLockLeafPageTable((INT64)AnyMultiplexedVm, v22);
  if( v26 )
  {
    v27 = v26 - 1;
    LODWORD(v125) = v26 - 1;
    v28 = (INT64)MmGetPteBase();
    v29 = v28 + ((v22 >> 9) & 0x7FFFFFFFF8i64);
    *((_QWORD *)&v125 + 1) = v29;
  }
  else
  {
    v129 |= 4u;
    v136 = &v125;
    v131 = 0i64;
    v132 = AnyMultiplexedVm;
    v130[0] = v130[0] & 0xE3 | 4;
    v135 = MiGetNextPageTableTail;
    v134 = v126;
    v130[4] = v11;
    v133 = v22;
    MiWalkPageTables((INT64)&v129);
    v27 = v125;
    v29 = *((_QWORD *)&v125 + 1);
    v28 = (INT64)MmGetPteBase();
  }
  if( v29 )
  {
    v30 = v28 + ((v29 >> 9) & 0x7FFFFFFFF8i64);
    v112 = v30;
    if( v27 )
    {
      v31 = v28 + ((v29 >> 9) & 0x7FFFFFFFF8i64);
      if( v27 > 1 )
      {
        v32 = v27 - 1;
        do
        {
          v31 = v28 + ((v31 >> 9) & 0x7FFFFFFFF8i64);
          --v32;
        }
        while( v32 );
      }
      v30 = v28 + ((v31 >> 9) & 0x7FFFFFFFF8i64);
      if( v29 == v16 )
      {
        BugCheckParameter3 = MI_READ_PTE_LOCK_FREE(v31);
        v92 = BugCheckParameter3;
        if( (BugCheckParameter3 & 1) == 0 && qword_140C4DC80 )
        {
          if( (BugCheckParameter3 & 0x10) != 0 )
            v92 = BugCheckParameter3 & 0xFFFFFFFFFFFFFFEFui64;
          else
            v92 = ~qword_140C4DC80 & BugCheckParameter3;
        }
        v93 = (*((_QWORD *)MmGetPfnDb() + 6 * ((v92 >> 12) & 0xFFFFFFFFFi64) + 5) >> 39) & 0x3FF;
        v94 = *(_DWORD *)(BugCheckParameter2 + 48);
        if( (*(_BYTE *)(BugCheckParameter2 + 48) & 0x70) == 48 || (v94 & 0x500000) == 5242880 )
          ProtectionFromPte = MiGetProtectionFromPte((PVOID)BugCheckParameter2, (PVOID)BugCheckParameter3);
        else
          ProtectionFromPte = (v94 >> 7) & 0x1F;
        *v122 = ProtectionFromPte;
        MiUnlockPageTableInternal(a1a, v30);
        *v123 = 0;
        *v124 = v93;
        LeafVa = MiGetLeafVa(v31 + 8);
        *v121 = LeafVa;
        return 4096i64;
      }
    }
    else if( v16 == v29 )
    {
      BugCheckParameter3 = MI_READ_PTE_LOCK_FREE(v16);
      v111 = 1;
      v29 = v16 + 8;
      v33 = (v16 & 0xFFFFFFFFFFFFF000ui64) + 4088;
      v20 = BugCheckParameter3 == 0;
      goto LABEL_23;
    }
    MiUnlockPageTableInternal(a1a, v30);
    v112 = 0i64;
    v33 = (v29 & 0xFFFFFFFFFFFFF000ui64) - 8;
LABEL_23:
    if( v33 > v119 )
      v33 = v119;
    v118 = v33;
    goto LABEL_26;
  }
  v29 = v119 + 8;
LABEL_26:
  v34 = 0;
  while( 1 )
  {
    v35 = v34;
    v104 = v34;
    v36 = 0x2000;
    v108[0] = v34;
    v103 = v34;
    if( !BugCheckParameter3 )
    {
      v43 = BugCheckParameter2;
      *v127 = v34;
      v44 = (UINT64 *)*(unsigned int *)(v43 + 48);
      if( (*(_BYTE *)(v43 + 48) & 0x70) == 48 || ((unsigned __int8)v44 & 0x70) == 16 )
      {
        if( ((unsigned __int8)v44 & 0x70) == 48 )
          v102 = *(_WORD *)MiGetAweVadPartition(v43);
LABEL_59:
        v41 = v35;
LABEL_60:
        v42 = a5;
        goto LABEL_61;
      }
      if( ((unsigned int)v44 & 0x100000) != 0 )
      {
        if( *(int *)(v43 + 52) >= 0 )
        {
          v41 = v34;
        }
        else
        {
          v36 = 4096;
          v41 = ((unsigned int)v44 >> 7) & 0x1F;
          v108[0] = MI_GET_GRAPHICS_PROTECTION_FROM_VAD(v43, 0i64, v28, v44, v100);
        }
        if( ((unsigned int)v44 & 0x500000) == 5242880 )
        {
          LockedVadEvent = MiLocateLockedVadEvent(v43, 16i64);
          if( LockedVadEvent )
          {
            if( LockedVadEvent[3] && PsReferencePartitionSafe((INT64)LockedVadEvent[3]) )
            {
              v102 = **v46;
              PsDereferencePartition((INT64)v46);
              v34 = 0;
            }
          }
        }
        goto LABEL_60;
      }
      v47 = v10 >> 12;
      v102 = **(_WORD **)(qword_140C4E388 + 8i64 * (*(_WORD *)(**(_QWORD **)(v43 + 72) + 60i64) & 0x3FF));
      *(_QWORD *)&v108[1] = MiGetProtoPteAddress((_MMVAD *)v43, v47, 4ui64, (_SUBSECTION **)&v115);
      v48 = *(_QWORD *)&v108[1];
      if( !*(_QWORD *)&v108[1] )
      {
        if( a5 && !MiQueryStateMatches(a5, 0x2000i64, 0i64, 0i64, 0) )
        {
          v16 = v106;
          v35 = 1;
          v41 = v104;
          v29 = v106;
          v103 = 1;
LABEL_61:
          v40 = a1a;
LABEL_62:
          Pml4eBase = MmGetPml4eBase();
          goto LABEL_63;
        }
        if( (unsigned int)MiVadPureReserve(BugCheckParameter2) && v115 && !*(_QWORD *)(v115 + 8) )
        {
          v16 = v106;
          v50 = MiSkipEntirePagefileRegions(v49, v47, v106, v29, v115);
          v40 = a1a;
          v34 = 0;
          v42 = a5;
          v29 = v50;
          Pml4eBase = MmGetPml4eBase();
          v41 = v35;
          if( v50 == v16 )
            v29 = v16 + 8;
          goto LABEL_63;
        }
        v16 = v106;
        v29 = v106 + 8;
        goto LABEL_59;
      }
      v51 = v115;
      if( v20 )
      {
        v52 = v106;
        v53 = *(_QWORD *)(v115 + 8);
        v54 = ((__int64)(v118 - v106) >> 3) + 1;
        if( v54 > 32 )
          v54 = 32i64;
        v55 = v53 + 8 * (*(unsigned int *)(v115 + 44) - (unsigned __int64)(*(_DWORD *)(v115 + 52) & 0x3FFFFFFF));
        if( (*(_BYTE *)(v115 + 34) & 2) != 0 || *(_QWORD *)&v108[1] < v53 || *(_QWORD *)&v108[1] >= v55 )
        {
          v54 = 0i64;
        }
        else if( *(_QWORD *)&v108[1] + 8 * v54 > v55 )
        {
          v54 = (__int64)(v55 - *(_QWORD *)&v108[1]) >> 3;
        }
        v56 = v106 - 8 + 8 * v54;
        v29 = v106 + 8;
        if( v106 + 8 <= v56 )
        {
          do
          {
            if( *(_QWORD *)v29 )
              break;
            v29 += 8i64;
          }
          while( v29 <= v56 );
          v48 = *(_QWORD *)&v108[1];
          v51 = v115;
          v52 = v106;
        }
        if( v111 )
          goto LABEL_81;
      }
      else
      {
        if( v111 )
        {
LABEL_81:
          v57 = BugCheckParameter2;
          goto LABEL_82;
        }
        v52 = v106;
        v61 = *(_QWORD *)(v115 + 8);
        v62 = (__int64)(v29 - v106) >> 3;
        v63 = v61 + 8 * (*(unsigned int *)(v115 + 44) - (unsigned __int64)(*(_DWORD *)(v115 + 52) & 0x3FFFFFFF));
        if( (*(_BYTE *)(v115 + 34) & 2) != 0 || *(_QWORD *)&v108[1] < v61 || *(_QWORD *)&v108[1] >= v63 )
        {
          v62 = 1i64;
        }
        else if( *(_QWORD *)&v108[1] + 8 * v62 > v63 )
        {
          v62 = (__int64)(v63 - *(_QWORD *)&v108[1]) >> 3;
        }
        v29 = v106 + 8 * v62;
      }
      if( (unsigned int)MiVadPureReserve(BugCheckParameter2) )
      {
        v64 = MiSkipFractionalPagefileRegion(v48, v51, (__int64)(v29 - v52) >> 3);
        v57 = BugCheckParameter2;
        if( v64 != v48 )
        {
          v65 = (__int64)(v64 - v48) >> 3;
          v34 = 0;
          v48 = 0i64;
          *(_QWORD *)&v108[1] = 0i64;
          v29 = v52 + 8 * v65;
LABEL_83:
          v58 = *(_QWORD **)(v57 + 120);
          if( (__int64)v58 >= 0 )
          {
            v59 = 0;
            v60 = -1i64;
          }
          else
          {
            v59 = 1;
            v60 = (unsigned __int64)(*v58 - 1i64) >> 12;
          }
          if( v48 )
          {
            if( (*(_DWORD *)(v57 + 48) & 0x70) == 32 )
            {
              v66 = *(_QWORD *)(v57 + 72);
              v34 = 0;
              v67 = 0i64;
              if( v66 )
              {
                do
                {
                  if( (*(_BYTE *)(v66 + 34) & 2) != 0
                    && (v68 = *(_QWORD *)v66, (*(_DWORD *)(*(_QWORD *)v66 + 56i64) & 0x4000000) != 0) )
                  {
                    SessionId = MmGetSessionIdEx(*((_QWORD *)KeGetCurrentThread() + 23));
                    SharedProtos = MiGetSharedProtos(v68, SessionId, v66);
                    v48 = *(_QWORD *)&v108[1];
                    v67 = SharedProtos[9];
                  }
                  else
                  {
                    v67 = *(_QWORD *)(v66 + 8);
                  }
                  if( v48 >= v67 && v48 < v67 + 8i64 * *(unsigned int *)(v66 + 44) )
                    break;
                  v66 = *(_QWORD *)(v66 + 16);
                }
                while( v66 );
                v57 = BugCheckParameter2;
                v34 = 0;
              }
              if( (__int64)(v48 - v67) >> 3 < (unsigned __int64)(*(_DWORD *)(v66 + 44)
                                                                - (*(_DWORD *)(v66 + 52) & 0x3FFFFFFFu)) )
              {
                v41 = (*(_DWORD *)(v57 + 48) >> 7) & 0x1F;
                if( v41 == 7 )
                  v41 = (*(unsigned __int16 *)(v66 + 32) >> 1) & 0x1F;
                v16 = v106;
                v35 = v103;
                v40 = a1a;
                v42 = a5;
                Pml4eBase = MmGetPml4eBase();
                if( v41 )
                  v36 = 4096;
                goto LABEL_63;
              }
              v16 = v106;
              v41 = 0;
              v35 = v103;
            }
            else
            {
              if( !*(_QWORD *)(*(_QWORD *)v51 + 64i64) && (*(_DWORD *)(*(_QWORD *)v51 + 56i64) & 0x2000) == 0 )
              {
                if( v112 )
                {
                  MiUnlockPageTableInternal(a1a, v112);
                  v112 = 0i64;
                }
                MiUnlockWorkingSetShared(a1a, a3);
                v71 = (__int64)(v29 - v106) >> 3;
                v72 = (__int64)(*(_QWORD *)(v51 + 8)
                              + 8
                              * (*(unsigned int *)(v51 + 44) - (unsigned __int64)(*(_DWORD *)(v51 + 52) & 0x3FFFFFFF))
                              - v48) >> 3;
                if( v72 > v71 )
                  v72 = v71;
                if( *(_QWORD *)v48 )
                {
                  v36 = 4096;
                  v41 = (*(_DWORD *)(BugCheckParameter2 + 48) >> 7) & 0x1F;
                }
                else
                {
                  v41 = v104;
                }
                if( !a5 || MiQueryStateMatches(a5, v36, v41, 0i64, v102) )
                {
                  if( v72 )
                  {
                    while( 1 )
                    {
LABEL_127:
                      if( *(_QWORD *)v48 )
                      {
                        if( v36 != 4096 )
                          break;
                      }
                      else if( v36 == 4096 )
                      {
                        break;
                      }
                      v48 += 8i64;
                      ++v18;
                      *(_QWORD *)&v108[1] = v48;
                      if( !--v72 )
                        break;
                      while( (v48 & 0xFFF) == 0 )
                      {
                        v73 = MI_READ_PTE_LOCK_FREE((INT64)MmGetPteBase() + ((v48 >> 9) & 0x7FFFFFFFF8i64));
                        if( (v73 & 1) != 0 || (v73 & 0x3E0) != 0 )
                        {
                          if( v36 == 4096 )
                            goto LABEL_127;
                          goto LABEL_142;
                        }
                        if( v36 == 4096 )
                          goto LABEL_142;
                        if( v72 <= 0x200 )
                        {
                          v18 += v72;
                          *(_QWORD *)&v108[1] = v48 + 8 * v72;
                          goto LABEL_142;
                        }
                        v48 += 4096i64;
                        v18 += 512i64;
                        *(_QWORD *)&v108[1] = v48;
                        v72 -= 512i64;
                        if( !v72 )
                          goto LABEL_142;
                      }
                    }
                  }
LABEL_142:
                  v35 = v103;
                }
                else
                {
                  v35 = 1;
                  v103 = 1;
                  v18 = 0i64;
                }
                v16 = v106;
                v40 = a1a;
                v29 = v106 + 8 * v18;
                MiLockWorkingSetShared(a1a);
                v42 = a5;
                v34 = 0;
                goto LABEL_62;
              }
              v74 = *(_QWORD *)(v51 + 8)
                  + 8 * (*(unsigned int *)(v51 + 44) - (unsigned __int64)(*(_DWORD *)(v51 + 52) & 0x3FFFFFFF))
                  - v48;
              v16 = v106;
              v18 = v74 >> 3;
              v75 = (__int64)(v29 - v106) >> 3;
              if( v18 > v75 )
                v18 = v75;
              v76 = v18;
              if( v59 )
              {
                v77 = *(unsigned int *)(v57 + 24) | ((unsigned __int64)*(unsigned __int8 *)(v57 + 32) << 32);
                if( v47 - v77 <= v60 )
                {
                  v18 = v77 - v47 + v60 + 1;
                  v59 = 0;
                  if( v76 <= v18 )
                    v18 = v76;
                }
              }
              v29 = v106 + 8 * v18;
              if( v59 )
                v41 = v104;
              else
                v41 = (*(_DWORD *)(v57 + 48) >> 7) & 0x1F;
              v35 = v103;
              v36 = 4096;
              if( v59 )
                v36 = 0x2000;
              v34 = 0;
            }
          }
          else
          {
            v41 = v104;
            v35 = v104;
            v16 = v106;
          }
          goto LABEL_60;
        }
      }
LABEL_82:
      v34 = 0;
      goto LABEL_83;
    }
    Pml4eBase = MmGetPml4eBase();
    if( (BugCheckParameter3 & 0x3E0) == 512
      && (BugCheckParameter3 & 1) == 0
      && ((BugCheckParameter3 & 0x400) == 0 || MiIsPrototypePteVadLookup(BugCheckParameter3)) )
    {
      v40 = a1a;
      v41 = v35;
      v42 = a5;
    }
    else
    {
      v36 = 4096;
      MiGetPageProtection(BugCheckParameter2, v16, (__int64 **)&v108[1], v108, &v102);
      v39 = *(_QWORD *)&v108[1];
      if( *(_QWORD *)&v108[1] )
      {
        v91 = a1a;
        MiUnlockPageTableInternal(a1a, v112);
        v112 = 0i64;
        MiUnlockWorkingSetShared(v91, a3);
        MiFaultInPagedPool(v39);
        MiLockWorkingSetShared(v91);
        v17 = v119;
        v19 = v120;
        v11 = a3;
        goto LABEL_2;
      }
      v35 = v103;
      v34 = 0;
      v40 = a1a;
      v41 = v38;
      v42 = a5;
      Pml4eBase = MmGetPml4eBase();
      if( !v38 )
        v36 = 0x2000;
    }
LABEL_63:
    v28 = v128;
    if( v16 == v128 )
    {
      v107 = v102;
      v116 = v36;
      v113 = v41;
      v114 = v108[0];
      if( v42 && !MiQueryStateMatches(v42, v36, v41, v108[0], v102) )
        goto LABEL_235;
      goto LABEL_214;
    }
    if( v36 != v116 || v102 != v107 || v41 != v113 || v108[0] != v114 )
      break;
    if( v18 || v35 == 1 || (__int64)((v16 - v128) & 0xFFFFFFFFFFFFFFF8ui64) < 256 )
      goto LABEL_214;
    if( !v112 )
      goto LABEL_190;
    v78 = *(_BYTE *)(v40 + 184) & 7;
    a3a = v34;
    if( (_MMPTE *)v112 != MmGetPxeSelfRef() )
    {
      if( v78 )
        goto LABEL_182;
      Pml4eLimit = MmGetPml4eLimit();
      if( v112 >= (unsigned __int64)Pml4eBase && v112 <= (unsigned __int64)Pml4eLimit )
      {
        v83 = *(_QWORD *)(*(_QWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1680i64) + 608i64);
        if( v83 )
        {
          v84 = (*(_DWORD *)(v83 + 4i64 * (((unsigned int)v112 >> 3) & 0x1FF)) >> 30) & 1;
LABEL_188:
          v80 = v84 == 0;
          goto LABEL_189;
        }
LABEL_182:
        Pml4eLimit = MmGetPml4eLimit();
      }
      if( v78 && v112 >= (unsigned __int64)Pml4eBase && v112 <= (unsigned __int64)Pml4eLimit )
      {
        PageTableLockBuffer = MiGetPageTableLockBuffer(v40, v112, &a3a);
        v80 = ((*(_DWORD *)PageTableLockBuffer >> a3a) & 2) == 0;
        goto LABEL_189;
      }
      v84 = (*(_QWORD *)v112 >> 60) & 2;
      goto LABEL_188;
    }
    CurrentPrcb = KeGetCurrentPrcb();
    if( v78 )
    {
      if( v78 == 7 )
      {
        v80 = *((_QWORD *)CurrentPrcb + 4523) == 0i64;
      }
      else
      {
        if( v78 == 5 )
          v81 = *((_QWORD *)CurrentPrcb + 4520);
        else
          v81 = *((_QWORD *)CurrentPrcb + 4529);
        v80 = v81 == 0;
      }
    }
    else
    {
      v80 = *((_QWORD *)CurrentPrcb + 4526) == 0i64;
    }
LABEL_189:
    if( !v80 )
      goto LABEL_233;
LABEL_190:
    v86 = &dword_140C4F4C0;
    if( (*(_BYTE *)(v40 + 184) & 7) != 2 )
      v86 = (LONG *)(v40 + 192);
    if( (*v86 & 0x40000000) != 0 )
      goto LABEL_233;
    if( a3 < 2u )
    {
      v87 = KeGetCurrentPrcb();
      v28 = *((unsigned int *)v87 + 3147);
      if( (v28 & 1) != 0 )
      {
        v88 = 1;
        if( *((_DWORD *)v87 + 8103) > 7u )
        {
          if( *((_BYTE *)v87 + 12585) )
          {
            v89 = 1;
LABEL_212:
            if( v89 )
            {
              v16 = v106;
LABEL_233:
              v29 = v16 + 8;
              goto LABEL_236;
            }
LABEL_213:
            v16 = v106;
            goto LABEL_214;
          }
LABEL_207:
          if( (v28 & 0x1E) != 0 )
          {
            v89 = 5;
            goto LABEL_212;
          }
          if( *((_QWORD *)v87 + 1) != *((_QWORD *)v87 + 3) )
          {
            v89 = 6;
            goto LABEL_212;
          }
LABEL_211:
          _disable();
          *((_DWORD *)v87 + 7931) = v34;
          *((_DWORD *)v87 + 8103) = v34;
          KiResetGlobalDpcWatchdogProfiler((INT64)v87);
          _enable();
          v34 = 0;
          v89 = 0;
          goto LABEL_212;
        }
      }
      else
      {
        v88 = v34;
        if( (v28 & 0x1E) != 0 )
        {
          v89 = 2;
          goto LABEL_212;
        }
        if( *((_BYTE *)v87 + 12585) )
        {
          v89 = 3;
          goto LABEL_212;
        }
        v90 = *((_QWORD *)v87 + 2);
        if( v90 && v90 != *((_QWORD *)v87 + 1) )
        {
          v89 = 4;
          goto LABEL_212;
        }
      }
      if( *((_DWORD *)v87 + 7931) <= 7u )
        goto LABEL_213;
      if( v88 )
        goto LABEL_207;
      goto LABEL_211;
    }
LABEL_214:
    if( v103 )
      goto LABEL_236;
    if( v18 )
      goto LABEL_236;
    v16 += 8i64;
    v106 = v16;
    if( v29 != v16 || v29 > v118 )
      goto LABEL_236;
    if( v111 )
      BugCheckParameter3 = *(_QWORD *)v16;
    v20 = v34;
    v10 = ((v16 << 25) - v120) >> 16;
    v29 += 8i64;
  }
  v41 = v113;
  v36 = v116;
  v102 = v107;
  v108[0] = v114;
LABEL_235:
  v29 = v16;
LABEL_236:
  if( v112 )
    MiUnlockPageTableInternal(a1a, v112);
  result = v36;
  v98 = v122;
  *v121 = (__int64)((v29 << 25) - v120) >> 16;
  v99 = v108[0];
  *v98 = v41;
  *v123 = v99;
  *v124 = v102;
  return result;
}

Referenced by:

MiAllowProtectionChange
MiComparePteProtections
MiQueryAddressSpan
MiSetProtectionOnSection