MiAddWorkingSetEntries
UINT64 __fastcall MiAddWorkingSetEntries(INT64 a1, UINT64 rdx0, UINT8 *r8_0, CHAR a4){
char v4;
unsigned __int64 v7;
unsigned __int64 *v9;
KSPIN_LOCK_QUEUE *v10;
int v11;
UINT8 *v12;
unsigned __int64 v13;
unsigned __int64 v14;
_QWORD *v15;
unsigned __int64 v16;
unsigned __int64 v17;
char v18;
_MMPTE *PteBase;
_MMPTE *PteLimit;
UINT8 *v21;
char v22;
int v23;
unsigned __int8 v24;
UINT64 v25;
unsigned __int64 *v26;
unsigned __int64 v27;
unsigned __int8 v28;
UINT64 result;
UINT64 v30;
UINT64 v31;
INT64 v32;
UINT64 *v33;
__int64 v34;
unsigned __int64 v35;
__int64 v36;
__int64 v37;
__int64 *v38;
__int64 *v39;
__int64 v40;
__int64 v41;
unsigned __int64 v42;
unsigned __int64 *v43;
unsigned __int64 v44;
KSPIN_LOCK_QUEUE *v45;
unsigned __int8 v46;
int v47;
__int64 v48;
__int64 **v49;
__int64 v50;
_MI_PARTITION *v51;
int StandbyRepurposed;
__int64 v53;
int v54;
_KSPIN_LOCK_QUEUE LockQueue;
__int64 v56;
UINT64 v57;
UINT64 v58;
struct _KLOCK_QUEUE_HANDLE LockHandle;
__int64 v60;
UINT64 a2;
__int128 v62;
__int64 v63;
_OWORD a3[2];
v4 = *(_BYTE *)(a1 + 184) & 7;
v56 = 0i64;
a2 = rdx0;
v7 = rdx0;
if( v4 == 2 )
v9 = &qword_140C4F500;
else
v9 = (unsigned __int64 *)(a1 + 256);
LockQueue.Lock = v9;
LockQueue.Next = 0i64;
v10 = (KSPIN_LOCK_QUEUE *)_InterlockedExchange64((volatile __int64 *)v9, (__int64)&LockQueue);
if( v10 )
KxWaitForLockOwnerShip(&LockQueue, v10);
v11 = 1;
if( (a4 & 1) != 0 )
{
v12 = &r8_0[*(_QWORD *)(a1 + 120)];
if( (unsigned __int64)v12 > *(_QWORD *)(a1 + 112) && (*(_BYTE *)(a1 + 187) & 8) == 0 )
{
v13 = *(_QWORD *)(a1 + 136);
v14 = *(_QWORD *)(*(_QWORD *)(a1 + 16) + 32i64);
if( v13 > v14 )
{
v15 = *(_QWORD **)(qword_140C4E388 + 8i64 * *(unsigned __int16 *)(a1 + 174));
v16 = v15[866];
if( (v13 & 0x3F) != 0 )
{
v17 = -1i64;
}
else
{
v17 = v15[888];
if( v17 < v16 / 0x14 )
{
v11 = 1;
if( v13 >= v16 / 0x14 )
{
LABEL_71:
*(_BYTE *)(a1 + 187) |= 8u;
goto LABEL_13;
}
}
else
{
v11 = 1;
}
}
if( v13 - v14 >= 3 * (v16 >> 2) )
{
v51 = *(_MI_PARTITION **)(qword_140C4E388 + 8i64 * *(unsigned __int16 *)(a1 + 174));
v60 = v15[856];
StandbyRepurposed = MiGetStandbyRepurposed(v51, 1ui64);
if( StandbyRepurposed == v54 )
{
v11 = 1;
}
else
{
if( v53 )
v17 = v15[888];
v11 = 1;
if( v17 < 10i64 * *(_QWORD *)(v60 + 2384) )
goto LABEL_71;
}
}
}
if( (*(_BYTE *)(a1 + 184) & 0x40) != 0 && (unsigned __int64)v12 > *(_QWORD *)(a1 + 152) )
goto LABEL_71;
}
}
LABEL_13:
v18 = *(_BYTE *)(a1 + 184);
*(_DWORD *)(a1 + 4) += (_DWORD)r8_0;
if( (v18 & 7) == 2 )
dword_140C4F540 += (int)r8_0;
__addgsdword(0x2E90u, (unsigned int)r8_0);
*(_QWORD *)(a1 + 136) += r8_0;
PteBase = MmGetPteBase();
PteLimit = MmGetPteLimit();
if( v7 < (unsigned __int64)PteBase || v7 > (unsigned __int64)PteLimit )
*(_QWORD *)(a1 + 120) += r8_0;
else
v11 = 0;
v21 = &r8_0[*(_QWORD *)(a1 + 120)];
if( (unsigned __int64)v21 > *(_QWORD *)(a1 + 160) )
*(_QWORD *)(a1 + 160) = v21;
if( (*(_BYTE *)(a1 + 184) & 7) == 2 )
{
qword_140C4F548 += (__int64)r8_0;
if( v11 == 1 )
qword_140C4F550 += (__int64)r8_0;
if( qword_140C4F550 > (unsigned __int64)qword_140C4F558 )
qword_140C4F558 = qword_140C4F550;
}
if( (a4 & 2) != 0 )
{
*(_QWORD *)(a1 + 144) += r8_0;
v62 = 0i64;
v63 = 0i64;
if( v7 < (unsigned __int64)PteBase || v7 > (unsigned __int64)PteLimit )
*(_QWORD *)(a1 + 128) += r8_0;
}
v22 = *(_BYTE *)(a1 + 184);
if( (v22 & 7u) >= 2 )
{
v40 = *(_QWORD *)(qword_140C4E388 + 8i64 * *(unsigned __int16 *)(a1 + 174));
v41 = (v22 & 7u) - 2;
v42 = *(_QWORD *)(a1 + 136) + *(_QWORD *)(v40 + 4352);
if( v42 > *(_QWORD *)(v40 + 8 * v41 + 4360) )
{
*(_QWORD *)(v40 + 8 * v41 + 4360) = v42;
v22 = *(_BYTE *)(a1 + 184);
}
if( (v22 & 7) == 4 )
{
if( PsNtosImageBase
&& (v7 >= PsNtosImageBase && v7 < PsNtosImageEnd || v7 < PsHalImageEnd && v7 >= (unsigned __int64)PsHalImageBase) )
{
LODWORD(xmmword_140C4CA88) = (_DWORD)r8_0 + xmmword_140C4CA88;
}
else
{
if( (unsigned int)MiGetSystemRegionType(v7) == 12
&& MiIsDriverPage((INT64)PteBase + ((v7 >> 9) & 0x7FFFFFFFF8i64)) )
{
DWORD1(xmmword_140C4CA88) += (_DWORD)r8_0;
}
PteLimit = MmGetPteLimit();
}
}
}
v23 = a4 & 4;
if( v23 && r8_0 )
{
while( 1 )
{
if( v7 < (unsigned __int64)PteBase || v7 > (unsigned __int64)PteLimit )
{
v24 = HIBYTE(*(_QWORD *)((char *)PteBase + ((v7 >> 9) & 0x7FFFFFFFF8i64))) & 0xF;
}
else
{
v43 = (unsigned __int64 *)((char *)PteBase + ((v7 >> 9) & 0x7FFFFFFFF8i64));
v44 = *v43;
MiPteInShadowRange((UINT64)v43);
v24 = (*((_BYTE *)MmGetPfnDb() + 48 * ((v44 >> 12) & 0xFFFFFFFFFi64)) >> 1) & 7;
}
if( v7 < (unsigned __int64)PteBase || v7 > (unsigned __int64)MmGetPteLimit() )
{
v25 = *(_QWORD *)((char *)MmGetPdeBase() + ((v7 >> 18) & 0x3FFFFFF8));
v57 = v25;
MiPteInShadowRange((UINT64)&v57);
v26 = (unsigned __int64 *)((char *)MmGetPfnDb() + 48 * ((v25 >> 12) & 0xFFFFFFFFFi64));
v27 = *v26;
v28 = (*v26 >> 14) & 7;
if( ((*v26 >> 4) & 0x3FF) != 0 )
{
if( v24 == v28 )
{
*v26 = v27 ^ ((unsigned __int16)v27 ^ (unsigned __int16)(16 * (((*v26 >> 4) & 0x3FF) + 1))) & 0x3FF0;
}
else if( v24 > v28 )
{
*v26 = v27 & 0xFFFFFFFFFFFE001Fui64 | ((unsigned __int64)(v24 & 7) << 14) | 0x10;
}
}
}
++*(_QWORD *)(a1 + 8i64 * v24 + 40);
if( v24 == 7 )
{
v34 = *(unsigned __int16 *)(a1 + 174);
v35 = *(_QWORD *)(a1 + 96);
memset(&LockHandle, 0, sizeof(LockHandle));
v36 = *(_QWORD *)(qword_140C4E388 + 8 * v34);
v37 = *(_QWORD *)(v36 + 6848);
if( v35 >= *(_QWORD *)(v37 + 56) )
{
v38 = (__int64 *)(a1 + 24);
if( *(_QWORD *)(a1 + 24) )
{
v39 = (__int64 *)(v36 + 6856);
if( *(__int64 **)(v36 + 6856) != v38 )
{
LockHandle.LockQueue.Lock = &WorkerRoutine;
LockHandle.LockQueue.Next = 0i64;
v45 = (KSPIN_LOCK_QUEUE *)_InterlockedExchange64((volatile __int64 *)&WorkerRoutine, (__int64)&LockHandle);
if( v45 )
KxWaitForLockOwnerShip(&LockHandle.LockQueue, v45);
if( *(_BYTE *)(v37 + 53) || (v48 = *v38) == 0 )
{
*(_BYTE *)(v37 + 54) = 1;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
}
else
{
v49 = *(__int64 ***)(a1 + 32);
if( *(__int64 **)(v48 + 8) != v38
|| *v49 != v38
|| (*v49 = (__int64 *)v48, *(_QWORD *)(v48 + 8) = v49, v50 = *v39, *(__int64 **)(*v39 + 8) != v39) )
{
__fastfail(3u);
}
*v38 = v50;
*(_QWORD *)(a1 + 32) = v39;
*(_QWORD *)(v50 + 8) = v38;
*v39 = (__int64)v38;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
}
}
}
}
PteBase = MmGetPteBase();
}
v7 += 4096i64;
if( !--r8_0 )
break;
PteLimit = MmGetPteLimit();
}
}
_m_prefetchw(&LockQueue);
result = (UINT64)LockQueue.Next;
if( !LockQueue.Next )
{
result = _InterlockedCompareExchange64((volatile signed __int64 *)LockQueue.Lock, 0i64, (signed __int64)&LockQueue);
if( (_KSPIN_LOCK_QUEUE *)result == &LockQueue )
goto LABEL_36;
result = (UINT64)KxWaitForLockChainValid(&LockQueue);
}
LockQueue.Next = 0i64;
_InterlockedXor64((volatile signed __int64 *)(result + 8), 1ui64);
LABEL_36:
if( v23 )
{
v30 = a2;
if( a2 < (unsigned __int64)PteBase || (result = (UINT64)MmGetPteLimit(), a2 > result) )
{
v31 = *(_QWORD *)((char *)MmGetPdeBase() + ((a2 >> 18) & 0x3FFFFFF8));
v58 = v31;
MiPteInShadowRange((UINT64)&v58);
v33 = (UINT64 *)((char *)MmGetPfnDb() + 48 * ((v31 >> 12) & 0xFFFFFFFFFi64));
result = (unsigned __int64)*(unsigned int *)v33 >> 4;
if( (result & 0x3FF) == 0 )
{
MiCountWslesInPageTable(v32, v30, a3);
v46 = 8;
while( 1 )
{
result = --v46;
v47 = *((_DWORD *)a3 + v46);
if( v47 )
break;
if( !v46 )
return result;
}
result = *v33 & 0xFFFFFFFFFFFE000Fui64;
*v33 = result | (16 * (v47 & 0x3FF | ((unsigned __int64)(v46 & 7) << 10)));
}
}
}
return result;
}Referenced by:
MiAllocateWsle
MiEmptyDeferredWorkingSetEntries
MiMakeSystemCacheRangeValid