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