MiResolveProtoPteFault

INT64 __fastcall MiResolveProtoPteFault(
        UINT64 StoreInstruction,
        VOID *FaultingAddress,
        _MMPTE *PoINTerPte,
        _MMSUPPORT_INSTANCE *Vm,
        UINT8 VmIrql,
        _MMPTE *PoINTerProtoPte,
        VOID *TrapInformation,
        CHAR PreviousMode,
        _MMINPAGE_SUPPORT **ReadBlock){
  _MMPTE *PteBase; 
  __int64 v12; 
  UINT64 *v13; 
  UINT64 v14; 
  UINT64 v15; 
  __int64 v16; 
  __int64 v17; 
  char *v18; 
  UINT64 v19; 
  INT64 v20; 
  UNICODE_STRING *v21; 
  unsigned __int64 v22; 
  char *v23; 
  wchar_t *Buffer; 
  WCHAR *v25; 
  WCHAR v26; 
  WCHAR *v27; 
  __int64 v28; 
  bool v29; 
  int v30; 
  __int64 v31; 
  unsigned __int64 v32; 
  __int64 v33; 
  _MMPTE *v34; 
  unsigned __int64 v35; 
  _MI_PARTITION *v36; 
  struct _KPRCB *CurrentPrcb; 
  signed __int32 v38; 
  signed __int32 v39; 
  char *v40; 
  MMPTE *v41; 
  char *v42; 
  char v43; 
  char *v44; 
  int v45; 
  char *v46; 
  unsigned __int64 *v47; 
  unsigned __int64 v48; 
  unsigned __int64 v49; 
  char *v50; 
  _MMPTE *v51; 
  UNICODE_STRING *Pml4eBase; 
  unsigned __int64 v53; 
  unsigned __int64 v54; 
  WCHAR *PxeUserLimit; 
  unsigned int PfnPriority; 
  UINT64 v57; 
  unsigned __int64 v58; 
  INT64 result; 
  int v60; 
  UINT64 v61; 
  __int64 v62; 
  __int64 v63; 
  __int64 v64; 
  __int64 v65; 
  __int64 v66; 
  int v67; 
  char *v68; 
  UINT64 v69; 
  RTL_BALANCED_NODE *Address; 
  char v71; 
  __int64 v72; 
  int v73; 
  UNICODE_STRING *v74; 
  bool v75; 
  __int16 v76; 
  __int64 v77; 
  WCHAR *v78; 
  unsigned __int64 v79; 
  int v80; 
  _MMPTE *v81; 
  UNICODE_STRING *v82; 
  char *v83; 
  char v84; 
  int v85; 
  unsigned __int64 v86; 
  unsigned __int64 v87; 
  __int64 v88; 
  unsigned __int64 v89; 
  __int64 v90; 
  __int64 v91; 
  signed __int32 v92; 
  __int64 v93; 
  unsigned __int64 v94; 
  unsigned __int64 v95; 
  _BYTE *v96; 
  __int64 v97; 
  unsigned int v98; 
  unsigned int v99; 
  __int16 v100; 
  __int64 v101; 
  char *v102; 
  unsigned __int64 v103; 
  void *v104; 
  unsigned __int64 v105; 
  char v106; 
  int v107; 
  unsigned int v108; 
  INT64 v109; 
  _MMPTE *v110; 
  unsigned __int64 v111; 
  void *v112; 
  void *v113; 
  _MMINPAGE_SUPPORT **v114; 
  UNICODE_STRING *antNameA; 
  __int64 v116; 
  UINT64 v117; 
  __int64 v118; 
  INT64 v119; 
  UINT64 v120; 
  char *v121; 
  unsigned __int64 v122; 
  UINT64 v123; 
  UINT64 SpinCount; 
  UINT64 v125; 
  unsigned __int64 *v126; 
  MMPTE *v127; 
  _QWORD *v128; 
  __int64 v129; 
  __int64 v130; 
  char *v131; 
  PteBase = MmGetPteBase();
  v119 = 0i64;
  *(_QWORD *)PoINTerPte = 0i64;
  v129 = *(_QWORD *)(StoreInstruction + 56);
  v123 = *(_QWORD *)StoreInstruction;
  v126 = (unsigned __int64 *)((char *)PteBase + ((v123 >> 9) & 0x7FFFFFFFF8i64));
  v12 = *(_QWORD *)(StoreInstruction + 16);
  v116 = v12;
  v118 = v12 & 1;
  if( (v12 & 1) == 0 || (v122 = v12 & 0xFFFFFFFFFFFFFFFEui64, *(_BYTE *)(v12 & 0xFFFFFFFFFFFFFFFEui64) != 1) )
    v122 = 0i64;
  v120 = *(_QWORD *)(StoreInstruction + 96);
  v13 = (UINT64 *)((char *)PteBase + ((v120 >> 9) & 0x7FFFFFFFF8i64));
  v117 = *v13;
  v14 = v117 & 1;
  do
  {
    if( !v14 )
      return 3221225494i64;
    v15 = v117;
    if( (v117 & 0x200) != 0 )
      return 3221225494i64;
    MiPteInShadowRange((UINT64)&v117);
    v16 = (v15 >> 12) & 0xFFFFFFFFFi64;
    v17 = 48 * v16;
    v130 = 48 * v16;
  }
  while( (*((_QWORD *)MmGetPfnDb() + 6 * v16 + 5) & 0x4000000000000i64) == 0 );
  LODWORD(SpinCount) = 0;
  antNameA = (UNICODE_STRING *)((char *)MmGetPfnDb() + v17);
  v18 = (char *)MmGetPfnDb() + 24;
  while( _interlockedbittestandset64((volatile signed __int32 *)&v18[v17], 0x3Fui64) )
  {
    do
      KeYieldProcessorEx(&SpinCount);
    while( *(__int64 *)&v18[v17] < 0 );
  }
  v19 = *v13;
  v117 = v19;
  if( (v19 & 1) == 0 || (v19 & 0x200) != 0 || v16 != ((v19 >> 12) & 0xFFFFFFFFFi64) )
  {
    _InterlockedAnd64((volatile signed __int64 *)&v18[v17], 0x7FFFFFFFFFFFFFFFui64);
    return 3221225494i64;
  }
  v20 = (INT64)antNameA;
  v21 = (UNICODE_STRING *)((char *)MmGetPfnDb() + 8);
  v22 = 1i64;
  v23 = (char *)MmGetPfnDb() + 34;
  Buffer = antNameA[2].Buffer;
  v25 = (WCHAR *)((char *)MmGetPfnDb() + 32);
  if( ((unsigned __int64)Buffer & 0x1000000000i64) != 0 || ((unsigned __int64)Buffer & 0x2000000000000i64) != 0 )
    goto LABEL_39;
  v26 = v25[(unsigned __int64)v17 / 2];
  v27 = &v25[(unsigned __int64)v17 / 2];
  v28 = *(_QWORD *)&v18[v17] & 0x3FFFFFFFFFFFFFFFi64;
  if( v26 )
  {
    if( v26 != 1 )
    {
      if( v26 != 2 || !v28 )
        goto LABEL_39;
LABEL_22:
      if( (v23[v17] & 8) == 0 )
        goto LABEL_39;
      goto LABEL_23;
    }
    if( !v28 )
      goto LABEL_22;
  }
LABEL_23:
  v29 = 0;
  LOBYTE(v30) = MI_PFN_IS_PROTO(antNameA, v21, (UINT8)Buffer, v25);
  if( v30 && (*(_DWORD *)((char *)MmGetPfnDb() + v17 + 16) & 0x400i64) != 0 )
  {
    v29 = 1;
  }
  else
  {
    v34 = MmGetPteBase();
    v35 = *(_QWORD *)(v17 + v31) | 0x8000000000000000ui64;
    if( v35 <= (unsigned __int64)v34 + 0x3FFFFFFF78i64 && v35 >= (unsigned __int64)v34 )
      v29 = (*(_BYTE *)(v17 + v33) & 0x20) != 0;
  }
  v36 = *(_MI_PARTITION **)(qword_140C4E388 + 8 * ((v32 >> 39) & 0x3FF));
  if( v29 )
  {
    v121 = (char *)v27;
    if( !(unsigned int)MiChargeCommit(v36, 1ui64, 4ui64) )
      goto LABEL_40;
  }
  if( v36 == (_MI_PARTITION *)&MiSystemPartition )
  {
    CurrentPrcb = KeGetCurrentPrcb();
    v38 = *((_DWORD *)CurrentPrcb + 8391);
    while( v38 )
    {
      if( v38 == -1 )
        break;
      v39 = v38;
      v38 = _InterlockedCompareExchange((volatile signed __int32 *)CurrentPrcb + 8391, v38 - 1, v38);
      if( v39 == v38 )
        goto LABEL_39;
    }
  }
  if( !(unsigned int)MiChargePartitionResidentAvailable((INT64)v36, 1ui64, 0xFFFFFFFFi64) )
  {
    v121 = (char *)v27;
    if( v29 )
    {
      MiReturnCommit(v36, 1ui64);
      v121 = (char *)v27;
    }
    goto LABEL_40;
  }
LABEL_39:
  v40 = (char *)MmGetPfnDb() + 32;
  ++*(_WORD *)&v40[v17];
  v121 = &v40[v17];
  v20 = (INT64)antNameA;
LABEL_40:
  v128 = (_QWORD *)((char *)MmGetPfnDb() + v17 + 8);
  v41 = (MMPTE *)(*v128 | 0x8000000000000000ui64);
  v127 = v41;
  v42 = &v23[v17];
  v43 = *v42;
  v131 = v42;
  if( (v43 & 0x20) != 0 )
  {
    v44 = (char *)MmGetPfnDb() + 24;
    do
    {
      _InterlockedAnd64((volatile signed __int64 *)&v44[v17], 0x7FFFFFFFFFFFFFFFui64);
      v45 = 0;
      while( (*v42 & 0x20) != 0 )
      {
        ++v45;
        _mm_pause();
      }
      MiLockPageInline(v20);
      v43 = *v42;
    }
    while( (*v42 & 0x20) != 0 );
    v41 = v127;
    v22 = 1i64;
  }
  *v42 = v43 | 0x20;
  v46 = (char *)MmGetPfnDb() + 24;
  if( (*(_QWORD *)&v46[v17] & 0x4000000000000000i64) == 0 && (*(_BYTE *)v41 & 0x20) == 0 )
    MiWriteValidPteVolatile(v41, 1ui64);
  _InterlockedAnd64((volatile signed __int64 *)&v46[v17], 0x7FFFFFFFFFFFFFFFui64);
  v47 = (unsigned __int64 *)v120;
  while( 1 )
  {
    while( 1 )
    {
      v48 = *v47;
      if( (*v47 & 1) == 0 )
        break;
      v49 = *v47;
LABEL_60:
      if( (*((_QWORD *)MmGetPfnDb() + 6 * ((v49 >> 12) & 0xFFFFFFFFFi64) + 5) & 0x4000000000000i64) != 0 )
      {
        v50 = (char *)MmGetPfnDb() + 48 * ((v49 >> 12) & 0xFFFFFFFFFi64);
        HIDWORD(SpinCount) = 0;
        while( _interlockedbittestandset64((volatile signed __int32 *)v50 + 6, 0x3Fui64) )
        {
          do
            KeYieldProcessorEx((UINT64 *)((char *)&SpinCount + 4));
          while( *((__int64 *)v50 + 3) < 0 );
        }
        if( *v47 == v48 )
          goto LABEL_67;
        _InterlockedAnd64((volatile signed __int64 *)v50 + 3, 0x7FFFFFFFFFFFFFFFui64);
      }
    }
    if( (v48 & 0x400) != 0 || (v48 & 0x800) == 0 )
      break;
    if( !v48 || !qword_140C4DC80 || (v48 & qword_140C4DC80) != 0 )
    {
      v49 = *v47;
      if( qword_140C4DC80 && (v48 & 0x10) == 0 )
        v49 = v48 & ~qword_140C4DC80;
      goto LABEL_60;
    }
  }
  v50 = 0i64;
LABEL_67:
  v51 = (_MMPTE *)v47;
  Pml4eBase = (UNICODE_STRING *)MmGetPml4eBase();
  v53 = *v47;
  v54 = v53;
  PxeUserLimit = (WCHAR *)MmGetPxeUserLimit();
  if( v51 >= (_MMPTE *)Pml4eBase && v51 <= (_MMPTE *)PxeUserLimit )
    Pml4eBase = (UNICODE_STRING *)MmGetPml4eBase();
  v119 = v53;
  if( (v53 & 1) == 0 )
  {
    if( !v53 )
    {
LABEL_150:
      LOBYTE(Pml4eBase) = 17;
      MiUnlockProtoPoolPage((_MMPFN *)antNameA, (UINT64)Pml4eBase);
      return 3221225477i64;
    }
    LOBYTE(v93) = 0;
    v94 = *v126;
    if( v126 >= (unsigned __int64 *)Pml4eBase && v126 <= (unsigned __int64 *)PxeUserLimit )
      Pml4eBase = (UNICODE_STRING *)MmGetPml4eBase();
    if( (v94 & 0x400) != 0 )
    {
      v95 = *v126;
      if( qword_140C4DC80 && (v94 & 0x10) == 0 )
        v95 = v94 & ~qword_140C4DC80;
      if( HIDWORD(v95) == 0xFFFFFFFF )
      {
        v96 = (_BYTE *)StoreInstruction;
        v93 = (v94 >> 5) & 0x1F;
        if( ((v94 >> 5) & 0x18) == 16 && (*(_BYTE *)(StoreInstruction + 69) & 8) != 0 )
          goto LABEL_263;
        v97 = v118;
        Pml4eBase = (UNICODE_STRING *)FaultingAddress;
LABEL_187:
        v100 = v53;
        if( qword_140C4DC80 && (v53 & 0x10) == 0 )
          v100 = v53 & ~(_WORD)qword_140C4DC80;
        if( (v100 & 0x400) == 0
          && (v100 & 0x800) == 0
          && (v100 & 4) == 0
          && (v93 & 5) == 5
          && (Pml4eBase || (((unsigned __int8)MI_READ_PTE_LOCK_FREE((INT64)&v119) >> 5) & 5) != 4)
          && ((*(_BYTE *)(v129 + 184) & 7) != 0 || !*(_QWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1264i64))
          && ((MiFlags & 0x10000) == 0 || v123 < 0xFFFF800000000000ui64 || (v93 & 2) == 0) )
        {
          v101 = v130;
          HIDWORD(v125) = 0;
          v102 = (char *)MmGetPfnDb() + 24;
          if( _interlockedbittestandset64((volatile signed __int32 *)&v102[v130], 0x3Fui64) )
          {
            do
            {
              do
                KeYieldProcessorEx((UINT64 *)((char *)&v125 + 4));
              while( *(__int64 *)&v102[v101] < 0 );
            }
            while( _interlockedbittestandset64((volatile signed __int32 *)&v102[v101], 0x3Fui64) );
          }
          *v131 &= ~0x20u;
          MiRemoveLockedPageChargeAndDecRef((_MMPFN *)antNameA);
          _InterlockedAnd64((volatile signed __int64 *)&v102[v101], 0x7FFFFFFFFFFFFFFFui64);
          if( v122 )
          {
            if( !v97 )
              return 0i64;
            v103 = v116 & 0xFFFFFFFFFFFFFFFEui64;
            if( *(_BYTE *)(v116 & 0xFFFFFFFFFFFFFFFEui64) != 1 || (*(_DWORD *)(v103 + 80) & 0x4000) == 0 )
              return 0i64;
            v104 = (void *)v116;
          }
          else
          {
            v104 = (void *)v116;
            v103 = v116 & 0xFFFFFFFFFFFFFFFEui64;
          }
          if( v97 )
          {
            if( *(_BYTE *)v103 != 1 && *(_BYTE *)v103 != 3 && *(_BYTE *)v103 != 6 )
              goto LABEL_220;
          }
          else if( KeInvalidAccessAllowed(v104) != 1 )
          {
            goto LABEL_220;
          }
          if( (!v97 || *(_BYTE *)v103 != 6) && v123 >= 0xFFFF800000000000ui64 )
            return 3221225477i64;
LABEL_220:
          if( (v94 & 0x400) == 0 )
            goto LABEL_225;
          v105 = v94;
          if( qword_140C4DC80 && (v94 & 0x10) == 0 )
            v105 = v94 & ~qword_140C4DC80;
          if( HIDWORD(v105) != 0xFFFFFFFF )
LABEL_225:
            v94 = v53;
          v106 = v94 >> 5;
          v107 = v106 & 0x18;
          v108 = v106 & 2 | 4;
          if( v107 == 8 )
          {
            v108 |= 8u;
          }
          else if( v107 == 24 )
          {
            v108 |= 0x18u;
          }
          v109 = MiSwizzleInvalidPte(32i64 * v108);
          v110 = (_MMPTE *)v126;
          if( v126 >= (unsigned __int64 *)MmGetPml4eBase()
            && v126 <= (unsigned __int64 *)MmGetPxeUserLimit()
            && (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0
            && (v109 & 1) != 0 )
          {
            v109 |= 0x8000000000000000ui64;
          }
          *v126 = v109;
          return MiResolveDemandZeroFault(
                   v96,
                   v110,
                   0i64,
                   (_MMSUPPORT_INSTANCE *)FaultingAddress,
                   v113,
                   (unsigned __int64)v114,
                   (unsigned int)antNameA);
        }
        if( (v53 & 0x400) != 0 )
        {
          if( (v96[69] & 8) == 0 )
            return MiResolveMappedFileFault(v96, v51, (_MMPFN *)antNameA, (_MMSUPPORT_INSTANCE *)PoINTerPte, v113, v114);
          goto LABEL_263;
        }
        if( (v53 & 0x800) != 0 )
          return MiResolveTransitionFault(
                   v96,
                   v51,
                   (_MMPFN *)antNameA,
                   (_MMSUPPORT_INSTANCE *)FaultingAddress,
                   PoINTerPte,
                   (UINT64)v114,
                   (INT64)antNameA,
                   v116,
                   (_MMINPAGE_SUPPORT **)v117);
        if( (v53 & 4) == 0 )
        {
          if( v122 )
          {
            if( !v97
              || (v111 = v116 & 0xFFFFFFFFFFFFFFFEui64, *(_BYTE *)(v116 & 0xFFFFFFFFFFFFFFFEui64) != 1)
              || (*(_DWORD *)(v111 + 80) & 0x4000) == 0 )
            {
              LOBYTE(Pml4eBase) = 17;
              MiUnlockProtoPoolPage((_MMPFN *)antNameA, (UINT64)Pml4eBase);
              return 0i64;
            }
            v112 = (void *)v116;
          }
          else
          {
            v112 = (void *)v116;
            v111 = v116 & 0xFFFFFFFFFFFFFFFEui64;
          }
          if( v97 )
          {
            if( *(_BYTE *)v111 != 1 && *(_BYTE *)v111 != 3 && *(_BYTE *)v111 != 6 )
              return MiResolveDemandZeroFault(
                       v96,
                       (_MMPTE *)v120,
                       (_MMPFN *)antNameA,
                       (_MMSUPPORT_INSTANCE *)FaultingAddress,
                       v113,
                       (unsigned __int64)v114,
                       (unsigned int)antNameA);
          }
          else if( KeInvalidAccessAllowed(v112) != 1 )
          {
            return MiResolveDemandZeroFault(
                     v96,
                     (_MMPTE *)v120,
                     (_MMPFN *)antNameA,
                     (_MMSUPPORT_INSTANCE *)FaultingAddress,
                     v113,
                     (unsigned __int64)v114,
                     (unsigned int)antNameA);
          }
          if( (!v97 || *(_BYTE *)v111 != 6) && v123 >= 0xFFFF800000000000ui64 )
          {
            if( !MiIsPrototypePteVadLookup(v94) )
              v94 = MI_READ_PTE_LOCK_FREE((INT64)&v119);
            if( ((v94 >> 5) & 0x18) == 16 )
              goto LABEL_150;
          }
          return MiResolveDemandZeroFault(
                   v96,
                   (_MMPTE *)v120,
                   (_MMPFN *)antNameA,
                   (_MMSUPPORT_INSTANCE *)FaultingAddress,
                   v113,
                   (unsigned __int64)v114,
                   (unsigned int)antNameA);
        }
        if( (v96[69] & 8) == 0 )
          return MiResolvePageFileFault(v96, v51, (_MMPFN *)antNameA, (_MMSUPPORT_INSTANCE *)PoINTerPte, v113, v114);
LABEL_263:
        LOBYTE(Pml4eBase) = 17;
        MiUnlockProtoPoolPage((_MMPFN *)antNameA, (UINT64)Pml4eBase);
        return 3221226548i64;
      }
    }
    if( (v94 & 8) != 0 )
    {
      Pml4eBase = (UNICODE_STRING *)FaultingAddress;
    }
    else
    {
      v93 = (v53 >> 5) & 0x1F;
      v98 = ((v53 >> 5) & 0x1F) >> 3;
      if( v98 == 2 && (*(_BYTE *)(StoreInstruction + 69) & 8) != 0 )
        goto LABEL_263;
      if( (v53 & 1) == 0 )
      {
        Pml4eBase = (UNICODE_STRING *)FaultingAddress;
        if( !FaultingAddress )
          LOBYTE(v22) = 0;
        if( *((char *)&MiReadWrite + ((unsigned __int8)v53 >> 5)) - (char)v22 < 10 )
        {
          v99 = -1073741819;
          goto LABEL_180;
        }
        v97 = v118;
        if( v98 == 2 && (!v118 || *(_BYTE *)(v116 & 0xFFFFFFFFFFFFFFFEui64) != 1) )
        {
          if( (unsigned int)MiAllowGuardFault((PVOID)v116) )
          {
            *(_QWORD *)v120 = v53 & 0xFFFFFFFFFFFFFC1Fui64 | (32 * ((v53 >> 5) & 0xF));
            v99 = -2147483647;
          }
          else
          {
            v99 = -1073741819;
          }
          goto LABEL_180;
        }
        v51 = (_MMPTE *)v120;
LABEL_186:
        v96 = (_BYTE *)StoreInstruction;
        goto LABEL_187;
      }
      Pml4eBase = (UNICODE_STRING *)FaultingAddress;
      if( FaultingAddress && (v53 & 0xA00) == 0 )
      {
        v99 = -1073741819;
LABEL_180:
        if( v50 )
          _InterlockedAnd64((volatile signed __int64 *)v50 + 3, 0x7FFFFFFFFFFFFFFFui64);
        LOBYTE(Pml4eBase) = 17;
        MiUnlockProtoPoolPage((_MMPFN *)antNameA, (UINT64)Pml4eBase);
        return v99;
      }
    }
    v97 = v118;
    goto LABEL_186;
  }
  if( v122 )
  {
    PfnPriority = MiGetPfnPriority((INT64)v50);
    if( (unsigned int)v57 > PfnPriority )
      v50[35] = v57 | v50[35] & 0xF8;
    _InterlockedAnd64((volatile signed __int64 *)v50 + 3, v58);
    LOBYTE(v57) = 17;
    MiUnlockProtoPoolPage((_MMPFN *)antNameA, v57);
    return 0i64;
  }
  LOBYTE(v60) = MI_PFN_IS_PROTO((UNICODE_STRING *)v50, Pml4eBase, 0xFFu, PxeUserLimit);
  if( v60 )
  {
    v62 = *((_QWORD *)v50 + 2);
    if( (v62 & 0x400) != 0 && ((*((_QWORD *)v50 + 5) >> 60) & 7) != 3 )
    {
      v63 = *((_QWORD *)v50 + 2);
      if( qword_140C4DC80 && (v62 & 0x10) == 0 )
        v63 = ~qword_140C4DC80 & v62;
      v64 = v63 >> 16;
      if( (*(_DWORD *)(*(_QWORD *)v64 + 56i64) & 0x20) != 0 )
      {
        v65 = *(_QWORD *)(*(_QWORD *)(*(_QWORD *)v64 + 96i64) + 40i64);
        if( v65 )
        {
          if( (v65 & 0xFFFFFFFFFFFFFFF8ui64) != 8 && (v65 & 3) != 2 )
          {
            if( v123 >= 0xFFFF800000000000ui64 )
            {
              if( (MiFlags & 0x10000) == 0 || (v62 & 0x40) == 0 )
                goto LABEL_88;
LABEL_101:
              _InterlockedAnd64((volatile signed __int64 *)v50 + 3, 0x7FFFFFFFFFFFFFFFui64);
              LOBYTE(v61) = 17;
              MiUnlockProtoPoolPage((_MMPFN *)antNameA, v61);
              return 3221226536i64;
            }
            Address = MiLocateAddress(v123);
            v61 = (UINT64)Address;
            if( !Address )
              goto LABEL_101;
            v73 = (int)Address[2].Children[0];
            if( (v73 & 0x70) != 32 )
              goto LABEL_101;
            if( (v73 & 0xF80) != 128
              && ((*(_DWORD *)&Address[2].0 & 0x8000000) == 0 || (v71 & 4) != 0)
              && ((MiFlags & 0x400) == 0 || (*(_BYTE *)(v72 + 34) & 2) == 0) )
            {
              goto LABEL_101;
            }
          }
        }
      }
    }
  }
LABEL_88:
  v66 = 0x3FFFFFFFFFFFFFFFi64;
  *((_QWORD *)v50 + 3) ^= (*((_QWORD *)v50 + 3) ^ (*((_QWORD *)v50 + 3) + 1i64)) & 0x3FFFFFFFFFFFFFFFi64;
  _InterlockedAnd64((volatile signed __int64 *)v50 + 3, 0x7FFFFFFFFFFFFFFFui64);
  v67 = 0;
  LODWORD(v125) = 0;
  v68 = (char *)MmGetPfnDb() + 24;
  if( _interlockedbittestandset64((volatile signed __int32 *)&v68[v17], 0x3Fui64) )
  {
    do
    {
      do
        KeYieldProcessorEx(&v125);
      while( *(__int64 *)&v68[v17] < 0 );
    }
    while( _interlockedbittestandset64((volatile signed __int32 *)&v68[v17], 0x3Fui64) );
    v66 = 0x3FFFFFFFFFFFFFFFi64;
  }
  *v42 &= ~0x20u;
  v69 = *(unsigned __int16 *)v121;
  if( !(_WORD)v69 )
    MiBadRefCount((_MMPFN *)antNameA, v69);
  v74 = antNameA;
  v75 = (_WORD)v69 == 1;
  v76 = v69 - 1;
  *(_WORD *)v121 = v76;
  if( v75 && MiIsPfnFileOnly((INT64)antNameA) )
    goto LABEL_145;
  v77 = (__int64)v74[2].Buffer;
  if( (v77 & 0x1000000000i64) == 0 && (v77 & 0x2000000000000i64) == 0 )
  {
    v78 = *(WCHAR **)&v68[v17];
    v79 = v66 & (unsigned __int64)v78;
    if( !v76 )
    {
      v80 = 1;
      goto LABEL_115;
    }
    if( v76 != 1 )
    {
      if( v76 == 2 && v79 )
      {
LABEL_112:
        if( (*v42 & 8) != 0 )
          goto LABEL_113;
      }
      goto LABEL_146;
    }
    if( !v79 )
      goto LABEL_112;
LABEL_113:
    v80 = 0;
LABEL_115:
    v81 = MmGetPteBase();
    v82 = (UNICODE_STRING *)(*v128 | 0x8000000000000000ui64);
    if( v82 <= (UNICODE_STRING *)((char *)v81 + 0x3FFFFFFF78i64) && v82 >= (UNICODE_STRING *)v81 )
    {
      v83 = (char *)MmGetPfnDb() + 35;
    }
    else
    {
      v83 = (char *)MmGetPfnDb() + 35;
      v84 = v83[v17];
      if( (v84 & 0x20) != 0 )
      {
        v83[v17] = v84 & 0xDF;
        goto LABEL_144;
      }
    }
    LOBYTE(v85) = MI_PFN_IS_PROTO(v74, v82, v77, v78);
    if( v85 && (*(_DWORD *)((char *)MmGetPfnDb() + v17 + 16) & 0x400i64) != 0 )
    {
      v67 = 1;
    }
    else if( v86 <= v89 && v86 >= (unsigned __int64)MmGetPteBase() && (v83[v17] & 0x20) != 0 )
    {
      v67 = 1;
    }
    else if( v80 == 1 && (v88 & 0x4000000000000000i64) != 0 )
    {
      v67 = 1;
    }
    v77 = (v87 >> 39) & 0x3FF;
    v90 = *(_QWORD *)(qword_140C4E388 + 8 * v77);
    if( v67 == 1 )
    {
      MiReturnCommit(*(_MI_PARTITION **)(qword_140C4E388 + 8 * v77), 1ui64);
      v74 = antNameA;
    }
    if( (ULONG_PTR *)v90 == &MiSystemPartition )
    {
      v77 = (__int64)KeGetCurrentPrcb();
      v91 = *(int *)(v77 + 33564);
      if( (_DWORD)v91 != -1 )
      {
        if( (unsigned __int64)(v91 + 1) <= 0x100 )
        {
          while( 1 )
          {
            v92 = _InterlockedCompareExchange((volatile signed __int32 *)(v77 + 33564), v91 + 1, v91);
            v75 = (_DWORD)v91 == v92;
            LODWORD(v91) = v92;
            if( v75 )
              break;
            if( v92 == -1 || (unsigned __int64)(v92 + 1i64) > 0x100 )
              goto LABEL_138;
          }
LABEL_144:
          if( v80 )
LABEL_145:
            MiPfnReferenceCountIsZero((_MMPFN *)v74, v17 / 48, (UINT8 *)v77);
          goto LABEL_146;
        }
LABEL_138:
        if( (int)v91 > 192
          && (_DWORD)v91 != -1
          && (_DWORD)v91 == _InterlockedCompareExchange((volatile signed __int32 *)(v77 + 33564), 192, v91) )
        {
          v22 = (int)v91 - 192 + 1i64;
        }
        if( !v22 )
          goto LABEL_144;
      }
    }
    _InterlockedExchangeAdd64((volatile signed __int64 *)(v90 + 7168), v22);
    goto LABEL_144;
  }
LABEL_146:
  _InterlockedAnd64((volatile signed __int64 *)((char *)MmGetPfnDb() + v17 + 24), 0x7FFFFFFFFFFFFFFFui64);
  __incgsdword(0x2E98u);
  result = MiCompleteProtoPteFault(StoreInstruction, v54, (__int64)FaultingAddress, 0, v116);
  if( (int)result >= 0 )
    return 272i64;
  return result;
}

Referenced by:

MiDispatchFault