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