Module: wine Branch: master Commit: c0b05a2c74af6ce9276ae932a94465d95e5f7d43 URL: https://source.winehq.org/git/wine.git/?a=commit;h=c0b05a2c74af6ce9276ae932a...
Author: Zebediah Figura z.figura12@gmail.com Date: Mon Aug 19 22:27:50 2019 -0500
ntoskrnl.exe: Implement IoReleaseRemoveLockAndWaitEx().
Signed-off-by: Zebediah Figura z.figura12@gmail.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/ntoskrnl.exe/ntoskrnl.c | 8 -------- dlls/ntoskrnl.exe/sync.c | 19 +++++++++++++++++++ include/ddk/wdm.h | 1 + 3 files changed, 20 insertions(+), 8 deletions(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c index 6be5990..91bd7da 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/ntoskrnl.c @@ -3805,14 +3805,6 @@ void WINAPI KeFlushQueuedDpcs(void) }
/********************************************************************* - * IoReleaseRemoveLockAndWaitEx (NTOSKRNL.@) - */ -void WINAPI IoReleaseRemoveLockAndWaitEx(PIO_REMOVE_LOCK lock, PVOID tag, ULONG size) -{ - FIXME("stub: %p %p %u\n", lock, tag, size); -} - -/********************************************************************* * DbgQueryDebugFilterState (NTOSKRNL.@) */ NTSTATUS WINAPI DbgQueryDebugFilterState(ULONG component, ULONG level) diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c index 7f4d263..4ab8b49 100644 --- a/dlls/ntoskrnl.exe/sync.c +++ b/dlls/ntoskrnl.exe/sync.c @@ -1239,3 +1239,22 @@ void WINAPI IoReleaseRemoveLockEx( IO_REMOVE_LOCK *lock, void *tag, ULONG size ) else if (count < 0) ERR("Lock %p is not acquired!\n", lock); } + +/*********************************************************************** + * IoReleaseRemoveLockAndWaitEx (NTOSKRNL.EXE.@) + */ +void WINAPI IoReleaseRemoveLockAndWaitEx( IO_REMOVE_LOCK *lock, void *tag, ULONG size ) +{ + LONG count; + + TRACE("lock %p, tag %p, size %u.\n", lock, tag, size); + + lock->Common.Removed = TRUE; + + if (!(count = InterlockedDecrement( &lock->Common.IoCount ))) + KeSetEvent( &lock->Common.RemoveEvent, IO_NO_INCREMENT, FALSE ); + else if (count < 0) + ERR("Lock %p is not acquired!\n", lock); + else + KeWaitForSingleObject( &lock->Common.RemoveEvent, Executive, KernelMode, FALSE, NULL ); +} diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h index 5e2e119..21c9539 100644 --- a/include/ddk/wdm.h +++ b/include/ddk/wdm.h @@ -1603,6 +1603,7 @@ void WINAPI IoInvalidateDeviceRelations(PDEVICE_OBJECT,DEVICE_RELATION_TYPE void WINAPI IoQueueWorkItem(PIO_WORKITEM,PIO_WORKITEM_ROUTINE,WORK_QUEUE_TYPE,void*); NTSTATUS WINAPI IoRegisterDeviceInterface(PDEVICE_OBJECT,const GUID*,PUNICODE_STRING,PUNICODE_STRING); void WINAPI IoReleaseCancelSpinLock(KIRQL); +void WINAPI IoReleaseRemoveLockAndWaitEx(IO_REMOVE_LOCK*,void*,ULONG); void WINAPI IoReleaseRemoveLockEx(IO_REMOVE_LOCK*,void*,ULONG); NTSTATUS WINAPI IoSetDeviceInterfaceState(UNICODE_STRING*,BOOLEAN); NTSTATUS WINAPI IoWMIRegistrationControl(PDEVICE_OBJECT,ULONG);