MiAddSystemPageTableToList
_MI_PAGE_DELETE_RESULT __fastcall MiAddSystemPageTableToList(_QWORD *a1, __int64 a2){
_MMPFN *v4;
_MI_PAGE_DELETE_RESULT result;
UINT64 SpinCount;
UINT64 v7;
while( 1 )
{
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(a2 + 24), 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(__int64 *)(a2 + 24) < 0 );
}
if( (*(_QWORD *)(a2 + 24) & 0x3FFFFFFFFFFFFFFFi64) == 1 )
break;
_InterlockedAnd64((volatile signed __int64 *)(a2 + 24), 0x7FFFFFFFFFFFFFFFui64);
}
*(_QWORD *)(a2 + 24) |= 0x4000000000000000ui64;
*(_QWORD *)a2 = *a1;
*a1 = a2;
*(_BYTE *)(a2 + 34) = *(_BYTE *)(a2 + 34) & 0xF8 | 5;
_InterlockedAnd64((volatile signed __int64 *)(a2 + 24), 0x7FFFFFFFFFFFFFFFui64);
v4 = &MmGetPfnDb()[*(_QWORD *)(a2 + 40) & 0xFFFFFFFFFi64];
LODWORD(v7) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v4->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&v7);
while( v4->u2._bf_0 < 0 );
}
result = MiDecrementShareCount(v4);
_InterlockedAnd64(&v4->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
return result;
}Referenced by:
MiDeleteSystemPageTable