MiDeleteLargeUserPde
INT64 __fastcall MiDeleteLargeUserPde(INT64 a1, UINT64 a2, UINT64 a3){
__int64 v3;
INT64 v4;
unsigned int v5;
int v7;
UNICODE_STRING *v8;
UINT8 v9;
WCHAR *v10;
unsigned __int64 v11;
INT64 v12;
__int64 v13;
unsigned __int64 v14;
int v15;
unsigned __int64 i;
_MMPFN *UsedPtesHandle;
INT64 result;
INT64 v19;
INT64 v20;
__int64 v21;
__int64 v22;
char v23;
INT64 v24;
__int64 v25;
UINT64 SpinCount;
int v28;
v3 = *(_QWORD *)(a1 + 168);
v4 = a1;
v25 = v3;
v5 = a3;
v7 = *(_DWORD *)(v3 + 104);
v28 = v7;
v24 = MI_READ_PTE_LOCK_FREE(a2);
v11 = v24;
v12 = v24 & 1;
if( (v24 & 1) != 0 )
{
v11 = MI_READ_PTE_LOCK_FREE((INT64)&v24);
}
else if( qword_140C4DC80 )
{
if( (v24 & 0x10) != 0 )
v11 = v24 & 0xFFFFFFFFFFFFFFEFui64;
else
v11 = ~qword_140C4DC80 & v24;
}
v13 = (v11 >> 12) & 0xFFFFFFFFFi64;
v14 = (-(__int64)(v5 != 0) & 0xFFFFFFFFFFFFFFF1ui64) + 16;
v15 = v7 & 0x10;
if( v15 )
{
MiDeleteVadAwePtes(*(_QWORD *)(*(_QWORD *)(v3 + 16) + 32i64), a2, (INT64 *)(v3 + 112));
goto LABEL_18;
}
if( !v5 )
{
for( i = 0i64; i < v14; ++i )
*(_QWORD *)(a2 + 8 * i) = ZeroPte;
LABEL_17:
UsedPtesHandle = MiGetUsedPtesHandle((__int64)((a2 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16);
MiDecreaseUsedPtesCount(UsedPtesHandle, (unsigned int)v14);
goto LABEL_18;
}
if( v12 )
{
MiRewritePteWithLockBit(*(_QWORD *)(v4 + 24), (volatile INT64 *)a2, ZeroPte);
}
else
{
*(_QWORD *)a2 = ZeroPte;
v4 = a1;
}
if( v5 != 3 )
goto LABEL_17;
LABEL_18:
result = (INT64)MmGetPfnDb();
v19 = result + 48 * v13;
if( v12 )
{
v20 = *(_QWORD *)(v4 + 16);
if( v5 )
result = MiInsertLargeTbFlushEntry(v20, v5, a2);
else
result = MiInsertTbFlushEntry(v20, (__int64)((a2 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16, v14, 0i64);
}
if( !v15 )
{
LOBYTE(result) = MI_PFN_IS_PROTO((UNICODE_STRING *)v19, v8, v9, v10);
if( !(_DWORD)result )
{
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(v19 + 24), 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(__int64 *)(v19 + 24) < 0 );
}
v21 = v25;
*(_BYTE *)(v19 + 34) = *(_BYTE *)(v19 + 34) & 0xF8 | 5;
MiSetLeafPfnBuddy((_QWORD *)v19, *(_QWORD *)(*(_QWORD *)(v21 + 16) + 40i64));
result = 0x7FFFFFFFFFFFFFFFi64;
*(_QWORD *)(*(_QWORD *)(v22 + 16) + 40i64) = v19;
*(_BYTE *)(v19 + 34) ^= (*(_BYTE *)(v19 + 34) ^ v23) & 7;
_InterlockedAnd64((volatile signed __int64 *)(v19 + 24), 0x7FFFFFFFFFFFFFFFui64);
}
}
if( (v28 & 0x800) != 0 && !v5 )
*(_BYTE *)(v4 + 3) = 15;
return result;
}Referenced by:
MiDeleteVa