diff --git a/kmtests/kmtest_drv/testlist.c b/kmtests/kmtest_drv/testlist.c index 8ef84a5c23a..3e90a7e29ba 100644 --- a/kmtests/kmtest_drv/testlist.c +++ b/kmtests/kmtest_drv/testlist.c @@ -43,7 +43,7 @@ const KMT_TEST TestList[] = { "KeDpc", Test_KeDpc }, { "KeIrql", Test_KeIrql }, { "KeProcessor", Test_KeProcessor }, - { "KernelType", Test_KernelType }, + { "-KernelType", Test_KernelType }, { "ObCreate", Test_ObCreate }, { NULL, NULL } }; diff --git a/kmtests/ntos_ex/ExInterlocked.c b/kmtests/ntos_ex/ExInterlocked.c index 19e57a99339..d8db0c7367e 100644 --- a/kmtests/ntos_ex/ExInterlocked.c +++ b/kmtests/ntos_ex/ExInterlocked.c @@ -38,10 +38,20 @@ __declspec(dllimport) int __stdcall Exi386InterlockedDecrementLo static KSPIN_LOCK SpinLock; +#ifdef _M_IX86 typedef struct { - int esi, edi, ebx, ebp, esp; -} PROCESSOR_STATE, *PPROCESSOR_STATE; + unsigned long esi, edi, ebx, ebp, esp; +} PROCESSOR_STATE; +#elif defined(_M_AMD64) +typedef struct +{ + unsigned long long rsi, rdi, rbx, rbp, rsp, r12, r13, r14, r15; +} PROCESSOR_STATE; +#else +// dummy +typedef int PROCESSOR_STATE; +#endif #if defined(_MSC_VER) && defined(_M_IX86) #define SaveState(State) do \ @@ -63,6 +73,56 @@ typedef struct ok_eq_hex((OldState)->esp, (NewState)->esp); \ } while (0) +#elif defined(__GNUC__) && defined(_M_IX86) +#define SaveState(State) \ + asm volatile( \ + ".intel_syntax noprefix\n\t" \ + "mov\t[ecx], esi\n\t" \ + "mov\t[ecx+4], edi\n\t" \ + "mov\t[ecx+8], ebx\n\t" \ + "mov\t[ecx+12], ebp\n\t" \ + "mov\t[ecx+16], esp\n\t" \ + ".att_syntax prefix" \ + : : "c" (&State) : "memory" \ + ); + +#define CheckState(OldState, NewState) do \ +{ \ + ok_eq_hex((OldState)->esi, (NewState)->esi); \ + ok_eq_hex((OldState)->edi, (NewState)->edi); \ + ok_eq_hex((OldState)->ebx, (NewState)->ebx); \ + ok_eq_hex((OldState)->ebp, (NewState)->ebp); \ + ok_eq_hex((OldState)->esp, (NewState)->esp); \ +} while (0) +#elif defined(__GNUC__) && defined(_M_AMD64) +#define SaveState(State) \ + asm volatile( \ + ".intel_syntax noprefix\n\t" \ + "mov\t[rcx], rsi\n\t" \ + "mov\t[rcx+8], rdi\n\t" \ + "mov\t[rcx+16], rbx\n\t" \ + "mov\t[rcx+24], rbp\n\t" \ + "mov\t[rcx+32], rsp\n\t" \ + "mov\t[rcx+40], r12\n\t" \ + "mov\t[rcx+48], r13\n\t" \ + "mov\t[rcx+56], r14\n\t" \ + "mov\t[rcx+64], r15\n\t" \ + ".att_syntax prefix" \ + : : "c" (&State) : "memory" \ + ); + +#define CheckState(OldState, NewState) do \ +{ \ + ok_eq_hex((OldState)->rsi, (NewState)->rsi); \ + ok_eq_hex((OldState)->rdi, (NewState)->rdi); \ + ok_eq_hex((OldState)->rbx, (NewState)->rbx); \ + ok_eq_hex((OldState)->rbp, (NewState)->rbp); \ + ok_eq_hex((OldState)->rsp, (NewState)->rsp); \ + ok_eq_hex((OldState)->r12, (NewState)->r12); \ + ok_eq_hex((OldState)->r13, (NewState)->r13); \ + ok_eq_hex((OldState)->r14, (NewState)->r14); \ + ok_eq_hex((OldState)->r15, (NewState)->r15); \ +} while (0) #else #define SaveState(State) #define CheckState(OldState, NewState) @@ -218,10 +278,6 @@ TestInterlockedFunctional(VOID) /* CompareExchange */ /* macro version */ - CheckInterlockedCmpXchg(InterlockedCompareExchange, LONG, "%ld", 5, 6, 8, 5L, 5L); - CheckInterlockedCmpXchg(InterlockedCompareExchange, LONG, "%ld", 5, 5, 9, 9L, 5L); - /* exported function */ -#undef InterlockedCompareExchange CheckInterlockedCmpXchg(InterlockedCompareExchange, LONG, "%ld", 5, 6, 8, 5L, 5L); CheckInterlockedCmpXchg(InterlockedCompareExchange, LONG, "%ld", 5, 5, 9, 9L, 5L); /* these only exist as macros on x86 */ @@ -229,27 +285,35 @@ TestInterlockedFunctional(VOID) CheckInterlockedCmpXchg(InterlockedCompareExchangeAcquire, LONG, "%ld", 16, 16, 4, 4L, 16L); CheckInterlockedCmpXchg(InterlockedCompareExchangeRelease, LONG, "%ld", 27, 123, 38, 27L, 27L); CheckInterlockedCmpXchg(InterlockedCompareExchangeRelease, LONG, "%ld", 27, 27, 39, 39L, 27L); + /* exported function */ +#undef InterlockedCompareExchange +#ifdef _M_IX86 + CheckInterlockedCmpXchg(InterlockedCompareExchange, LONG, "%ld", 5, 6, 8, 5L, 5L); + CheckInterlockedCmpXchg(InterlockedCompareExchange, LONG, "%ld", 5, 5, 9, 9L, 5L); +#endif /* only exists as a macro */ CheckInterlockedCmpXchg(InterlockedCompareExchangePointer, PVOID, "%p", (PVOID)117, (PVOID)711, (PVOID)12, (PVOID)117, (PVOID)117); CheckInterlockedCmpXchg(InterlockedCompareExchangePointer, PVOID, "%p", (PVOID)117, (PVOID)117, (PVOID)228, (PVOID)228, (PVOID)117); /* macro version */ CheckInterlockedCmpXchgI(ExInterlockedCompareExchange64, LONGLONG, "%I64d", 17, 4LL, 20LL, 17LL, 17LL, pSpinLock); CheckInterlockedCmpXchgI(ExInterlockedCompareExchange64, LONGLONG, "%I64d", 17, 17LL, 21LL, 21LL, 17LL, pSpinLock); +#ifdef _M_IX86 /* exported function */ CheckInterlockedCmpXchgI((ExInterlockedCompareExchange64), LONGLONG, "%I64d", 17, 4LL, 20LL, 17LL, 17LL, pSpinLock); CheckInterlockedCmpXchgI((ExInterlockedCompareExchange64), LONGLONG, "%I64d", 17, 17LL, 21LL, 21LL, 17LL, pSpinLock); /* fastcall version */ CheckInterlockedCmpXchgI(ExfInterlockedCompareExchange64, LONGLONG, "%I64d", 17, 4LL, 20LL, 17LL, 17LL); CheckInterlockedCmpXchgI(ExfInterlockedCompareExchange64, LONGLONG, "%I64d", 17, 17LL, 21LL, 21LL, 17LL); +#endif /* Exchange */ CheckInterlockedOp(InterlockedExchange, LONG, "%ld", 5, 8, 8L, 5L); -#undef InterlockedExchange - CheckInterlockedOp(InterlockedExchange, LONG, "%ld", 5, 8, 8L, 5L); CheckInterlockedOp(InterlockedExchangePointer, PVOID, "%p", (PVOID)700, (PVOID)93, (PVOID)93, (PVOID)700); +#undef InterlockedExchange +#ifdef _M_IX86 + CheckInterlockedOp(InterlockedExchange, LONG, "%ld", 5, 8, 8L, 5L); CheckInterlockedOp(ExInterlockedExchangeUlong, ULONG, "%lu", 212, 121, 121LU, 212LU, pSpinLock); CheckInterlockedOp((ExInterlockedExchangeUlong), ULONG, "%lu", 212, 121, 121LU, 212LU, pSpinLock); -#ifdef _M_IX86 CheckInterlockedOp(Exi386InterlockedExchangeUlong, ULONG, "%lu", 212, 121, 121LU, 212LU); CheckInterlockedOp(Exfi386InterlockedExchangeUlong, ULONG, "%lu", 212, 121, 121LU, 212LU); #endif @@ -258,7 +322,9 @@ TestInterlockedFunctional(VOID) /* TODO: ExInterlockedExchangeAddLargeInteger? */ CheckInterlockedOp(InterlockedExchangeAdd, LONG, "%ld", 312, 7, 319L, 312L); #undef InterlockedExchangeAdd +#ifdef _M_IX86 CheckInterlockedOp(InterlockedExchangeAdd, LONG, "%ld", 312, 7, 319L, 312L); +#endif /* Add */ /* these DO need a valid spinlock even on x86 */ @@ -271,11 +337,12 @@ TestInterlockedFunctional(VOID) /* Increment */ CheckInterlockedOpNoArg(InterlockedIncrement, LONG, "%ld", 2341L, 2342L, 2342L); CheckInterlockedOpNoArg(InterlockedIncrement, LONG, "%ld", (LONG)MAXLONG, (LONG)MINLONG, (LONG)MINLONG); -#undef InterlockedIncrement - CheckInterlockedOpNoArg(InterlockedIncrement, LONG, "%ld", 2341L, 2342L, 2342L); - CheckInterlockedOpNoArg(InterlockedIncrement, LONG, "%ld", (LONG)MAXLONG, (LONG)MINLONG, (LONG)MINLONG); CheckInterlockedOpNoArg(InterlockedIncrementAcquire, LONG, "%ld", 2341L, 2342L, 2342L); CheckInterlockedOpNoArg(InterlockedIncrementRelease, LONG, "%ld", 2341L, 2342L, 2342L); +#undef InterlockedIncrement +#ifdef _M_IX86 + CheckInterlockedOpNoArg(InterlockedIncrement, LONG, "%ld", 2341L, 2342L, 2342L); + CheckInterlockedOpNoArg(InterlockedIncrement, LONG, "%ld", (LONG)MAXLONG, (LONG)MINLONG, (LONG)MINLONG); CheckInterlockedOpNoArg(ExInterlockedIncrementLong, LONG, "%ld", -2L, -1L, (LONG)ResultNegative, pSpinLock); CheckInterlockedOpNoArg(ExInterlockedIncrementLong, LONG, "%ld", -1L, 0L, (LONG)ResultZero, pSpinLock); CheckInterlockedOpNoArg(ExInterlockedIncrementLong, LONG, "%ld", 0L, 1L, (LONG)ResultPositive, pSpinLock); @@ -284,7 +351,6 @@ TestInterlockedFunctional(VOID) CheckInterlockedOpNoArg((ExInterlockedIncrementLong), LONG, "%ld", -1L, 0L, (LONG)ResultZero, pSpinLock); CheckInterlockedOpNoArg((ExInterlockedIncrementLong), LONG, "%ld", 0L, 1L, (LONG)ResultPositive, pSpinLock); CheckInterlockedOpNoArg((ExInterlockedIncrementLong), LONG, "%ld", (LONG)MAXLONG, (LONG)MINLONG, (LONG)ResultNegative, pSpinLock); -#ifdef _M_IX86 CheckInterlockedOpNoArg(Exi386InterlockedIncrementLong, LONG, "%ld", -2L, -1L, (LONG)ResultNegative); CheckInterlockedOpNoArg(Exi386InterlockedIncrementLong, LONG, "%ld", -1L, 0L, (LONG)ResultZero); CheckInterlockedOpNoArg(Exi386InterlockedIncrementLong, LONG, "%ld", 0L, 1L, (LONG)ResultPositive); @@ -294,11 +360,12 @@ TestInterlockedFunctional(VOID) /* Decrement */ CheckInterlockedOpNoArg(InterlockedDecrement, LONG, "%ld", 1745L, 1744L, 1744L); CheckInterlockedOpNoArg(InterlockedDecrement, LONG, "%ld", (LONG)MINLONG, (LONG)MAXLONG, (LONG)MAXLONG); -#undef InterlockedDecrement - CheckInterlockedOpNoArg(InterlockedDecrement, LONG, "%ld", 1745L, 1744L, 1744L); - CheckInterlockedOpNoArg(InterlockedDecrement, LONG, "%ld", (LONG)MINLONG, (LONG)MAXLONG, (LONG)MAXLONG); CheckInterlockedOpNoArg(InterlockedDecrementAcquire, LONG, "%ld", 1745L, 1744L, 1744L); CheckInterlockedOpNoArg(InterlockedDecrementRelease, LONG, "%ld", 1745L, 1744L, 1744L); +#undef InterlockedDecrement +#ifdef _M_IX86 + CheckInterlockedOpNoArg(InterlockedDecrement, LONG, "%ld", 1745L, 1744L, 1744L); + CheckInterlockedOpNoArg(InterlockedDecrement, LONG, "%ld", (LONG)MINLONG, (LONG)MAXLONG, (LONG)MAXLONG); CheckInterlockedOpNoArg(ExInterlockedDecrementLong, LONG, "%ld", (LONG)MINLONG, (LONG)MAXLONG, (LONG)ResultPositive, pSpinLock); CheckInterlockedOpNoArg(ExInterlockedDecrementLong, LONG, "%ld", 0L, -1L, (LONG)ResultNegative, pSpinLock); CheckInterlockedOpNoArg(ExInterlockedDecrementLong, LONG, "%ld", 1L, 0L, (LONG)ResultZero, pSpinLock); @@ -307,7 +374,6 @@ TestInterlockedFunctional(VOID) CheckInterlockedOpNoArg((ExInterlockedDecrementLong), LONG, "%ld", 0L, -1L, (LONG)ResultNegative, pSpinLock); CheckInterlockedOpNoArg((ExInterlockedDecrementLong), LONG, "%ld", 1L, 0L, (LONG)ResultZero, pSpinLock); CheckInterlockedOpNoArg((ExInterlockedDecrementLong), LONG, "%ld", 2L, 1L, (LONG)ResultPositive, pSpinLock); -#ifdef _M_IX86 CheckInterlockedOpNoArg(Exi386InterlockedDecrementLong, LONG, "%ld", (LONG)MINLONG, (LONG)MAXLONG, (LONG)ResultPositive); CheckInterlockedOpNoArg(Exi386InterlockedDecrementLong, LONG, "%ld", 0L, -1L, (LONG)ResultNegative); CheckInterlockedOpNoArg(Exi386InterlockedDecrementLong, LONG, "%ld", 1L, 0L, (LONG)ResultZero); diff --git a/kmtests/ntos_ke/KeApc.c b/kmtests/ntos_ke/KeApc.c index dc85887aab5..e365d335fb7 100644 --- a/kmtests/ntos_ke/KeApc.c +++ b/kmtests/ntos_ke/KeApc.c @@ -6,146 +6,181 @@ */ #include +#include +#include #include -#define CheckApcs(KernelApcsDisabled, SpecialApcsDisabled, Irql) do \ -{ \ - ok_eq_bool(KeAreApcsDisabled(), KernelApcsDisabled); \ - ok_eq_bool(KeAreAllApcsDisabled(), SpecialApcsDisabled); \ - ok_irql(Irql); \ +#define CheckApcs(KernelApcsDisabled, SpecialApcsDisabled, AllApcsDisabled, Irql) do \ +{ \ + ok_eq_bool(KeAreApcsDisabled(), KernelApcsDisabled || SpecialApcsDisabled); \ + ok_eq_int(Thread->KernelApcDisable, KernelApcsDisabled); \ + ok_eq_bool(KeAreAllApcsDisabled(), AllApcsDisabled); \ + ok_eq_int(Thread->SpecialApcDisable, SpecialApcsDisabled); \ + ok_irql(Irql); \ } while (0) START_TEST(KeApc) { KIRQL Irql; + PKTHREAD Thread = KeGetCurrentThread(); - CheckApcs(FALSE, FALSE, PASSIVE_LEVEL); + CheckApcs(0, 0, FALSE, PASSIVE_LEVEL); /* critical region */ KeEnterCriticalRegion(); - CheckApcs(TRUE, FALSE, PASSIVE_LEVEL); + CheckApcs(-1, 0, FALSE, PASSIVE_LEVEL); KeEnterCriticalRegion(); - CheckApcs(TRUE, FALSE, PASSIVE_LEVEL); + CheckApcs(-2, 0, FALSE, PASSIVE_LEVEL); KeEnterCriticalRegion(); - CheckApcs(TRUE, FALSE, PASSIVE_LEVEL); + CheckApcs(-3, 0, FALSE, PASSIVE_LEVEL); KeLeaveCriticalRegion(); - CheckApcs(TRUE, FALSE, PASSIVE_LEVEL); + CheckApcs(-2, 0, FALSE, PASSIVE_LEVEL); KeLeaveCriticalRegion(); - CheckApcs(TRUE, FALSE, PASSIVE_LEVEL); + CheckApcs(-1, 0, FALSE, PASSIVE_LEVEL); KeLeaveCriticalRegion(); - CheckApcs(FALSE, FALSE, PASSIVE_LEVEL); + CheckApcs(0, 0, FALSE, PASSIVE_LEVEL); /* guarded region */ KeEnterGuardedRegion(); - CheckApcs(TRUE, TRUE, PASSIVE_LEVEL); + CheckApcs(0, -1, TRUE, PASSIVE_LEVEL); KeEnterGuardedRegion(); - CheckApcs(TRUE, TRUE, PASSIVE_LEVEL); + CheckApcs(0, -2, TRUE, PASSIVE_LEVEL); KeEnterGuardedRegion(); - CheckApcs(TRUE, TRUE, PASSIVE_LEVEL); + CheckApcs(0, -3, TRUE, PASSIVE_LEVEL); KeLeaveGuardedRegion(); - CheckApcs(TRUE, TRUE, PASSIVE_LEVEL); + CheckApcs(0, -2, TRUE, PASSIVE_LEVEL); KeLeaveGuardedRegion(); - CheckApcs(TRUE, TRUE, PASSIVE_LEVEL); + CheckApcs(0, -1, TRUE, PASSIVE_LEVEL); KeLeaveGuardedRegion(); - CheckApcs(FALSE, FALSE, PASSIVE_LEVEL); + CheckApcs(0, 0, FALSE, PASSIVE_LEVEL); /* mix them */ KeEnterGuardedRegion(); - CheckApcs(TRUE, TRUE, PASSIVE_LEVEL); + CheckApcs(0, -1, TRUE, PASSIVE_LEVEL); KeEnterCriticalRegion(); - CheckApcs(TRUE, TRUE, PASSIVE_LEVEL); + CheckApcs(-1, -1, TRUE, PASSIVE_LEVEL); KeLeaveCriticalRegion(); - CheckApcs(TRUE, TRUE, PASSIVE_LEVEL); + CheckApcs(0, -1, TRUE, PASSIVE_LEVEL); KeLeaveGuardedRegion(); - CheckApcs(FALSE, FALSE, PASSIVE_LEVEL); + CheckApcs(0, 0, FALSE, PASSIVE_LEVEL); KeEnterCriticalRegion(); - CheckApcs(TRUE, FALSE, PASSIVE_LEVEL); + CheckApcs(-1, 0, FALSE, PASSIVE_LEVEL); KeEnterGuardedRegion(); - CheckApcs(TRUE, TRUE, PASSIVE_LEVEL); + CheckApcs(-1, -1, TRUE, PASSIVE_LEVEL); KeLeaveGuardedRegion(); - CheckApcs(TRUE, FALSE, PASSIVE_LEVEL); + CheckApcs(-1, 0, FALSE, PASSIVE_LEVEL); KeLeaveCriticalRegion(); - CheckApcs(FALSE, FALSE, PASSIVE_LEVEL); + CheckApcs(0, 0, FALSE, PASSIVE_LEVEL); + + /* leave without entering */ + KeLeaveCriticalRegion(); + CheckApcs(1, 0, FALSE, PASSIVE_LEVEL); + KeEnterCriticalRegion(); + CheckApcs(0, 0, FALSE, PASSIVE_LEVEL); + + KeLeaveGuardedRegion(); + CheckApcs(0, 1, TRUE, PASSIVE_LEVEL); + KeEnterGuardedRegion(); + CheckApcs(0, 0, FALSE, PASSIVE_LEVEL); + + KeLeaveCriticalRegion(); + CheckApcs(1, 0, FALSE, PASSIVE_LEVEL); + KeLeaveGuardedRegion(); + CheckApcs(1, 1, TRUE, PASSIVE_LEVEL); + KeEnterCriticalRegion(); + CheckApcs(0, 1, TRUE, PASSIVE_LEVEL); + KeEnterGuardedRegion(); + CheckApcs(0, 0, FALSE, PASSIVE_LEVEL); + + /* manually disable APCs */ + Thread->KernelApcDisable = -1; + CheckApcs(-1, 0, FALSE, PASSIVE_LEVEL); + Thread->SpecialApcDisable = -1; + CheckApcs(-1, -1, TRUE, PASSIVE_LEVEL); + Thread->KernelApcDisable = 0; + CheckApcs(0, -1, TRUE, PASSIVE_LEVEL); + Thread->SpecialApcDisable = 0; + CheckApcs(0, 0, FALSE, PASSIVE_LEVEL); /* raised irql - APC_LEVEL should disable APCs */ KeRaiseIrql(APC_LEVEL, &Irql); - CheckApcs(FALSE, TRUE, APC_LEVEL); + CheckApcs(0, 0, TRUE, APC_LEVEL); KeLowerIrql(Irql); - CheckApcs(FALSE, FALSE, PASSIVE_LEVEL); + CheckApcs(0, 0, FALSE, PASSIVE_LEVEL); /* KeAre*ApcsDisabled are documented to work up to DISPATCH_LEVEL... */ KeRaiseIrql(DISPATCH_LEVEL, &Irql); - CheckApcs(FALSE, TRUE, DISPATCH_LEVEL); + CheckApcs(0, 0, TRUE, DISPATCH_LEVEL); KeLowerIrql(Irql); - CheckApcs(FALSE, FALSE, PASSIVE_LEVEL); + CheckApcs(0, 0, FALSE, PASSIVE_LEVEL); /* ... but also work on higher levels! */ KeRaiseIrql(HIGH_LEVEL, &Irql); - CheckApcs(FALSE, TRUE, HIGH_LEVEL); + CheckApcs(0, 0, TRUE, HIGH_LEVEL); KeLowerIrql(Irql); - CheckApcs(FALSE, FALSE, PASSIVE_LEVEL); + CheckApcs(0, 0, FALSE, PASSIVE_LEVEL); /* now comes the crazy stuff */ KeRaiseIrql(HIGH_LEVEL, &Irql); - CheckApcs(FALSE, TRUE, HIGH_LEVEL); + CheckApcs(0, 0, TRUE, HIGH_LEVEL); KeEnterCriticalRegion(); - CheckApcs(TRUE, TRUE, HIGH_LEVEL); + CheckApcs(-1, 0, TRUE, HIGH_LEVEL); KeLeaveCriticalRegion(); - CheckApcs(FALSE, TRUE, HIGH_LEVEL); + CheckApcs(0, 0, TRUE, HIGH_LEVEL); KeEnterGuardedRegion(); - CheckApcs(TRUE, TRUE, HIGH_LEVEL); + CheckApcs(0, -1, TRUE, HIGH_LEVEL); KeLeaveGuardedRegion(); - CheckApcs(FALSE, TRUE, HIGH_LEVEL); + CheckApcs(0, 0, TRUE, HIGH_LEVEL); KeLowerIrql(Irql); - CheckApcs(FALSE, FALSE, PASSIVE_LEVEL); + CheckApcs(0, 0, FALSE, PASSIVE_LEVEL); KeRaiseIrql(HIGH_LEVEL, &Irql); - CheckApcs(FALSE, TRUE, HIGH_LEVEL); + CheckApcs(0, 0, TRUE, HIGH_LEVEL); KeEnterCriticalRegion(); - CheckApcs(TRUE, TRUE, HIGH_LEVEL); + CheckApcs(-1, 0, TRUE, HIGH_LEVEL); KeEnterGuardedRegion(); - CheckApcs(TRUE, TRUE, HIGH_LEVEL); + CheckApcs(-1, -1, TRUE, HIGH_LEVEL); KeLowerIrql(Irql); - CheckApcs(TRUE, TRUE, PASSIVE_LEVEL); + CheckApcs(-1, -1, TRUE, PASSIVE_LEVEL); KeLeaveCriticalRegion(); - CheckApcs(TRUE, TRUE, PASSIVE_LEVEL); + CheckApcs(0, -1, TRUE, PASSIVE_LEVEL); KeLeaveGuardedRegion(); - CheckApcs(FALSE, FALSE, PASSIVE_LEVEL); + CheckApcs(0, 0, FALSE, PASSIVE_LEVEL); KeEnterGuardedRegion(); - CheckApcs(TRUE, TRUE, PASSIVE_LEVEL); + CheckApcs(0, -1, TRUE, PASSIVE_LEVEL); KeRaiseIrql(HIGH_LEVEL, &Irql); - CheckApcs(TRUE, TRUE, HIGH_LEVEL); + CheckApcs(0, -1, TRUE, HIGH_LEVEL); KeEnterCriticalRegion(); - CheckApcs(TRUE, TRUE, HIGH_LEVEL); + CheckApcs(-1, -1, TRUE, HIGH_LEVEL); KeLeaveGuardedRegion(); - CheckApcs(TRUE, TRUE, HIGH_LEVEL); + CheckApcs(-1, 0, TRUE, HIGH_LEVEL); KeLowerIrql(Irql); - CheckApcs(TRUE, FALSE, PASSIVE_LEVEL); + CheckApcs(-1, 0, FALSE, PASSIVE_LEVEL); KeLeaveCriticalRegion(); - CheckApcs(FALSE, FALSE, PASSIVE_LEVEL); + CheckApcs(0, 0, FALSE, PASSIVE_LEVEL); KeEnterCriticalRegion(); - CheckApcs(TRUE, FALSE, PASSIVE_LEVEL); + CheckApcs(-1, 0, FALSE, PASSIVE_LEVEL); KeRaiseIrql(HIGH_LEVEL, &Irql); - CheckApcs(TRUE, TRUE, HIGH_LEVEL); + CheckApcs(-1, 0, TRUE, HIGH_LEVEL); KeEnterGuardedRegion(); - CheckApcs(TRUE, TRUE, HIGH_LEVEL); + CheckApcs(-1, -1, TRUE, HIGH_LEVEL); KeLeaveCriticalRegion(); - CheckApcs(TRUE, TRUE, HIGH_LEVEL); + CheckApcs(0, -1, TRUE, HIGH_LEVEL); KeLowerIrql(Irql); - CheckApcs(TRUE, TRUE, PASSIVE_LEVEL); + CheckApcs(0, -1, TRUE, PASSIVE_LEVEL); KeLeaveGuardedRegion(); - CheckApcs(FALSE, FALSE, PASSIVE_LEVEL); + CheckApcs(0, 0, FALSE, PASSIVE_LEVEL); KeEnterCriticalRegion(); - CheckApcs(TRUE, FALSE, PASSIVE_LEVEL); + CheckApcs(-1, 0, FALSE, PASSIVE_LEVEL); KeRaiseIrql(HIGH_LEVEL, &Irql); - CheckApcs(TRUE, TRUE, HIGH_LEVEL); + CheckApcs(-1, 0, TRUE, HIGH_LEVEL); KeLeaveCriticalRegion(); - CheckApcs(FALSE, TRUE, HIGH_LEVEL); + CheckApcs(0, 0, TRUE, HIGH_LEVEL); KeLowerIrql(Irql); - CheckApcs(FALSE, FALSE, PASSIVE_LEVEL); + CheckApcs(0, 0, FALSE, PASSIVE_LEVEL); } diff --git a/kmtests/ntos_ke/KeIrql.c b/kmtests/ntos_ke/KeIrql.c index a8122ce12fc..4df71d23b4a 100644 --- a/kmtests/ntos_ke/KeIrql.c +++ b/kmtests/ntos_ke/KeIrql.c @@ -23,18 +23,12 @@ START_TEST(KeIrql) PrevIrql = KeGetCurrentIrql(); - // SYNCH_LEVEL is different for UP/MP - if (KeGetCurrentPrcb()->BuildType & PRCB_BUILD_UNIPROCESSOR) - { - trace("This is a Uniprocessor kernel\n"); - SynchIrql = DISPATCH_LEVEL; - } - else - { - trace("This is a Multiprocessor kernel\n"); + /* SYNCH_LEVEL is different for UP/MP */ + if (KmtIsMultiProcessorBuild) SynchIrql = IPI_LEVEL - 2; - } - + else + SynchIrql = DISPATCH_LEVEL; + /* some Irqls MUST work */ { const KIRQL Irqls[] = { LOW_LEVEL, PASSIVE_LEVEL, APC_LEVEL, DISPATCH_LEVEL, @@ -129,6 +123,17 @@ START_TEST(KeIrql) ok_eq_uint(Irql, SynchIrql); KeLowerIrql(PASSIVE_LEVEL); + /* these bugcheck on a checked build but run fine on free! */ + if (!KmtIsCheckedBuild) + { + KeRaiseIrql(HIGH_LEVEL, &Irql); + KeRaiseIrql(APC_LEVEL, &Irql); + ok_irql(APC_LEVEL); + KeLowerIrql(HIGH_LEVEL); + ok_irql(HIGH_LEVEL); + KeLowerIrql(PASSIVE_LEVEL); + } + /* make sure we exit gracefully */ ok_irql(PASSIVE_LEVEL); KeLowerIrql(PASSIVE_LEVEL);