MiTryUnlinkNodeLargePage
INT64 __fastcall MiTryUnlinkNodeLargePage(UINT64 BaseLargePage, UINT64 LargePageIndex){
int v2;
char v3;
_DWORD *v4;
char v6;
__int64 v8;
__int64 v9;
char *v10;
unsigned __int8 v11;
void *v12;
__int64 v13;
__int64 v14;
__int64 v15;
unsigned int v16;
__int64 v17;
int PfnPageSizeIndex;
_BOOL8 v19;
unsigned __int8 v20;
unsigned int Channel;
__int64 v23;
struct _KLOCK_QUEUE_HANDLE LockHandle;
__int64 v25;
__int64 PcValue;
__int64 v27[3];
UINT64 SpinCount;
INT64 LargePageIndexa;
_DWORD *v31;
LODWORD(LargePageIndexa) = v2;
v4 = v31;
memset(&LockHandle, 0, sizeof(LockHandle));
v6 = v3;
LODWORD(v8) = MiSearchNumaNodeTable((PVOID)LargePageIndex);
v9 = *(unsigned int *)(v8 + 8);
v10 = (char *)MmGetPfnDb() + 48 * LargePageIndex;
Channel = MiGetPfnChannel((INT64)v10);
v11 = MiLockPageInline((INT64)v10);
v13 = *(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v10 + 5) >> 39) & 0x3FFi64));
if( v13 != BaseLargePage )
{
LABEL_15:
_InterlockedAnd64((volatile signed __int64 *)v10 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v11);
*v4 = 1;
return 0i64;
}
v14 = 4544 * v9;
v23 = 4544 * v9;
while( 1 )
{
v15 = *(_QWORD *)(v13 + 16);
v16 = 1;
LockHandle.LockQueue.Next = 0i64;
v17 = v14 + v15;
LockHandle.LockQueue.Lock = (unsigned __int64 *volatile)(v17 + 4328);
KxAcquireQueuedSpinLock((PIO_WORKITEM)&LockHandle, (PIO_WORKITEM_ROUTINE)(v17 + 4328), (WORK_QUEUE_TYPE)v13, v12);
PfnPageSizeIndex = MiGetPfnPageSizeIndex((INT64)v10);
if( PfnPageSizeIndex != (_DWORD)LargePageIndexa )
{
LODWORD(v19) = 1;
goto LABEL_7;
}
v20 = v10[34] & 7;
if( v20 <= 1u )
break;
v19 = v20 != 5;
LABEL_7:
v16 = 0;
*v4 = v19;
if( !*(_DWORD *)(v17 + 4284) )
goto LABEL_22;
if( (v6 & 0x10) != 0 )
{
PcValue = 393479i64;
v27[1] = (__int64)v27;
v27[0] = (__int64)v27;
v25 = *(_QWORD *)(v17 + 4288);
*(_QWORD *)(v17 + 4288) = &v25;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
_InterlockedAnd64((volatile signed __int64 *)v10 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v11);
KeWaitForGate(&PcValue, 18);
}
else
{
LODWORD(SpinCount) = 0;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
_InterlockedAnd64((volatile signed __int64 *)v10 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v11);
if( v11 != 2 )
{
*v4 = 0;
return 0i64;
}
LODWORD(SpinCount) = 0;
while( *(_DWORD *)(v17 + 4284) )
KeYieldProcessorEx(&SpinCount);
}
v11 = MiLockPageInline((INT64)v10);
v13 = *(_QWORD *)(qword_140C4E388 + 8 * ((*((_QWORD *)v10 + 5) >> 39) & 0x3FFi64));
v14 = v23;
if( v13 != BaseLargePage )
goto LABEL_15;
}
if( MiUnlinkNodeLargePageHelper((_MI_NODE_INFORMATION *)v17, (_MMPFN *)v10, (unsigned int)LargePageIndexa, Channel) )
{
if( (v6 & 0x20) != 0 )
++*(_DWORD *)(v23 + *(_QWORD *)(BaseLargePage + 16) + 4284);
}
else
{
*v4 = 0;
v16 = 0;
}
LABEL_22:
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
if( v16 && (v6 & 0x20) != 0 )
v11 = 2;
_InterlockedAnd64((volatile signed __int64 *)v10 + 3, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v11);
return v16;
}Referenced by:
MiDemoteLargeFreePage
MiLargeFreePageToMdl
MiMoveLargeFreePage