MiUnlinkPageFromBadList
UINT8 __fastcall MiUnlinkPageFromBadList(_RTL_ATOM_TABLE *AtomTable){
char v1;
char v2;
unsigned __int64 v4;
WORK_QUEUE_TYPE v5;
_MMPFN *PfnDb;
ULONG_PTR *v7;
INT64 *v8;
int v9;
__int64 v10;
__int64 v11;
unsigned __int64 *v12;
unsigned __int64 v13;
unsigned __int64 v14;
volatile signed __int32 *v15;
unsigned int v16;
int v17;
unsigned __int64 v18;
UINT8 result;
_BYTE LockHandle[56];
v2 = v1;
memset(LockHandle, 0, 24);
v4 = ((char *)AtomTable - (char *)MmGetPfnDb()) / 48;
if( MiIsPfnFileOnly((INT64)AtomTable) )
{
v7 = &MiSystemPartition;
v8 = &qword_140C4C800;
}
else
{
v7 = *(ULONG_PTR **)(qword_140C4E388 + 8 * ((*(_QWORD *)&AtomTable[1].Signature >> 39) & 0x3FFi64));
v8 = (INT64 *)(v7 + 512);
}
v9 = v2 & 0x80;
if( !v9 )
{
*(_QWORD *)LockHandle = 0i64;
*(_QWORD *)&LockHandle[8] = v7 + 516;
KxAcquireQueuedSpinLock((PIO_WORKITEM)LockHandle, (PIO_WORKITEM_ROUTINE)(v7 + 516), v5, PfnDb);
PfnDb = MmGetPfnDb();
}
v10 = *(_QWORD *)&AtomTable->Signature & 0xFFFFFFFFFi64;
v11 = *(_QWORD *)&AtomTable->Flags & 0xFFFFFFFFFi64;
if( v10 == 0xFFFFFFFFFi64 )
v8[3] = v11;
else
MiSetPfnBlink((_MMPFN *)((char *)PfnDb + 48 * v10), *(_QWORD *)&AtomTable->Flags & 0xFFFFFFFFFi64, 0i64);
if( v11 == 0xFFFFFFFFFi64 )
{
v8[2] = v10;
}
else
{
v12 = (unsigned __int64 *)((char *)MmGetPfnDb() + 48 * v11);
*v12 = v10 | *v12 & 0xFFFFFFF000000000ui64;
}
if( v8 != &qword_140C4C800 && dword_140C4E40C == 1 )
{
v13 = v4 & 0x1F;
LOBYTE(v14) = 1;
v15 = (volatile signed __int32 *)(qword_140C4E468 + 4 * (v4 >> 5));
if( v13 + 1 <= 0x20 )
{
v16 = 1 << v13;
LABEL_22:
_InterlockedOr(v15, v16);
goto LABEL_23;
}
if( (v4 & 0x1F) == 0 )
goto LABEL_21;
v17 = v4 & 0x1F;
_InterlockedOr(v15++, ((1 << (32 - v17)) - 1) << v13);
v14 = 1i64 - (unsigned int)(32 - v17);
if( v14 >= 0x20 )
{
v18 = v14 >> 5;
v14 += -32i64 * (v14 >> 5);
do
{
*v15++ = -1;
--v18;
}
while( v18 );
}
if( v14 )
{
LABEL_21:
v16 = (1 << v14) - 1;
goto LABEL_22;
}
}
LABEL_23:
--*v8;
if( !v9 )
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)LockHandle);
*(_QWORD *)&AtomTable->Signature = 0i64;
MiSetPfnBlink((_MMPFN *)AtomTable, 0i64, 1ui64);
if( v8 != &qword_140C4C800 )
AtomTable->PushLock.Value = 0i64;
return result;
}Referenced by:
MiPurgeBadFileOnlyPages
MiRemoveBadPages
MiTransferPartitionPageRun
MiUnlinkBadPages
MiUnlinkPageFromList