mirror of
https://github.com/reactos/reactos.git
synced 2025-03-10 18:24:02 +00:00
117 lines
2.7 KiB
C++
117 lines
2.7 KiB
C++
![]() |
/*++
|
||
|
|
||
|
Copyright (c) Microsoft. All rights reserved.
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
FxWatchDog.hpp
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module implements the watchdog utility class for the power and power
|
||
|
policy state machines
|
||
|
|
||
|
Author:
|
||
|
|
||
|
|
||
|
|
||
|
Environment:
|
||
|
|
||
|
Both kernel and user mode
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#ifndef __FX_WATCHDOG__
|
||
|
#define __FX_WATCHDOG__
|
||
|
|
||
|
struct FxWatchdog {
|
||
|
FxWatchdog(
|
||
|
__in FxPkgPnp* PkgPnp
|
||
|
)
|
||
|
{
|
||
|
m_PkgPnp = PkgPnp;
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
StartTimer(
|
||
|
__in ULONG State
|
||
|
)
|
||
|
{
|
||
|
LARGE_INTEGER time;
|
||
|
NTSTATUS status;
|
||
|
|
||
|
if (State & WdfDevStateNP) {
|
||
|
//
|
||
|
// This is a non-pageable state. So we set the timer watchdog.
|
||
|
// If it fires, it means that the driver stalled, probably due
|
||
|
// to a page fault, which means that the whole machine is wedged.
|
||
|
// We will then attempt to put the failure in the trace log
|
||
|
// and bring the machine down, hopefully getting the reason we
|
||
|
// stopped responding into the crashdump. (This will probably only work
|
||
|
// if the machine is hibernating.)
|
||
|
//
|
||
|
// If the state function returns, then we'll cancel the timer
|
||
|
// and no love will be lost.
|
||
|
//
|
||
|
status = m_Timer.Initialize(this, _WatchdogDpc, 0);
|
||
|
|
||
|
//
|
||
|
// This code is not used in UM. Hence we can assert and assume that
|
||
|
// timer start will always be successful.
|
||
|
//
|
||
|
WDF_VERIFY_KM_ONLY_CODE();
|
||
|
|
||
|
FX_ASSERT_AND_ASSUME_FOR_PREFAST(NT_SUCCESS(status));
|
||
|
|
||
|
m_CallingThread = Mx::MxGetCurrentThread();
|
||
|
|
||
|
if (m_PkgPnp->m_SharedPower.m_ExtendWatchDogTimer) {
|
||
|
//
|
||
|
// 24 hours:
|
||
|
// 60 = to minutes
|
||
|
// 60 = to hours
|
||
|
// 24 = number of hours
|
||
|
//
|
||
|
time.QuadPart = WDF_REL_TIMEOUT_IN_SEC(60 * 60 * 24);
|
||
|
}
|
||
|
else {
|
||
|
//
|
||
|
// 10 minutes from now (same as the Vista timeout)
|
||
|
//
|
||
|
time.QuadPart = WDF_REL_TIMEOUT_IN_SEC(60 * 10);
|
||
|
}
|
||
|
|
||
|
m_Timer.Start(time);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
CancelTimer(
|
||
|
__in ULONG State
|
||
|
)
|
||
|
{
|
||
|
if (State & WdfDevStateNP) {
|
||
|
//
|
||
|
// The state was successfully handled without the timer expiring.
|
||
|
// We don't care about the return code in this case.
|
||
|
//
|
||
|
(void) m_Timer.Stop();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static
|
||
|
MdDeferredRoutineType
|
||
|
_WatchdogDpc;
|
||
|
|
||
|
MxTimer m_Timer;
|
||
|
|
||
|
FxPkgPnp* m_PkgPnp;
|
||
|
|
||
|
MxThread m_CallingThread;
|
||
|
};
|
||
|
|
||
|
#endif // __FX_WATCHDOG__
|
||
|
|