MiIsPageTableDeletable
NTSTATUS __stdcall MiIsPageTableDeletable(_TOKEN *SourceLowboxToken, _TOKEN **DesiredAnonymousLowboxToken){
_TOKEN **v2;
_LUID AuthenticationId;
__int64 v5;
unsigned __int64 v6;
__int64 v7;
UINT64 *v8;
UINT64 v9;
INT64 v11;
unsigned __int64 v12;
int v13;
__int64 v14;
UINT64 v15;
INT64 v16;
v2 = DesiredAnonymousLowboxToken;
AuthenticationId = SourceLowboxToken->AuthenticationId;
v5 = (__int64)(((_QWORD)DesiredAnonymousLowboxToken << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16;
LODWORD(v6) = MiGetLeafVa(v5);
if( v6 > 0x7FFFFFFEFFFFi64 )
{
LODWORD(v11) = MI_READ_PTE_LOCK_FREE((INT64)v2);
v16 = v11;
LODWORD(v12) = MI_READ_PTE_LOCK_FREE((INT64)&v16);
if( (MmGetPfnDb()[(v12 >> 12) & 0xFFFFFFFFFi64].u2._bf_0 & 0x3FFFFFFFFFFFFFFFi64) != 1 )
return 0;
if( (*(_BYTE *)(*(_QWORD *)&AuthenticationId + 184i64) & 7) == 1 )
{
if( (SourceLowboxToken->TokenSource.SourceName[0] & 4) != 0 )
MiLockPageTableInternal(*(_QWORD *)&AuthenticationId, (UINT64)v2, 0i64);
else
v2 = 0i64;
v13 = 1;
while( 1 )
{
LODWORD(v14) = MI_READ_PTE_LOCK_FREE(v5);
if( v14 )
{
if( (v14 & 1) == 0 )
break;
}
v5 += 8i64;
if( (v5 & 0xFFF) == 0 )
goto LABEL_15;
}
v13 = 0;
LABEL_15:
if( v2 )
MiUnlockPageTableInternal(*(_QWORD *)&AuthenticationId, (UINT64)v2);
if( !v13 )
return 0;
}
}
else
{
v8 = (unsigned __int64 *)((char *)&MmGetPdeBase()->u.Long + (((((v5 << 25) - v7) >> 16) & 0xFFFFFFE00000ui64) >> 18));
v9 = *v8;
MiPteInShadowRange((UINT64)v8);
v15 = v9;
MiPteInShadowRange((UINT64)&v15);
if( (*(_DWORD *)(&MmGetPfnDb()[(v9 >> 12) & 0xFFFFFFFFFi64].3 + 1) & 0x3FF0000) != 0 )
return 0;
}
return 1;
}Referenced by:
MiDeleteEmptyPageTable
MiDeleteVa