MiMarkHugePfnBad
NTSTATUS __stdcall MiMarkHugePfnBad(UINT64 a1, INT64 a2){
_RTL_BALANCED_NODE *Root;
_ETHREAD *CurrentThread;
NTSTATUS v4;
unsigned __int64 v5;
_QWORD *v7;
_MI_PARTITION *v8;
_MI_PARTITION *v9;
int v11;
_QWORD *v12;
VOID **PoolWithTag;
VOID **v14;
VOID **v15;
int v16;
_RTL_BALANCED_NODE *v17;
BOOL v18;
_RTL_BALANCED_NODE *v19;
_RTL_BALANCED_NODE *v20;
unsigned __int64 v21;
_RTL_BALANCED_NODE *v22;
unsigned __int64 v23;
unsigned __int8 v24;
__int64 v25;
_KLOCK_QUEUE_HANDLE LockHandle;
_RTL_BALANCED_NODE *P;
int v28;
_QWORD *v29;
_ETHREAD *Thread;
v28 = a2;
Root = 0i64;
memset(&LockHandle, 0, sizeof(LockHandle));
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v4 = 0;
v5 = (a1 >> 18) & 0x3FFFF;
P = 0i64;
Thread = CurrentThread;
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&stru_140C4DB30 + 259, 0i64);
v7 = (_QWORD *)(*(&stru_140C4DB30 + 272) + 8 * v5);
while( 1 )
{
v8 = (_MI_PARTITION *)MiHugePfnPartition(v7);
v9 = v8;
if( !v8 )
{
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(v8, CurrentThread);
if( v9 == (_MI_PARTITION *)MiHugePfnPartition(v7) )
break;
MiUnlockDynamicMemoryExclusive(v9, CurrentThread);
}
if( (v9->Core.u.LongFlags & 1) != 0
|| (KeAcquireInStackQueuedSpinLock(&v9->PageLists.BadPageListHead.Lock, &LockHandle),
LOBYTE(v11) = MiIsPageInHugePfn(a1),
!v11) )
{
LABEL_15:
v4 = -1073740748;
goto LABEL_16;
}
while( 1 )
{
v12 = (_QWORD *)(*(&stru_140C4DB30 + 272) + 8 * v5);
v29 = v12;
if( (*v12 & 0x10000000000i64) != 0 )
{
P = Root;
Root = v9->PageLists.HugePfnBadPages.Root;
while( Root )
{
v21 = (__int64)Root[1].Children[0] & 0x3FFFF;
if( v5 > v21 )
{
Root = Root->Children[1];
}
else
{
if( v5 >= v21 )
break;
Root = Root->Children[0];
}
}
v4 = (*v12 & 0x1C0000i64) != 0x100000 ? 0x103 : 0;
goto LABEL_42;
}
if( Root )
break;
KeReleaseInStackQueuedSpinLock(&LockHandle);
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x10000ui64, 1883793741i64);
v14 = PoolWithTag;
if( !PoolWithTag )
{
v4 = -1073741670;
goto LABEL_17;
}
memset(PoolWithTag, 0i64, 0x10000u);
v15 = ExAllocatePoolWithTag(0x200ui64, 0x28ui64, 1883793741i64);
Root = (_RTL_BALANCED_NODE *)v15;
if( !v15 )
{
v17 = (_RTL_BALANCED_NODE *)v14;
v4 = -1073741670;
goto LABEL_18;
}
v15[3] = (VOID *)v5;
v15[4] = v14;
KeAcquireInStackQueuedSpinLock(&v9->PageLists.BadPageListHead.Lock, &LockHandle);
LOBYTE(v16) = MiIsPageInHugePfn(a1);
if( !v16 )
goto LABEL_15;
}
v18 = 0;
v19 = v9->PageLists.HugePfnBadPages.Root;
if( !v19 )
goto LABEL_34;
while( v5 < ((unsigned __int64)v19[1].Children[0] & 0x3FFFF) )
{
v20 = v19->Children[0];
if( !v19->Children[0] )
goto LABEL_34;
LABEL_32:
v19 = v20;
}
v20 = v19->Children[1];
if( v20 )
goto LABEL_32;
v18 = 1;
LABEL_34:
RtlAvlInsertNodeEx(&v9->PageLists.HugePfnBadPages.Root, (UINT64)v19, v18, Root);
v12 = v29;
*v29 |= 0x10000000000ui64;
LABEL_42:
v22 = Root[1].Children[1];
v23 = a1 & 0x3FFFF;
if( !_bittest64((const signed __int64 *)v22, v23) )
{
_bittestandset64((signed __int64 *)v22, v23);
v22 = Root[1].Children[1];
}
v24 = _bittest64((const signed __int64 *)&v22[1365].Children[1], v23);
if( (v28 & 0x10000000) != 0 )
{
if( !v24 )
_bittestandset64((signed __int64 *)&v22[1365].Children[1], v23);
}
else if( v24 )
{
_bittestandreset64((signed __int64 *)&v22[1365].Children[1], v23);
}
if( (((*(_DWORD *)v12 & 0x1C0000) - 0x40000i64) & 0xFFFFFFFFFFFBFFFFui64) == 0 )
{
v25 = MiHugePfnPartition(v12);
MiUnlinkHugeRange(v25, v5);
MiInsertHugeRangeInList(v5, 160, 0i64);
}
LABEL_16:
KeReleaseInStackQueuedSpinLock(&LockHandle);
LABEL_17:
v17 = P;
LABEL_18:
MiUnlockDynamicMemoryExclusive(v9, Thread);
if( (_InterlockedExchangeAdd64((_QWORD *)&stru_140C4DB30 + 259, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)&stru_140C4DB30 + 259);
KeAbPostRelease((char *)&stru_140C4DB30 + 2072);
KiLeaveGuardedRegionUnsafe((__int64)Thread);
if( v17 )
ExFreePoolWithTag(v17, 0);
if( v4 == -1073740748 )
KeDelayExecutionThread(0, 0, (_LARGE_INTEGER *)&Mi10Milliseconds);
return v4;
}Referenced by:
MmMarkPhysicalMemoryAsBad