PopSetWatchdog
CHAR *__fastcall PopSetWatchdog(CHAR *P, UINT64 *a2, CHAR a3){
CHAR *v5;
unsigned __int64 v6;
unsigned int v7;
unsigned __int8 v8;
unsigned __int8 v9;
__int64 v10;
CHAR *result;
__int64 v12;
__int64 v13;
char v14;
UINT64 v15;
unsigned __int8 v16;
__int64 v17;
__int64 v18;
CHAR **v19;
UINT64 v20;
unsigned __int8 v21;
char v22;
v22 = 0;
v5 = P;
v6 = 0i64;
v7 = 0;
if( P )
{
KeAcquireSpinLockRaiseToDpc(&PopWatchdogLock, (UINT64)a2);
v9 = v8;
}
else
{
result = (CHAR *)ExAllocatePoolWithTag(NonPagedPoolNx, 0x138ui64, 0x44574F50ui64);
v5 = result;
if( !result )
return result;
memset((INT64)result, 0i64);
*((_DWORD *)v5 + 4) = 1146572624;
*((_QWORD *)v5 + 5) = v5 + 32;
*((_QWORD *)v5 + 4) = v5 + 32;
*(_WORD *)(v5 + 25) = 1536;
*((_DWORD *)v5 + 7) = 1;
*((_QWORD *)v5 + 8) = v5 + 56;
*((_QWORD *)v5 + 7) = v5 + 56;
*((_QWORD *)v5 + 6) = 0i64;
v5[48] = 8;
*((_QWORD *)v5 + 9) = 0i64;
*((_DWORD *)v5 + 27) = 0;
*((_WORD *)v5 + 52) = 0;
*((_QWORD *)v5 + 17) = PopWatchdogDpc;
*((_DWORD *)v5 + 28) = 275;
*((_QWORD *)v5 + 18) = v5;
*((_QWORD *)v5 + 21) = 0i64;
*((_QWORD *)v5 + 16) = 0i64;
*((_QWORD *)v5 + 24) = PopWatchdogWorker;
*((_QWORD *)v5 + 25) = v5;
*((_QWORD *)v5 + 22) = 0i64;
KeAcquireSpinLockRaiseToDpc(&PopWatchdogLock, v15);
v9 = v16;
v17 = PopWatchdogList;
if( *(__int64 **)(PopWatchdogList + 8) != &PopWatchdogList )
goto LABEL_23;
*(_QWORD *)v5 = PopWatchdogList;
*((_QWORD *)v5 + 1) = &PopWatchdogList;
*(_QWORD *)(v17 + 8) = v5;
PopWatchdogList = (__int64)v5;
}
if( *((_DWORD *)v5 + 4) != 1146572624 )
__fastfail(5u);
v10 = *(unsigned int *)a2;
if( (_DWORD)v10 && !a3 )
{
v12 = 10000 * v10;
*((_OWORD *)v5 + 14) = *(_OWORD *)a2;
*((_OWORD *)v5 + 15) = *((_OWORD *)a2 + 1);
*((_OWORD *)v5 + 16) = *((_OWORD *)a2 + 2);
*((_OWORD *)v5 + 17) = *((_OWORD *)a2 + 3);
*((_QWORD *)v5 + 36) = a2[8];
v13 = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
*((_QWORD *)v5 + 37) = *(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart;
*((_QWORD *)v5 + 26) = v12 + v13;
*((_QWORD *)v5 + 38) = KeGetCurrentThread();
v5[216] = 1;
KiSetTimerEx((_KTIMER *)(v5 + 48), (_LARGE_INTEGER)-v12, 0i64, 0, (_KDPC *)(v5 + 112));
if( !v14 )
{
v5[20] = 1;
PopUpdateWatchdogNoWorkersEvent(v5);
}
goto LABEL_11;
}
if( *((_DWORD *)v5 + 58) == 412 && *((_QWORD *)v5 + 30) > 0x20ui64 )
{
v7 = *((_DWORD *)v5 + 60);
v22 = 1;
v6 = (*(_QWORD *)&KUSER_SHARED_DATA.InterruptTime.LowPart - *((_QWORD *)v5 + 37)) / 0xAui64;
}
v5[216] = 0;
if( KeCancelTimer((PKTIMER)(v5 + 48)) )
{
v5[20] = 0;
PopUpdateWatchdogNoWorkersEvent(v5);
}
if( !*((_DWORD *)v5 + 7) )
{
KxReleaseSpinLock(&PopWatchdogLock);
__writecr8(v9);
KeWaitForSingleObject(v5 + 24, Executive, 0, 0, 0i64);
KeAcquireSpinLockRaiseToDpc(&PopWatchdogLock, v20);
v9 = v21;
}
if( !a3 )
goto LABEL_11;
v18 = *(_QWORD *)v5;
v19 = (CHAR **)*((_QWORD *)v5 + 1);
if( *(CHAR **)(*(_QWORD *)v5 + 8i64) != v5 || *v19 != v5 )
LABEL_23:
__fastfail(3u);
*v19 = (CHAR *)v18;
*(_QWORD *)(v18 + 8) = v19;
*((_DWORD *)v5 + 4) = 1330532174;
ExFreePoolWithTag(v5, 0x44574F50u);
v5 = 0i64;
LABEL_11:
KxReleaseSpinLock(&PopWatchdogLock);
__writecr8(v9);
if( v22 )
PopCacheDisplayOnPhaseDuration(v7, v6);
return v5;
}Referenced by:
PopPowerInformationInternal