140462c92SVictor Perevertkin /*++
240462c92SVictor Perevertkin
340462c92SVictor Perevertkin Copyright (c) Microsoft Corporation. All rights reserved.
440462c92SVictor Perevertkin
540462c92SVictor Perevertkin _WdfVersionBuild_
640462c92SVictor Perevertkin
740462c92SVictor Perevertkin Module Name:
840462c92SVictor Perevertkin
940462c92SVictor Perevertkin wdftimer.h
1040462c92SVictor Perevertkin
1140462c92SVictor Perevertkin Abstract:
1240462c92SVictor Perevertkin
1340462c92SVictor Perevertkin This is the C header for driver framework TIMER object
1440462c92SVictor Perevertkin
1540462c92SVictor Perevertkin Revision History:
1640462c92SVictor Perevertkin
1740462c92SVictor Perevertkin
1840462c92SVictor Perevertkin --*/
1940462c92SVictor Perevertkin
2040462c92SVictor Perevertkin //
2140462c92SVictor Perevertkin // NOTE: This header is generated by stubwork. Please make any
2240462c92SVictor Perevertkin // modifications to the corresponding template files
2340462c92SVictor Perevertkin // (.x or .y) and use stubwork to regenerate the header
2440462c92SVictor Perevertkin //
2540462c92SVictor Perevertkin
2640462c92SVictor Perevertkin #ifndef _WDFTIMER_H_
2740462c92SVictor Perevertkin #define _WDFTIMER_H_
2840462c92SVictor Perevertkin
2940462c92SVictor Perevertkin #ifndef WDF_EXTERN_C
3040462c92SVictor Perevertkin #ifdef __cplusplus
3140462c92SVictor Perevertkin #define WDF_EXTERN_C extern "C"
3240462c92SVictor Perevertkin #define WDF_EXTERN_C_START extern "C" {
3340462c92SVictor Perevertkin #define WDF_EXTERN_C_END }
3440462c92SVictor Perevertkin #else
3540462c92SVictor Perevertkin #define WDF_EXTERN_C
3640462c92SVictor Perevertkin #define WDF_EXTERN_C_START
3740462c92SVictor Perevertkin #define WDF_EXTERN_C_END
3840462c92SVictor Perevertkin #endif
3940462c92SVictor Perevertkin #endif
4040462c92SVictor Perevertkin
4140462c92SVictor Perevertkin WDF_EXTERN_C_START
4240462c92SVictor Perevertkin
4340462c92SVictor Perevertkin
4440462c92SVictor Perevertkin
4540462c92SVictor Perevertkin #if (NTDDI_VERSION >= NTDDI_WIN2K)
4640462c92SVictor Perevertkin
4740462c92SVictor Perevertkin
4840462c92SVictor Perevertkin
4940462c92SVictor Perevertkin
5040462c92SVictor Perevertkin #define TolerableDelayUnlimited ((ULONG)-1)
5140462c92SVictor Perevertkin
5240462c92SVictor Perevertkin //
5340462c92SVictor Perevertkin // This is the function that gets called back into the driver
5440462c92SVictor Perevertkin // when the TIMER fires.
5540462c92SVictor Perevertkin //
5640462c92SVictor Perevertkin typedef
5740462c92SVictor Perevertkin _Function_class_(EVT_WDF_TIMER)
5840462c92SVictor Perevertkin _IRQL_requires_same_
5940462c92SVictor Perevertkin _IRQL_requires_max_(DISPATCH_LEVEL)
6040462c92SVictor Perevertkin VOID
61*545df815SVictor Perevertkin STDCALL
6240462c92SVictor Perevertkin EVT_WDF_TIMER(
6340462c92SVictor Perevertkin _In_
6440462c92SVictor Perevertkin WDFTIMER Timer
6540462c92SVictor Perevertkin );
6640462c92SVictor Perevertkin
6740462c92SVictor Perevertkin typedef EVT_WDF_TIMER *PFN_WDF_TIMER;
6840462c92SVictor Perevertkin
6940462c92SVictor Perevertkin //
7040462c92SVictor Perevertkin // Disable warning C4324: structure was padded due to DECLSPEC_ALIGN
7140462c92SVictor Perevertkin // This padding is intentional and necessary.
72*545df815SVictor Perevertkin #ifdef _MSC_VER
7340462c92SVictor Perevertkin #pragma warning(push)
7440462c92SVictor Perevertkin #pragma warning(disable: 4324)
75*545df815SVictor Perevertkin #endif
7640462c92SVictor Perevertkin
7740462c92SVictor Perevertkin typedef struct _WDF_TIMER_CONFIG {
7840462c92SVictor Perevertkin ULONG Size;
7940462c92SVictor Perevertkin PFN_WDF_TIMER EvtTimerFunc;
8040462c92SVictor Perevertkin
8140462c92SVictor Perevertkin ULONG Period;
8240462c92SVictor Perevertkin
8340462c92SVictor Perevertkin //
8440462c92SVictor Perevertkin // If this is TRUE, the Timer will automatically serialize
8540462c92SVictor Perevertkin // with the event callback handlers of its Parent Object.
8640462c92SVictor Perevertkin //
8740462c92SVictor Perevertkin // Parent Object's callback constraints should be compatible
8840462c92SVictor Perevertkin // with the Timer DPC (DISPATCH_LEVEL), or the request will fail.
8940462c92SVictor Perevertkin //
9040462c92SVictor Perevertkin BOOLEAN AutomaticSerialization;
9140462c92SVictor Perevertkin
9240462c92SVictor Perevertkin //
9340462c92SVictor Perevertkin // Optional tolerance for the timer in milliseconds.
9440462c92SVictor Perevertkin //
9540462c92SVictor Perevertkin ULONG TolerableDelay;
9640462c92SVictor Perevertkin
9740462c92SVictor Perevertkin //
9840462c92SVictor Perevertkin // If this is TRUE, high resolution timers will be used. The default
9940462c92SVictor Perevertkin // value is FALSE
10040462c92SVictor Perevertkin //
10140462c92SVictor Perevertkin DECLSPEC_ALIGN(8) BOOLEAN UseHighResolutionTimer;
10240462c92SVictor Perevertkin
10340462c92SVictor Perevertkin } WDF_TIMER_CONFIG, *PWDF_TIMER_CONFIG;
10440462c92SVictor Perevertkin
105*545df815SVictor Perevertkin #ifdef _MSC_VER
10640462c92SVictor Perevertkin #pragma warning(pop)
107*545df815SVictor Perevertkin #endif
10840462c92SVictor Perevertkin
10940462c92SVictor Perevertkin FORCEINLINE
110*545df815SVictor Perevertkin VOID
WDF_TIMER_CONFIG_INIT(_Out_ PWDF_TIMER_CONFIG Config,_In_ PFN_WDF_TIMER EvtTimerFunc)11140462c92SVictor Perevertkin WDF_TIMER_CONFIG_INIT(
11240462c92SVictor Perevertkin _Out_ PWDF_TIMER_CONFIG Config,
11340462c92SVictor Perevertkin _In_ PFN_WDF_TIMER EvtTimerFunc
11440462c92SVictor Perevertkin )
11540462c92SVictor Perevertkin {
11640462c92SVictor Perevertkin RtlZeroMemory(Config, sizeof(WDF_TIMER_CONFIG));
11740462c92SVictor Perevertkin Config->Size = sizeof(WDF_TIMER_CONFIG);
11840462c92SVictor Perevertkin Config->EvtTimerFunc = EvtTimerFunc;
11940462c92SVictor Perevertkin Config->Period = 0;
12040462c92SVictor Perevertkin Config->AutomaticSerialization = TRUE;
12140462c92SVictor Perevertkin Config->TolerableDelay = 0;
12240462c92SVictor Perevertkin }
12340462c92SVictor Perevertkin
12440462c92SVictor Perevertkin FORCEINLINE
125*545df815SVictor Perevertkin VOID
WDF_TIMER_CONFIG_INIT_PERIODIC(_Out_ PWDF_TIMER_CONFIG Config,_In_ PFN_WDF_TIMER EvtTimerFunc,_In_ LONG Period)12640462c92SVictor Perevertkin WDF_TIMER_CONFIG_INIT_PERIODIC(
12740462c92SVictor Perevertkin _Out_ PWDF_TIMER_CONFIG Config,
12840462c92SVictor Perevertkin _In_ PFN_WDF_TIMER EvtTimerFunc,
12940462c92SVictor Perevertkin _In_ LONG Period
13040462c92SVictor Perevertkin )
13140462c92SVictor Perevertkin {
13240462c92SVictor Perevertkin RtlZeroMemory(Config, sizeof(WDF_TIMER_CONFIG));
13340462c92SVictor Perevertkin Config->Size = sizeof(WDF_TIMER_CONFIG);
13440462c92SVictor Perevertkin Config->EvtTimerFunc = EvtTimerFunc;
13540462c92SVictor Perevertkin Config->Period = Period;
13640462c92SVictor Perevertkin Config->AutomaticSerialization = TRUE;
13740462c92SVictor Perevertkin Config->TolerableDelay = 0;
13840462c92SVictor Perevertkin }
13940462c92SVictor Perevertkin
14040462c92SVictor Perevertkin
14140462c92SVictor Perevertkin //
14240462c92SVictor Perevertkin // WDF Function: WdfTimerCreate
14340462c92SVictor Perevertkin //
14440462c92SVictor Perevertkin typedef
14540462c92SVictor Perevertkin _Must_inspect_result_
14640462c92SVictor Perevertkin _IRQL_requires_max_(DISPATCH_LEVEL)
14740462c92SVictor Perevertkin WDFAPI
14840462c92SVictor Perevertkin NTSTATUS
149*545df815SVictor Perevertkin (STDCALL *PFN_WDFTIMERCREATE)(
15040462c92SVictor Perevertkin _In_
15140462c92SVictor Perevertkin PWDF_DRIVER_GLOBALS DriverGlobals,
15240462c92SVictor Perevertkin _In_
15340462c92SVictor Perevertkin PWDF_TIMER_CONFIG Config,
15440462c92SVictor Perevertkin _In_
15540462c92SVictor Perevertkin PWDF_OBJECT_ATTRIBUTES Attributes,
15640462c92SVictor Perevertkin _Out_
15740462c92SVictor Perevertkin WDFTIMER* Timer
15840462c92SVictor Perevertkin );
15940462c92SVictor Perevertkin
16040462c92SVictor Perevertkin _Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)16140462c92SVictor Perevertkin _IRQL_requires_max_(DISPATCH_LEVEL)
16240462c92SVictor Perevertkin FORCEINLINE
163*545df815SVictor Perevertkin NTSTATUS
16440462c92SVictor Perevertkin WdfTimerCreate(
16540462c92SVictor Perevertkin _In_
16640462c92SVictor Perevertkin PWDF_TIMER_CONFIG Config,
16740462c92SVictor Perevertkin _In_
16840462c92SVictor Perevertkin PWDF_OBJECT_ATTRIBUTES Attributes,
16940462c92SVictor Perevertkin _Out_
17040462c92SVictor Perevertkin WDFTIMER* Timer
17140462c92SVictor Perevertkin )
17240462c92SVictor Perevertkin {
17340462c92SVictor Perevertkin return ((PFN_WDFTIMERCREATE) WdfFunctions[WdfTimerCreateTableIndex])(WdfDriverGlobals, Config, Attributes, Timer);
17440462c92SVictor Perevertkin }
17540462c92SVictor Perevertkin
17640462c92SVictor Perevertkin //
17740462c92SVictor Perevertkin // WDF Function: WdfTimerStart
17840462c92SVictor Perevertkin //
17940462c92SVictor Perevertkin typedef
18040462c92SVictor Perevertkin _IRQL_requires_max_(DISPATCH_LEVEL)
18140462c92SVictor Perevertkin WDFAPI
18240462c92SVictor Perevertkin BOOLEAN
183*545df815SVictor Perevertkin (STDCALL *PFN_WDFTIMERSTART)(
18440462c92SVictor Perevertkin _In_
18540462c92SVictor Perevertkin PWDF_DRIVER_GLOBALS DriverGlobals,
18640462c92SVictor Perevertkin _In_
18740462c92SVictor Perevertkin WDFTIMER Timer,
18840462c92SVictor Perevertkin _In_
18940462c92SVictor Perevertkin LONGLONG DueTime
19040462c92SVictor Perevertkin );
19140462c92SVictor Perevertkin
_IRQL_requires_max_(DISPATCH_LEVEL)19240462c92SVictor Perevertkin _IRQL_requires_max_(DISPATCH_LEVEL)
19340462c92SVictor Perevertkin FORCEINLINE
194*545df815SVictor Perevertkin BOOLEAN
19540462c92SVictor Perevertkin WdfTimerStart(
19640462c92SVictor Perevertkin _In_
19740462c92SVictor Perevertkin WDFTIMER Timer,
19840462c92SVictor Perevertkin _In_
19940462c92SVictor Perevertkin LONGLONG DueTime
20040462c92SVictor Perevertkin )
20140462c92SVictor Perevertkin {
20240462c92SVictor Perevertkin return ((PFN_WDFTIMERSTART) WdfFunctions[WdfTimerStartTableIndex])(WdfDriverGlobals, Timer, DueTime);
20340462c92SVictor Perevertkin }
20440462c92SVictor Perevertkin
20540462c92SVictor Perevertkin //
20640462c92SVictor Perevertkin // WDF Function: WdfTimerStop
20740462c92SVictor Perevertkin //
20840462c92SVictor Perevertkin typedef
20940462c92SVictor Perevertkin _When_(Wait == __true, _IRQL_requires_max_(PASSIVE_LEVEL))
21040462c92SVictor Perevertkin _When_(Wait == __false, _IRQL_requires_max_(DISPATCH_LEVEL))
21140462c92SVictor Perevertkin WDFAPI
21240462c92SVictor Perevertkin BOOLEAN
213*545df815SVictor Perevertkin (STDCALL *PFN_WDFTIMERSTOP)(
21440462c92SVictor Perevertkin _In_
21540462c92SVictor Perevertkin PWDF_DRIVER_GLOBALS DriverGlobals,
21640462c92SVictor Perevertkin _In_
21740462c92SVictor Perevertkin WDFTIMER Timer,
21840462c92SVictor Perevertkin _In_
21940462c92SVictor Perevertkin BOOLEAN Wait
22040462c92SVictor Perevertkin );
22140462c92SVictor Perevertkin
22240462c92SVictor Perevertkin _When_(Wait == __true, _IRQL_requires_max_(PASSIVE_LEVEL))
22340462c92SVictor Perevertkin _When_(Wait == __false, _IRQL_requires_max_(DISPATCH_LEVEL))
22440462c92SVictor Perevertkin FORCEINLINE
225*545df815SVictor Perevertkin BOOLEAN
WdfTimerStop(_In_ WDFTIMER Timer,_In_ BOOLEAN Wait)22640462c92SVictor Perevertkin WdfTimerStop(
22740462c92SVictor Perevertkin _In_
22840462c92SVictor Perevertkin WDFTIMER Timer,
22940462c92SVictor Perevertkin _In_
23040462c92SVictor Perevertkin BOOLEAN Wait
23140462c92SVictor Perevertkin )
23240462c92SVictor Perevertkin {
23340462c92SVictor Perevertkin return ((PFN_WDFTIMERSTOP) WdfFunctions[WdfTimerStopTableIndex])(WdfDriverGlobals, Timer, Wait);
23440462c92SVictor Perevertkin }
23540462c92SVictor Perevertkin
23640462c92SVictor Perevertkin //
23740462c92SVictor Perevertkin // WDF Function: WdfTimerGetParentObject
23840462c92SVictor Perevertkin //
23940462c92SVictor Perevertkin typedef
24040462c92SVictor Perevertkin _IRQL_requires_max_(DISPATCH_LEVEL)
24140462c92SVictor Perevertkin WDFAPI
24240462c92SVictor Perevertkin WDFOBJECT
243*545df815SVictor Perevertkin (STDCALL *PFN_WDFTIMERGETPARENTOBJECT)(
24440462c92SVictor Perevertkin _In_
24540462c92SVictor Perevertkin PWDF_DRIVER_GLOBALS DriverGlobals,
24640462c92SVictor Perevertkin _In_
24740462c92SVictor Perevertkin WDFTIMER Timer
24840462c92SVictor Perevertkin );
24940462c92SVictor Perevertkin
_IRQL_requires_max_(DISPATCH_LEVEL)25040462c92SVictor Perevertkin _IRQL_requires_max_(DISPATCH_LEVEL)
25140462c92SVictor Perevertkin FORCEINLINE
252*545df815SVictor Perevertkin WDFOBJECT
25340462c92SVictor Perevertkin WdfTimerGetParentObject(
25440462c92SVictor Perevertkin _In_
25540462c92SVictor Perevertkin WDFTIMER Timer
25640462c92SVictor Perevertkin )
25740462c92SVictor Perevertkin {
25840462c92SVictor Perevertkin return ((PFN_WDFTIMERGETPARENTOBJECT) WdfFunctions[WdfTimerGetParentObjectTableIndex])(WdfDriverGlobals, Timer);
25940462c92SVictor Perevertkin }
26040462c92SVictor Perevertkin
26140462c92SVictor Perevertkin
26240462c92SVictor Perevertkin
26340462c92SVictor Perevertkin #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
26440462c92SVictor Perevertkin
26540462c92SVictor Perevertkin
26640462c92SVictor Perevertkin WDF_EXTERN_C_END
26740462c92SVictor Perevertkin
26840462c92SVictor Perevertkin #endif // _WDFTIMER_H_
26940462c92SVictor Perevertkin
270