MiCompleteProtoPteFault

__int64 __fastcall MiCompleteProtoPteFault(INT64 rcx0, unsigned __int64 a2, __int64 r8_0, int a4, __int64 a5){
  unsigned int v5; 
  unsigned __int64 v6; 
  __int64 v7; 
  UNICODE_STRING *v8; 
  _DWORD *p_Length; 
  __int64 v10; 
  __int64 v11; 
  __int64 v12; 
  __int64 v13; 
  _EX_FAST_REF *v14; 
  signed __int64 v15; 
  signed __int64 v16; 
  char *v17; 
  unsigned int v18; 
  INT64 v19; 
  signed __int64 v20; 
  signed __int64 v21; 
  signed __int64 v22; 
  unsigned __int64 v23; 
  unsigned __int64 v24; 
  __int64 v25; 
  __int64 v26; 
  unsigned int v27; 
  unsigned __int64 v28; 
  __int64 v29; 
  INT64 v30; 
  __int64 v31; 
  _ETHREAD *CurrentThread; 
  __int64 v33; 
  int v34; 
  signed __int64 v35; 
  signed __int64 v36; 
  unsigned __int64 v37; 
  UINT64 v38; 
  bool v39; 
  unsigned __int8 v40; 
  unsigned __int64 v41; 
  signed __int64 v42; 
  signed __int64 v43; 
  signed __int64 v44; 
  signed __int64 v45; 
  unsigned __int64 v46; 
  _ETHREAD *v47; 
  unsigned __int64 v48; 
  int v49; 
  unsigned __int64 v50; 
  BOOL v51; 
  int LogEntry; 
  unsigned __int64 *v53; 
  _QWORD *v54; 
  __int64 v55; 
  signed __int32 v56; 
  char v57; 
  signed __int32 v58; 
  UINT64 v59; 
  CHAR *v60; 
  unsigned __int8 v61; 
  unsigned __int64 v62; 
  CHAR **v63; 
  signed __int32 v64; 
  unsigned __int64 *v65; 
  unsigned __int64 v66; 
  signed __int64 Value; 
  signed __int64 v68; 
  char *v69; 
  unsigned __int64 v70; 
  unsigned __int64 v71; 
  int v72; 
  unsigned __int64 v73; 
  __int64 v74; 
  _MMPTE *PteLimit; 
  UINT64 PteBase; 
  int v77; 
  UINT64 v78; 
  char v79; 
  char PagePrivilege; 
  unsigned int v81; 
  char v82; 
  unsigned __int64 v83; 
  unsigned __int64 v84; 
  int v85; 
  int v86; 
  INT64 v87; 
  __int64 v88; 
  __int64 v89; 
  bool v90; 
  UINT64 v91; 
  unsigned __int8 v92; 
  INT64 v93; 
  char MaximumLength; 
  unsigned __int64 v95; 
  UINT64 v96; 
  __int64 v97; 
  int v98; 
  unsigned int v99; 
  UINT64 v100; 
  unsigned __int64 ParentValue; 
  unsigned int v102; 
  INT64 v103; 
  __int64 v104; 
  RTL_BALANCED_NODE *Address; 
  RTL_BALANCED_NODE *v106; 
  int v107; 
  UNICODE_STRING *v108; 
  char v110; 
  _BYTE *v111; 
  UNICODE_STRING *v112; 
  __int64 v113; 
  int v114; 
  __int16 v115; 
  WCHAR *v116; 
  int v117; 
  char v118; 
  __int16 v119; 
  UNICODE_STRING *v120; 
  UNICODE_STRING *v121; 
  int v122; 
  char v123; 
  __int64 v124; 
  char v125; 
  UINT64 *v126; 
  int v127; 
  ULONG_PTR BugCheckParameter4; 
  char v129[8]; 
  INT64 v130; 
  INT64 v131; 
  UNICODE_STRING *a9; 
  INT64 a10; 
  INT64 a11; 
  INT64 a12; 
  INT64 v136; 
  UINT64 v137; 
  UINT64 v138; 
  unsigned __int64 v139; 
  UINT64 SpinCount; 
  _EX_FAST_REF *v141; 
  PVOID Object; 
  unsigned __int64 v143; 
  __int64 v144; 
  unsigned __int64 *a3; 
  __int64 v146; 
  char *v147; 
  __int64 v148; 
  __int64 v149; 
  INT64 a1; 
  __int64 v151; 
  __int128 v152; 
  __int64 v153; 
  v149 = *(_QWORD *)(rcx0 + 56);
  v5 = 0;
  v137 = *(_QWORD *)rcx0;
  v148 = 0i64;
  a10 = 0i64;
  LODWORD(v138) = 0;
  v6 = (unsigned __int64)MmGetPteBase() + ((v137 >> 9) & 0x7FFFFFFFF8i64);
  a11 = v6;
  v7 = (a2 >> 12) & 0xFFFFFFFFFi64;
  v146 = v7;
  v8 = (UNICODE_STRING *)((char *)MmGetPfnDb() + 48 * v7);
  p_Length = &v8[1].Length;
  a9 = v8;
  v147 = (char *)&v8[1];
  v10 = *(_QWORD *)&v8[1].Length;
  a1 = *(_QWORD *)(qword_140C4E388 + 8 * (((unsigned __int64)v8[2].Buffer >> 39) & 0x3FF));
  v151 = v10;
  v139 = v10;
  if( (v10 & 0x400) == 0 )
  {
    v144 = 0i64;
    v136 = 0i64;
    goto LABEL_102;
  }
  v11 = v10;
  if( qword_140C4DC80 && (v10 & 0x10) == 0 )
    v11 = v10 & ~qword_140C4DC80;
  v12 = v11 >> 16;
  v144 = v12;
  v13 = *(_QWORD *)v12;
  v136 = *(_QWORD *)v12;
  if( PfSnNumActiveTraces )
  {
    v14 = (_EX_FAST_REF *)(v13 + 64);
    v141 = (_EX_FAST_REF *)(v13 + 64);
    _m_prefetchw((const void *)(v13 + 64));
    v15 = *(_QWORD *)(v13 + 64);
    if( (v15 & 0xF) != 0 )
    {
      do
      {
        v16 = _InterlockedCompareExchange64((volatile signed __int64 *)v14, v15 - 1, v15);
        if( v15 == v16 )
          break;
        v15 = v16;
      }
      while( (v16 & 0xF) != 0 );
    }
    v17 = (char *)(v15 & 0xFFFFFFFFFFFFFFF0ui64);
    v18 = v15 & 0xF;
    Object = v17;
    if( v18 <= 1 )
    {
      if( !v18 )
      {
LABEL_20:
        v23 = ExAcquireSpinLockShared((PEX_SPIN_LOCK)(v136 + 72));
        Object = (PVOID)ObFastReferenceObjectLocked(v14);
        ExReleaseSpinLockSharedFromDpcLevel((PEX_SPIN_LOCK)(v136 + 72));
        __writecr8(v23);
        v12 = v144;
LABEL_21:
        v24 = (unsigned __int64)v8->Buffer | 0x8000000000000000ui64;
        if( (v137 < 0xFFFF800000000000ui64 || (unsigned int)MiGetSystemRegionType(v137) == 1)
          && (v25 = *((_QWORD *)KeGetCurrentThread() + 23), (v26 = *(_QWORD *)(v25 + 1368)) != 0)
          && (*(_DWORD *)(v25 + 2172) & 0x1000) == 0 )
        {
          v27 = *(_DWORD *)(v26 + 8);
        }
        else
        {
          v27 = -1;
        }
        v28 = *(_QWORD *)(v12 + 8);
        if( (*(_DWORD *)(*(_QWORD *)v12 + 56i64) & 0x20) != 0 )
        {
          if( v24 < v28 || v24 >= v28 + 8i64 * *(unsigned int *)(v12 + 44) )
          {
            if( (*(_BYTE *)(v12 + 34) & 2) != 0 )
              v29 = (v24 << 9) - (MiGetSharedProtos(*(_QWORD *)v12, v27, v12)[9] << 9);
            else
              v29 = (v24 << 9) - (*(_QWORD *)(MiGetSubsectionDriverProtos((_QWORD *)v12) + 72) << 9);
          }
          else
          {
            v29 = (v24 << 9) - (v28 << 9);
          }
          v30 = ((unsigned __int64)*(unsigned int *)(v12 + 36) << 9) + (v29 & 0xFFFFFFFFFFFFF000ui64);
        }
        else
        {
          if( v28 )
            v31 = (__int64)(v24 - v28) >> 3 << 12;
          else
            v31 = 0i64;
          v30 = ((*(unsigned int *)(v12 + 36) | ((unsigned __int64)(*(_WORD *)(v12 + 32) & 0xFFC0) << 26)) << 12) + v31;
        }
        CurrentThread = (_ETHREAD *)KeGetCurrentThread();
        a12 = v30;
        v33 = *((_QWORD *)CurrentThread + 23);
        v34 = *(_DWORD *)(v136 + 56) & 0x20;
        _m_prefetchw((const void *)(v33 + 1536));
        v35 = *(_QWORD *)(v33 + 1536);
        if( (v35 & 0xF) != 0 )
        {
          do
          {
            v36 = _InterlockedCompareExchange64((volatile signed __int64 *)(v33 + 1536), v35 - 1, v35);
            if( v35 == v36 )
              break;
            v35 = v36;
          }
          while( (v36 & 0xF) != 0 );
        }
        v37 = v35 & 0xFFFFFFFFFFFFFFF0ui64;
        if( (v35 & 0xFFFFFFFFFFFFFFF0ui64) == 0 )
          goto LABEL_97;
        v38 = v35 & 0xF;
        if( (unsigned int)v38 <= 1 )
        {
          if( (_DWORD)v38 )
          {
            if( ExAcquireRundownProtectionEx((EX_RUNDOWN_REF *)(v37 + 360), 0xFui64) )
            {
              _m_prefetchw((const void *)(v33 + 1536));
              v42 = *(_QWORD *)(v33 + 1536);
              while( (v42 & 0xF) == 0 )
              {
                if( v37 != (v42 & 0xFFFFFFFFFFFFFFF0ui64) )
                  break;
                v43 = v42;
                v42 = _InterlockedCompareExchange64((volatile signed __int64 *)(v33 + 1536), v42 + 15, v42);
                if( v43 == v42 )
                  goto LABEL_60;
              }
              v152 = 0i64;
              v153 = 0i64;
              _m_prefetchw((const void *)(v37 + 360));
              v44 = *(_QWORD *)(v37 + 360);
              if( (v44 & 1) != 0 )
              {
LABEL_57:
                v46 = v44 & 0xFFFFFFFFFFFFFFFEui64;
                if( _InterlockedExchangeAdd64((volatile signed __int64 *)v46, 0xFFFFFFFFFFFFFFF1ui64) == 15
                  && !_interlockedbittestandreset((volatile signed __int32 *)(v46 + 32), 0) )
                {
                  KeSetEvent((PRKEVENT)(v46 + 8), 0);
                }
              }
              else
              {
                while( 1 )
                {
                  v45 = v44;
                  v44 = _InterlockedCompareExchange64((volatile signed __int64 *)(v37 + 360), v44 - 30, v44);
                  if( v45 == v44 )
                    break;
                  if( (v44 & 1) != 0 )
                    goto LABEL_57;
                }
              }
            }
          }
          else
          {
            v39 = 1;
            KeAcquireSpinLockRaiseToDpc(&SpinLock, v38);
            v41 = v40;
            v37 = *(_QWORD *)(v33 + 1536) & 0xFFFFFFFFFFFFFFF0ui64;
            if( v37 )
              v39 = ExAcquireRundownProtection((PEX_RUNDOWN_REF)(v37 + 360));
            KxReleaseSpinLock(&SpinLock);
            __writecr8(v41);
            if( !v39 )
            {
LABEL_96:
              v14 = v141;
LABEL_97:
              _m_prefetchw(v14);
              Value = v14->Value;
              if( ((unsigned __int64)Object ^ v14->Value) >= 0xF )
              {
LABEL_100:
                ObDereferenceObjectDeferDelete(Object);
              }
              else
              {
                while( 1 )
                {
                  v68 = Value;
                  Value = _InterlockedCompareExchange64((volatile signed __int64 *)v14, Value + 1, Value);
                  if( v68 == Value )
                    break;
                  if( ((unsigned __int64)Object ^ Value) >= 0xF )
                    goto LABEL_100;
                }
              }
              p_Length = v147;
              v6 = a11;
              v8 = a9;
              v7 = v146;
              goto LABEL_102;
            }
          }
        }
LABEL_60:
        if( v37 )
        {
          if( (*((_BYTE *)CurrentThread + 1304) & 0x40) == 0 )
          {
            if( (*(_DWORD *)(*((_QWORD *)CurrentThread + 68) + 1124i64) & 0x100000) == 0
              && (*((_DWORD *)CurrentThread + 324) & 0xE00u) >= 0x400
              || CurrentThread == (_ETHREAD *)KeGetCurrentThread() && *((_DWORD *)CurrentThread + 340) )
            {
              v47 = *(_ETHREAD **)(v37 + 432);
              if( !v47 || v47 == CurrentThread && *(_QWORD *)(v37 + 440) == *((_QWORD *)CurrentThread + 144) )
              {
                v48 = *((_QWORD *)Object + 3);
                PfSnGetFileInformation(v37, Object);
                if( (*(_BYTE *)(v37 + 484) & 1) == 0 && *(_BYTE *)(*(_QWORD *)(v37 + 352) + 1850i64) == 2 )
                  _InterlockedOr16((volatile signed __int16 *)(v37 + 484), 1u);
                if( (unsigned __int64)a12 < 0x20000000000i64 )
                {
                  v49 = dword_140CEBED0;
                  v50 = (unsigned __int64)a12 >> 9;
                  a12 = (unsigned __int64)a12 >> 9;
                  a3 = 0i64;
                  v51 = v34 != 0;
                  if( dword_140CEBED0 != *(_DWORD *)(v37 + 404) )
                  {
                    LogEntry = PfSnTraceGetLogEntry(v37, 1ui64, &a3);
                    v50 = a12;
                    if( LogEntry >= 0 )
                    {
                      v53 = a3;
                      *a3 = *a3 & 0xFFFFFFFFFFFFFFF8ui64 | 2;
                      *((_DWORD *)v53 + 2) = v49;
                      *(_DWORD *)(v37 + 404) = v49;
                      *(_QWORD *)(v37 + 408) = v37 + 416;
                    }
                  }
                  if( v34 || (v54 = *(_QWORD **)(v37 + 408), *v54 >> 3 != v50) || v54[1] != v48 )
                  {
                    if( _InterlockedIncrement((volatile signed __int32 *)(v37 + 344)) <= *(_DWORD *)(v37 + 340) )
                    {
                      v55 = *(_QWORD *)(v37 + 96);
                      v56 = _InterlockedExchangeAdd((volatile signed __int32 *)(v55 + 16), 1u);
                      v57 = (v56 + 1 < 0) ^ __OFADD__(1, v56) | (v56 == -1);
                      v58 = v56 + 1;
                      if( v57 )
                      {
LABEL_90:
                        _InterlockedExchangeAdd((volatile signed __int32 *)(v37 + 344), 0xFFFFFFFF);
                      }
                      else
                      {
                        while( v58 > *(_DWORD *)(v55 + 20) )
                        {
                          _InterlockedExchangeAdd((volatile signed __int32 *)(v55 + 16), 0xFFFFFFFF);
                          v60 = PfSnTraceBufferAllocate();
                          if( v60 )
                          {
                            KeAcquireSpinLockRaiseToDpc((UINT64 *)(v37 + 128), v59);
                            v62 = v61;
                            if( *(_QWORD *)(v37 + 96) == v55 )
                            {
                              v63 = *(CHAR ***)(v37 + 112);
                              if( *v63 != (CHAR *)(v37 + 104) )
                                __fastfail(3u);
                              *((_QWORD *)v60 + 1) = v63;
                              *(_QWORD *)v60 = v37 + 104;
                              *v63 = v60;
                              *(_QWORD *)(v37 + 112) = v60;
                              ++*(_DWORD *)(v37 + 120);
                              *(_QWORD *)(v37 + 96) = v60;
                              KxReleaseSpinLock((UINT64 *)(v37 + 128));
                              __writecr8(v62);
                            }
                            else
                            {
                              KxReleaseSpinLock((UINT64 *)(v37 + 128));
                              __writecr8(v62);
                              ExFreePoolWithTag(v60, 0);
                            }
                            v55 = *(_QWORD *)(v37 + 96);
                            v64 = _InterlockedExchangeAdd((volatile signed __int32 *)(v55 + 16), 1u);
                            v57 = (v64 + 1 < 0) ^ __OFADD__(1, v64) | (v64 == -1);
                            v58 = v64 + 1;
                            if( !v57 )
                              continue;
                          }
                          goto LABEL_90;
                        }
                        v65 = (unsigned __int64 *)(v55 + 16i64 * v58 + 8);
                        v66 = v51 | (unsigned __int64)(8 * a12);
                        v65[1] = v48;
                        *v65 = v66;
                        _InterlockedIncrement((volatile signed __int32 *)(v37 + 332));
                        if( !v51 )
                          *(_QWORD *)(v37 + 408) = v65;
                      }
                    }
                    else
                    {
                      _InterlockedExchangeAdd((volatile signed __int32 *)(v37 + 344), 0xFFFFFFFF);
                      if( !_InterlockedCompareExchange((volatile signed __int32 *)(v37 + 400), 3, 0) )
                        ExQueueWorkItem((WORK_QUEUE_ITEM *)(v37 + 368), DelayedWorkQueue);
                    }
                  }
                }
              }
            }
            else
            {
              _InterlockedIncrement((volatile signed __int32 *)(v37 + 336));
            }
          }
          ExReleaseRundownProtection((PEX_RUNDOWN_REF)(v37 + 360));
        }
        goto LABEL_96;
      }
      ObReferenceObjectExWithTag(v17, 0xFui64);
      _m_prefetchw(v14);
      v20 = v14->Value;
      while( (v20 & 0xF) == 0 )
      {
        if( v17 != (char *)(v20 & 0xFFFFFFFFFFFFFFF0ui64) )
          break;
        v21 = v20;
        v20 = _InterlockedCompareExchange64((volatile signed __int64 *)v14, v20 + 15, v20);
        if( v21 == v20 )
          goto LABEL_19;
      }
      ObpTraceObjectDereferenceIfActive((INT64)(v17 - 48), (_BYTE *)0xF, 1953261124i64, v19, BugCheckParameter4);
      v22 = _InterlockedExchangeAdd64((volatile signed __int64 *)v17 - 6, 0xFFFFFFFFFFFFFFF1ui64) - 15;
      if( v22 <= 0 )
      {
        if( *((_QWORD *)v17 - 5) )
          KeBugCheckEx(
            0x18u,
            ObTypeIndexTable[(unsigned __int8)ObHeaderCookie ^ (unsigned __int8)*(v17 - 24) ^ (unsigned __int64)(unsigned __int8)((unsigned __int16)((_WORD)v17 - 48) >> 8)],
            (ULONG_PTR)v17,
            6ui64,
            *((_QWORD *)v17 - 5));
        if( v22 < 0 )
          KeBugCheckEx(0x18u, 0i64, (ULONG_PTR)v17, 5ui64, v22);
        ObpDeferObjectDeletion((INT64)(v17 - 48));
      }
    }
LABEL_19:
    if( v17 )
      goto LABEL_21;
    goto LABEL_20;
  }
LABEL_102:
  v143 = *(_QWORD *)((char *)MmGetPteBase() + ((v6 >> 9) & 0x7FFFFFFFF8i64));
  v69 = (char *)MmGetPfnDb() + 48 * ((v143 >> 12) & 0xFFFFFFFFFi64);
  LODWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)v69 + 6, 0x3Fui64) )
  {
    do
      KeYieldProcessorEx(&SpinCount);
    while( *((__int64 *)v69 + 3) < 0 );
  }
  *((_QWORD *)v69 + 3) ^= (*((_QWORD *)v69 + 3) ^ (*((_QWORD *)v69 + 3) + 1i64)) & 0x3FFFFFFFFFFFFFFFi64;
  _InterlockedAnd64((volatile signed __int64 *)v69 + 3, 0x7FFFFFFFFFFFFFFFui64);
  v70 = *(_QWORD *)v6;
  if( (*(_QWORD *)v6 & 0x400i64) == 0 )
    goto LABEL_112;
  v71 = *(_QWORD *)v6;
  if( qword_140C4DC80 && (v70 & 0x10) == 0 )
    v71 = v70 & ~qword_140C4DC80;
  if( HIDWORD(v71) == 0xFFFFFFFF )
  {
    v72 = (v70 >> 5) & 0x1F;
  }
  else
  {
LABEL_112:
    v73 = (v139 >> 5) & 0x1F;
    v5 = 1;
    if( (v70 & 8) != 0 )
      LODWORD(v73) = 1;
    v74 = r8_0;
    v72 = v73;
    if( r8_0 )
    {
      if( (v73 & 4) == 0 )
        v74 = 0i64;
      r8_0 = v74;
    }
  }
  PteLimit = MmGetPteLimit();
  PteBase = (UINT64)MmGetPteBase();
  if( (MiFlags & 0x10000) != 0
    && v137 >= 0xFFFF800000000000ui64
    && (v137 < PteBase || v137 > (unsigned __int64)PteLimit)
    && (v72 & 2) != 0 )
  {
    if( (MiFlags & 0x20000) != 0
      || (LOBYTE(v77) = MI_PFN_IS_PROTO(v8, (UNICODE_STRING *)v137, (UINT8)PteLimit, 0i64), !v77)
      || (*p_Length & 0x400i64) != 0 )
    {
      PagePrivilege = MiGetPagePrivilege((ULONG_PTR)v8, 0, 0i64);
    }
    else
    {
      PagePrivilege = v79;
      if( (unsigned int)MiIsAddressInDriverView(v78) )
        PagePrivilege = 1;
    }
    PteBase = (UINT64)MmGetPteBase();
    if( (PagePrivilege & 1) != 0 )
    {
      v72 = 3;
      r8_0 = 0i64;
    }
    else if( (PagePrivilege & 8) != 0 )
    {
      v72 = 1;
      r8_0 = 0i64;
    }
    else
    {
      v72 &= ~2u;
      if( !v72 )
        v72 = 1;
    }
    PteLimit = MmGetPteLimit();
  }
  v81 = v72 & 0xFFFFFFE7;
  v82 = LOBYTE(v8[2].MaximumLength) >> 6;
  if( v82 != 1 )
  {
    if( v82 )
    {
      if( v82 == 2 )
        v81 |= 0x18u;
    }
    else
    {
      v81 |= 8u;
    }
  }
  v83 = (v7 << 12) | MmProtectToPteMask[v81] & 0xFFFF000000000E7Fui64 | 0x21;
  if( v6 < PteBase || v6 > (unsigned __int64)PteLimit )
  {
LABEL_161:
    v83 |= 0x100ui64;
    goto LABEL_162;
  }
  v84 = (__int64)((v6 << 25) - (PteBase << 25)) >> 16;
  if( v6 >= (unsigned __int64)MmGetPdeBase() && v6 <= (unsigned __int64)MmGetPdeLimit() )
  {
    if( (_MMPTE *)v6 == MmGetPxeSelfRef() )
      v83 |= 0x8000000000000000ui64;
    else
      v83 &= ~0x8000000000000000ui64;
    v85 = MiUserPdeOrAbove(v6);
    PteBase = (UINT64)MmGetPteBase();
    if( v85 )
      v83 |= 4ui64;
  }
  if( v6 <= PteBase + 0x3FFFFFFF78i64 )
    v83 |= 4ui64;
  if( v84 < 0xFFFF800000000000ui64 )
  {
    v86 = HIBYTE(word_140C4DD48);
    goto LABEL_160;
  }
  if( (unsigned int)MiGetSystemRegionType(v84) != 1
    && (v84 < (unsigned __int64)MmGetPteBase() || v84 > (unsigned __int64)MmGetPteLimit()) )
  {
    if( v84 < qword_140C4F878 || (v86 = HIBYTE(word_140C4DD48), v84 > qword_140C4E0A8) )
      v86 = (unsigned __int8)word_140C4DD48;
LABEL_160:
    if( !v86 )
      goto LABEL_162;
    goto LABEL_161;
  }
