MiRebuildLargePages
VOID __stdcall MiRebuildLargePages(VOID *Context){
_MI_NODE_INFORMATION *v1;
unsigned __int64 TotalPagesEntireNode;
unsigned __int64 v3;
unsigned __int64 v4;
unsigned __int64 v5;
_MI_PARTITION *v6;
unsigned int v7;
unsigned __int64 v8;
unsigned __int64 v9;
unsigned int i;
__int64 v11;
unsigned __int8 CurrentIrql;
unsigned __int64 *p_LargePageLock;
_BYTE *v14;
bool v15;
unsigned int v16;
unsigned __int64 v17;
UINT64 j;
__int64 v19;
__int64 v20;
int v21;
unsigned __int64 v22;
char v23;
__int64 v24;
__int64 v25;
unsigned __int8 NextPassDelta;
_KLOCK_QUEUE_HANDLE LockQueue[4];
unsigned __int64 NodeNumber;
unsigned __int8 LargeSubPagesActive;
_MI_PARTITION *Partition;
NodeNumber = (unsigned __int64)Context >> 53;
memset(LockQueue, 0, 24);
Partition = (_MI_PARTITION *)(16 * ((unsigned __int64)Context | 0xFFE0000000000000ui64));
v1 = &Partition->Core.NodeInformation[(unsigned __int64)Context >> 53];
TotalPagesEntireNode = v1->TotalPagesEntireNode;
LargeSubPagesActive = v1->LargePageRebuildTimer.LargeSubPagesActive;
v3 = TotalPagesEntireNode / 0xC8;
if( TotalPagesEntireNode / 0xC8 >= (-(__int64)(LargeSubPagesActive != 0) & 0xFFFFFFFFFFFFE100ui64) + 0x2000 )
{
LODWORD(v4) = MiNodeLargeFreeZeroPages(v1, 4ui64, StandbyPageList);
v5 = v4;
if( v4 < v3 )
{
v7 = MmNumberOfChannels;
v8 = v3 - v4;
v9 = 0i64;
for( i = 0; i < v7; ++i )
{
LODWORD(v11) = MiNodeFreeZeroPages(v1, i, 0i64);
v9 += v11;
}
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LockQueue[0].LockQueue.Next = 0i64;
p_LargePageLock = &v1->LargePageLock;
LockQueue[0].LockQueue.Lock = &v1->LargePageLock;
KxAcquireQueuedSpinLock(&LockQueue[0].LockQueue, &v1->LargePageLock);
v14 = KeAbPreAcquire(v1, 0i64, 0i64);
if( v14 )
v14[26] |= 1u;
if( v9 >= v8 )
{
v6 = Partition;
}
else
{
v15 = v5 < 0x400;
v6 = Partition;
if( v15 )
{
v16 = MmNumberOfChannels;
v17 = 0i64;
for( j = 0i64; (unsigned int)j < v16; j = (unsigned int)(v21 + 1) )
{
MiGetNodeStandbyPageCount(Partition, (unsigned int)NodeNumber, j);
v17 = v19 + v20;
}
if( TotalPagesEntireNode < 0x5000A )
v22 = 0x8000i64;
else
v22 = TotalPagesEntireNode / 0xA;
p_LargePageLock = &v1->LargePageLock;
if( v17 > v22 )
v9 += (v17 - v22) / 0xC8;
}
if( v9 < v8 )
{
v23 = 8;
LABEL_28:
v1->LargePageRebuildTimer.NextPassDelta = v23;
v1->LargePageRebuildTimer.SecondsLeft = v23;
v1->LargePageRebuildTimer.RebuildActive = 0;
KeReleaseInStackQueuedSpinLockFromDpcLevel(LockQueue);
__writecr8(CurrentIrql);
KeAbPostRelease(v1);
goto LABEL_4;
}
}
v1->LargePageRebuildTimer.LargeSubPagesActive = 0;
KeReleaseInStackQueuedSpinLockFromDpcLevel(LockQueue);
__writecr8(CurrentIrql);
LODWORD(v24) = MiRebuildLargePage(v6, (unsigned int)NodeNumber);
v25 = v24;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LockQueue[0].LockQueue.Next = 0i64;
LockQueue[0].LockQueue.Lock = p_LargePageLock;
KxAcquireQueuedSpinLock(&LockQueue[0].LockQueue, p_LargePageLock);
if( v25 )
{
v23 = 8;
}
else
{
if( LargeSubPagesActive )
v1->LargePageRebuildTimer.LargeSubPagesActive = 1;
NextPassDelta = v1->LargePageRebuildTimer.NextPassDelta;
if( NextPassDelta >= 0x80u )
v23 = -1;
else
v23 = 2 * NextPassDelta;
}
goto LABEL_28;
}
}
v6 = Partition;
LABEL_4:
PsDereferencePartition((INT64)v6->Core.PartitionObject);
}Referenced by:
No references.