2 * PROJECT: ReactOS kernel-mode tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Kernel-Mode Test Suite Interrupt Request Level test
5 * PROGRAMMER: Thomas Faber <thfabba@gmx.de>
8 __declspec(dllimport
) void __stdcall
KeRaiseIrql(unsigned char, unsigned char *);
9 __declspec(dllimport
) void __stdcall
KeLowerIrql(unsigned char);
13 #include <ndk/ntndk.h>
15 #include <pseh/pseh2.h>
22 KIRQL Irql
, Irql2
, PrevIrql
, SynchIrql
;
24 /* we should be called at PASSIVE_LEVEL */
25 ok_irql(PASSIVE_LEVEL
);
27 PrevIrql
= KeGetCurrentIrql();
29 /* SYNCH_LEVEL is different for UP/MP */
30 if (KmtIsMultiProcessorBuild
)
31 SynchIrql
= IPI_LEVEL
- 2;
33 SynchIrql
= DISPATCH_LEVEL
;
35 /* some Irqls MUST work */
37 const KIRQL Irqls
[] = { LOW_LEVEL
, PASSIVE_LEVEL
, APC_LEVEL
, DISPATCH_LEVEL
,
38 CMCI_LEVEL
, CLOCK1_LEVEL
, CLOCK2_LEVEL
, CLOCK_LEVEL
,
39 PROFILE_LEVEL
, IPI_LEVEL
, /*POWER_LEVEL,*/ SynchIrql
, HIGH_LEVEL
};
41 for (i
= 0; i
< sizeof Irqls
/ sizeof Irqls
[0]; ++i
)
43 KeRaiseIrql(Irqls
[i
], &Irql2
);
44 ok_eq_uint(Irql2
, PrevIrql
);
51 /* raising/lowering to the current level should have no effect */
52 ok_irql(PASSIVE_LEVEL
);
53 KeRaiseIrql(PASSIVE_LEVEL
, &Irql
);
54 ok_eq_uint(Irql
, PASSIVE_LEVEL
);
55 KeLowerIrql(PASSIVE_LEVEL
);
56 ok_irql(PASSIVE_LEVEL
);
58 /* try to raise to each Irql and back */
59 for (Irql
= PASSIVE_LEVEL
; Irql
<= HIGH_LEVEL
; ++Irql
)
61 DPRINT("Raising to %u\n", Irql
);
62 KeRaiseIrql(Irql
, &Irql2
);
63 ok_eq_uint(Irql2
, PrevIrql
);
68 /* go through all Irqls in order, skip the ones that the system doesn't accept */
69 for (Irql
= PASSIVE_LEVEL
; Irql
<= HIGH_LEVEL
; ++Irql
)
71 DPRINT("Raising to %u\n", Irql
);
72 KeRaiseIrql(Irql
, &Irql2
);
73 ok_eq_uint(Irql2
, PrevIrql
);
74 Irql2
= KeGetCurrentIrql();
75 ok(Irql2
<= Irql
, "New Irql is %u, expected <= requested value of %u\n", Irql2
, Irql
);
81 /* now go back again, skipping the ones that don't work */
82 for (Irql
= HIGH_LEVEL
; Irql
> PASSIVE_LEVEL
;)
84 DPRINT("Lowering to %u\n", Irql
- 1);
85 KeLowerIrql(Irql
- 1);
86 Irql2
= KeGetCurrentIrql();
87 ok(Irql2
< Irql
, "New Irql is %u, expected <= requested value of %u\n", Irql2
, Irql
- 1);
95 /* on x86, you can raise to _any_ possible KIRQL value */
96 /* on x64, anything with more than the least significant 4 bits set bugchecked, last time I tried */
97 /* TODO: other platforms? */
99 for (Irql
= PASSIVE_LEVEL
; Irql
<= (KIRQL
)-1; ++Irql
)
101 DPRINT("Raising to %u\n", Irql
);
102 KeRaiseIrql(Irql
, &Irql2
);
103 ok_eq_uint(Irql2
, PrevIrql
);
107 #endif /* defined _M_X86 */
109 /* test KeRaiseIrqlToDpcLevel */
110 ok_irql(PASSIVE_LEVEL
);
111 Irql
= KeRaiseIrqlToDpcLevel();
112 ok_irql(DISPATCH_LEVEL
);
113 ok_eq_uint(Irql
, PASSIVE_LEVEL
);
114 Irql
= KeRaiseIrqlToDpcLevel();
115 ok_irql(DISPATCH_LEVEL
);
116 ok_eq_uint(Irql
, DISPATCH_LEVEL
);
117 KeLowerIrql(PASSIVE_LEVEL
);
119 /* test KeRaiseIrqlToSynchLevel */
120 ok_irql(PASSIVE_LEVEL
);
121 Irql
= KeRaiseIrqlToSynchLevel();
123 ok_eq_uint(Irql
, PASSIVE_LEVEL
);
124 Irql
= KeRaiseIrqlToSynchLevel();
126 ok_eq_uint(Irql
, SynchIrql
);
127 KeLowerIrql(PASSIVE_LEVEL
);
129 /* these bugcheck on a checked build but run fine on free! */
130 if (!KmtIsCheckedBuild
)
132 KeRaiseIrql(HIGH_LEVEL
, &Irql
);
133 KeRaiseIrql(APC_LEVEL
, &Irql
);
135 KeLowerIrql(HIGH_LEVEL
);
137 KeLowerIrql(PASSIVE_LEVEL
);
140 /* try the actual exports, not only the fastcall versions */
141 ok_irql(PASSIVE_LEVEL
);
142 (KeRaiseIrql
)(HIGH_LEVEL
, &Irql
);
144 ok_eq_uint(Irql
, PASSIVE_LEVEL
);
146 ok_irql(PASSIVE_LEVEL
);
148 /* make sure we exit gracefully */
149 ok_irql(PASSIVE_LEVEL
);
150 KeLowerIrql(PASSIVE_LEVEL
);