97{ \
99 ok_eq_pointer((
Mutex)->
Owner, ExpectedOwner); \
100 ok_eq_ulong((
Mutex)->Contention, ExpectedContention); \
101 ok_eq_int((
Mutex)->KernelApcDisable, ExpectedKernelApcDisable); \
103 ok_eq_int((
Mutex)->SpecialApcDisable, ExpectedSpecialApcDisable); \
104 else \
105 ok_eq_int((
Mutex)->SpecialApcDisable, 0x5555); \
107 ok_eq_int(
Thread->KernelApcDisable, KernelApcsDisabled); \
108 ok_eq_bool(pKeAreAllApcsDisabled(), AllApcsDisabled); \
109 ok_eq_int(
Thread->SpecialApcDisable, SpecialApcsDisabled); \
110 ok_irql(ExpectedIrql); \
111} while (0)
112
113static
115TestGuardedMutex(
117 SHORT KernelApcsDisabled,
118 SHORT SpecialApcsDisabled,
119 SHORT AllApcsDisabled,
121{
123
124 ok_irql(OriginalIrql);
125 CheckMutex(
Mutex, 1L,
NULL, 0LU, 0x5555, 0x5555, KernelApcsDisabled, SpecialApcsDisabled, AllApcsDisabled, OriginalIrql);
126
127
129 {
130
131 pKeAcquireGuardedMutex(
Mutex);
132 CheckMutex(
Mutex, 0
L,
Thread, 0LU, 0x5555, SpecialApcsDisabled - 1, KernelApcsDisabled, SpecialApcsDisabled - 1,
TRUE, OriginalIrql);
133 ok_bool_false(pKeTryToAcquireGuardedMutex(
Mutex),
"KeTryToAcquireGuardedMutex returned");
134 CheckMutex(
Mutex, 0
L,
Thread, 0LU, 0x5555, SpecialApcsDisabled - 1, KernelApcsDisabled, SpecialApcsDisabled - 1,
TRUE, OriginalIrql);
135 pKeReleaseGuardedMutex(
Mutex);
136 CheckMutex(
Mutex, 1L,
NULL, 0LU, 0x5555, SpecialApcsDisabled - 1, KernelApcsDisabled, SpecialApcsDisabled, AllApcsDisabled, OriginalIrql);
137
138
139 ok_bool_true(pKeTryToAcquireGuardedMutex(
Mutex),
"KeTryToAcquireGuardedMutex returned");
140 CheckMutex(
Mutex, 0
L,
Thread, 0LU, 0x5555, SpecialApcsDisabled - 1, KernelApcsDisabled, SpecialApcsDisabled - 1,
TRUE, OriginalIrql);
141 pKeReleaseGuardedMutex(
Mutex);
142 CheckMutex(
Mutex, 1L,
NULL, 0LU, 0x5555, SpecialApcsDisabled - 1, KernelApcsDisabled, SpecialApcsDisabled, AllApcsDisabled, OriginalIrql);
143 }
144 else
145
146 Mutex->SpecialApcDisable = SpecialApcsDisabled - 1;
147
148
150 {
151
152 pKeAcquireGuardedMutexUnsafe(
Mutex);
153 CheckMutex(
Mutex, 0
L,
Thread, 0LU, 0x5555, SpecialApcsDisabled - 1, KernelApcsDisabled, SpecialApcsDisabled, AllApcsDisabled, OriginalIrql);
154 pKeReleaseGuardedMutexUnsafe(
Mutex);
155 CheckMutex(
Mutex, 1L,
NULL, 0LU, 0x5555, SpecialApcsDisabled - 1, KernelApcsDisabled, SpecialApcsDisabled, AllApcsDisabled, OriginalIrql);
156 }
157
158
160 {
161
162 pKeAcquireGuardedMutex(
Mutex);
163 CheckMutex(
Mutex, 0
L,
Thread, 0LU, 0x5555, SpecialApcsDisabled - 1, KernelApcsDisabled, SpecialApcsDisabled - 1,
TRUE, OriginalIrql);
164 pKeReleaseGuardedMutexUnsafe(
Mutex);
165 CheckMutex(
Mutex, 1L,
NULL, 0LU, 0x5555, SpecialApcsDisabled - 1, KernelApcsDisabled, SpecialApcsDisabled - 1,
TRUE, OriginalIrql);
166 pKeLeaveGuardedRegion();
167 CheckMutex(
Mutex, 1L,
NULL, 0LU, 0x5555, SpecialApcsDisabled - 1, KernelApcsDisabled, SpecialApcsDisabled, AllApcsDisabled, OriginalIrql);
168
169 pKeAcquireGuardedMutexUnsafe(
Mutex);
170 CheckMutex(
Mutex, 0
L,
Thread, 0LU, 0x5555, SpecialApcsDisabled - 1, KernelApcsDisabled, SpecialApcsDisabled, AllApcsDisabled, OriginalIrql);
171 pKeReleaseGuardedMutex(
Mutex);
172 CheckMutex(
Mutex, 1L,
NULL, 0LU, 0x5555, SpecialApcsDisabled - 1, KernelApcsDisabled, SpecialApcsDisabled + 1, OriginalIrql >=
APC_LEVEL || SpecialApcsDisabled != -1, OriginalIrql);
173 pKeEnterGuardedRegion();
174 CheckMutex(
Mutex, 1L,
NULL, 0LU, 0x5555, SpecialApcsDisabled - 1, KernelApcsDisabled, SpecialApcsDisabled, AllApcsDisabled, OriginalIrql);
175
176
177 pKeReleaseGuardedMutexUnsafe(
Mutex);
178 CheckMutex(
Mutex, 0
L,
NULL, 0LU, 0x5555, SpecialApcsDisabled - 1, KernelApcsDisabled, SpecialApcsDisabled, AllApcsDisabled, OriginalIrql);
179 pKeReleaseGuardedMutex(
Mutex);
180 CheckMutex(
Mutex, 1L,
NULL, 0LU, 0x5555, SpecialApcsDisabled, KernelApcsDisabled, SpecialApcsDisabled + 1, OriginalIrql >=
APC_LEVEL || SpecialApcsDisabled != -1, OriginalIrql);
181 pKeReleaseGuardedMutex(
Mutex);
182
183 CheckMutex(
Mutex, 0
L,
NULL, 0LU, 0x5555, SpecialApcsDisabled, KernelApcsDisabled, SpecialApcsDisabled + 2, OriginalIrql >=
APC_LEVEL || SpecialApcsDisabled != -2, OriginalIrql);
184 pKeReleaseGuardedMutex(
Mutex);
185 CheckMutex(
Mutex, 1L,
NULL, 0LU, 0x5555, SpecialApcsDisabled, KernelApcsDisabled, SpecialApcsDisabled + 3, OriginalIrql >=
APC_LEVEL || SpecialApcsDisabled != -3, OriginalIrql);
186 Thread->SpecialApcDisable -= 3;
187 }
188
189
193 Thread->KernelApcDisable = KernelApcsDisabled;
195 Thread->SpecialApcDisable = SpecialApcsDisabled;
196 ok_irql(OriginalIrql);
197}
#define CheckMutex(Mutex, ExpectedCount, ExpectedOwner, ExpectedContention, ExpectedKernelApcDisable, ExpectedSpecialApcDisable, KernelApcsDisabled, SpecialApcsDisabled, AllApcsDisabled, ExpectedIrql)
#define ok_eq_long(value, expected)
#define ok_bool_false(value, desc)
#define ok_bool_true(value, desc)
#define ok_eq_int(value, expected)
#define KeGetCurrentThread