MiDeleteLargeUserPde
NTSTATUS __stdcall MiDeleteLargeUserPde(INT64 a1, UINT64 a2, UINT64 a3){
__int64 v3;
INT64 v4;
unsigned int v5;
int v7;
INT64 v8;
unsigned __int64 v9;
INT64 v10;
unsigned __int64 v11;
__int64 v12;
UINT64 v13;
int v14;
_UNICODE_STRING *v15;
UINT8 v16;
wchar_t *v17;
UINT64 i;
unsigned __int64 Long;
int v20;
VOID *v21;
_MMPFN *PfnDb;
_MMPFN *v23;
_MI_TB_FLUSH_LIST *v24;
__int64 v25;
__int64 v26;
char v27;
INT64 v29;
__int64 v30;
UINT64 SpinCount;
int v33;
v3 = *(_QWORD *)(a1 + 168);
v4 = a1;
v30 = v3;
v5 = a3;
v7 = *(_DWORD *)(v3 + 104);
v33 = v7;
LODWORD(v8) = MI_READ_PTE_LOCK_FREE(a2);
v29 = v8;
v9 = v8;
v10 = v8 & 1;
if( (v8 & 1) != 0 )
{
LODWORD(v11) = MI_READ_PTE_LOCK_FREE((INT64)&v29);
v9 = v11;
}
else if( *(&stru_140C4DB30 + 42) )
{
if( (v8 & 0x10) != 0 )
v9 = v8 & 0xFFFFFFFFFFFFFFEFui64;
else
v9 = ~*(&stru_140C4DB30 + 42) & v8;
}
v12 = (v9 >> 12) & 0xFFFFFFFFFi64;
v13 = (-(__int64)(v5 != 0) & 0xFFFFFFFFFFFFFFF1ui64) + 16;
v14 = v7 & 0x10;
if( v14 )
{
MiDeleteVadAwePtes(*(_QWORD *)(*(_QWORD *)(v3 + 16) + 32i64), a2, (INT64 *)(v3 + 112));
goto LABEL_22;
}
if( !v5 )
{
for( i = 0i64; i < v13; ++i )
*(_MMPTE *)(a2 + 8 * i) = ZeroPte;
LABEL_21:
LODWORD(v21) = MiGetUsedPtesHandle((PSLIST_ENTRY)((__int64)((a2 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16));
MiDecreaseUsedPtesCount(v21, (unsigned int)v13);
goto LABEL_22;
}
if( v10 )
{
MiRewritePteWithLockBit(*(_QWORD *)(v4 + 24), (INT64 *)a2, ZeroPte.u.Hard._bf_0);
}
else
{
Long = ZeroPte.u.Long;
LOBYTE(v20) = MiPteInShadowRange(a2);
if( v20 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (ZeroPte.u.Long & 1) != 0 )
Long = ZeroPte.u.Long | 0x8000000000000000ui64;
*(_QWORD *)a2 = Long;
v4 = a1;
}
if( v5 != 3 )
goto LABEL_21;
LABEL_22:
PfnDb = MmGetPfnDb();
v23 = &PfnDb[v12];
if( v10 )
{
v24 = *(_MI_TB_FLUSH_LIST **)(v4 + 16);
if( v5 )
MiInsertLargeTbFlushEntry(v24, v5, a2);
else
MiInsertTbFlushEntry(v24, (VOID *)((__int64)((a2 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16), v13, 0i64);
}
if( !v14 )
{
LOBYTE(PfnDb) = MI_PFN_IS_PROTO((_UNICODE_STRING *)v23, v15, v16, v17);
if( !(_DWORD)PfnDb )
{
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v23->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v23->u2._bf_0 < 0 );
}
v25 = v30;
*((_BYTE *)&v23->u3 + 2) = *(_BYTE *)(&v23->u3 + 1) & 0xF8 | 5;
MiSetLeafPfnBuddy(v23, *(_QWORD *)(*(_QWORD *)(v25 + 16) + 40i64));
LODWORD(PfnDb) = -1;
*(_QWORD *)(*(_QWORD *)(v26 + 16) + 40i64) = v23;
*((_BYTE *)&v23->u3 + 2) ^= (*((_BYTE *)&v23->u3 + 2) ^ v27) & 7;
_InterlockedAnd64(&v23->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
}
}
if( (v33 & 0x800) != 0 && !v5 )
*(_BYTE *)(v4 + 3) = 15;
return(int)PfnDb;
}Referenced by:
MiDeleteVa