MiRemoveWsle
INT64 __fastcall MiRemoveWsle(INT64 a1, UINT64 a2, UINT8 *a3, CHAR a4, INT64 a5, INT64 a6){
char v6;
unsigned __int64 *v11;
KSPIN_LOCK_QUEUE *v12;
unsigned __int64 PteBase;
_MMPTE *PteLimit;
char v15;
char v16;
unsigned __int8 v17;
int v18;
UINT64 v19;
unsigned __int64 *v20;
unsigned __int64 v21;
unsigned __int8 v22;
unsigned __int64 v23;
INT64 result;
UINT64 v25;
UINT8 *v26;
INT64 v27;
_KSPIN_LOCK_QUEUE LockQueue;
__int64 v29;
__int128 v30;
__int64 v31;
UINT64 v32;
v6 = *(_BYTE *)(a1 + 184) & 7;
v29 = 0i64;
if( v6 == 2 )
v11 = &qword_140C4F500;
else
v11 = (unsigned __int64 *)(a1 + 256);
LockQueue.Lock = v11;
LockQueue.Next = 0i64;
v12 = (KSPIN_LOCK_QUEUE *)_InterlockedExchange64((volatile __int64 *)v11, (__int64)&LockQueue);
if( v12 )
KxWaitForLockOwnerShip(&LockQueue, v12);
PteBase = (unsigned __int64)MmGetPteBase();
PteLimit = MmGetPteLimit();
if( (_DWORD)a6 )
{
*(_QWORD *)(a1 + 144) -= a3;
v30 = 0i64;
v31 = 0i64;
if( a2 < PteBase || a2 > (unsigned __int64)PteLimit )
*(_QWORD *)(a1 + 128) -= a3;
}
if( (*(_BYTE *)(a1 + 184) & 7) == 4 )
{
if( PsNtosImageBase
&& (a2 < PsNtosImageEnd && a2 >= PsNtosImageBase || a2 < PsHalImageEnd && a2 >= (unsigned __int64)PsHalImageBase) )
{
LODWORD(xmmword_140C4CA88) = xmmword_140C4CA88 - (_DWORD)a3;
}
else
{
if( (unsigned int)MiGetSystemRegionType(a2) == 12
&& MiLookupDataTableEntry(
(__int64)(((PteBase + ((a2 >> 9) & 0x7FFFFFFFF8i64)) << 25) - (PteBase << 25)) >> 16,
2i64,
v27) )
{
DWORD1(xmmword_140C4CA88) -= (_DWORD)a3;
}
PteLimit = MmGetPteLimit();
}
}
v15 = *(_BYTE *)(a1 + 184);
*(_QWORD *)(a1 + 136) -= a3;
v16 = v15 & 7;
if( a2 < PteBase || a2 > (unsigned __int64)PteLimit )
{
*(_QWORD *)(a1 + 120) -= a3;
v17 = a4 & 0xF;
v18 = 1;
if( v17 == 8 )
goto LABEL_16;
}
else
{
v18 = 0;
if( v16 )
goto LABEL_16;
v17 = a4 & 0xF;
}
if( a2 < PteBase || a2 > (unsigned __int64)PteLimit )
{
v19 = *(_QWORD *)((char *)MmGetPdeBase() + ((a2 >> 18) & 0x3FFFFFF8));
v32 = v19;
MiPteInShadowRange((UINT64)&v32);
v20 = (unsigned __int64 *)((char *)MmGetPfnDb() + 48 * ((v19 >> 12) & 0xFFFFFFFFFi64));
v21 = *v20;
v22 = (*v20 >> 14) & 7;
if( ((*v20 >> 4) & 0x3FF) != 0 )
{
if( v17 == v22 )
{
v23 = v21 ^ ((unsigned __int16)v21 ^ (unsigned __int16)(16 * (((*v20 >> 4) & 0x3FF) - (_WORD)a3))) & 0x3FF0;
LABEL_13:
*v20 = v23;
goto LABEL_14;
}
if( v17 > v22 )
{
v23 = v21 & 0xFFFFFFFFFFFE000Fui64 | (16 * (-(__int16)a3 & 0x3FF | ((unsigned __int64)(v17 & 7) << 10)));
goto LABEL_13;
}
}
}
LABEL_14:
*(_QWORD *)(a1 + 8i64 * v17 + 40) -= a3;
if( v17 == 7 )
MiVolunteerForTrimFirst(a1, -(__int64)a3);
LABEL_16:
if( (*(_BYTE *)(a1 + 184) & 7) == 2 )
{
qword_140C4F548 -= (__int64)a3;
if( v18 == 1 )
qword_140C4F550 -= (__int64)a3;
}
_m_prefetchw(&LockQueue);
result = (INT64)LockQueue.Next;
if( LockQueue.Next )
goto LABEL_51;
result = _InterlockedCompareExchange64((volatile signed __int64 *)LockQueue.Lock, 0i64, (signed __int64)&LockQueue);
if( (_KSPIN_LOCK_QUEUE *)result != &LockQueue )
{
result = (INT64)KxWaitForLockChainValid(&LockQueue);
LABEL_51:
LockQueue.Next = 0i64;
_InterlockedXor64((volatile signed __int64 *)(result + 8), 1ui64);
}
if( v18 == 1 )
{
if( (_DWORD)a5 == 9
|| (_DWORD)a5 == 10 && (result = PteBase, (*(_BYTE *)(((a2 >> 9) & 0x7FFFFFFFF8i64) + PteBase) & 1) != 0) )
{
if( a3 )
{
v25 = a2;
v26 = a3;
do
{
MiWriteValidPteVolatile((MMPTE *)(PteBase + ((v25 >> 9) & 0x7FFFFFFFF8i64)), 0x80000000ui64);
v25 += 4096i64;
--v26;
}
while( v26 );
}
}
}
return result;
}Referenced by:
MiConvertPrivateToProto
MiDeleteVa
MiTerminateWsle
MiTerminateWsleCluster