PoQueryWatchdogTime

UINT8 __stdcall PoQueryWatchdogTime(_DEVICE_OBJECT *Pdo, UINT64 *SecondsRemaining){
  unsigned __int64 v2; 
  UINT8 v3; 
  _QWORD *DeviceNode; 
  __int64 v6; 
  __int64 v7; 
  UINT64 UnbiasedInterruptTime; 
  __int64 v10; 
  unsigned int v11; 
  __int64 v12; 
  unsigned __int64 v13; 
  __int64 v14; 
  unsigned int v15; 
  __int64 v16; 
  __int64 v17; 
  _KLOCK_QUEUE_HANDLE LockHandle; 

  v2 = -1i64;
  v3 = 0;
  memset(&LockHandle, 0, sizeof(LockHandle));
  if( Pdo )
    DeviceNode = Pdo->DeviceObjectExtension->DeviceNode;
  else
    DeviceNode = 0i64;
  KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)&stru_140C23628 + 121, &LockHandle);
  v6 = DeviceNode[33];
  if( v6 )
  {
    v14 = *(char *)(v6 + 66);
    if( *(_BYTE *)(*(_QWORD *)(v6 + 72 * v14 + 200) + 196i64) )
    {
      v15 = PopComputeWatchdogTimeout(*(_POP_IRP_DATA **)(v6 + 72 * v14 + 200));
      v17 = *(_QWORD *)(v16 + 48) + 10000000i64 * v15;
      if( v17 != -1 )
        v2 = v17;
    }
  }
  v7 = DeviceNode[35];
  if( v7 )
  {
    v10 = *(char *)(v7 + 66);
    if( *(_BYTE *)(*(_QWORD *)(v7 + 72 * v10 + 200) + 196i64) )
    {
      v11 = PopComputeWatchdogTimeout(*(_POP_IRP_DATA **)(v7 + 72 * v10 + 200));
      v13 = *(_QWORD *)(v12 + 48) + 10000000i64 * v11;
      if( v13 < v2 )
        v2 = v13;
    }
  }
  KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
  __writecr8(LockHandle.OldIrql);
  if( v2 != -1i64 )
  {
    v3 = 1;
    UnbiasedInterruptTime = KiQueryUnbiasedInterruptTime(1u);
    if( UnbiasedInterruptTime > v2 )
      *(_DWORD *)SecondsRemaining = 0;
    else
      *(_DWORD *)SecondsRemaining = (v2 - UnbiasedInterruptTime) / 0x989680;
  }
  return v3;
}

Referenced by:

No references.