LABEL_162:
  v87 = v83 & 0xF0FFFFFFFFFFFFFFui64 | 0xA00000000000000i64;
  a10 = v87;
  if( r8_0 )
  {
    if( *(_QWORD *)rcx0 <= 0x7FFFFFFEFFFFui64 )
    {
      v88 = *((_QWORD *)KeGetCurrentThread() + 23);
      if( v87 >= 0 && (*(_DWORD *)(v88 + 1124) & 0x10) != 0
        || (v89 = *(_QWORD *)(v88 + 2552)) != 0 && *(_QWORD *)(v89 + 24) != v89 + 24 )
      {
        v87 = a10;
        r8_0 = 0i64;
        goto LABEL_185;
      }
      v87 = a10;
    }
    if( (v72 & 5) != 5 )
    {
      v87 |= 0x42ui64;
      v90 = (v8[2].MaximumLength & 0x10) == 0;
      a10 = v87;
      if( v90 && (*(_DWORD *)&v8[1].Length & 0x400i64) == 0 && (unsigned int)MiGetPagingFileOffset((MMPTE *)&v8[1]) )
      {
        v91 = 0i64;
        v92 = MiLockPageInline((INT64)v8);
        MaximumLength = v8[2].MaximumLength;
        v95 = v92;
        if( (MaximumLength & 0x10) == 0 && (*(_DWORD *)&v8[1].Length & 0x400i64) == 0 )
        {
          if( (MaximumLength & 8) == 0 )
          {
            v96 = MiCapturePageFileInfoInline((UINT64 *)&v8[1].Length, 1i64, 0i64);
            MaximumLength = v8[2].MaximumLength;
            v91 = v96;
          }
          LOBYTE(v8[2].MaximumLength) = MaximumLength | 0x10;
        }
        _InterlockedAnd64((volatile signed __int64 *)&v8[1].Buffer, 0x7FFFFFFFFFFFFFFFui64);
        if( v91 )
          MiReleasePageFileInfo(
            a1,
            v91,
            1,
            v93,
            BugCheckParameter4,
            *(INT64 *)v129,
            v130,
            v131,
            (INT64)a9,
            a10,
            a11,
            a12);
        __writecr8(v95);
        v87 = a10;
      }
      if( (v151 & 0x400) != 0 && (*(_BYTE *)(v149 + 184) & 7) != 2 )
        MiCheckAndUpdateIoAttribution((INT64)v8);
    }
  }
