1 /*++
2
3 Copyright (c) Microsoft Corporation. All rights reserved.
4
5 _WdfVersionBuild_
6
7 Module Name:
8
9 wdfinterrupt.h
10
11 Abstract:
12
13 This is the C header for driver framework Interrupt 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 _WDFINTERRUPT_H_
27 #define _WDFINTERRUPT_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 // Message Signaled Interrupts (MSI) information structure
49 //
50 typedef enum _WDF_INTERRUPT_POLARITY {
51 WdfInterruptPolarityUnknown = 0,
52 WdfInterruptActiveHigh,
53 WdfInterruptActiveLow,
54 } WDF_INTERRUPT_POLARITY, *PWDF_INTERRUPT_POLARITY;
55
56 typedef enum _WDF_INTERRUPT_POLICY {
57 WdfIrqPolicyMachineDefault = 0,
58 WdfIrqPolicyAllCloseProcessors,
59 WdfIrqPolicyOneCloseProcessor,
60 WdfIrqPolicyAllProcessorsInMachine,
61 WdfIrqPolicySpecifiedProcessors,
62 WdfIrqPolicySpreadMessagesAcrossAllProcessors,
63 } WDF_INTERRUPT_POLICY, *PWDF_INTERRUPT_POLICY;
64
65 typedef enum _WDF_INTERRUPT_PRIORITY {
66 WdfIrqPriorityUndefined = 0,
67 WdfIrqPriorityLow,
68 WdfIrqPriorityNormal,
69 WdfIrqPriorityHigh,
70 } WDF_INTERRUPT_PRIORITY, *PWDF_INTERRUPT_PRIORITY;
71
72
73
74
75 //
76 // This is the function that gets invoked when the hardware ISR occurs.
77 // This function is called at the IRQL at which the interrupt is serviced:
78 // - DIRQL for DIRQL interrupt handling.
79 // - PASSIVE_LEVEL for passive-level interrupt handling.
80 //
81 typedef
82 _Function_class_(EVT_WDF_INTERRUPT_ISR)
83 _IRQL_requires_same_
84 _IRQL_requires_min_(PASSIVE_LEVEL)
85 BOOLEAN
86 STDCALL
87 EVT_WDF_INTERRUPT_ISR(
88 _In_
89 WDFINTERRUPT Interrupt,
90 _In_
91 ULONG MessageID
92 );
93
94 typedef EVT_WDF_INTERRUPT_ISR *PFN_WDF_INTERRUPT_ISR;
95
96 //
97 // This is the function that gets invoked when a Synchronize execution occurs.
98 // This function is called at the IRQL at which the interrupt is serviced:
99 // - DIRQL for DIRQL interrupt handling.
100 // - PASSIVE_LEVEL for passive-level interrupt handling.
101 //
102 typedef
103 _Function_class_(EVT_WDF_INTERRUPT_SYNCHRONIZE)
104 _IRQL_requires_same_
105 _IRQL_requires_min_(PASSIVE_LEVEL)
106 BOOLEAN
107 STDCALL
108 EVT_WDF_INTERRUPT_SYNCHRONIZE(
109 _In_
110 WDFINTERRUPT Interrupt,
111 _In_
112 WDFCONTEXT Context
113 );
114
115 typedef EVT_WDF_INTERRUPT_SYNCHRONIZE *PFN_WDF_INTERRUPT_SYNCHRONIZE;
116
117 //
118 // This is the function that gets called back into the driver
119 // when the DpcForIsr fires. It will be called at DISPATCH_LEVEL.
120 //
121 typedef
122 _Function_class_(EVT_WDF_INTERRUPT_DPC)
123 _IRQL_requires_same_
124 _IRQL_requires_(DISPATCH_LEVEL)
125 VOID
126 STDCALL
127 EVT_WDF_INTERRUPT_DPC(
128 _In_
129 WDFINTERRUPT Interrupt,
130 _In_
131 WDFOBJECT AssociatedObject
132 );
133
134 typedef EVT_WDF_INTERRUPT_DPC *PFN_WDF_INTERRUPT_DPC;
135
136 //
137 // This is the function that gets called back into the driver
138 // when the WorkItemForIsr fires. It will be called at PASSIVE_LEVEL.
139 //
140 typedef
141 _Function_class_(EVT_WDF_INTERRUPT_WORKITEM)
142 _IRQL_requires_same_
143 _IRQL_requires_(PASSIVE_LEVEL)
144 VOID
145 STDCALL
146 EVT_WDF_INTERRUPT_WORKITEM(
147 _In_
148 WDFINTERRUPT Interrupt,
149 _In_
150 WDFOBJECT AssociatedObject
151 );
152
153 typedef EVT_WDF_INTERRUPT_WORKITEM *PFN_WDF_INTERRUPT_WORKITEM;
154
155 //
156 // This is the function that gets called back into the driver
157 // to enable the interrupt in the hardware. It will be called
158 // at the same IRQL at which the interrupt will be serviced:
159 // - DIRQL for DIRQL interrupt handling.
160 // - PASSIVE_LEVEL for passive-level interrupt handling.
161 //
162 typedef
163 _Function_class_(EVT_WDF_INTERRUPT_ENABLE)
164 _IRQL_requires_same_
165 _IRQL_requires_min_(PASSIVE_LEVEL)
166 NTSTATUS
167 STDCALL
168 EVT_WDF_INTERRUPT_ENABLE(
169 _In_
170 WDFINTERRUPT Interrupt,
171 _In_
172 WDFDEVICE AssociatedDevice
173 );
174
175 typedef EVT_WDF_INTERRUPT_ENABLE *PFN_WDF_INTERRUPT_ENABLE;
176
177 //
178 // This is the function that gets called back into the driver
179 // to disable the interrupt in the hardware. It will be called
180 // at the same IRQL at which the interrupt is serviced:
181 // - DIRQL for DIRQL interrupt handling.
182 // - PASSIVE_LEVEL for passive-level interrupt handling.
183 //
184 typedef
185 _Function_class_(EVT_WDF_INTERRUPT_DISABLE)
186 _IRQL_requires_same_
187 _IRQL_requires_min_(PASSIVE_LEVEL)
188 NTSTATUS
189 STDCALL
190 EVT_WDF_INTERRUPT_DISABLE(
191 _In_
192 WDFINTERRUPT Interrupt,
193 _In_
194 WDFDEVICE AssociatedDevice
195 );
196
197 typedef EVT_WDF_INTERRUPT_DISABLE *PFN_WDF_INTERRUPT_DISABLE;
198
199 //
200 // Interrupt Configuration Structure
201 //
202 typedef struct _WDF_INTERRUPT_CONFIG {
203 ULONG Size;
204
205 //
206 // If this interrupt is to be synchronized with other interrupt(s) assigned
207 // to the same WDFDEVICE, create a WDFSPINLOCK and assign it to each of the
208 // WDFINTERRUPTs config.
209 //
210 WDFSPINLOCK SpinLock;
211
212 WDF_TRI_STATE ShareVector;
213
214 BOOLEAN FloatingSave;
215
216 //
217 // DIRQL handling: automatic serialization of the DpcForIsr/WaitItemForIsr.
218 // Passive-level handling: automatic serialization of all callbacks.
219 //
220 BOOLEAN AutomaticSerialization;
221
222 //
223 // Event Callbacks
224 //
225 PFN_WDF_INTERRUPT_ISR EvtInterruptIsr;
226 PFN_WDF_INTERRUPT_DPC EvtInterruptDpc;
227 PFN_WDF_INTERRUPT_ENABLE EvtInterruptEnable;
228 PFN_WDF_INTERRUPT_DISABLE EvtInterruptDisable;
229 PFN_WDF_INTERRUPT_WORKITEM EvtInterruptWorkItem;
230
231 //
232 // These fields are only used when interrupt is created in
233 // EvtDevicePrepareHardware callback.
234 //
235 PCM_PARTIAL_RESOURCE_DESCRIPTOR InterruptRaw;
236 PCM_PARTIAL_RESOURCE_DESCRIPTOR InterruptTranslated;
237
238 //
239 // Optional passive lock for handling interrupts at passive-level.
240 //
241 WDFWAITLOCK WaitLock;
242
243 //
244 // TRUE: handle interrupt at passive-level.
245 // FALSE: handle interrupt at DIRQL level. This is the default.
246 //
247 BOOLEAN PassiveHandling;
248
249 //
250 // TRUE: Interrupt is reported inactive on explicit power down
251 // instead of disconnecting it.
252 // FALSE: Interrupt is disconnected instead of reporting inactive
253 // on explicit power down.
254 // DEFAULT: Framework decides the right value.
255 //
256 WDF_TRI_STATE ReportInactiveOnPowerDown;
257
258 //
259 // TRUE: Interrupt is used to wake the device from low-power states
260 // and when the device is armed for wake this interrupt should
261 // remain connected.
262 // FALSE: Interrupt is not used to wake the device from low-power states.
263 // This is the default.
264 //
265 BOOLEAN CanWakeDevice;
266 } WDF_INTERRUPT_CONFIG, *PWDF_INTERRUPT_CONFIG;
267
268
269 FORCEINLINE
270 VOID
WDF_INTERRUPT_CONFIG_INIT(_Out_ PWDF_INTERRUPT_CONFIG Configuration,_In_ PFN_WDF_INTERRUPT_ISR EvtInterruptIsr,_In_opt_ PFN_WDF_INTERRUPT_DPC EvtInterruptDpc)271 WDF_INTERRUPT_CONFIG_INIT(
272 _Out_ PWDF_INTERRUPT_CONFIG Configuration,
273 _In_ PFN_WDF_INTERRUPT_ISR EvtInterruptIsr,
274 _In_opt_ PFN_WDF_INTERRUPT_DPC EvtInterruptDpc
275 )
276 {
277 RtlZeroMemory(Configuration, sizeof(WDF_INTERRUPT_CONFIG));
278
279 Configuration->Size = sizeof(WDF_INTERRUPT_CONFIG);
280
281 Configuration->ShareVector = WdfUseDefault;
282
283 Configuration->EvtInterruptIsr = EvtInterruptIsr;
284 Configuration->EvtInterruptDpc = EvtInterruptDpc;
285
286 Configuration->ReportInactiveOnPowerDown = WdfUseDefault;
287 }
288
289
290
291
292 //
293 // Disable warning C4324: structure was padded due to DECLSPEC_ALIGN
294 // This padding is intentional and necessary.
295 #ifdef _MSC_VER
296 #pragma warning(push)
297 #pragma warning(disable: 4324)
298 #endif
299
300 typedef struct _WDF_INTERRUPT_INFO {
301 //
302 // Size of this structure in bytes
303 //
304 ULONG Size;
305 ULONG64 Reserved1;
306 KAFFINITY TargetProcessorSet;
307 ULONG Reserved2;
308 ULONG MessageNumber;
309 ULONG Vector;
310 KIRQL Irql;
311 KINTERRUPT_MODE Mode;
312 WDF_INTERRUPT_POLARITY Polarity;
313 BOOLEAN MessageSignaled;
314 UCHAR ShareDisposition; //CM_SHARE_DISPOSITION
315 DECLSPEC_ALIGN(8) USHORT Group;
316
317 } WDF_INTERRUPT_INFO, *PWDF_INTERRUPT_INFO;
318
319 #ifdef _MSC_VER
320 #pragma warning(pop)
321 #endif
322
323 FORCEINLINE
324 VOID
WDF_INTERRUPT_INFO_INIT(_Out_ PWDF_INTERRUPT_INFO Info)325 WDF_INTERRUPT_INFO_INIT(
326 _Out_ PWDF_INTERRUPT_INFO Info
327 )
328 {
329 RtlZeroMemory(Info, sizeof(WDF_INTERRUPT_INFO));
330 Info->Size = sizeof(WDF_INTERRUPT_INFO);
331 }
332
333 //
334 // Interrupt Extended Policy Configuration Structure
335 //
336 typedef struct _WDF_INTERRUPT_EXTENDED_POLICY {
337 //
338 // Size of this structure in bytes
339 //
340 ULONG Size;
341 WDF_INTERRUPT_POLICY Policy;
342 WDF_INTERRUPT_PRIORITY Priority;
343 GROUP_AFFINITY TargetProcessorSetAndGroup;
344
345 } WDF_INTERRUPT_EXTENDED_POLICY, *PWDF_INTERRUPT_EXTENDED_POLICY;
346
347 FORCEINLINE
348 VOID
WDF_INTERRUPT_EXTENDED_POLICY_INIT(_Out_ PWDF_INTERRUPT_EXTENDED_POLICY ExtendedPolicy)349 WDF_INTERRUPT_EXTENDED_POLICY_INIT(
350 _Out_ PWDF_INTERRUPT_EXTENDED_POLICY ExtendedPolicy
351 )
352 {
353 RtlZeroMemory(ExtendedPolicy, sizeof(WDF_INTERRUPT_EXTENDED_POLICY));
354 ExtendedPolicy->Size = sizeof(WDF_INTERRUPT_EXTENDED_POLICY);
355 ExtendedPolicy->Policy = WdfIrqPolicyMachineDefault;
356 ExtendedPolicy->Priority = WdfIrqPriorityUndefined;
357 }
358
359
360 //
361 // WDF Function: WdfInterruptCreate
362 //
363 typedef
364 _Must_inspect_result_
365 _IRQL_requires_max_(DISPATCH_LEVEL)
366 WDFAPI
367 NTSTATUS
368 (STDCALL *PFN_WDFINTERRUPTCREATE)(
369 _In_
370 PWDF_DRIVER_GLOBALS DriverGlobals,
371 _In_
372 WDFDEVICE Device,
373 _In_
374 PWDF_INTERRUPT_CONFIG Configuration,
375 _In_opt_
376 PWDF_OBJECT_ATTRIBUTES Attributes,
377 _Out_
378 WDFINTERRUPT* Interrupt
379 );
380
381 _Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)382 _IRQL_requires_max_(DISPATCH_LEVEL)
383 FORCEINLINE
384 NTSTATUS
385 WdfInterruptCreate(
386 _In_
387 WDFDEVICE Device,
388 _In_
389 PWDF_INTERRUPT_CONFIG Configuration,
390 _In_opt_
391 PWDF_OBJECT_ATTRIBUTES Attributes,
392 _Out_
393 WDFINTERRUPT* Interrupt
394 )
395 {
396 return ((PFN_WDFINTERRUPTCREATE) WdfFunctions[WdfInterruptCreateTableIndex])(WdfDriverGlobals, Device, Configuration, Attributes, Interrupt);
397 }
398
399 //
400 // WDF Function: WdfInterruptQueueDpcForIsr
401 //
402 typedef
403 WDFAPI
404 BOOLEAN
405 (STDCALL *PFN_WDFINTERRUPTQUEUEDPCFORISR)(
406 _In_
407 PWDF_DRIVER_GLOBALS DriverGlobals,
408 _In_
409 WDFINTERRUPT Interrupt
410 );
411
412 FORCEINLINE
413 BOOLEAN
WdfInterruptQueueDpcForIsr(_In_ WDFINTERRUPT Interrupt)414 WdfInterruptQueueDpcForIsr(
415 _In_
416 WDFINTERRUPT Interrupt
417 )
418 {
419 return ((PFN_WDFINTERRUPTQUEUEDPCFORISR) WdfFunctions[WdfInterruptQueueDpcForIsrTableIndex])(WdfDriverGlobals, Interrupt);
420 }
421
422 //
423 // WDF Function: WdfInterruptQueueWorkItemForIsr
424 //
425 typedef
426 WDFAPI
427 BOOLEAN
428 (STDCALL *PFN_WDFINTERRUPTQUEUEWORKITEMFORISR)(
429 _In_
430 PWDF_DRIVER_GLOBALS DriverGlobals,
431 _In_
432 WDFINTERRUPT Interrupt
433 );
434
435 FORCEINLINE
436 BOOLEAN
WdfInterruptQueueWorkItemForIsr(_In_ WDFINTERRUPT Interrupt)437 WdfInterruptQueueWorkItemForIsr(
438 _In_
439 WDFINTERRUPT Interrupt
440 )
441 {
442 return ((PFN_WDFINTERRUPTQUEUEWORKITEMFORISR) WdfFunctions[WdfInterruptQueueWorkItemForIsrTableIndex])(WdfDriverGlobals, Interrupt);
443 }
444
445 //
446 // WDF Function: WdfInterruptSynchronize
447 //
448 typedef
449 _IRQL_requires_max_(DISPATCH_LEVEL)
450 WDFAPI
451 BOOLEAN
452 (STDCALL *PFN_WDFINTERRUPTSYNCHRONIZE)(
453 _In_
454 PWDF_DRIVER_GLOBALS DriverGlobals,
455 _In_
456 WDFINTERRUPT Interrupt,
457 _In_
458 PFN_WDF_INTERRUPT_SYNCHRONIZE Callback,
459 _In_
460 WDFCONTEXT Context
461 );
462
_IRQL_requires_max_(DISPATCH_LEVEL)463 _IRQL_requires_max_(DISPATCH_LEVEL)
464 FORCEINLINE
465 BOOLEAN
466 WdfInterruptSynchronize(
467 _In_
468 WDFINTERRUPT Interrupt,
469 _In_
470 PFN_WDF_INTERRUPT_SYNCHRONIZE Callback,
471 _In_
472 WDFCONTEXT Context
473 )
474 {
475 return ((PFN_WDFINTERRUPTSYNCHRONIZE) WdfFunctions[WdfInterruptSynchronizeTableIndex])(WdfDriverGlobals, Interrupt, Callback, Context);
476 }
477
478 //
479 // WDF Function: WdfInterruptAcquireLock
480 //
481 typedef
482 _IRQL_requires_max_(DISPATCH_LEVEL + 1)
483 WDFAPI
484 VOID
485 (STDCALL *PFN_WDFINTERRUPTACQUIRELOCK)(
486 _In_
487 PWDF_DRIVER_GLOBALS DriverGlobals,
488 _In_
489 _Requires_lock_not_held_(_Curr_)
490 _Acquires_lock_(_Curr_)
491 WDFINTERRUPT Interrupt
492 );
493
494 _IRQL_requires_max_(DISPATCH_LEVEL + 1)
495 FORCEINLINE
496 VOID
WdfInterruptAcquireLock(_In_ _Requires_lock_not_held_ (_Curr_)_Acquires_lock_ (_Curr_)WDFINTERRUPT Interrupt)497 WdfInterruptAcquireLock(
498 _In_
499 _Requires_lock_not_held_(_Curr_)
500 _Acquires_lock_(_Curr_)
501 WDFINTERRUPT Interrupt
502 )
503 {
504 ((PFN_WDFINTERRUPTACQUIRELOCK) WdfFunctions[WdfInterruptAcquireLockTableIndex])(WdfDriverGlobals, Interrupt);
505 }
506
507 //
508 // WDF Function: WdfInterruptReleaseLock
509 //
510 typedef
511 _IRQL_requires_max_(DISPATCH_LEVEL + 1)
512 WDFAPI
513 VOID
514 (STDCALL *PFN_WDFINTERRUPTRELEASELOCK)(
515 _In_
516 PWDF_DRIVER_GLOBALS DriverGlobals,
517 _In_
518 _Requires_lock_held_(_Curr_)
519 _Releases_lock_(_Curr_)
520 WDFINTERRUPT Interrupt
521 );
522
523 _IRQL_requires_max_(DISPATCH_LEVEL + 1)
524 FORCEINLINE
525 VOID
WdfInterruptReleaseLock(_In_ _Requires_lock_held_ (_Curr_)_Releases_lock_ (_Curr_)WDFINTERRUPT Interrupt)526 WdfInterruptReleaseLock(
527 _In_
528 _Requires_lock_held_(_Curr_)
529 _Releases_lock_(_Curr_)
530 WDFINTERRUPT Interrupt
531 )
532 {
533 ((PFN_WDFINTERRUPTRELEASELOCK) WdfFunctions[WdfInterruptReleaseLockTableIndex])(WdfDriverGlobals, Interrupt);
534 }
535
536 //
537 // WDF Function: WdfInterruptEnable
538 //
539 typedef
540 _IRQL_requires_max_(PASSIVE_LEVEL)
541 WDFAPI
542 VOID
543 (STDCALL *PFN_WDFINTERRUPTENABLE)(
544 _In_
545 PWDF_DRIVER_GLOBALS DriverGlobals,
546 _In_
547 WDFINTERRUPT Interrupt
548 );
549
_IRQL_requires_max_(PASSIVE_LEVEL)550 _IRQL_requires_max_(PASSIVE_LEVEL)
551 FORCEINLINE
552 VOID
553 WdfInterruptEnable(
554 _In_
555 WDFINTERRUPT Interrupt
556 )
557 {
558 ((PFN_WDFINTERRUPTENABLE) WdfFunctions[WdfInterruptEnableTableIndex])(WdfDriverGlobals, Interrupt);
559 }
560
561 //
562 // WDF Function: WdfInterruptDisable
563 //
564 typedef
565 _IRQL_requires_max_(PASSIVE_LEVEL)
566 WDFAPI
567 VOID
568 (STDCALL *PFN_WDFINTERRUPTDISABLE)(
569 _In_
570 PWDF_DRIVER_GLOBALS DriverGlobals,
571 _In_
572 WDFINTERRUPT Interrupt
573 );
574
_IRQL_requires_max_(PASSIVE_LEVEL)575 _IRQL_requires_max_(PASSIVE_LEVEL)
576 FORCEINLINE
577 VOID
578 WdfInterruptDisable(
579 _In_
580 WDFINTERRUPT Interrupt
581 )
582 {
583 ((PFN_WDFINTERRUPTDISABLE) WdfFunctions[WdfInterruptDisableTableIndex])(WdfDriverGlobals, Interrupt);
584 }
585
586 //
587 // WDF Function: WdfInterruptWdmGetInterrupt
588 //
589 typedef
590 _Must_inspect_result_
591 WDFAPI
592 PKINTERRUPT
593 (STDCALL *PFN_WDFINTERRUPTWDMGETINTERRUPT)(
594 _In_
595 PWDF_DRIVER_GLOBALS DriverGlobals,
596 _In_
597 WDFINTERRUPT Interrupt
598 );
599
600 _Must_inspect_result_
601 FORCEINLINE
602 PKINTERRUPT
WdfInterruptWdmGetInterrupt(_In_ WDFINTERRUPT Interrupt)603 WdfInterruptWdmGetInterrupt(
604 _In_
605 WDFINTERRUPT Interrupt
606 )
607 {
608 return ((PFN_WDFINTERRUPTWDMGETINTERRUPT) WdfFunctions[WdfInterruptWdmGetInterruptTableIndex])(WdfDriverGlobals, Interrupt);
609 }
610
611 //
612 // WDF Function: WdfInterruptGetInfo
613 //
614 typedef
615 _IRQL_requires_max_(DISPATCH_LEVEL)
616 WDFAPI
617 VOID
618 (STDCALL *PFN_WDFINTERRUPTGETINFO)(
619 _In_
620 PWDF_DRIVER_GLOBALS DriverGlobals,
621 _In_
622 WDFINTERRUPT Interrupt,
623 _Out_
624 PWDF_INTERRUPT_INFO Info
625 );
626
_IRQL_requires_max_(DISPATCH_LEVEL)627 _IRQL_requires_max_(DISPATCH_LEVEL)
628 FORCEINLINE
629 VOID
630 WdfInterruptGetInfo(
631 _In_
632 WDFINTERRUPT Interrupt,
633 _Out_
634 PWDF_INTERRUPT_INFO Info
635 )
636 {
637 ((PFN_WDFINTERRUPTGETINFO) WdfFunctions[WdfInterruptGetInfoTableIndex])(WdfDriverGlobals, Interrupt, Info);
638 }
639
640 //
641 // WDF Function: WdfInterruptSetPolicy
642 //
643 typedef
644 _IRQL_requires_max_(DISPATCH_LEVEL)
645 WDFAPI
646 VOID
647 (STDCALL *PFN_WDFINTERRUPTSETPOLICY)(
648 _In_
649 PWDF_DRIVER_GLOBALS DriverGlobals,
650 _In_
651 WDFINTERRUPT Interrupt,
652 _In_
653 WDF_INTERRUPT_POLICY Policy,
654 _In_
655 WDF_INTERRUPT_PRIORITY Priority,
656 _In_
657 KAFFINITY TargetProcessorSet
658 );
659
_IRQL_requires_max_(DISPATCH_LEVEL)660 _IRQL_requires_max_(DISPATCH_LEVEL)
661 FORCEINLINE
662 VOID
663 WdfInterruptSetPolicy(
664 _In_
665 WDFINTERRUPT Interrupt,
666 _In_
667 WDF_INTERRUPT_POLICY Policy,
668 _In_
669 WDF_INTERRUPT_PRIORITY Priority,
670 _In_
671 KAFFINITY TargetProcessorSet
672 )
673 {
674 ((PFN_WDFINTERRUPTSETPOLICY) WdfFunctions[WdfInterruptSetPolicyTableIndex])(WdfDriverGlobals, Interrupt, Policy, Priority, TargetProcessorSet);
675 }
676
677 //
678 // WDF Function: WdfInterruptSetExtendedPolicy
679 //
680 typedef
681 _IRQL_requires_max_(DISPATCH_LEVEL)
682 WDFAPI
683 VOID
684 (STDCALL *PFN_WDFINTERRUPTSETEXTENDEDPOLICY)(
685 _In_
686 PWDF_DRIVER_GLOBALS DriverGlobals,
687 _In_
688 WDFINTERRUPT Interrupt,
689 _In_
690 PWDF_INTERRUPT_EXTENDED_POLICY PolicyAndGroup
691 );
692
_IRQL_requires_max_(DISPATCH_LEVEL)693 _IRQL_requires_max_(DISPATCH_LEVEL)
694 FORCEINLINE
695 VOID
696 WdfInterruptSetExtendedPolicy(
697 _In_
698 WDFINTERRUPT Interrupt,
699 _In_
700 PWDF_INTERRUPT_EXTENDED_POLICY PolicyAndGroup
701 )
702 {
703 ((PFN_WDFINTERRUPTSETEXTENDEDPOLICY) WdfFunctions[WdfInterruptSetExtendedPolicyTableIndex])(WdfDriverGlobals, Interrupt, PolicyAndGroup);
704 }
705
706 //
707 // WDF Function: WdfInterruptGetDevice
708 //
709 typedef
710 WDFAPI
711 WDFDEVICE
712 (STDCALL *PFN_WDFINTERRUPTGETDEVICE)(
713 _In_
714 PWDF_DRIVER_GLOBALS DriverGlobals,
715 _In_
716 WDFINTERRUPT Interrupt
717 );
718
719 FORCEINLINE
720 WDFDEVICE
WdfInterruptGetDevice(_In_ WDFINTERRUPT Interrupt)721 WdfInterruptGetDevice(
722 _In_
723 WDFINTERRUPT Interrupt
724 )
725 {
726 return ((PFN_WDFINTERRUPTGETDEVICE) WdfFunctions[WdfInterruptGetDeviceTableIndex])(WdfDriverGlobals, Interrupt);
727 }
728
729 //
730 // WDF Function: WdfInterruptTryToAcquireLock
731 //
732 typedef
733 _Must_inspect_result_
734 _Post_satisfies_(return == 1 || return == 0)
735 _IRQL_requires_max_(PASSIVE_LEVEL)
736 WDFAPI
737 BOOLEAN
738 (STDCALL *PFN_WDFINTERRUPTTRYTOACQUIRELOCK)(
739 _In_
740 PWDF_DRIVER_GLOBALS DriverGlobals,
741 _In_
742 _Requires_lock_not_held_(_Curr_)
743 _When_(return!=0, _Acquires_lock_(_Curr_))
744 WDFINTERRUPT Interrupt
745 );
746
747 _Must_inspect_result_
748 _Post_satisfies_(return == 1 || return == 0)
_IRQL_requires_max_(PASSIVE_LEVEL)749 _IRQL_requires_max_(PASSIVE_LEVEL)
750 FORCEINLINE
751 BOOLEAN
752 WdfInterruptTryToAcquireLock(
753 _In_
754 _Requires_lock_not_held_(_Curr_)
755 _When_(return!=0, _Acquires_lock_(_Curr_))
756 WDFINTERRUPT Interrupt
757 )
758 {
759 return ((PFN_WDFINTERRUPTTRYTOACQUIRELOCK) WdfFunctions[WdfInterruptTryToAcquireLockTableIndex])(WdfDriverGlobals, Interrupt);
760 }
761
762 //
763 // WDF Function: WdfInterruptReportActive
764 //
765 typedef
766 _IRQL_requires_max_(DISPATCH_LEVEL)
767 WDFAPI
768 VOID
769 (STDCALL *PFN_WDFINTERRUPTREPORTACTIVE)(
770 _In_
771 PWDF_DRIVER_GLOBALS DriverGlobals,
772 _In_
773 WDFINTERRUPT Interrupt
774 );
775
_IRQL_requires_max_(DISPATCH_LEVEL)776 _IRQL_requires_max_(DISPATCH_LEVEL)
777 FORCEINLINE
778 VOID
779 WdfInterruptReportActive(
780 _In_
781 WDFINTERRUPT Interrupt
782 )
783 {
784 ((PFN_WDFINTERRUPTREPORTACTIVE) WdfFunctions[WdfInterruptReportActiveTableIndex])(WdfDriverGlobals, Interrupt);
785 }
786
787 //
788 // WDF Function: WdfInterruptReportInactive
789 //
790 typedef
791 _IRQL_requires_max_(DISPATCH_LEVEL)
792 WDFAPI
793 VOID
794 (STDCALL *PFN_WDFINTERRUPTREPORTINACTIVE)(
795 _In_
796 PWDF_DRIVER_GLOBALS DriverGlobals,
797 _In_
798 WDFINTERRUPT Interrupt
799 );
800
_IRQL_requires_max_(DISPATCH_LEVEL)801 _IRQL_requires_max_(DISPATCH_LEVEL)
802 FORCEINLINE
803 VOID
804 WdfInterruptReportInactive(
805 _In_
806 WDFINTERRUPT Interrupt
807 )
808 {
809 ((PFN_WDFINTERRUPTREPORTINACTIVE) WdfFunctions[WdfInterruptReportInactiveTableIndex])(WdfDriverGlobals, Interrupt);
810 }
811
812
813
814 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
815
816
817 WDF_EXTERN_C_END
818
819 #endif // _WDFINTERRUPT_H_
820
821