MiDecrementHugeContext
NTSTATUS __stdcall MiDecrementHugeContext(PVOID P){
NTSTATUS result;
_MI_ZERO_THREAD_CONTEXT *v2;
bool v3;
_MI_ZERO_THREAD_CONTEXT *v4;
__int64 *v6;
__int64 v7;
__int64 **v8;
__int64 v9;
unsigned __int64 v10;
__int64 v11;
v3 = (*((_DWORD *)P + 47))-- == 1;
v4 = v2;
if( v3 )
{
v6 = (__int64 *)((char *)P + 72);
v7 = *v6;
if( *v6 )
{
v8 = (__int64 **)v6[1];
if( *(__int64 **)(v7 + 8) != v6 || *v8 != v6 )
__fastfail(3u);
*v8 = (__int64 *)v7;
*(_QWORD *)(v7 + 8) = v8;
if( *((_DWORD *)P + 48) != 512 )
{
if( !*((_BYTE *)P + 69) )
{
v9 = *((_QWORD *)P + 3);
if( v9 )
{
v10 = MiLockPageInline(*((_MMPFN **)P + 3));
*(_BYTE *)(v9 + 34) &= ~8u;
v11 = *(_QWORD *)(v9 + 16);
*(_QWORD *)(v11 + 24) = 0i64;
*(_BYTE *)(v11 + 69) = 1;
*(_QWORD *)(v9 + 16) = MiSwizzleInvalidPte(128i64);
_InterlockedAnd64((volatile signed __int64 *)(v9 + 24), 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v10);
}
}
if( v4 )
MiReleaseLargeZeroingVa(v4);
}
}
if( *((_BYTE *)P + 68) )
MiRemoveFaultNode((_MI_LIST_THREAD_CONTEXT *)P);
return(unsigned int)ExFreePoolWithTag(P, 0);
}
return result;
}Referenced by:
MiDereferenceAnyActiveHugeContext
MiGetHugePageToZero
MiGetUltraHugeAlreadyActive
MiZeroLargePageThread