LABEL_185:
  v97 = 0i64;
  v98 = 0;
  v99 = 0;
  if( a4 || ((__int64)v8[2].Buffer & 0x1000000000i64) == 0 && (__int64)v8->Buffer > 0 )
    goto LABEL_216;
  v100 = v137;
  if( v137 < 0xFFFF800000000000ui64 )
  {
    if( v144 )
    {
      if( (*(_DWORD *)(v136 + 56) & 0x20) == 0 )
      {
LABEL_216:
        v108 = a9;
        goto LABEL_217;
      }
    }
    else
    {
      v104 = *((_QWORD *)KeGetCurrentThread() + 23);
      if( *(_QWORD *)(v104 + 1264) && MiLocateCloneAddress(v104, (unsigned __int64)v8->Buffer | 0x8000000000000000ui64) )
        goto LABEL_215;
    }
    if( *(_QWORD *)(*(_QWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1680i64) + 384i64) != v97 )
    {
      Address = MiLocateAddress(v100);
      v106 = Address;
      if( Address )
      {
        v107 = (int)Address[2].Children[0];
        if( (v107 & 0x70) == 32 && (v107 & 0x100000) == 0 && (v107 & 0x200000) != 0 )
        {
          v103 = (INT64)v106[3].Children[0]->Children[0];
          v102 = (v137 >> 12)
               + (((__int64)v106[3].Children[1] - *(_QWORD *)(v103 + 136)) >> 3)
               - LODWORD(v106[1].Children[0]);
          if( _bittest((const signed __int32 *)v106[6].Children[1], v102) )
          {
            ParentValue = v106[5].ParentValue;
            v87 = a10;
            goto LABEL_204;
          }
        }
      }
    }
LABEL_215:
    v87 = a10;
    goto LABEL_216;
  }
  if( v136 && (*(_DWORD *)(v136 + 56) & 0x20) == 0 )
    goto LABEL_216;
  ParentValue = MiSystemImageHasPrivateFixups(v137, &v136, &v138);
  v102 = v138;
  LOBYTE(v97) = 0;
  v103 = v136;
