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