1 /*++
2
3 Copyright (c) Microsoft Corporation. All rights reserved.
4
5 _WdfVersionBuild_
6
7 Module Name:
8
9 wdftimer.h
10
11 Abstract:
12
13 This is the C header for driver framework TIMER object
14
15 Revision History:
16
17
18 --*/
19
20 //
21 // NOTE: This header is generated by stubwork. Please make any
22 // modifications to the corresponding template files
23 // (.x or .y) and use stubwork to regenerate the header
24 //
25
26 #ifndef _WDFTIMER_H_
27 #define _WDFTIMER_H_
28
29 #ifndef WDF_EXTERN_C
30 #ifdef __cplusplus
31 #define WDF_EXTERN_C extern "C"
32 #define WDF_EXTERN_C_START extern "C" {
33 #define WDF_EXTERN_C_END }
34 #else
35 #define WDF_EXTERN_C
36 #define WDF_EXTERN_C_START
37 #define WDF_EXTERN_C_END
38 #endif
39 #endif
40
41 WDF_EXTERN_C_START
42
43
44
45 #if (NTDDI_VERSION >= NTDDI_WIN2K)
46
47
48
49
50 #define TolerableDelayUnlimited ((ULONG)-1)
51
52 //
53 // This is the function that gets called back into the driver
54 // when the TIMER fires.
55 //
56 typedef
57 _Function_class_(EVT_WDF_TIMER)
58 _IRQL_requires_same_
59 _IRQL_requires_max_(DISPATCH_LEVEL)
60 VOID
61 STDCALL
62 EVT_WDF_TIMER(
63 _In_
64 WDFTIMER Timer
65 );
66
67 typedef EVT_WDF_TIMER *PFN_WDF_TIMER;
68
69 //
70 // Disable warning C4324: structure was padded due to DECLSPEC_ALIGN
71 // This padding is intentional and necessary.
72 #ifdef _MSC_VER
73 #pragma warning(push)
74 #pragma warning(disable: 4324)
75 #endif
76
77 typedef struct _WDF_TIMER_CONFIG {
78 ULONG Size;
79 PFN_WDF_TIMER EvtTimerFunc;
80
81 ULONG Period;
82
83 //
84 // If this is TRUE, the Timer will automatically serialize
85 // with the event callback handlers of its Parent Object.
86 //
87 // Parent Object's callback constraints should be compatible
88 // with the Timer DPC (DISPATCH_LEVEL), or the request will fail.
89 //
90 BOOLEAN AutomaticSerialization;
91
92 //
93 // Optional tolerance for the timer in milliseconds.
94 //
95 ULONG TolerableDelay;
96
97 //
98 // If this is TRUE, high resolution timers will be used. The default
99 // value is FALSE
100 //
101 DECLSPEC_ALIGN(8) BOOLEAN UseHighResolutionTimer;
102
103 } WDF_TIMER_CONFIG, *PWDF_TIMER_CONFIG;
104
105 #ifdef _MSC_VER
106 #pragma warning(pop)
107 #endif
108
109 FORCEINLINE
110 VOID
WDF_TIMER_CONFIG_INIT(_Out_ PWDF_TIMER_CONFIG Config,_In_ PFN_WDF_TIMER EvtTimerFunc)111 WDF_TIMER_CONFIG_INIT(
112 _Out_ PWDF_TIMER_CONFIG Config,
113 _In_ PFN_WDF_TIMER EvtTimerFunc
114 )
115 {
116 RtlZeroMemory(Config, sizeof(WDF_TIMER_CONFIG));
117 Config->Size = sizeof(WDF_TIMER_CONFIG);
118 Config->EvtTimerFunc = EvtTimerFunc;
119 Config->Period = 0;
120 Config->AutomaticSerialization = TRUE;
121 Config->TolerableDelay = 0;
122 }
123
124 FORCEINLINE
125 VOID
WDF_TIMER_CONFIG_INIT_PERIODIC(_Out_ PWDF_TIMER_CONFIG Config,_In_ PFN_WDF_TIMER EvtTimerFunc,_In_ LONG Period)126 WDF_TIMER_CONFIG_INIT_PERIODIC(
127 _Out_ PWDF_TIMER_CONFIG Config,
128 _In_ PFN_WDF_TIMER EvtTimerFunc,
129 _In_ LONG Period
130 )
131 {
132 RtlZeroMemory(Config, sizeof(WDF_TIMER_CONFIG));
133 Config->Size = sizeof(WDF_TIMER_CONFIG);
134 Config->EvtTimerFunc = EvtTimerFunc;
135 Config->Period = Period;
136 Config->AutomaticSerialization = TRUE;
137 Config->TolerableDelay = 0;
138 }
139
140
141 //
142 // WDF Function: WdfTimerCreate
143 //
144 typedef
145 _Must_inspect_result_
146 _IRQL_requires_max_(DISPATCH_LEVEL)
147 WDFAPI
148 NTSTATUS
149 (STDCALL *PFN_WDFTIMERCREATE)(
150 _In_
151 PWDF_DRIVER_GLOBALS DriverGlobals,
152 _In_
153 PWDF_TIMER_CONFIG Config,
154 _In_
155 PWDF_OBJECT_ATTRIBUTES Attributes,
156 _Out_
157 WDFTIMER* Timer
158 );
159
160 _Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)161 _IRQL_requires_max_(DISPATCH_LEVEL)
162 FORCEINLINE
163 NTSTATUS
164 WdfTimerCreate(
165 _In_
166 PWDF_TIMER_CONFIG Config,
167 _In_
168 PWDF_OBJECT_ATTRIBUTES Attributes,
169 _Out_
170 WDFTIMER* Timer
171 )
172 {
173 return ((PFN_WDFTIMERCREATE) WdfFunctions[WdfTimerCreateTableIndex])(WdfDriverGlobals, Config, Attributes, Timer);
174 }
175
176 //
177 // WDF Function: WdfTimerStart
178 //
179 typedef
180 _IRQL_requires_max_(DISPATCH_LEVEL)
181 WDFAPI
182 BOOLEAN
183 (STDCALL *PFN_WDFTIMERSTART)(
184 _In_
185 PWDF_DRIVER_GLOBALS DriverGlobals,
186 _In_
187 WDFTIMER Timer,
188 _In_
189 LONGLONG DueTime
190 );
191
_IRQL_requires_max_(DISPATCH_LEVEL)192 _IRQL_requires_max_(DISPATCH_LEVEL)
193 FORCEINLINE
194 BOOLEAN
195 WdfTimerStart(
196 _In_
197 WDFTIMER Timer,
198 _In_
199 LONGLONG DueTime
200 )
201 {
202 return ((PFN_WDFTIMERSTART) WdfFunctions[WdfTimerStartTableIndex])(WdfDriverGlobals, Timer, DueTime);
203 }
204
205 //
206 // WDF Function: WdfTimerStop
207 //
208 typedef
209 _When_(Wait == __true, _IRQL_requires_max_(PASSIVE_LEVEL))
210 _When_(Wait == __false, _IRQL_requires_max_(DISPATCH_LEVEL))
211 WDFAPI
212 BOOLEAN
213 (STDCALL *PFN_WDFTIMERSTOP)(
214 _In_
215 PWDF_DRIVER_GLOBALS DriverGlobals,
216 _In_
217 WDFTIMER Timer,
218 _In_
219 BOOLEAN Wait
220 );
221
222 _When_(Wait == __true, _IRQL_requires_max_(PASSIVE_LEVEL))
223 _When_(Wait == __false, _IRQL_requires_max_(DISPATCH_LEVEL))
224 FORCEINLINE
225 BOOLEAN
WdfTimerStop(_In_ WDFTIMER Timer,_In_ BOOLEAN Wait)226 WdfTimerStop(
227 _In_
228 WDFTIMER Timer,
229 _In_
230 BOOLEAN Wait
231 )
232 {
233 return ((PFN_WDFTIMERSTOP) WdfFunctions[WdfTimerStopTableIndex])(WdfDriverGlobals, Timer, Wait);
234 }
235
236 //
237 // WDF Function: WdfTimerGetParentObject
238 //
239 typedef
240 _IRQL_requires_max_(DISPATCH_LEVEL)
241 WDFAPI
242 WDFOBJECT
243 (STDCALL *PFN_WDFTIMERGETPARENTOBJECT)(
244 _In_
245 PWDF_DRIVER_GLOBALS DriverGlobals,
246 _In_
247 WDFTIMER Timer
248 );
249
_IRQL_requires_max_(DISPATCH_LEVEL)250 _IRQL_requires_max_(DISPATCH_LEVEL)
251 FORCEINLINE
252 WDFOBJECT
253 WdfTimerGetParentObject(
254 _In_
255 WDFTIMER Timer
256 )
257 {
258 return ((PFN_WDFTIMERGETPARENTOBJECT) WdfFunctions[WdfTimerGetParentObjectTableIndex])(WdfDriverGlobals, Timer);
259 }
260
261
262
263 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
264
265
266 WDF_EXTERN_C_END
267
268 #endif // _WDFTIMER_H_
269
270