MiMarkHugePfnGood
INT64 __fastcall MiMarkHugePfnGood(UINT64 a1){
_ETHREAD *CurrentThread;
unsigned int v4;
unsigned __int64 v5;
__int64 v6;
__int64 v7;
INT64 v8;
__int64 v9;
unsigned __int64 v10;
signed __int64 *v11;
unsigned __int64 v12;
__int64 v13;
__int128 v14;
struct _KLOCK_QUEUE_HANDLE LockHandle;
v14 = 0i64;
memset(&LockHandle, 0, sizeof(LockHandle));
if( KeGetCurrentIrql() > 1u )
return 3221225485i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v4 = 0;
v5 = (a1 >> 18) & 0x3FFFF;
v6 = 0i64;
--*((_WORD *)CurrentThread + 243);
ExAcquirePushLockExclusiveEx((UINT64)&qword_140C4E348, 0i64);
v7 = MiHugePfnPartition((_QWORD *)(qword_140C4E3B0 + 8 * v5));
v8 = v7;
if( !v7 )
{
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&qword_140C4E348, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)&qword_140C4E348);
KeAbPostRelease(&qword_140C4E348);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
return 3221226548i64;
}
MiLockDynamicMemoryExclusive(v7, (__int64)CurrentThread);
if( (*(_DWORD *)(v8 + 4) & 1) != 0 )
{
MiUnlockDynamicMemoryExclusive((_MI_PARTITION *)v8, CurrentThread);
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&qword_140C4E348, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)&qword_140C4E348);
KeAbPostRelease(&qword_140C4E348);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
KeDelayExecutionThread(0, 0, (PLARGE_INTEGER)&Mi10Milliseconds);
return 3221226548i64;
}
KeAcquireInStackQueuedSpinLock((UINT64 *)(v8 + 4128), &LockHandle);
if( MiIsPageInHugePfn(a1) )
{
v9 = qword_140C4E3B0;
if( (*(_QWORD *)(qword_140C4E3B0 + 8 * v5) & 0x10000000000i64) != 0 )
{
v6 = *(_QWORD *)(v8 + 4896);
while( v6 )
{
v10 = *(_QWORD *)(v6 + 24) & 0x3FFFFi64;
if( v5 > v10 )
{
v6 = *(_QWORD *)(v6 + 8);
}
else
{
if( v5 >= v10 )
break;
v6 = *(_QWORD *)v6;
}
}
v11 = *(signed __int64 **)(v6 + 32);
v12 = a1 & 0x3FFFF;
*((_QWORD *)&v14 + 1) = v11;
*(_QWORD *)&v14 = 0x40000i64;
if( _bittest64(v11, v12) )
{
_bittestandreset64(v11, v12);
if( RtlAreBitsClearEx((INT64)&v14, 0i64, 0x40000ui64) )
{
if( (*(_DWORD *)(v9 + 8 * v5) & 0x1C0000) == 0x100000i64 )
MiUnlinkHugeRange(v8, v5);
RtlAvlRemoveNode((unsigned __int64 *)(v8 + 4896), (__int64 *)v6);
*(_QWORD *)(v9 + 8 * v5) &= ~0x10000000000ui64;
MiInsertHugeRangeInList(v5, 130, 0i64);
goto LABEL_29;
}
v13 = *(_QWORD *)(v6 + 32);
if( _bittest64((const signed __int64 *)(v13 + 0x8000), v12) )
_bittestandreset64((signed __int64 *)(v13 + 0x8000), v12);
}
v6 = 0i64;
}
}
else
{
v4 = -1073740748;
}
LABEL_29:
KeReleaseInStackQueuedSpinLock(&LockHandle);
MiUnlockDynamicMemoryExclusive((_MI_PARTITION *)v8, CurrentThread);
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&qword_140C4E348, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)&qword_140C4E348);
KeAbPostRelease(&qword_140C4E348);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
if( v6 )
{
ExFreePoolWithTag(*(PVOID *)(v6 + 32), 0);
ExFreePoolWithTag((PVOID)v6, 0);
}
return v4;
}Referenced by:
MiUnlinkBadPages