PopFxResidentTimeoutRoutine
VOID __stdcall PopFxResidentTimeoutRoutine(PVOID Parameter){
_ETHREAD *CurrentThread;
__int64 v2;
ULONG_PTR v3;
__int64 v4;
unsigned int i;
__int64 v6;
INT64 CurrentQpc;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockSharedEx((UINT64)&PopFxDeviceListLock, 0i64);
if( (ULONG_PTR *)PopFxDeviceList != &PopFxDeviceList )
{
LODWORD(v2) = RtlGetInterruptTimePrecise(&CurrentQpc);
v3 = PopFxDeviceList;
v4 = v2;
while( (ULONG_PTR *)v3 != &PopFxDeviceList )
{
for( i = 0; i < *(_DWORD *)(v3 + 828); ++i )
{
v6 = *(_QWORD *)(*(_QWORD *)(v3 + 832) + 8i64 * i);
if( *(int *)(v6 + 96) > 0
&& v4 - *(_QWORD *)(v6 + 144) >= (unsigned __int64)(unsigned int)PopFxActiveIdleThreshold )
{
_InterlockedAdd((volatile signed __int32 *)(v6 + 96), 0xFFFFFFFF);
_InterlockedAdd(&PopFxResidentComponentCount, 0xFFFFFFFF);
PopFxIdleComponent(v3, i, 1, 0i64);
}
}
v3 = *(_QWORD *)v3;
}
}
if( _InterlockedCompareExchange64((volatile signed __int64 *)&PopFxDeviceListLock, 0i64, 17i64) != 17 )
ExfReleasePushLockShared((INT64 *)&PopFxDeviceListLock);
KeAbPostRelease(&PopFxDeviceListLock);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
PopFxArmResidentTimer(1u);
}Referenced by:
No references.