diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c index 6be59909d43..91bd7da1e12 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/ntoskrnl.c @@ -3804,14 +3804,6 @@ void WINAPI KeFlushQueuedDpcs(void) FIXME("stub!\n"); } -/********************************************************************* - * IoReleaseRemoveLockAndWaitEx (NTOSKRNL.@) - */ -void WINAPI IoReleaseRemoveLockAndWaitEx(PIO_REMOVE_LOCK lock, PVOID tag, ULONG size) -{ - FIXME("stub: %p %p %u\n", lock, tag, size); -} - /********************************************************************* * DbgQueryDebugFilterState (NTOSKRNL.@) */ diff --git a/dlls/ntoskrnl.exe/sync.c b/dlls/ntoskrnl.exe/sync.c index 7f4d26335f6..4ab8b497249 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 5e2e119d08f..21c9539c0ab 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);