PopDripsWatchdogDiagnosticWorker
VOID __stdcall PopDripsWatchdogDiagnosticWorker(_ERESOURCE *Resource){
INT64 v1;
unsigned int *p_ActiveEntries;
_ETHREAD *CurrentThread;
UINT64 *v5;
__int64 v6;
__int64 v7;
unsigned __int8 v8;
_LIST_ENTRY *Flink;
unsigned int v10;
_OWNER_ENTRY OwnerEntry;
unsigned int NumberOfSharedWaiters;
__int64 v13;
int Flink_high;
INT64 v15;
_ETHREAD *v16;
int v17;
int v18;
__int64 v19;
__int128 v20;
__int128 v21;
_POP_DRIPS_WATCHDOG_METRICS Metrics;
p_ActiveEntries = &Resource[3].ActiveEntries;
memset(&Metrics, 0, sizeof(Metrics));
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v20 = 0i64;
--CurrentThread->Tcb.KernelApcDisable;
v21 = 0i64;
ExAcquireResourceExclusiveLite((UINT64)Resource, 1, v1);
if( ((__int64)Resource[1].SystemResourcesList.Flink & 4) != 0 && (p_ActiveEntries[45] & 2) != 0 )
{
++LODWORD(Resource[6].OwnerTable);
v6 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
v18 = 0;
v19 = 0i64;
v17 = 0;
PopCalculateIdleInformation((__int64)&v20, v5);
PopDripsWatchdogUpdateMetrics((__int64)Resource, v6, (__int64)&v20, &v18, &v19, &v17);
v7 = 0i64;
v8 = 0;
if( (_QWORD)v21 != -1i64 )
{
Flink = Resource[6].SystemResourcesList.Flink;
if( Flink != (_LIST_ENTRY *)-1i64 )
{
v8 = 1;
v7 = v21 - (_QWORD)Flink;
}
}
v10 = p_ActiveEntries[45];
if( (v10 & 4) == 0 )
{
OwnerEntry = Resource[5].OwnerEntry;
NumberOfSharedWaiters = Resource[5].NumberOfSharedWaiters;
v13 = *(_QWORD *)&Resource[5].ActiveEntries;
Flink_high = HIDWORD(Resource[1].SystemResourcesList.Flink);
p_ActiveEntries[45] = v10 | 4;
*(_OWNER_ENTRY *)&Metrics.NonDripsDurationMs = OwnerEntry;
*(_DWORD *)&Metrics.OnAc = NumberOfSharedWaiters;
*(_QWORD *)&Metrics.NonActivatedCpuTimeAsPercentage = v13;
PopDripsWatchdogScheduleNextTimer((_KTIMER2 *)p_ActiveEntries);
ExReleaseResourceLite(Resource);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
if( v17 )
{
if( !v18 && PopDeepSleepEnabled() )
PopDeepSleepWatchdogTakeAction(&Metrics, Flink_high);
}
else if( !qword_140C4FC98 )
{
PopDripsWatchdogTakeAction(&Metrics, Flink_high);
}
PopDiagTraceCsDripsDivergence(v8, v19, v7);
if( v8 )
PopDripsWatchdogCheckHwDivergence(v7, v19);
v16 = (_ETHREAD *)KeGetCurrentThread();
--v16->Tcb.KernelApcDisable;
ExAcquireResourceExclusiveLite((UINT64)Resource, 1, v15);
p_ActiveEntries[45] &= ~4u;
}
}
ExReleaseResourceLite(Resource);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
}Referenced by:
No references.