MiMakePageAvoidRead

__int64 __fastcall MiMakePageAvoidRead(
        __int64 a1,
        VOID *a2,
        unsigned int a3,
        __int64 a4,
        char a5,
        _MMPTE *a6,
        _DWORD *a7){
  __int64 v8; 
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v9; 
  ULONG_PTR *v10; 
  struct _KPRCB *CurrentPrcb; 
  int NodeShiftedColor; 
  int v13; 
  signed __int32 v14; 
  UINT64 v15; 
  UINT64 v16; 
  UINT64 v17; 
  _MMPFN *v19; 
  unsigned int v20; 
  _MI_PFN_CACHE_ATTRIBUTE v21; 
  int v22; 
  signed __int64 i; 
  signed __int64 v24; 
  UINT64 v25; 
  union {$8D9ED47C9F2F2CD645B633E301950288 __s0;unsigned __int64 EntireField;} *p_u4; 
  _MMPTE *v27; 
  UINT64 v28; 
  UINT64 v29; 
  char v30; 
  int v31; 
  UINT64 v32; 
  unsigned __int64 PteBase; 
  _MMPTE *PteLimit; 
  unsigned __int64 v35; 
  NTSTATUS v36; 
  int v37; 
  unsigned __int64 v38; 
  int v39; 
  __int64 v40; 
  char *v41; 
  _KTBFLUSH_TYPE v42; 
  __int64 v43; 
  _MMPFN *v44; 
  unsigned __int8 CurrentIrql; 
  __int64 *v46; 
  UINT64 v47; 
  _UNICODE_STRING *v48; 
  UINT8 v49; 
  wchar_t *v50; 
  int v51; 
  _MMPFN *v52; 
  char v53; 
  char v54; 
  int v55; 
  __int64 v56; 
  _MI_PARTITION *v57; 
  struct _KPRCB *v58; 
  signed __int32 CachedResidentAvailable; 
  signed __int32 v60; 
  _MI_RESAVAIL_CHARGE v61; 
  _MMPTE *v62; 
  char v63; 
  _QWORD *v64; 
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v65; 
  __int64 v66; 
  __int64 bf_0; 
  _MI_PFN_CACHE_ATTRIBUTE v68; 
  unsigned __int64 v69; 
  __int64 v70; 
  _ETHREAD *CurrentThread; 
  unsigned int v72; 
  int v73; 
  _MIPFNBLINK *p_u2; 
  unsigned __int8 v75; 
  char v76; 
  char v77; 
  INT64 *v78; 
  UINT8 v79; 
  signed __int32 v80; 
  bool v81; 
  signed __int32 v82; 
  char v83; 
  UINT64 v84; 
  UINT64 v85; 
  __int64 v86; 
  unsigned __int64 v87; 
  _MMPTE *PxeUserLimit; 
  unsigned __int64 Long; 
  __int64 v90; 
  unsigned __int16 ReferenceCount; 
  unsigned __int16 v92; 
  int v93; 
  __int64 v94; 
  __int64 v95; 
  _MMPTE *v96; 
  wchar_t *v97; 
  char v98; 
  int v99; 
  int v100; 
  unsigned __int64 v101; 
  unsigned __int64 v102; 
  __int64 v103; 
  unsigned __int64 v104; 
  __int64 v105; 
  _MI_PARTITION *v106; 
  struct _KPRCB *v107; 
  __int64 v108; 
  signed __int32 v109; 
  UINT8 v110; 
  int v111; 
  int v112; 
  _MMPFN *Pfn1; 
  UINT64 v114; 
  UINT64 v115; 
  UINT64 v116; 
  UINT64 *v117; 
  unsigned __int64 v118; 
  UINT64 PageFrameIndex; 
  unsigned int v120; 
  UINT64 SpinCount; 
  UINT64 v122; 
  unsigned __int64 v123; 
  __int64 v124; 
  __int64 v125; 
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v126; 
  _MMPTE *v127; 
  _DWORD *v128; 
  __int64 v129; 
  _MMPTE *v130; 
  VOID *Src; 
  _MMPFN *v132; 
  UINT64 v133; 
  __int64 v134; 
  __int64 v135; 
  UINT64 v136; 
  _MMPFN_IDENTITY PfnIdentity[4]; 
  __int128 v138; 
  __int64 v139[2]; 

  v8 = a3;
  Src = a2;
  v118 = a1;
  v127 = a6;
  v129 = a1;
  v130 = a6;
  v128 = a7;
  v110 = 0;
  *(_OWORD *)PfnIdentity = 0i64;
  v138 = 0i64;
  *a7 = 0;
  v9.Long = (unsigned __int64)a6->u;
  v126.Long = (unsigned __int64)a6->u;
  if( *(&stru_140C4DB30 + 42) )
  {
    if( (v9.Long & 0x10) != 0 )
      v9.Long &= ~0x10ui64;
    else
      v9.Long &= ~*(&stru_140C4DB30 + 42);
  }
  v125 = v9.Hard._bf_0 >> 16;
  v135 = v9.Hard._bf_0 >> 16;
  v124 = *(_QWORD *)(v9.Hard._bf_0 >> 16);
  v134 = v124;
  v10 = *(ULONG_PTR **)(*(&stru_140C4DB30 + 267) + 8i64 * (*(_WORD *)(v124 + 60) & 0x3FF));
  if( ((*(_DWORD *)(v124 + 56) >> 20) & 0x3F) != 0 )
  {
    CurrentPrcb = KeGetCurrentPrcb();
    NodeShiftedColor = (((*(_DWORD *)(v124 + 56) >> 20) & 0x3F) - 1) << *(&stru_140C4DB30 + 156);
  }
  else
  {
    CurrentPrcb = *(&KiProcessorBlock + KeGetCurrentThread()->IdealProcessor);
    NodeShiftedColor = CurrentPrcb->NodeShiftedColor;
  }
  v13 = (1 << *(&stru_140C4DB30 + 157)) - 1;
  v14 = v13 & _InterlockedExchangeAdd((volatile signed __int32 *)&CurrentPrcb->PageColor, 1u);
  v15 = 0i64;
  if( a4 != 4096 )
    v15 = 2i64;
  LODWORD(v16) = MiGetPage(v10, NodeShiftedColor | (unsigned int)v14, v15);
  PageFrameIndex = v16;
  v136 = v16;
  if( v16 == -1i64 )
  {
    MiWaitForFreePage((_MI_PARTITION *)v10, v17);
    return 1i64;
  }
  v19 = &MmGetPfnDb()[v16];
  Pfn1 = v19;
  v132 = v19;
  v20 = (a6->u.Long >> 5) & 0x1F;
  v120 = v20;
  HIDWORD(v116) = v20;
  if( v20 )
  {
    if( v20 == 31 )
    {
      v21 = MiCached;
    }
    else if( v20 >> 3 == 3 && (v20 & 7) != 0 )
    {
      v21 = MiWriteCombined;
    }
    else
    {
      v21 = v20 >> 3 != 1;
    }
  }
  else
  {
    v21 = MiNotMapped;
  }
  v22 = 0;
  v111 = 0;
  if( a4 != 4096 && MiPfnZeroingNeeded(v19, v21) )
    v22 = 1;
  if( *((unsigned __int8 *)&v19->u3 + 2) >> 6 != v21 )
    MiChangePageAttribute(v19, v21, 0i64);
  for( i = v19->u2._bf_0; ; i = v24 )
  {
    v24 = _InterlockedCompareExchange64(&v19->u2.Lock, i & 0xF0FFFFFFFFFFFFFFui64, i);
    if( i == v24 )
      break;
  }
  v25 = (UINT64)MiReservePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), 1ui64);
  v133 = v25;
  if( v25 )
  {
    v30 = 4;
    if( PageFrameIndex <= 0xFFFFFFFFFi64 && (MmGetPfnDb()[PageFrameIndex].u4._bf_0 & 0x4000000000000i64) != 0 )
    {
      v31 = *((unsigned __int8 *)&MmGetPfnDb()[PageFrameIndex].u3 + 2) >> 6;
      if( !v31 || v31 == 3 )
      {
        v30 = 12;
      }
      else if( v31 == 2 )
      {
        v30 = 28;
      }
    }
    v32 = ((PageFrameIndex & 0xFFFFFFFFFi64) << 12) | MmProtectToPteMask[v30 & 0x1F] & 0xFFFF000000000E7Fui64 | 0x21;
    PteBase = (unsigned __int64)MmGetPteBase();
    if( v25 < PteBase )
      goto LABEL_64;
    PteLimit = MmGetPteLimit();
    if( v25 > (unsigned __int64)PteLimit )
      goto LABEL_64;
    v35 = (__int64)((v25 << 25) - (PteBase << 25)) >> 16;
    if( v25 >= (unsigned __int64)MmGetPdeBase() && v25 <= (unsigned __int64)MmGetPdeLimit() )
    {
      if( (_MMPTE *)v25 == MmGetPxeSelfRef() )
        v32 |= 0x8000000000000000ui64;
      else
        v32 &= ~0x8000000000000000ui64;
      v36 = MiUserPdeOrAbove(v25);
      PteBase = (unsigned __int64)MmGetPteBase();
      PteLimit = MmGetPteLimit();
      if( v36 )
        v32 |= 4ui64;
    }
    if( v25 <= PteBase + 0x3FFFFFFF78i64 )
      v32 |= 4ui64;
    if( v35 >= 0xFFFF800000000000ui64 )
    {
      if( *((_BYTE *)&stru_140C4DB30 + ((v35 >> 39) & 0x1FF) + 6872) == 1
        || v35 >= PteBase && v35 <= (unsigned __int64)PteLimit )
      {
        goto LABEL_65;
      }
      if( v35 < *(&stru_140C4DB30 + 937) || (v37 = *(&stru_140C4DB30 + 537), v35 > *(&stru_140C4DB30 + 175)) )
        v37 = *(&stru_140C4DB30 + 536);
    }
    else
    {
      v37 = *(&stru_140C4DB30 + 537);
    }
    if( v37 )
LABEL_64:
      v32 |= 0x100ui64;
LABEL_65:
    v38 = v32 & 0xFAFFFFFFFFFFFEFFui64 | ((unsigned __int64)(*(&stru_140C4DB30 + 536) & 1) << 8) | 0xA00000000000042i64;
    LOBYTE(v39) = MiPteInShadowRange(v25);
    if( v39 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 )
      v38 |= 0x8000000000000000ui64;
    *(_QWORD *)v25 = v38;
    v40 = (__int64)((v25 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
    v41 = (char *)(v40 + v8);
    if( v22 )
    {
      if( (_DWORD)v8 )
        memset((VOID *)v40, 0i64, v8);
      if( 4096 - v8 != a4 )
        memset(&v41[a4], 0i64, 4096 - v8 - a4);
    }
    memmove(v41, Src, a4);
    p_u4 = &MmGetPfnDb()->u4;
    v27 = MmGetPteBase();
    MiReleasePtes((_MI_SYSTEM_PTE_TYPE *)((char *)&stru_140C4DB30 + 4432), (_MMPTE *)v25, 1ui64, v42);
    goto LABEL_33;
  }
  if( (a5 & 1) == 0 )
  {
    MiReleaseFreshPage(v19);
    return 4i64;
  }
  if( v22 )
    MiZeroPhysicalPage(PageFrameIndex, 1ui64, v21);
  v111 = 1;
  p_u4 = &MmGetPfnDb()->u4;
  v27 = MmGetPteBase();
LABEL_33:
  v112 = *(_BYTE *)(&PerfGlobalGroupMask + 1) & 1;
  v117 = (unsigned __int64 *)((char *)&v27->u.Long + ((v118 >> 9) & 0x7FFFFFFFF8i64));
  v114 = *v117;
  v28 = v114 & 1;
  do
  {
    if( !v28 )
      goto LABEL_229;
    v29 = v114;
    if( (v114 & 0x200) != 0 )
      goto LABEL_229;
    MiPteInShadowRange((UINT64)&v114);
    v43 = (v29 >> 12) & 0xFFFFFFFFFi64;
    v129 = 48 * v43;
  }
  while( (p_u4[6 * v43]._bf_0 & 0x4000000000000i64) == 0 );
  v44 = &MmGetPfnDb()[v43];
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  LODWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)&v44->u2, 0x3Fui64) )
  {
    do
      KeYieldProcessorEx(&SpinCount);
    while( v44->u2._bf_0 < 0 );
  }
  v46 = (__int64 *)v117;
  v47 = *v117;
  v114 = v47;
  if( (v47 & 1) == 0 || (v47 & 0x200) != 0 || v43 != ((v47 >> 12) & 0xFFFFFFFFFi64) )
  {
    _InterlockedAnd64(&v44->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
    if( CurrentIrql != 17 )
      __writecr8(CurrentIrql);
    goto LABEL_229;
  }
  if( !MiAreChargesNeededToLockPage(v44) )
    goto LABEL_98;
  LOBYTE(v51) = MI_PFN_IS_PROTO((_UNICODE_STRING *)v44, v48, v49, v50);
  if( v51 && (*(_DWORD *)(&v44->3 + 1) & 0x400i64) != 0 )
  {
    v53 = 1;
  }
  else
  {
    MiIsPfnCommitNotCharged(v52);
    v53 = v54;
    if( v55 )
      v53 = 1;
  }
  v56 = ((unsigned __int64)v44->u4._bf_0 >> 39) & 0x3FF;
  v57 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * v56);
  if( !v53 || MiChargeCommit(*(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * v56), 1ui64, 4ui64) )
  {
    if( v57 == &Irp )
    {
      v58 = KeGetCurrentPrcb();
      CachedResidentAvailable = v58->CachedResidentAvailable;
      while( CachedResidentAvailable )
      {
        if( CachedResidentAvailable == -1 )
          break;
        v60 = CachedResidentAvailable;
        CachedResidentAvailable = _InterlockedCompareExchange(
                                    (volatile signed __int32 *)&v58->CachedResidentAvailable,
                                    CachedResidentAvailable - 1,
                                    CachedResidentAvailable);
        if( v60 == CachedResidentAvailable )
          goto LABEL_98;
      }
    }
    v61 = MiChargePartitionResidentAvailable(v57, 1ui64, 0xFFFFFFFFui64);
    if( v61 == MiChargeFailed && v53 )
      MiReturnCommit(v57, 1ui64);
    if( v61 )
LABEL_98:
      ++v44->u3.ReferenceCount;
  }
  if( CurrentIrql == 17 )
  {
    MiLockOwnedProtoPage(v44, 0x11u);
  }
  else
  {
    v110 = CurrentIrql;
    LODWORD(v115) = 0;
    v62 = (_MMPTE *)(v44->PteLong | 0x8000000000000000ui64);
    v130 = v62;
    v63 = *((_BYTE *)&v44->u3 + 2);
    if( (v63 & 0x20) != 0 )
    {
      do
      {
        _InterlockedAnd64(&v44->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
        __writecr8(CurrentIrql);
        LODWORD(v115) = 0;
        while( (*(_BYTE *)(&v44->u3 + 1) & 0x20) != 0 )
          KeYieldProcessorEx(&v115);
        MiLockPageInline(v44);
        v63 = *((_BYTE *)&v44->u3 + 2);
      }
      while( (v63 & 0x20) != 0 );
      v62 = v130;
      v46 = (__int64 *)v117;
    }
    *((_BYTE *)&v44->u3 + 2) = v63 | 0x20;
    if( (v44->u2._bf_0 & 0x4000000000000000i64) == 0 && (v62->u.Long & 0x20) == 0 )
      MiWriteValidPteVolatile(v62, 1ui64);
    _InterlockedAnd64(&v44->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
  }
  v64 = (_QWORD *)v118;
  v65.Long = *(unsigned __int64 *)v118;
  v126.Long = v65.Long;
  if( (v65.Long & 1) != 0 || (v65.Long & 0x800) != 0 && (v65.Long & 0x400) == 0 || v20 != ((v65.Long >> 5) & 0x1F) )
  {
    MiUnlockProtoPoolPage((ULONG_PTR)v44, v110);
LABEL_229:
    MiLockAndInsertPageInFreeList(Pfn1);
    return 1i64;
  }
  HIDWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)&Pfn1->u2, 0x3Fui64) )
  {
    do
      KeYieldProcessorEx((UINT64 *)((char *)&SpinCount + 4));
    while( Pfn1->u2._bf_0 < 0 );
  }
  v66 = -9i64;
  if( (*v64 & 0x400i64) != 0 )
    v66 = -2049i64;
  Pfn1->OriginalPte.u.Long = *v64 & v66;
  Pfn1->u4._bf_0 |= 0x8000000000000000ui64;
  bf_0 = Pfn1->u4._bf_0;
  if( v20 )
  {
    if( v20 == 31 )
    {
      v68 = MiCached;
    }
    else if( v20 >> 3 == 3 && (v20 & 7) != 0 )
    {
      v68 = MiWriteCombined;
    }
    else
    {
      v68 = v20 >> 3 != 1;
    }
  }
  else
  {
    v68 = MiNotMapped;
  }
  Pfn1->u3.ReferenceCount = 1;
  v123 = *v46;
  v69 = (v123 >> 12) & 0xFFFFFFFFFi64;
  Pfn1->u4._bf_0 = bf_0 ^ (bf_0 ^ v69) & 0xFFFFFFFFFi64;
  v70 = 6 * v69;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  if( (CurrentThread->SameThreadApcFlags & 0x100) != 0 )
  {
    HIDWORD(v115) = (CurrentThread->SameThreadApcFlags & 0xE00) >> 9;
  }
  else
  {
    v72 = (CurrentThread->CrossThreadFlags >> 12) & 7;
    if( (CurrentThread->Tcb.Process->Flags & 0x100000) != 0 )
    {
      v73 = 2;
      if( v72 < 2 )
        v73 = (CurrentThread->CrossThreadFlags >> 12) & 7;
      v72 = v73;
    }
    HIDWORD(v115) = v72;
  }
  LODWORD(v122) = 0;
  p_u2 = &MmGetPfnDb()->u2;
  while( _interlockedbittestandset64((volatile signed __int32 *)&p_u2[v70], 0x3Fui64) )
  {
    do
      KeYieldProcessorEx(&v122);
    while( p_u2[v70]._bf_0 < 0 );
  }
  p_u2[v70]._bf_0 ^= (p_u2[v70]._bf_0 ^ ((p_u2[v70]._bf_0 & 0x3FFFFFFFFFFFFFFFi64) + 1)) & 0x3FFFFFFFFFFFFFFFi64;
  _InterlockedAnd64(&p_u2[v70].Lock, 0x7FFFFFFFFFFFFFFFui64);
  v75 = *((_BYTE *)&Pfn1->u3 + 2);
  if( v75 >> 6 != v68 )
  {
    MiChangePageAttribute(Pfn1, v68, 1ui64);
    v75 = *((_BYTE *)&Pfn1->u3 + 2);
  }
  Pfn1->u2._bf_0 = Pfn1->u2._bf_0 & 0xC000000000000000ui64 | 1;
  *((_BYTE *)&Pfn1->u3 + 3) = BYTE4(v115) | *((_BYTE *)&Pfn1->u3 + 3) & 0xF8;
  Pfn1->PteLong = v118;
  v76 = v75 & 0xF8 | 6;
  *((_BYTE *)&Pfn1->u3 + 2) = v76;
  *((_BYTE *)&Pfn1->u3 + 2) = v76 | 0x10;
  if( (a5 & 2) != 0 )
  {
    v77 = *((_BYTE *)&Pfn1->u3 + 3);
    if( (v77 & 8) != 0 || (v77 & 7u) > 2 )
      *((_BYTE *)&Pfn1->u3 + 3) = v77 & 0xF8 | 2;
  }
  if( (*(_DWORD *)(v124 + 56) & 0x20) != 0 || !*(_QWORD *)(v124 + 64) )
    v125 = 0i64;
  v78 = (INT64 *)(v124 + 72);
  v79 = KeGetCurrentIrql();
  __writecr8(2ui64);
  LODWORD(v116) = 0;
  if( _interlockedbittestandset((volatile signed __int32 *)v78, 0x1Fu) )
  {
    KiSetVpThreadSpinLockCount();
    LODWORD(v116) = ExpWaitForSpinLockExclusiveAndAcquire(v78, v79);
  }
  v80 = *(_DWORD *)v78;
  while( (v80 & 0xBFFFFFFF) != 0x80000000 )
  {
    if( (v80 & 0x40000000) == 0 )
    {
      v82 = _InterlockedCompareExchange((volatile signed __int32 *)v78, v80 | 0x40000000, v80);
      v81 = v80 == v82;
      v80 = v82;
      if( !v81 )
        continue;
    }
    KeYieldProcessorEx(&v116);
    v80 = *(_DWORD *)v78;
  }
  ++*(_QWORD *)(v124 + 32);
  if( v125 )
    ++*(_DWORD *)(v125 + 104);
  *(_DWORD *)v78 = 0;
  __writecr8(v79);
  v83 = BYTE4(v116) & 0x1F;
  v84 = ((PageFrameIndex & 0xFFFFFFFFFi64) << 12) | MmProtectToPteMask[BYTE4(v116) & 0x1F] & 0xFFFF000000000E7Fui64 | 0x21;
  if( MmGetPteBase() )
  {
    v85 = ((PageFrameIndex & 0xFFFFFFFFFi64) << 12) | MmProtectToPteMask[BYTE4(v116) & 0x1F] & 0xFFFF000000000E7Fui64 | 0x121;
  }
  else
  {
    if( !MmGetPdeBase() )
    {
      v84 = ((PageFrameIndex & 0xFFFFFFFFFi64) << 12) & 0x7FFFFFFFFFFFFFFFi64 | MmProtectToPteMask[BYTE4(v116) & 0x1F] & 0x7FFF000000000E7Fi64 | 0x21;
      if( MiUserPdeOrAbove(0i64) )
        v84 |= 4ui64;
    }
    v85 = v84 | 4;
    if( MiIsAddressGlobal(0i64) )
      v85 = v86 | 0x104;
  }
  if( (v83 & 5) == 4 )
    v85 |= 0x42ui64;
  v87 = v85 & 0xF0FFFFFFFFFFFEFFui64 | 0xA00000000000000i64;
  v126.Long = v87;
  PxeUserLimit = MmGetPxeUserLimit();
  if( v118 >= (unsigned __int64)MmGetPml4eBase()
    && v118 <= (unsigned __int64)PxeUserLimit
    && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 )
  {
    v87 |= 0x8000000000000000ui64;
  }
  *(_QWORD *)v118 = v87;
  Long = v126.Long;
  if( v127 >= MmGetPml4eBase()
    && v127 <= PxeUserLimit
    && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0
    && (v126.Long & 1) != 0 )
  {
    Long = v126.Long | 0x8000000000000000ui64;
  }
  v127->u.Long = Long;
  if( v112 )
  {
    *(_OWORD *)PfnIdentity = 0i64;
    v138 = 0i64;
    MiIdentifyPfn(Pfn1, PfnIdentity);
  }
  if( (*(_BYTE *)(&Pfn1->u3 + 1) & 7) != 6 )
    MiBadShareCount();
  v90 = (Pfn1->u2._bf_0 & 0x3FFFFFFFFFFFFFFFi64) - 1;
  Pfn1->u2._bf_0 ^= (v90 ^ Pfn1->u2._bf_0) & 0x3FFFFFFFFFFFFFFFi64;
  if( !v90 )
    MiPfnShareCountIsZero(Pfn1, 0i64);
  _InterlockedAnd64(&Pfn1->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
  HIDWORD(v122) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)&v44->u2, 0x3Fui64) )
  {
    do
      KeYieldProcessorEx((UINT64 *)((char *)&v122 + 4));
    while( v44->u2._bf_0 < 0 );
  }
  *((_BYTE *)&v44->u3 + 2) &= ~0x20u;
  ReferenceCount = v44->u3.ReferenceCount;
  if( !ReferenceCount )
    MiBadRefCount(v44);
  v92 = ReferenceCount - 1;
  v44->u3.ReferenceCount = v92;
  if( !v92 )
  {
    LOBYTE(v93) = MiIsPfnFileOnly((INT64)v44);
    if( v93 )
      goto LABEL_222;
  }
  v94 = v44->u4._bf_0;
  if( (v94 & 0x1000000000i64) == 0 && (v94 & 0x2000000000000i64) == 0 )
  {
    v95 = v44->u2._bf_0 & 0x3FFFFFFFFFFFFFFFi64;
    if( !v92 )
      goto LABEL_193;
    if( v92 == 1 )
    {
      if( v95 )
        goto LABEL_193;
    }
    else if( v92 != 2 || !v95 )
    {
      goto LABEL_223;
    }
    if( (*(_BYTE *)(&v44->u3 + 1) & 8) == 0 )
      goto LABEL_223;
LABEL_193:
    v96 = MmGetPteBase();
    v97 = (wchar_t *)(v44->PteLong | 0x8000000000000000ui64);
    if( v97 > (wchar_t *)&v96[0x7FFFFFFEFi64] || v97 < (wchar_t *)v96 )
    {
      v98 = *((_BYTE *)&v44->u3 + 3);
      if( (v98 & 0x20) != 0 )
      {
        *((_BYTE *)&v44->u3 + 3) = v98 & 0xDF;
        goto LABEL_221;
      }
    }
    LOBYTE(v99) = MI_PFN_IS_PROTO((_UNICODE_STRING *)v44, 0i64, v94, v97);
    if( v99 && (*(_DWORD *)(&v44->3 + 1) & 0x400i64) != 0 )
    {
      v100 = 1;
    }
    else if( v102 <= v104 && v102 >= (unsigned __int64)v96 && (*((_BYTE *)&v44->u3 + 3) & 0x20) != 0 )
    {
      v100 = 1;
    }
    else if( !v92 && (v103 & 0x4000000000000000i64) != 0 )
    {
      v100 = 1;
    }
    v105 = (v101 >> 39) & 0x3FF;
    v106 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * v105);
    if( v100 == 1 )
      MiReturnCommit(*(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * v105), 1ui64);
    v94 = 1i64;
    if( v106 == &Irp )
    {
      v107 = KeGetCurrentPrcb();
      v108 = (int)v107->CachedResidentAvailable;
      if( (_DWORD)v108 != -1 )
      {
        if( (unsigned __int64)(v108 + 1) <= 0x100 )
        {
          while( 1 )
          {
            v109 = _InterlockedCompareExchange(
                     (volatile signed __int32 *)&v107->CachedResidentAvailable,
                     v108 + 1,
                     v108);
            v81 = (_DWORD)v108 == v109;
            LODWORD(v108) = v109;
            if( v81 )
              break;
            if( v109 == -1 || (unsigned __int64)(v109 + 1i64) > 0x100 )
              goto LABEL_215;
          }
LABEL_221:
          if( !v92 )
          {
LABEL_222:
            MiPfnReferenceCountIsZero(v44, v129 / 48, v94);
            goto LABEL_223;
          }
          goto LABEL_223;
        }
LABEL_215:
        if( (int)v108 > 192
          && (_DWORD)v108 != -1
          && (_DWORD)v108 == _InterlockedCompareExchange(
                               (volatile signed __int32 *)&v107->CachedResidentAvailable,
                               192,
                               v108) )
        {
          v94 = (int)v108 - 192 + 1i64;
        }
        if( !v94 )
          goto LABEL_221;
      }
    }
    LOBYTE(v94) = _InterlockedExchangeAdd64((volatile signed __int64 *)&v106->Vp.ResidentAvailablePages, v94);
    goto LABEL_221;
  }
LABEL_223:
  _InterlockedAnd64(&v44->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
  __writecr8(v110);
  *v128 = 0;
  if( v112 )
  {
    *((_QWORD *)&v138 + 1) |= 4ui64;
    v139[0] = (__int64)PfnIdentity;
    v139[1] = 32i64;
    EtwTraceKernelEvent((__int64)v139, 1u, 0x20000001u, 0x282u, 0x11401B02u);
  }
  return v111 != 0 ? 4 : 0;
}

Referenced by:

MmCopyToCachedPage