MiMakePageAvoidRead

INT64 __fastcall MiMakePageAvoidRead(INT64 a1, UINT8 *a2, UINT64 a3, UINT64 a4, CHAR a5, _MMPTE *a6, _DWORD *a7){
  __int64 v8; 
  __int64 v9; 
  _MI_PARTITION *v10; 
  struct _KPRCB *CurrentPrcb; 
  int v12; 
  int v13; 
  signed __int32 v14; 
  UINT64 v15; 
  __int64 Page; 
  UINT64 v17; 
  char *v19; 
  unsigned int v20; 
  _MI_PFN_CACHE_ATTRIBUTE v21; 
  int v22; 
  signed __int64 i; 
  signed __int64 v24; 
  unsigned __int64 v25; 
  char *v26; 
  _MMPTE *v27; 
  UINT64 v28; 
  UINT64 v29; 
  char v30; 
  int v31; 
  UINT64 v32; 
  unsigned __int64 PteBase; 
  _MMPTE *PteLimit; 
  unsigned __int64 v35; 
  int v36; 
  int v37; 
  __int64 v38; 
  UINT8 *v39; 
  __int64 v40; 
  char *v41; 
  unsigned __int8 CurrentIrql; 
  __int64 *v43; 
  UINT64 v44; 
  UNICODE_STRING *v45; 
  UINT8 v46; 
  WCHAR *v47; 
  int v48; 
  INT64 v49; 
  char v50; 
  int IsPfnCommitNotCharged; 
  char v52; 
  __int64 v53; 
  ULONG_PTR *v54; 
  struct _KPRCB *v55; 
  signed __int32 v56; 
  signed __int32 v57; 
  int v58; 
  MMPTE *v59; 
  char v60; 
  _QWORD *v61; 
  unsigned __int64 v62; 
  __int64 v63; 
  __int64 v64; 
  unsigned int v65; 
  unsigned __int64 v66; 
  __int64 v67; 
  _ETHREAD *CurrentThread; 
  unsigned int v69; 
  int v70; 
  char *v71; 
  unsigned __int8 v72; 
  char v73; 
  char v74; 
  RTL_BITMAP *v75; 
  unsigned __int8 v76; 
  UINT64 *v77; 
  signed __int32 SizeOfBitMap; 
  bool v79; 
  signed __int32 v80; 
  char v81; 
  UINT64 v82; 
  UINT64 v83; 
  __int64 v84; 
  unsigned __int64 v85; 
  _MMPTE *PxeUserLimit; 
  unsigned __int64 v87; 
  UINT64 v88; 
  __int16 v89; 
  __int16 v90; 
  __int64 v91; 
  __int64 v92; 
  _MMPTE *v93; 
  WCHAR *v94; 
  char v95; 
  int v96; 
  int v97; 
  unsigned __int64 v98; 
  unsigned __int64 v99; 
  __int64 v100; 
  unsigned __int64 v101; 
  __int64 v102; 
  __int64 v103; 
  struct _KPRCB *v104; 
  __int64 v105; 
  signed __int32 v106; 
  UINT64 Flag; 
  unsigned __int8 v108; 
  int v109; 
  int v110; 
  _MMPFN *Pfn1; 
  UINT64 v112; 
  UINT64 v113; 
  UINT64 v114; 
  UINT64 *v115; 
  unsigned __int64 v116; 
  UINT64 PageFrameIndex; 
  unsigned int v118; 
  UINT64 SpinCount; 
  UINT64 v120; 
  unsigned __int64 v121; 
  __int64 v122; 
  __int64 v123; 
  unsigned __int64 v124; 
  _MMPTE *v125; 
  _DWORD *v126; 
  INT64 v127; 
  _MMPTE *v128; 
  void *Src; 
  char *v130; 
  unsigned __int64 v131; 
  __int64 v132; 
  __int64 v133; 
  __int64 v134; 
  UINT64 a2a[2]; 
  __int128 v136; 
  EVENT_DATA_DESCRIPTOR EventData; 
  v8 = (unsigned int)a3;
  Src = a2;
  v116 = a1;
  v125 = a6;
  v127 = a1;
  v128 = a6;
  v126 = a7;
  v108 = 0;
  *(_OWORD *)a2a = 0i64;
  v136 = 0i64;
  *a7 = 0;
  v9 = *(_QWORD *)a6;
  v124 = *(_QWORD *)a6;
  if( qword_140C4DC80 )
  {
    if( (v9 & 0x10) != 0 )
      v9 &= ~0x10ui64;
    else
      v9 &= ~qword_140C4DC80;
  }
  v123 = v9 >> 16;
  v133 = v9 >> 16;
  v122 = *(_QWORD *)(v9 >> 16);
  v132 = v122;
  v10 = *(_MI_PARTITION **)(qword_140C4E388 + 8i64 * (*(_WORD *)(v122 + 60) & 0x3FF));
  if( ((*(_DWORD *)(v122 + 56) >> 20) & 0x3F) != 0 )
  {
    CurrentPrcb = KeGetCurrentPrcb();
    v12 = (((*(_DWORD *)(v122 + 56) >> 20) & 0x3F) - 1) << byte_140C4DBCC;
  }
  else
  {
    CurrentPrcb = *(&KiProcessorBlock + *((unsigned int *)KeGetCurrentThread() + 147));
    v12 = *((_DWORD *)CurrentPrcb + 8134);
  }
  v13 = (1 << byte_140C4DBCD) - 1;
  v14 = v13 & _InterlockedExchangeAdd((volatile signed __int32 *)CurrentPrcb + 8132, 1u);
  v15 = 0i64;
  if( a4 != 4096 )
    v15 = 2i64;
  Page = MiGetPage(v10, v12 | (unsigned int)v14, v15);
  PageFrameIndex = Page;
  v134 = Page;
  if( Page == -1 )
  {
    MiWaitForFreePage(v10, v17);
    return 1i64;
  }
  v19 = (char *)MmGetPfnDb() + 48 * Page;
  Pfn1 = (_MMPFN *)v19;
  v130 = v19;
  v20 = (*(_QWORD *)a6 >> 5) & 0x1F;
  v118 = v20;
  HIDWORD(v114) = 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;
  v109 = 0;
  if( a4 != 4096 && MiPfnZeroingNeeded((INT64)v19, (unsigned int)v21) )
    v22 = 1;
  if( (unsigned __int8)v19[34] >> 6 != v21 )
    MiChangePageAttribute((INT64)v19, (unsigned int)v21, 0);
  for( i = *((_QWORD *)v19 + 3); ; i = v24 )
  {
    v24 = _InterlockedCompareExchange64((volatile signed __int64 *)v19 + 3, i & 0xF0FFFFFFFFFFFFFFui64, i);
    if( i == v24 )
      break;
  }
  v25 = MiReservePtes((INT64)&qword_140C4EC80, 1ui64);
  v131 = v25;
  if( v25 )
  {
    v30 = 4;
    if( PageFrameIndex <= 0xFFFFFFFFFi64
      && (*((_QWORD *)MmGetPfnDb() + 6 * PageFrameIndex + 5) & 0x4000000000000i64) != 0 )
    {
      v31 = *((unsigned __int8 *)MmGetPfnDb() + 48 * PageFrameIndex + 34) >> 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 *)&antNameB + ((v35 >> 39) & 0x1FF) - 256) == 1
        || v35 >= PteBase && v35 <= (unsigned __int64)PteLimit )
      {
        goto LABEL_65;
      }
      if( v35 < qword_140C4F878 || (v37 = HIBYTE(word_140C4DD48), v35 > qword_140C4E0A8) )
        v37 = (unsigned __int8)word_140C4DD48;
    }
    else
    {
      v37 = HIBYTE(word_140C4DD48);
    }
    if( v37 )
