release the dispatcher lock in KeReleaseMutant before raising an exception and handle the exception in NtReleaseMutant Modified: trunk/reactos/ntoskrnl/ex/mutant.c Modified: trunk/reactos/ntoskrnl/ke/mutex.c _____
Modified: trunk/reactos/ntoskrnl/ex/mutant.c --- trunk/reactos/ntoskrnl/ex/mutant.c 2005-03-28 10:56:29 UTC (rev 14362) +++ trunk/reactos/ntoskrnl/ex/mutant.c 2005-03-28 15:17:54 UTC (rev 14363) @@ -332,23 +332,35 @@
LONG Prev;
- /* Save the Old State */ - DPRINT("Releasing Mutant\n"); - Prev = KeReleaseMutant(Mutant, MUTANT_INCREMENT, FALSE, FALSE); + /* release the mutant. doing so might raise an exception which we're + required to catch! */ + _SEH_TRY { + + Prev = KeReleaseMutant(Mutant, MUTANT_INCREMENT, FALSE, FALSE); + + } _SEH_HANDLE { + + Status = _SEH_GetExceptionCode(); + + } _SEH_END; + ObDereferenceObject(Mutant);
- /* Return it */ - if(PreviousCount) { - - _SEH_TRY { + if(NT_SUCCESS(Status)) { + + /* Return it */ + if(PreviousCount) { + + _SEH_TRY { + + *PreviousCount = Prev; + + } _SEH_HANDLE {
- *PreviousCount = Prev; - - } _SEH_HANDLE { - - Status = _SEH_GetExceptionCode(); - - } _SEH_END; + Status = _SEH_GetExceptionCode(); + + } _SEH_END; + } } }
_____
Modified: trunk/reactos/ntoskrnl/ke/mutex.c --- trunk/reactos/ntoskrnl/ke/mutex.c 2005-03-28 10:56:29 UTC (rev 14362) +++ trunk/reactos/ntoskrnl/ke/mutex.c 2005-03-28 15:17:54 UTC (rev 14363) @@ -144,6 +144,8 @@
/* Make sure that the Owner Thread is the current Thread */ if (Mutant->OwnerThread != CurrentThread) {
+ KeReleaseDispatcherDatabaseLock(OldIrql); + DPRINT1("Trying to touch a Mutant that the caller doesn't own!\n"); ExRaiseStatus(STATUS_MUTANT_NOT_OWNED); }