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.