MiZeroLargePageThread
VOID __stdcall MiZeroLargePageThread(VOID *Context){
INT64 v1;
__int64 v2;
__int64 v4;
int v5;
__int64 v6;
__int64 v7;
unsigned int *v8;
unsigned __int8 CurrentIrql;
bool v10;
__int64 v11;
_KSPIN_LOCK_QUEUE *volatile Next;
__int64 v13;
_QWORD *v14;
__int64 v15;
UINT8 v16;
void *v17;
_MI_PARTITION *v18;
struct _KPRCB *CurrentPrcb;
__int64 v20;
_KSPIN_LOCK_QUEUE LockQueue;
__int64 v22;
_KLOCK_QUEUE_HANDLE LockHandle;
void *v24;
INT64 v25;
__int64 v26;
__int64 v27;
v1 = *((_QWORD *)Context + 29);
v22 = 0i64;
v2 = *((unsigned int *)Context + 66);
LockQueue = 0i64;
v4 = *(_QWORD *)(v1 + 72);
v25 = v1;
v27 = v4;
v5 = 1;
v6 = *(_QWORD *)(v1 + 144) + 40 * v2;
v7 = *(_QWORD *)(v4 + 16) + 4544i64 * *(unsigned int *)(v1 + 80);
v26 = v7;
KeWaitForSingleObject(v1 + 88, 0, 0, 0, 0i64);
while( 1 )
{
MiZeroLargePages((_MI_ZERO_THREAD_CONTEXT *)Context);
if( *(_BYTE *)(v4 + 6400) == 1 )
break;
if( *((_BYTE *)Context + 80) )
{
v8 = (unsigned int *)*((_QWORD *)Context + 28);
memset(&LockHandle, 0, sizeof(LockHandle));
if( v8 )
{
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)(qword_140C50AD0 + 4544i64 * v8[46] + 4304), &LockHandle);
MiDecrementHugeContext(v8);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
*((_QWORD *)Context + 28) = 0i64;
}
}
if( v5 )
MiSignalZeroingPassComplete((INT64)Context);
LockQueue.Next = 0i64;
LockQueue.Lock = (unsigned __int64 *volatile)(v1 + 24);
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LOBYTE(v22) = CurrentIrql;
if( _InterlockedExchange64((volatile __int64 *)(v1 + 24), (__int64)&LockQueue) )
KxWaitForLockOwnerShip((INT64)&LockQueue);
if( v5 && !*(_BYTE *)(v1 + 132) )
{
*(_BYTE *)(v1 + 132) = 1;
MiWakeZeroingThreads(v1, 5);
}
*(_BYTE *)(v6 + 4) &= ~2u;
*(_BYTE *)(v6 + 4) |= 4u;
if( (*(_BYTE *)(v6 + 4) & 1) == 0 )
{
*(_BYTE *)(v6 + 4) |= 1u;
v10 = (*(_DWORD *)(v1 + 164))-- == 1;
if( v10 )
*(_BYTE *)(v7 + 4490) = 0;
}
v11 = *((_QWORD *)Context + 30);
*((_QWORD *)Context + 30) = 0i64;
_m_prefetchw(&LockQueue);
Next = LockQueue.Next;
if( !LockQueue.Next )
{
if( (_KSPIN_LOCK_QUEUE *)_InterlockedCompareExchange64(
(volatile signed __int64 *)LockQueue.Lock,
0i64,
(signed __int64)&LockQueue) == &LockQueue )
goto LABEL_16;
Next = KxWaitForLockChainValid(&LockQueue);
}
LockQueue.Next = 0i64;
_InterlockedXor64((volatile signed __int64 *)&Next->Lock, 1ui64);
LABEL_16:
__writecr8((unsigned __int8)v22);
if( v11 )
{
v13 = *(_QWORD *)(v11 - 16);
v14 = (_QWORD *)(v11 - 16);
v15 = 0i64;
v24 = 0i64;
v16 = KeGetCurrentIrql();
__writecr8(2ui64);
ExpAcquireSpinLockExclusive((INT64 *)(v13 + 200), v16);
v10 = v14[1]-- == 1i64;
if( v10 )
{
v17 = v14;
v24 = v14;
}
else
{
v17 = 0i64;
}
v18 = &Irp;
if( (_MI_PARTITION *)v13 != &Irp )
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)(v13 + 200));
__writecr8(v16);
LODWORD(v18) = ExAcquireSpinLockExclusive((INT64 *)&stru_140C50B28 + 12);
v17 = v24;
v16 = (unsigned __int8)v18;
}
if( !--qword_140C50AE8 )
{
v15 = qword_140C50B18;
qword_140C50B18 = 0i64;
}
*(&stru_140C50B28 + 24) = 0;
CurrentPrcb = KeGetCurrentPrcb();
if( CurrentPrcb->SchedulerAssist && CurrentPrcb->NestingLevel <= 1u && !(_DWORD)v18 )
v17 = v24;
__writecr8(v16);
if( v15 )
{
do
{
v20 = *(_QWORD *)v15;
KeSignalGate((_KGATE *)(v15 + 8), 1i64);
v15 = v20;
}
while( v20 );
v17 = v24;
}
if( v17 )
ExFreePoolWithTag(v17, 0);
v7 = v26;
v1 = v25;
}
v4 = v27;
v5 = 0;
}
MiDeleteZeroThreadContext((_MI_ZERO_THREAD_CONTEXT *)Context);
}Referenced by:
No references.