PopDripsWatchdogDiagnosticWorker
VOID __stdcall PopDripsWatchdogDiagnosticWorker(ERESOURCE *Resource){
unsigned int *p_ActiveEntries;
_ETHREAD *CurrentThread;
UINT64 *v4;
INT64 v5;
EVENT_DESCRIPTOR *v6;
unsigned __int8 v7;
_LIST_ENTRY *Flink;
unsigned int v9;
_OWNER_ENTRY OwnerEntry;
unsigned int NumberOfSharedWaiters;
__int64 v12;
int Flink_high;
int OwnerTable;
_ETHREAD *v15;
int a6;
int a4;
INT64 a2;
INT64 a3[2];
__int128 v20;
INT64 v21[2];
__int64 v22;
unsigned int v23;
p_ActiveEntries = &Resource[3].ActiveEntries;
v22 = 0i64;
v23 = 0;
*(_OWORD *)v21 = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
*(_OWORD *)a3 = 0i64;
--*((_WORD *)CurrentThread + 242);
v20 = 0i64;
ExAcquireResourceExclusiveLite(Resource, 1u);
if( ((__int64)Resource[1].SystemResourcesList.Flink & 4) != 0 && (p_ActiveEntries[45] & 2) != 0 )
{
++LODWORD(Resource[6].OwnerTable);
v5 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
a4 = 0;
a2 = 0i64;
a6 = 0;
PopCalculateIdleInformation((INT64)a3, v4);
PopDripsWatchdogUpdateMetrics((INT64)Resource, v5, (INT64)a3, &a4, &a2, &a6);
v6 = 0i64;
v7 = 0;
if( (_QWORD)v20 != -1i64 )
{
Flink = Resource[6].SystemResourcesList.Flink;
if( Flink != (_LIST_ENTRY *)-1i64 )
{
v7 = 1;
v6 = (EVENT_DESCRIPTOR *)(v20 - (_QWORD)Flink);
}
}
v9 = p_ActiveEntries[45];
if( (v9 & 4) == 0 )
{
OwnerEntry = Resource[5].OwnerEntry;
NumberOfSharedWaiters = Resource[5].NumberOfSharedWaiters;
v12 = *(_QWORD *)&Resource[5].ActiveEntries;
Flink_high = HIDWORD(Resource[1].SystemResourcesList.Flink);
OwnerTable = (int)Resource[6].OwnerTable;
p_ActiveEntries[45] = v9 | 4;
*(_OWNER_ENTRY *)v21 = OwnerEntry;
v23 = NumberOfSharedWaiters;
v22 = v12;
PopDripsWatchdogScheduleNextTimer((__int64)p_ActiveEntries);
ExReleaseResourceLite(Resource);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
if( a6 )
{
if( !a4 && PopDeepSleepEnabled() )
PopDeepSleepWatchdogTakeAction((INT64)v21, Flink_high);
}
else if( !qword_140C4FC98 )
{
PopDripsWatchdogTakeAction((__int64)v21, Flink_high, OwnerTable);
}
PopDiagTraceCsDripsDivergence(v7, a2, v6);
if( v7 )
PopDripsWatchdogCheckHwDivergence((UINT64)v6, a2);
v15 = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)v15 + 242);
ExAcquireResourceExclusiveLite(Resource, 1u);
p_ActiveEntries[45] &= ~4u;
}
}
ExReleaseResourceLite(Resource);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
}Referenced by:
No references.