LABEL_204:
  if( !ParentValue )
    goto LABEL_216;
  v99 = MiPrivateFixup(rcx0, v103, v102, (INT64)v8, ParentValue);
  MiLockAndDecrementShareCount((UINT64)v8, 0);
  if( v99 == 297 || v99 == -1073741670 )
  {
    MiLockAndDecrementShareCount((UINT64)v69, 0);
    if( v99 == 297 )
      return(unsigned int)-1073740748;
    return v99;
  }
  if( (v99 & 0x80000000) != 0 )
    return v99;
  a10 = MiMakeTransitionPteValid(a11);
  v87 = a10;
  v108 = (UNICODE_STRING *)((char *)MmGetPfnDb()
                          + 48 * (((unsigned __int64)MI_READ_PTE_LOCK_FREE((INT64)&a10) >> 12) & 0xFFFFFFFFFi64));
  v5 = 2;
  a9 = v108;
  if( v137 >= 0xFFFF800000000000ui64 && (v108[2].MaximumLength & 0x800) != 0 )
    v98 = 2;
  LOBYTE(v97) = 0;
  LOBYTE(v72) = 0;
LABEL_217:
  v110 = v97;
  if( (v5 & 1) == 0 )
    v110 = v72;
  v111 = (_BYTE *)(a5 & 0xFFFFFFFFFFFFFFFEui64);
  if( (a5 & 1) != 0 )
  {
    if( *v111 == 5 )
      v148 = a5 & 0xFFFFFFFFFFFFFFFEui64;
    if( (a5 & 1) != 0 && *v111 == 3 )
      v98 |= 1u;
  }
  v112 = (UNICODE_STRING *)*(unsigned __int8 *)(rcx0 + 69);
  if( ((unsigned __int8)v112 & 8) != 0 )
  {
    v113 = *(_QWORD *)(rcx0 + 16);
    if( (v113 & 1) == 0 || *(_BYTE *)(v113 & 0xFFFFFFFFFFFFFFFEui64) != 2 )
      v87 &= ~0x20ui64;
  }
  if( ((unsigned __int8)v112 & 5) != 4 || ((unsigned __int8)v112 & 2) != 0 )
  {
    v121 = a9;
    goto LABEL_245;
  }
  v114 = *(unsigned __int16 *)(rcx0 + 66);
  v115 = 511;
  v116 = (WCHAR *)a11;
  if( (_WORD)v114 )
  {
    if( v114 + *(unsigned __int16 *)(rcx0 + 64) == (((unsigned int)a11 >> 3) & 0x1FF) )
    {
      LOBYTE(v112) = (unsigned __int8)v112 & 0x10;
      LOBYTE(v117) = MI_PFN_IS_PROTO(v108, v112, (UINT8)v108, (PWCHAR)a11);
      if( v117 )
      {
        if( !v118 )
          goto LABEL_238;
      }
      else if( v118 )
      {
        goto LABEL_238;
      }
    }
    MiEmptyDeferredWorkingSetEntries(rcx0 + 56);
    v115 = 511;
    v116 = (WCHAR *)a11;
  }
