Index: irp.c =================================================================== --- ntoskrnl/io/iomgr/irp.c (revision 71479) +++ ntoskrnl/io/iomgr/irp.c (working copy) @@ -1218,8 +1218,35 @@ StackPtr->DeviceObject = DeviceObject; /* Call it */ +#if DBG + { + KIRQL OldIrql; + PKTHREAD Thread; + ULONG CombinedApcDisable; + NTSTATUS Status; + UCHAR MajorFunction; + + Thread = KeGetCurrentThread(); + OldIrql = KeGetCurrentIrql(); + CombinedApcDisable = Thread->CombinedApcDisable; + MajorFunction = StackPtr->MajorFunction; + + Status = DriverObject->MajorFunction[MajorFunction](DeviceObject, + Irp); + if (KeGetCurrentIrql() != OldIrql || + Thread->CombinedApcDisable != CombinedApcDisable) + { + DPRINT1("Dispatch function %p (major %u) changed IRQL (%u -> %u) or APC state (0x%lx -> 0x%lx)\n", + DriverObject->MajorFunction[MajorFunction], MajorFunction, OldIrql, KeGetCurrentIrql(), CombinedApcDisable, Thread->CombinedApcDisable); + NT_ASSERT(KeGetCurrentIrql() == OldIrql); + NT_ASSERT(Thread->CombinedApcDisable == CombinedApcDisable); + } + return Status; + } +#else return DriverObject->MajorFunction[StackPtr->MajorFunction](DeviceObject, Irp); +#endif } FORCEINLINE