Module: wine Branch: master Commit: e3856fd630cb631a1164146613b6269b3a351358 URL: https://source.winehq.org/git/wine.git/?a=commit;h=e3856fd630cb631a116414661...
Author: Zebediah Figura z.figura12@gmail.com Date: Tue Jan 29 22:01:45 2019 -0600
ntoskrnl.exe: Implement APC-level fast mutex functions.
Signed-off-by: Zebediah Figura z.figura12@gmail.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntoskrnl.exe/ntoskrnl.c | 28 ---------------------------- dlls/ntoskrnl.exe/sync.c | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 28 deletions(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c index 9ee7543..25d9eb7 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/ntoskrnl.c @@ -727,34 +727,6 @@ done: return status; }
- -/*********************************************************************** - * ExAcquireFastMutexUnsafe (NTOSKRNL.EXE.@) - */ -#ifdef DEFINE_FASTCALL1_ENTRYPOINT -DEFINE_FASTCALL1_ENTRYPOINT(ExAcquireFastMutexUnsafe) -void WINAPI __regs_ExAcquireFastMutexUnsafe(PFAST_MUTEX FastMutex) -#else -void WINAPI ExAcquireFastMutexUnsafe(PFAST_MUTEX FastMutex) -#endif -{ - FIXME("(%p): stub\n", FastMutex); -} - - -/*********************************************************************** - * ExReleaseFastMutexUnsafe (NTOSKRNL.EXE.@) - */ -#ifdef DEFINE_FASTCALL1_ENTRYPOINT -DEFINE_FASTCALL1_ENTRYPOINT(ExReleaseFastMutexUnsafe) -void WINAPI __regs_ExReleaseFastMutexUnsafe(PFAST_MUTEX FastMutex) -#else -void WINAPI ExReleaseFastMutexUnsafe(PFAST_MUTEX FastMutex) -#endif -{ - FIXME("(%p): stub\n", FastMutex); -} - /*********************************************************************** * IoAllocateDriverObjectExtension (NTOSKRNL.EXE.@) */ diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c index 46ffc581..1ab37d1 100644 --- a/dlls/ntoskrnl.exe/sync.c +++ b/dlls/ntoskrnl.exe/sync.c @@ -562,3 +562,41 @@ LIST_ENTRY * WINAPI ExInterlockedRemoveHeadList( LIST_ENTRY *list, KSPIN_LOCK *l
return ret; } + +/*********************************************************************** + * ExAcquireFastMutexUnsafe (NTOSKRNL.EXE.@) + */ +#ifdef DEFINE_FASTCALL1_ENTRYPOINT +DEFINE_FASTCALL1_ENTRYPOINT(ExAcquireFastMutexUnsafe) +void WINAPI __regs_ExAcquireFastMutexUnsafe( FAST_MUTEX *mutex ) +#else +void WINAPI ExAcquireFastMutexUnsafe( FAST_MUTEX *mutex ) +#endif +{ + LONG count; + + TRACE("mutex %p.\n", mutex); + + count = InterlockedDecrement( &mutex->Count ); + if (count < 0) + KeWaitForSingleObject( &mutex->Event, Executive, KernelMode, FALSE, NULL ); +} + +/*********************************************************************** + * ExReleaseFastMutexUnsafe (NTOSKRNL.EXE.@) + */ +#ifdef DEFINE_FASTCALL1_ENTRYPOINT +DEFINE_FASTCALL1_ENTRYPOINT(ExReleaseFastMutexUnsafe) +void WINAPI __regs_ExReleaseFastMutexUnsafe( FAST_MUTEX *mutex ) +#else +void WINAPI ExReleaseFastMutexUnsafe( FAST_MUTEX *mutex ) +#endif +{ + LONG count; + + TRACE("mutex %p.\n", mutex); + + count = InterlockedIncrement( &mutex->Count ); + if (count < 1) + KeSetEvent( &mutex->Event, IO_NO_INCREMENT, FALSE ); +}