MiRemoveBadPages
INT64 __fastcall MiRemoveBadPages(INT64 a1, UINT64 a2, UINT64 a3){
UINT64 v4;
_ETHREAD *CurrentThread;
unsigned __int64 v7;
unsigned int v8;
UINT64 v9;
char *v10;
_QWORD *v11;
unsigned __int8 v12;
unsigned __int64 v13;
unsigned __int64 v14;
_RTL_ATOM_TABLE *v15;
_ETHREAD *v16;
v4 = a2;
if( (MiFlags & 0x8000000) == 0 )
return 3221225474i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v7 = 0i64;
v16 = CurrentThread;
v8 = 0;
v9 = 6 * a2;
v10 = (char *)MmGetPfnDb() + 48 * a2;
--*((_WORD *)CurrentThread + 243);
ExAcquirePushLockSharedEx((UINT64)&qword_140C50B80, 0i64);
if( a3 )
{
v11 = (_QWORD *)((char *)MmGetPfnDb() + 8 * v9 + 40);
while( v4 <= 0xFFFFFFFFFi64 && (*v11 & 0x4000000000000i64) != 0 )
{
v12 = MiLockPageInline((INT64)v10);
v13 = *((_QWORD *)v10 + 5);
v14 = v12;
if( (v13 & 0x2000000000000i64) != 0 )
{
_InterlockedAnd64((volatile signed __int64 *)v10 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v12);
break;
}
if( *(ULONG_PTR **)(qword_140C4E388 + 8 * ((v13 >> 39) & 0x3FF)) != &MiSystemPartition )
{
_InterlockedAnd64((volatile signed __int64 *)v10 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v12);
v8 = -1073740277;
goto LABEL_16;
}
if( !MiIsPageOnBadList((INT64)v10) )
{
_InterlockedAnd64((volatile signed __int64 *)v10 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v14);
v8 = -1073740682;
goto LABEL_16;
}
MiUnlinkPageFromBadList(v15);
MiSetPfnRemovalRequested((INT64)v10, 1i64);
*((_QWORD *)v10 + 3) |= 0x4000000000000000ui64;
_InterlockedAnd64((volatile signed __int64 *)v10 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v14);
++v7;
++v4;
v11 += 6;
v10 += 48;
if( v7 >= a3 )
goto LABEL_18;
}
v8 = -1073741585;
LABEL_16:
if( v7 )
MiReturnBadPagesToBadList(v4 - v7, v7);
LABEL_18:
CurrentThread = v16;
}
if( _InterlockedCompareExchange64((volatile signed __int64 *)&qword_140C50B80, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)&qword_140C50B80);
KeAbPostRelease(&qword_140C50B80);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
return v8;
}Referenced by:
MmRemovePhysicalMemory