MiRemoveBadPages
NTSTATUS __stdcall MiRemoveBadPages(INT64 a1, UINT64 a2, UINT64 a3){
UINT64 v4;
_ETHREAD *CurrentThread;
unsigned __int64 v7;
NTSTATUS v8;
UINT64 v9;
_MMPFN *v10;
union {$8D9ED47C9F2F2CD645B633E301950288 __s0;unsigned __int64 EntireField;} *p_u4;
UINT8 v12;
unsigned __int64 EntireField;
unsigned __int64 v14;
int v15;
_MMPFN *v16;
_ETHREAD *v17;
v4 = a2;
if( (MiFlags & 0x8000000) == 0 )
return -1073741822;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v7 = 0i64;
v17 = CurrentThread;
v8 = 0;
v9 = a2;
v10 = &MmGetPfnDb()[a2];
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)&stru_140C50B28 + 11, 0i64);
if( a3 )
{
p_u4 = &MmGetPfnDb()[v9].u4;
while( v4 <= 0xFFFFFFFFFi64 && (p_u4->_bf_0 & 0x4000000000000i64) != 0 )
{
v12 = MiLockPageInline(v10);
EntireField = v10->u4.EntireField;
v14 = v12;
if( (EntireField & 0x2000000000000i64) != 0 )
{
_InterlockedAnd64(&v10->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v12);
break;
}
if( *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * ((EntireField >> 39) & 0x3FF)) != &Irp )
{
_InterlockedAnd64(&v10->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v12);
v8 = -1073740277;
goto LABEL_16;
}
LOBYTE(v15) = MiIsPageOnBadList((INT64)v10);
if( !v15 )
{
_InterlockedAnd64(&v10->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v14);
v8 = -1073740682;
goto LABEL_16;
}
MiUnlinkPageFromBadList(v16);
MiSetPfnRemovalRequested((INT64)v10, 1i64);
v10->u2._bf_0 |= 0x4000000000000000ui64;
_InterlockedAnd64(&v10->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v14);
++v7;
++v4;
p_u4 += 6;
++v10;
if( v7 >= a3 )
goto LABEL_18;
}
v8 = -1073741585;
LABEL_16:
if( v7 )
MiReturnBadPagesToBadList(v4 - v7, v7);
LABEL_18:
CurrentThread = v17;
}
if( _InterlockedCompareExchange64((_QWORD *)&stru_140C50B28 + 11, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((_EX_PUSH_LOCK *)&stru_140C50B28 + 11);
KeAbPostRelease((char *)&stru_140C50B28 + 88);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
return v8;
}Referenced by:
MmRemovePhysicalMemory