MiMarkHugePfnGood
NTSTATUS __stdcall MiMarkHugePfnGood(UINT64 a1){
_ETHREAD *CurrentThread;
NTSTATUS v4;
UINT64 v5;
INT64 v6;
_MI_PARTITION *v7;
INT64 v8;
int v9;
__int64 v10;
unsigned __int64 v11;
unsigned __int64 *v12;
unsigned __int64 v13;
char v14;
__int64 v15;
_RTL_BITMAP_EX BitMapHeader;
_KLOCK_QUEUE_HANDLE LockHandle;
BitMapHeader = 0i64;
memset(&LockHandle, 0, sizeof(LockHandle));
if( KeGetCurrentIrql() > 1u )
return -1073741811;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v4 = 0;
v5 = (a1 >> 18) & 0x3FFFF;
v6 = 0i64;
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&stru_140C4DB30 + 259, 0i64);
v7 = (_MI_PARTITION *)MiHugePfnPartition((_QWORD *)(*(&stru_140C4DB30 + 272) + 8 * v5));
v8 = (INT64)v7;
if( !v7 )
{
if( (_InterlockedExchangeAdd64((_QWORD *)&stru_140C4DB30 + 259, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)&stru_140C4DB30 + 259);
KeAbPostRelease((char *)&stru_140C4DB30 + 2072);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
return -1073740748;
}
MiLockDynamicMemoryExclusive(v7, CurrentThread);
if( (*(_DWORD *)(v8 + 4) & 1) != 0 )
{
MiUnlockDynamicMemoryExclusive((_MI_PARTITION *)v8, CurrentThread);
if( (_InterlockedExchangeAdd64((_QWORD *)&stru_140C4DB30 + 259, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)&stru_140C4DB30 + 259);
KeAbPostRelease((char *)&stru_140C4DB30 + 2072);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
KeDelayExecutionThread(0, 0, (_LARGE_INTEGER *)&Mi10Milliseconds);
return -1073740748;
}
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)(v8 + 4128), &LockHandle);
LOBYTE(v9) = MiIsPageInHugePfn(a1);
if( v9 )
{
v10 = *(&stru_140C4DB30 + 272);
if( (*(_QWORD *)(*(&stru_140C4DB30 + 272) + 8 * v5) & 0x10000000000i64) != 0 )
{
v6 = *(_QWORD *)(v8 + 4896);
while( v6 )
{
v11 = *(_QWORD *)(v6 + 24) & 0x3FFFFi64;
if( v5 > v11 )
{
v6 = *(_QWORD *)(v6 + 8);
}
else
{
if( v5 >= v11 )
break;
v6 = *(_QWORD *)v6;
}
}
v12 = *(unsigned __int64 **)(v6 + 32);
v13 = a1 & 0x3FFFF;
BitMapHeader.Buffer = v12;
BitMapHeader.SizeOfBitMap = 0x40000i64;
if( _bittest64((const signed __int64 *)v12, v13) )
{
_bittestandreset64((signed __int64 *)v12, v13);
RtlAreBitsClearEx(&BitMapHeader, 0i64, 0x40000ui64);
if( v14 )
{
if( (*(_DWORD *)(v10 + 8 * v5) & 0x1C0000) == 0x100000i64 )
MiUnlinkHugeRange(v8, v5);
RtlAvlRemoveNode((UINT64 *)(v8 + 4896), (INT64 *)v6);
*(_QWORD *)(v10 + 8 * v5) &= ~0x10000000000ui64;
MiInsertHugeRangeInList(v5, 130, 0i64);
goto LABEL_29;
}
v15 = *(_QWORD *)(v6 + 32);
if( _bittest64((const signed __int64 *)(v15 + 0x8000), v13) )
_bittestandreset64((signed __int64 *)(v15 + 0x8000), v13);
}
v6 = 0i64;
}
}
else
{
v4 = -1073740748;
}
LABEL_29:
KeReleaseInStackQueuedSpinLock(&LockHandle);
MiUnlockDynamicMemoryExclusive((_MI_PARTITION *)v8, CurrentThread);
if( (_InterlockedExchangeAdd64((_QWORD *)&stru_140C4DB30 + 259, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)&stru_140C4DB30 + 259);
KeAbPostRelease((char *)&stru_140C4DB30 + 2072);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
if( v6 )
{
ExFreePoolWithTag(*(PVOID *)(v6 + 32), 0);
ExFreePoolWithTag((PVOID)v6, 0);
}
return v4;
}Referenced by:
MiUnlinkBadPages