LABEL_238:
  v119 = *(_WORD *)(rcx0 + 66);
  if( v119 )
  {
    *(_WORD *)(rcx0 + 66) = v119 + 1;
    v98 |= 4u;
    v121 = a9;
  }
  else
  {
    v120 = (UNICODE_STRING *)*(unsigned __int8 *)(rcx0 + 69);
    *(_WORD *)(rcx0 + 66) = 1;
    *(_WORD *)(rcx0 + 64) = v115 & ((unsigned int)v116 >> 3);
    v121 = a9;
    LOBYTE(v122) = MI_PFN_IS_PROTO(a9, v120, (UINT8)v108, v116);
    if( v122 )
      v125 = v123 & 0xEF;
    else
      v125 = v123 | 0x10;
    *(_BYTE *)(v124 + 69) = v125;
    v98 |= 4u;
  }
LABEL_245:
  *(_DWORD *)v129 = v98;
  v126 = (UINT64 *)a11;
  if( !(unsigned int)MiAllocateWsle(v149, a11, v121, v110, v87, *(__int64 *)v129, v148) )
  {
    MiLockAndDecrementShareCount((UINT64)v121, 0);
    if( v5 < 2 )
      MiLockAndDecrementShareCount((UINT64)v69, 0);
    return(unsigned int)-1073741801;
  }
  if( !r8_0
    || (v87 & 0x800) != 0
    || (v87 & 0x200) == 0
    || *(_QWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 1248i64) )
  {
    return v99;
  }
  if( *(_QWORD *)(rcx0 + 72) && (*(_BYTE *)(rcx0 + 69) & 1) == 0 && *(_WORD *)(rcx0 + 66) )
    MiEmptyDeferredWorkingSetEntries(rcx0 + 56);
  v127 = MiCopyOnWrite(v137, v126, -1i64, 0i64);
  v99 = v127;
  if( v127 >= 0 )
    return v99;
  MiSetFaultPacketDirectives(rcx0, (unsigned int)v127);
  return 3221226548i64;
}

Referenced by:

MiIssueHardFault
MiResolveDemandZeroFault
MiResolveProtoPteFault
MiResolveTransitionFault