LABEL_64:
      v32 |= 0x100ui64;
LABEL_65:
    *(_QWORD *)v25 = v32 & 0xFAFFFFFFFFFFFEFFui64 | ((unsigned __int64)(word_140C4DD48 & 1) << 8) | 0xA00000000000042i64;
    v38 = (__int64)((v25 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
    v39 = (UINT8 *)(v38 + v8);
    if( v22 )
    {
      if( (_DWORD)v8 )
        memset(v38, 0i64);
      if( 4096 - v8 != a4 )
        memset((INT64)&v39[a4], 0i64);
    }
    memmove(v39, (UINT8 *)Src, a4);
    v26 = (char *)MmGetPfnDb() + 40;
    v27 = MmGetPteBase();
    MiReleasePtes((INT64)&qword_140C4EC80, v25, 1ui64);
    goto LABEL_33;
  }
  if( (a5 & 1) == 0 )
  {
    MiReleaseFreshPage((_MMPFN *)v19);
    return 4i64;
  }
  if( v22 )
    MiZeroPhysicalPage(PageFrameIndex, 1ui64, v21);
  v109 = 1;
  v26 = (char *)MmGetPfnDb() + 40;
  v27 = MmGetPteBase();
LABEL_33:
  v110 = BYTE4(PerfGlobalGroupMask) & 1;
  v115 = (UINT64 *)((char *)v27 + ((v116 >> 9) & 0x7FFFFFFFF8i64));
  v112 = *v115;
  v28 = v112 & 1;
  do
  {
    if( !v28 )
      goto LABEL_226;
    v29 = v112;
    if( (v112 & 0x200) != 0 )
      goto LABEL_226;
    MiPteInShadowRange((UINT64)&v112);
    v40 = (v29 >> 12) & 0xFFFFFFFFFi64;
    v127 = 48 * v40;
  }
  while( (*(_QWORD *)&v26[48 * v40] & 0x4000000000000i64) == 0 );
  v41 = (char *)MmGetPfnDb() + 48 * v40;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  LODWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)v41 + 6, 0x3Fui64) )
  {
    do
      KeYieldProcessorEx(&SpinCount);
    while( *((__int64 *)v41 + 3) < 0 );
  }
  v43 = (__int64 *)v115;
  v44 = *v115;
  v112 = v44;
  if( (v44 & 1) == 0 || (v44 & 0x200) != 0 || v40 != ((v44 >> 12) & 0xFFFFFFFFFi64) )
  {
    _InterlockedAnd64((volatile signed __int64 *)v41 + 3, 0x7FFFFFFFFFFFFFFFui64);
    if( CurrentIrql != 17 )
      __writecr8(CurrentIrql);
    goto LABEL_226;
  }
  if( !(unsigned int)MiAreChargesNeededToLockPage((INT64)v41) )
    goto LABEL_95;
  LOBYTE(v48) = MI_PFN_IS_PROTO((UNICODE_STRING *)v41, v45, v46, v47);
  if( v48 && (*((_DWORD *)v41 + 4) & 0x400i64) != 0 )
  {
    v50 = 1;
  }
  else
  {
    IsPfnCommitNotCharged = MiIsPfnCommitNotCharged(v49);
    v50 = v52;
    if( IsPfnCommitNotCharged )
      v50 = 1;
  }
  v53 = (*((_QWORD *)v41 + 5) >> 39) & 0x3FFi64;
  v54 = *(ULONG_PTR **)(qword_140C4E388 + 8 * v53);
  if( !v50 || (unsigned int)MiChargeCommit(*(_MI_PARTITION **)(qword_140C4E388 + 8 * v53), 1ui64, 4ui64) )
  {
    if( v54 == &MiSystemPartition )
    {
      v55 = KeGetCurrentPrcb();
      v56 = *((_DWORD *)v55 + 8391);
      while( v56 )
      {
        if( v56 == -1 )
          break;
        v57 = v56;
        v56 = _InterlockedCompareExchange((volatile signed __int32 *)v55 + 8391, v56 - 1, v56);
        if( v57 == v56 )
          goto LABEL_95;
      }
    }
    v58 = MiChargePartitionResidentAvailable((INT64)v54, 1ui64, 0xFFFFFFFFi64);
    if( !v58 && v50 )
      MiReturnCommit((_MI_PARTITION *)v54, 1ui64);
    if( v58 )
LABEL_95:
      ++*((_WORD *)v41 + 16);
  }
  if( CurrentIrql == 17 )
  {
    MiLockOwnedProtoPage((INT64)v41, 0x11u);
  }
  else
  {
    v108 = CurrentIrql;
    LODWORD(v113) = 0;
    v59 = (MMPTE *)(*((_QWORD *)v41 + 1) | 0x8000000000000000ui64);
    v128 = v59;
    v60 = v41[34];
    if( (v60 & 0x20) != 0 )
    {
      do
      {
        _InterlockedAnd64((volatile signed __int64 *)v41 + 3, 0x7FFFFFFFFFFFFFFFui64);
        __writecr8(CurrentIrql);
        LODWORD(v113) = 0;
        while( (v41[34] & 0x20) != 0 )
          KeYieldProcessorEx(&v113);
        MiLockPageInline((INT64)v41);
        v60 = v41[34];
      }
      while( (v60 & 0x20) != 0 );
      v59 = v128;
      v43 = (__int64 *)v115;
    }
    v41[34] = v60 | 0x20;
    if( (*((_QWORD *)v41 + 3) & 0x4000000000000000i64) == 0 && (*(_BYTE *)v59 & 0x20) == 0 )
      MiWriteValidPteVolatile(v59, 1ui64);
    _InterlockedAnd64((volatile signed __int64 *)v41 + 3, 0x7FFFFFFFFFFFFFFFui64);
  }
  v61 = (_QWORD *)v116;
  v62 = *(_QWORD *)v116;
  v124 = v62;
  if( (v62 & 1) != 0 || (v62 & 0x800) != 0 && (v62 & 0x400) == 0 || v20 != ((v62 >> 5) & 0x1F) )
  {
    MiUnlockProtoPoolPage((_MMPFN *)v41, v108);
LABEL_226:
    MiLockAndInsertPageInFreeList(Pfn1);
    return 1i64;
  }
  HIDWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)Pfn1 + 6, 0x3Fui64) )
  {
    do
      KeYieldProcessorEx((UINT64 *)((char *)&SpinCount + 4));
    while( *((__int64 *)Pfn1 + 3) < 0 );
  }
  v63 = -9i64;
  if( (*v61 & 0x400i64) != 0 )
    v63 = -2049i64;
  *((_QWORD *)Pfn1 + 2) = *v61 & v63;
  *((_QWORD *)Pfn1 + 5) |= 0x8000000000000000ui64;
  v64 = *((_QWORD *)Pfn1 + 5);
  if( v20 )
  {
    if( v20 == 31 )
    {
      v65 = 1;
    }
    else if( v20 >> 3 == 3 && (v20 & 7) != 0 )
    {
      v65 = 2;
    }
    else
    {
      v65 = v20 >> 3 != 1;
    }
  }
  else
  {
    v65 = 3;
  }
  *((_WORD *)Pfn1 + 16) = 1;
  v121 = *v43;
  v66 = (v121 >> 12) & 0xFFFFFFFFFi64;
  *((_QWORD *)Pfn1 + 5) = v64 ^ (v64 ^ v66) & 0xFFFFFFFFFi64;
  v67 = 48 * v66;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  if( (*((_DWORD *)CurrentThread + 326) & 0x100) != 0 )
  {
    HIDWORD(v113) = (*((_DWORD *)CurrentThread + 326) & 0xE00u) >> 9;
  }
  else
  {
    v69 = (*((_DWORD *)CurrentThread + 324) >> 12) & 7;
    if( (*(_DWORD *)(*((_QWORD *)CurrentThread + 68) + 1124i64) & 0x100000) != 0 )
    {
      v70 = 2;
      if( v69 < 2 )
        v70 = (*((_DWORD *)CurrentThread + 324) >> 12) & 7;
      v69 = v70;
    }
    HIDWORD(v113) = v69;
  }
  LODWORD(v120) = 0;
  v71 = (char *)MmGetPfnDb() + 24;
  while( _interlockedbittestandset64((volatile signed __int32 *)&v71[v67], 0x3Fui64) )
  {
    do
      KeYieldProcessorEx(&v120);
    while( *(__int64 *)&v71[v67] < 0 );
  }
  *(_QWORD *)&v71[v67] ^= (*(_QWORD *)&v71[v67] ^ ((*(_QWORD *)&v71[v67] & 0x3FFFFFFFFFFFFFFFi64) + 1)) & 0x3FFFFFFFFFFFFFFFi64;
  _InterlockedAnd64((volatile signed __int64 *)&v71[v67], 0x7FFFFFFFFFFFFFFFui64);
  v72 = *((_BYTE *)Pfn1 + 34);
  if( v72 >> 6 != v65 )
  {
    MiChangePageAttribute((INT64)Pfn1, v65, 1);
    v72 = *((_BYTE *)Pfn1 + 34);
  }
  *((_QWORD *)Pfn1 + 3) = *((_QWORD *)Pfn1 + 3) & 0xC000000000000000ui64 | 1;
  *((_BYTE *)Pfn1 + 35) = BYTE4(v113) | *((_BYTE *)Pfn1 + 35) & 0xF8;
  *((_QWORD *)Pfn1 + 1) = v116;
  v73 = v72 & 0xF8 | 6;
  *((_BYTE *)Pfn1 + 34) = v73;
  *((_BYTE *)Pfn1 + 34) = v73 | 0x10;
  if( (a5 & 2) != 0 )
  {
    v74 = *((_BYTE *)Pfn1 + 35);
    if( (v74 & 8) != 0 || (v74 & 7u) > 2 )
      *((_BYTE *)Pfn1 + 35) = v74 & 0xF8 | 2;
  }
  if( (*(_DWORD *)(v122 + 56) & 0x20) != 0 || !*(_QWORD *)(v122 + 64) )
    v123 = 0i64;
  v75 = (RTL_BITMAP *)(v122 + 72);
  v76 = KeGetCurrentIrql();
  __writecr8(2ui64);
  LODWORD(v114) = 0;
  if( _interlockedbittestandset((volatile signed __int32 *)v75, 0x1Fu) )
  {
    KiSetVpThreadSpinLockCount();
    LODWORD(v114) = ExpWaitForSpinLockExclusiveAndAcquire(v75, v76, v77);
  }
  SizeOfBitMap = v75->SizeOfBitMap;
  while( (SizeOfBitMap & 0xBFFFFFFF) != 0x80000000 )
  {
    if( (SizeOfBitMap & 0x40000000) == 0 )
    {
      v80 = _InterlockedCompareExchange((volatile signed __int32 *)v75, SizeOfBitMap | 0x40000000, SizeOfBitMap);
      v79 = SizeOfBitMap == v80;
      SizeOfBitMap = v80;
      if( !v79 )
        continue;
    }
    KeYieldProcessorEx(&v114);
    SizeOfBitMap = v75->SizeOfBitMap;
  }
  ++*(_QWORD *)(v122 + 32);
  if( v123 )
    ++*(_DWORD *)(v123 + 104);
  v75->SizeOfBitMap = 0;
  __writecr8(v76);
  v81 = BYTE4(v114) & 0x1F;
  v82 = ((PageFrameIndex & 0xFFFFFFFFFi64) << 12) | MmProtectToPteMask[BYTE4(v114) & 0x1F] & 0xFFFF000000000E7Fui64 | 0x21;
  if( MmGetPteBase() )
  {
    v83 = ((PageFrameIndex & 0xFFFFFFFFFi64) << 12) | MmProtectToPteMask[BYTE4(v114) & 0x1F] & 0xFFFF000000000E7Fui64 | 0x121;
  }
  else
  {
    if( !MmGetPdeBase() )
    {
      v82 = ((PageFrameIndex & 0xFFFFFFFFFi64) << 12) & 0x7FFFFFFFFFFFFFFFi64 | MmProtectToPteMask[BYTE4(v114) & 0x1F] & 0x7FFF000000000E7Fi64 | 0x21;
      if( (unsigned int)MiUserPdeOrAbove(0i64) )
        v82 |= 4ui64;
    }
    v83 = v82 | 4;
    if( (unsigned int)MiIsAddressGlobal(0i64) )
      v83 = v84 | 0x104;
  }
  if( (v81 & 5) == 4 )
    v83 |= 0x42ui64;
  v85 = v83 & 0xF0FFFFFFFFFFFEFFui64 | 0xA00000000000000i64;
  v124 = v85;
  PxeUserLimit = MmGetPxeUserLimit();
  if( v116 >= (unsigned __int64)MmGetPml4eBase()
    && v116 <= (unsigned __int64)PxeUserLimit
    && (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0 )
  {
    v85 |= 0x8000000000000000ui64;
  }
  *(_QWORD *)v116 = v85;
  v87 = v124;
  if( v125 >= MmGetPml4eBase()
    && v125 <= PxeUserLimit
    && (*(_DWORD *)(*((_QWORD *)KeGetCurrentThread() + 23) + 2172i64) & 0x1000) != 0
    && (v124 & 1) != 0 )
  {
    v87 = v124 | 0x8000000000000000ui64;
  }
  *(_QWORD *)v125 = v87;
  if( v110 )
  {
    *(_OWORD *)a2a = 0i64;
    v136 = 0i64;
    MiIdentifyPfn(Pfn1, a2a);
  }
  if( (*((_BYTE *)Pfn1 + 34) & 7) != 6 )
    MiBadShareCount(Pfn1);
  v88 = (*((_QWORD *)Pfn1 + 3) & 0x3FFFFFFFFFFFFFFFi64) - 1;
  *((_QWORD *)Pfn1 + 3) ^= (v88 ^ *((_QWORD *)Pfn1 + 3)) & 0x3FFFFFFFFFFFFFFFi64;
  if( !v88 )
    MiPfnShareCountIsZero((UINT64)Pfn1, 0i64);
  _InterlockedAnd64((volatile signed __int64 *)Pfn1 + 3, 0x7FFFFFFFFFFFFFFFui64);
  HIDWORD(v120) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)v41 + 6, 0x3Fui64) )
  {
    do
      KeYieldProcessorEx((UINT64 *)((char *)&v120 + 4));
    while( *((__int64 *)v41 + 3) < 0 );
  }
  v41[34] &= ~0x20u;
  v89 = *((_WORD *)v41 + 16);
  if( !v89 )
    MiBadRefCount((_MMPFN *)v41, v88);
  v90 = v89 - 1;
  *((_WORD *)v41 + 16) = v90;
  if( !v90 && MiIsPfnFileOnly((INT64)v41) )
    goto LABEL_219;
  v91 = *((_QWORD *)v41 + 5);
  if( (v91 & 0x1000000000i64) == 0 && (v91 & 0x2000000000000i64) == 0 )
  {
    v92 = *((_QWORD *)v41 + 3) & 0x3FFFFFFFFFFFFFFFi64;
    if( !v90 )
      goto LABEL_190;
    if( v90 == 1 )
    {
      if( v92 )
        goto LABEL_190;
    }
    else if( v90 != 2 || !v92 )
    {
      goto LABEL_220;
    }
    if( (v41[34] & 8) == 0 )
      goto LABEL_220;
LABEL_190:
    v93 = MmGetPteBase();
    v94 = (WCHAR *)(*((_QWORD *)v41 + 1) | 0x8000000000000000ui64);
    if( v94 > (WCHAR *)v93 + 0x1FFFFFFFBCi64 || v94 < (WCHAR *)v93 )
    {
      v95 = v41[35];
      if( (v95 & 0x20) != 0 )
      {
        v41[35] = v95 & 0xDF;
        goto LABEL_218;
      }
    }
    LOBYTE(v96) = MI_PFN_IS_PROTO((UNICODE_STRING *)v41, 0i64, v91, v94);
    if( v96 && (*((_DWORD *)v41 + 4) & 0x400i64) != 0 )
    {
      v97 = 1;
    }
    else if( v99 <= v101 && v99 >= (unsigned __int64)v93 && (v41[35] & 0x20) != 0 )
    {
      v97 = 1;
    }
    else if( !v90 && (v100 & 0x4000000000000000i64) != 0 )
    {
      v97 = 1;
    }
    v102 = (v98 >> 39) & 0x3FF;
    v103 = *(_QWORD *)(qword_140C4E388 + 8 * v102);
    if( v97 == 1 )
      MiReturnCommit(*(_MI_PARTITION **)(qword_140C4E388 + 8 * v102), 1ui64);
    v91 = 1i64;
    if( (ULONG_PTR *)v103 == &MiSystemPartition )
    {
      v104 = KeGetCurrentPrcb();
      v105 = *((int *)v104 + 8391);
      if( (_DWORD)v105 != -1 )
      {
        if( (unsigned __int64)(v105 + 1) <= 0x100 )
        {
          while( 1 )
          {
            v106 = _InterlockedCompareExchange((volatile signed __int32 *)v104 + 8391, v105 + 1, v105);
            v79 = (_DWORD)v105 == v106;
            LODWORD(v105) = v106;
            if( v79 )
              break;
            if( v106 == -1 || (unsigned __int64)(v106 + 1i64) > 0x100 )
              goto LABEL_212;
          }
LABEL_218:
          if( !v90 )
          {
LABEL_219:
            MiPfnReferenceCountIsZero((_MMPFN *)v41, v127 / 48, (UINT8 *)v91);
            goto LABEL_220;
          }
          goto LABEL_220;
        }
LABEL_212:
        if( (int)v105 > 192
          && (_DWORD)v105 != -1
          && (_DWORD)v105 == _InterlockedCompareExchange((volatile signed __int32 *)v104 + 8391, 192, v105) )
        {
          v91 = (int)v105 - 192 + 1i64;
        }
        if( !v91 )
          goto LABEL_218;
      }
    }
    v91 = _InterlockedExchangeAdd64((volatile signed __int64 *)(v103 + 7168), v91);
    goto LABEL_218;
  }
LABEL_220:
  _InterlockedAnd64((volatile signed __int64 *)v41 + 3, 0x7FFFFFFFFFFFFFFFui64);
  __writecr8(v108);
  *v126 = 0;
  if( v110 )
  {
    *((_QWORD *)&v136 + 1) |= 4ui64;
    EventData.Ptr = (unsigned __int64)a2a;
    *(_QWORD *)&EventData.Size = 32i64;
    LODWORD(Flag) = 289413890;
    EtwTraceKernelEvent(&EventData, 1ui64, 0x20000001ui64, 0x282u, Flag);
  }
  return v109 != 0 ? 4 : 0;
}

Referenced by:

MmCopyToCachedPage