MiAddSystemPageTableToList
INT64 __fastcall MiAddSystemPageTableToList(_QWORD *a1, INT64 a2){
char *v4;
INT64 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 = (char *)MmGetPfnDb() + 48 * (*(_QWORD *)(a2 + 40) & 0xFFFFFFFFFi64);
LODWORD(v7) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v4 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&v7);
while( *((__int64 *)v4 + 3) < 0 );
}
result = MiDecrementShareCount((UINT64)v4);
_InterlockedAnd64((volatile signed __int64 *)v4 + 3, 0x7FFFFFFFFFFFFFFFui64);
return result;
}Referenced by:
MiDeleteSystemPageTable