MiUnlinkPageFromBadList
VOID __stdcall MiUnlinkPageFromBadList(_MMPFN *Pfn1){
char v1;
char v2;
unsigned __int64 v4;
int v5;
_MMPFN *PfnDb;
_MI_PARTITION *v7;
_MMPFNLIST *p_BadPageListHead;
int v9;
__int64 v10;
__int64 v11;
_MMPFN *v12;
unsigned __int64 v13;
unsigned __int64 v14;
volatile signed __int32 *v15;
unsigned int v16;
int v17;
unsigned __int64 v18;
_KLOCK_QUEUE_HANDLE LockQueue[2];
v2 = v1;
memset(LockQueue, 0, 24);
v4 = Pfn1 - MmGetPfnDb();
LOBYTE(v5) = MiIsPfnFileOnly((INT64)Pfn1);
if( v5 )
{
v7 = &Irp;
p_BadPageListHead = &stru_140C4C800;
}
else
{
v7 = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)Pfn1->u4._bf_0 >> 39) & 0x3FF));
p_BadPageListHead = &v7->PageLists.BadPageListHead;
}
v9 = v2 & 0x80;
if( !v9 )
{
LockQueue[0].LockQueue.Next = 0i64;
LockQueue[0].LockQueue.Lock = &v7->PageLists.BadPageListHead.Lock;
KxAcquireQueuedSpinLock(&LockQueue[0].LockQueue, &v7->PageLists.BadPageListHead.Lock);
PfnDb = MmGetPfnDb();
}
v10 = Pfn1->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 & 0xFFFFFFFFFi64;
v11 = Pfn1->u2._bf_0 & 0xFFFFFFFFFi64;
if( v10 == 0xFFFFFFFFFi64 )
p_BadPageListHead->Blink = v11;
else
MiSetPfnBlink(&PfnDb[v10], Pfn1->u2._bf_0 & 0xFFFFFFFFFi64, 0i64);
if( v11 == 0xFFFFFFFFFi64 )
{
p_BadPageListHead->Flink = v10;
}
else
{
v12 = &MmGetPfnDb()[v11];
v12->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 = v10 | v12->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 & 0xFFFFFFF000000000ui64;
}
if( p_BadPageListHead != &stru_140C4C800 && *(&stru_140C4DB30 + 567) == 1 )
{
v13 = v4 & 0x1F;
LOBYTE(v14) = 1;
v15 = (volatile signed __int32 *)(*(&stru_140C4DB30 + 295) + 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:
--p_BadPageListHead->Total;
if( !v9 )
KeReleaseInStackQueuedSpinLockFromDpcLevel(LockQueue);
Pfn1->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0 = 0i64;
MiSetPfnBlink(Pfn1, 0i64, 1ui64);
if( p_BadPageListHead != &stru_140C4C800 )
Pfn1->PteLong = 0i64;
}Referenced by:
MiPurgeBadFileOnlyPages
MiRemoveBadPages
MiTransferPartitionPageRun
MiUnlinkBadPages
MiUnlinkPageFromList