MiEnableLargeSubsection
NTSTATUS __stdcall MiEnableLargeSubsection(INT64 a1){
_XSTATE_CONFIGURATION *v1;
__int64 v2;
NTSTATUS result;
_XSTATE_CONFIGURATION *v5;
unsigned __int64 v6;
ULONG_PTR v7;
UINT8 v8;
unsigned __int64 v9;
_MMPFN *v10;
_MMPFN *v11;
unsigned __int64 EnabledFeatures;
char v13;
UINT8 PageIrql;
v1 = *(_XSTATE_CONFIGURATION **)(a1 + 8);
v2 = *(unsigned int *)(a1 + 44);
result = MiChargeLargeProtoSubsection(a1, 1i64);
if( result )
{
v5 = (_XSTATE_CONFIGURATION *)((char *)v1 + 8 * v2);
LODWORD(v6) = MiMakeValidPte(v1, -1i64, (*(unsigned __int16 *)(a1 + 32) >> 1) & 0x1F);
v7 = 0;
v8 = 17;
PageIrql = 17;
v9 = v6;
if( v1 < v5 )
{
do
{
if( ((unsigned __int16)v1 & 0xFFF) == 0 || v8 == 17 )
{
if( v8 != 17 )
MiUnlockProtoPoolPage(v7, v8);
while( 1 )
{
v10 = MiLockProtoPoolPage((_MMPTE *)v1, &PageIrql);
v7 = (unsigned int)v10;
if( v10 )
break;
MmAccessFault(2ui64, v1, 0, 0i64);
}
}
v11 = MiLockLeafPage((_MMPTE *)v1, 0i64);
EnabledFeatures = v1->EnabledFeatures;
if( (v1->EnabledFeatures & 1) == 0 )
{
if( *(&stru_140C4DB30 + 42) && (EnabledFeatures & 0x10) == 0 )
EnabledFeatures &= ~*(&stru_140C4DB30 + 42);
v9 ^= (v9 ^ EnabledFeatures) & 0xFFFFFFFFF000i64;
v1->EnabledFeatures = v9;
v11->u2._bf_0 &= 0xC000000000000000ui64;
MiUnlinkPageFromList(v11, 0i64);
v13 = *(_BYTE *)(&v11->u3 + 1) & 0xF8 | 6;
++v11->u3.ReferenceCount;
*((_BYTE *)&v11->u3 + 2) = v13;
}
v11->u2._bf_0 ^= (v11->u2._bf_0 ^ (v11->u2._bf_0 + 1)) & 0x3FFFFFFFFFFFFFFFi64;
_InterlockedAnd64(&v11->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
v1 = (_XSTATE_CONFIGURATION *)((char *)v1 + 8);
if( ((unsigned __int16)v1 & 0x1F8) != 0 || !(unsigned int)KeShouldYieldProcessor() )
{
v8 = PageIrql;
}
else
{
MiUnlockProtoPoolPage(v7, PageIrql);
v8 = 17;
PageIrql = 17;
}
}
while( v1 < v5 );
if( v8 != 17 )
MiUnlockProtoPoolPage(v7, v8);
}
return 1;
}
return result;
}Referenced by:
MiIncrementLargeSubsections