| Previous | Next |
| STATUS_INVALID_PAGE_PROTECTION | STATUS_SEMAPHORE_LIMIT_EXCEEDED |
STATUS_MUTANT_NOT_OWNED
Only the owning thread can release this mutant
Kernel mutants and Win32 mutexes are owned synchronization objects. Ownership is assigned to the thread that successfully acquires the object, and release is tied to that owner. This status means the release path ran on a different thread or after ownership had already been unwound.
Capture the acquiring and releasing thread IDs and recursion depth. Thread-pool handoff is a common design clue: code that acquires a mutex in one callback and posts release work to another callback violates the ownership model even if the protected data is global. Replacing the mutex with a semaphore merely to allow cross-thread release changes synchronization semantics and should be a deliberate design decision.
What to inspect
- Trace every successful wait that acquires the mutant and every release.
- Compare owner thread ID and recursion count at the failure.
- Keep acquisition and release on the same logical thread or choose a non-owned synchronization primitive.
References
- Microsoft: Mutex objects
- ReactOS: executive mutant implementation
- Microsoft Open Specifications: NTSTATUS values
Looking for a different code? Search another status or error code.
