mirror of
https://github.com/reactos/reactos.git
synced 2025-03-10 10:14:44 +00:00
222 lines
4.3 KiB
C++
222 lines
4.3 KiB
C++
![]() |
/*++
|
||
|
|
||
|
Copyright (c) Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
FxTimer.hpp
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This module implements a frameworks managed TIMER that
|
||
|
can synchrononize with driver frameworks object locks.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
Environment:
|
||
|
|
||
|
Both kernel and user mode
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#ifndef _FXTIMER_H_
|
||
|
#define _FXTIMER_H_
|
||
|
|
||
|
//
|
||
|
// Driver Frameworks TIMER Design:
|
||
|
//
|
||
|
// The driver frameworks provides an optional TIMER wrapper object that allows
|
||
|
// a reference counted TIMER object to be created that can synchronize
|
||
|
// automatically with certain frameworks objects.
|
||
|
//
|
||
|
// This provides automatic synchronization between the TIMER's execution, and the
|
||
|
// frameworks objects event callbacks into the device driver.
|
||
|
//
|
||
|
|
||
|
class FxTimer : public FxNonPagedObject {
|
||
|
|
||
|
private:
|
||
|
|
||
|
//
|
||
|
// Kernel Timer Object
|
||
|
//
|
||
|
MxTimer m_Timer;
|
||
|
|
||
|
//
|
||
|
// This is the Framework object who is associated with the TIMER
|
||
|
// if supplied
|
||
|
//
|
||
|
FxObject* m_Object;
|
||
|
|
||
|
//
|
||
|
// This is the supplied Period to WdfTimerCreate
|
||
|
//
|
||
|
ULONG m_Period;
|
||
|
|
||
|
//
|
||
|
// Optional tolerance for the timer in milliseconds
|
||
|
//
|
||
|
ULONG m_TolerableDelay;
|
||
|
|
||
|
//
|
||
|
// This indicates whether a high resolution attribute is set
|
||
|
// for the timer
|
||
|
//
|
||
|
BOOLEAN m_UseHighResolutionTimer;
|
||
|
|
||
|
//
|
||
|
// This is the callback lock for the object this TIMER will
|
||
|
// synchronize with
|
||
|
//
|
||
|
FxCallbackLock* m_CallbackLock;
|
||
|
|
||
|
//
|
||
|
// This is the object whose reference count actually controls
|
||
|
// the lifetime of the m_CallbackLock
|
||
|
//
|
||
|
FxObject* m_CallbackLockObject;
|
||
|
|
||
|
//
|
||
|
// This is the user supplied callback function
|
||
|
//
|
||
|
PFN_WDF_TIMER m_Callback;
|
||
|
|
||
|
//
|
||
|
// This workitem object will be used to queue workitem from the timer
|
||
|
// dpc callback if the caller requests passive callback.
|
||
|
//
|
||
|
FxSystemWorkItem* m_SystemWorkItem;
|
||
|
|
||
|
//
|
||
|
// This is a pointer to thread object that invoked our dpc callback
|
||
|
// callback. This value will be used to avoid deadlock when we try
|
||
|
// to stop or delete the timer.
|
||
|
//
|
||
|
volatile POINTER_ALIGNMENT MxThread m_CallbackThread;
|
||
|
|
||
|
//
|
||
|
// This is a pointer to the Stop thread object when driver invokes the
|
||
|
// timer's WdfTimerStop function.
|
||
|
//
|
||
|
MxThread m_StopThread;
|
||
|
|
||
|
//
|
||
|
// TRUE if the timer was restarted while stopping.
|
||
|
//
|
||
|
BOOLEAN m_StopAgain;
|
||
|
|
||
|
//
|
||
|
// TRUE if a start operation was aborted b/c stop was in progress.
|
||
|
//
|
||
|
BOOLEAN m_StartAborted;
|
||
|
|
||
|
//
|
||
|
// Ensures only one of either Delete or Cleanup runsdown the object
|
||
|
//
|
||
|
BOOLEAN m_RunningDown;
|
||
|
|
||
|
public:
|
||
|
static
|
||
|
_Must_inspect_result_
|
||
|
NTSTATUS
|
||
|
_Create(
|
||
|
__in PFX_DRIVER_GLOBALS FxDriverGlobals,
|
||
|
__in PWDF_TIMER_CONFIG Config,
|
||
|
__in PWDF_OBJECT_ATTRIBUTES Attributes,
|
||
|
__in FxObject* ParentObject,
|
||
|
__out WDFTIMER* Timer
|
||
|
);
|
||
|
|
||
|
FxTimer(
|
||
|
__in PFX_DRIVER_GLOBALS FxDriverGlobals
|
||
|
);
|
||
|
|
||
|
virtual
|
||
|
~FxTimer(
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
_Must_inspect_result_
|
||
|
NTSTATUS
|
||
|
Initialize(
|
||
|
__in PWDF_OBJECT_ATTRIBUTES Attributes,
|
||
|
__in PWDF_TIMER_CONFIG Config,
|
||
|
__in FxObject* ParentObject,
|
||
|
__out WDFTIMER* Timer
|
||
|
);
|
||
|
|
||
|
virtual
|
||
|
BOOLEAN
|
||
|
Dispose(
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
BOOLEAN
|
||
|
Start(
|
||
|
__in LARGE_INTEGER DueTime
|
||
|
);
|
||
|
|
||
|
BOOLEAN
|
||
|
Stop(
|
||
|
__in BOOLEAN Wait
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
TimerHandler(
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
WDFOBJECT
|
||
|
GetObject(
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
if( m_Object != NULL ) {
|
||
|
return m_Object->GetObjectHandle();
|
||
|
}
|
||
|
else {
|
||
|
return NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
WDFTIMER
|
||
|
GetHandle(
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
return (WDFTIMER) GetObjectHandle();
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
|
||
|
//
|
||
|
// Called from Dispose, or cleanup list to perform final flushing of any
|
||
|
// outstanding DPC's and dereferencing of objects.
|
||
|
//
|
||
|
VOID
|
||
|
FlushAndRundown(
|
||
|
VOID
|
||
|
);
|
||
|
|
||
|
static
|
||
|
FN_WDF_SYSTEMWORKITEM
|
||
|
_FxTimerWorkItemCallback;
|
||
|
|
||
|
static
|
||
|
MdDeferredRoutineType
|
||
|
_FxTimerDpcThunk;
|
||
|
|
||
|
static
|
||
|
MdExtCallbackType
|
||
|
_FxTimerExtCallbackThunk;
|
||
|
};
|
||
|
|
||
|
#endif // _FXTIMER_H
|
||
|
|