From 1be6d7bcaa0ddef3e0fde069f92cdd5b408023a1 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Sat, 22 Jan 2005 12:45:03 +0000 Subject: [PATCH] fixed the prototype of KePulseEvent() and made NtPulseEvent() return the previous state svn path=/trunk/; revision=13209 --- reactos/include/ddk/kefuncs.h | 6 +++--- reactos/ntoskrnl/ex/event.c | 15 +++++++++++++-- reactos/ntoskrnl/ke/event.c | 13 +++++++------ reactos/w32api/include/ddk/winddk.h | 2 +- 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/reactos/include/ddk/kefuncs.h b/reactos/include/ddk/kefuncs.h index ff5ea62103b..038bbd26cd3 100644 --- a/reactos/include/ddk/kefuncs.h +++ b/reactos/include/ddk/kefuncs.h @@ -218,9 +218,9 @@ VOID STDCALL KeLeaveCriticalRegion (VOID); VOID STDCALL KeLowerIrql (KIRQL NewIrql); -NTSTATUS STDCALL KePulseEvent (PKEVENT Event, - KPRIORITY Increment, - BOOLEAN Wait); +LONG STDCALL KePulseEvent (PKEVENT Event, + KPRIORITY Increment, + BOOLEAN Wait); LARGE_INTEGER STDCALL diff --git a/reactos/ntoskrnl/ex/event.c b/reactos/ntoskrnl/ex/event.c index 0cbbba02480..56324c1f1e4 100644 --- a/reactos/ntoskrnl/ex/event.c +++ b/reactos/ntoskrnl/ex/event.c @@ -295,10 +295,21 @@ NtPulseEvent(IN HANDLE EventHandle, NULL); if(NT_SUCCESS(Status)) { - KePulseEvent(Event, EVENT_INCREMENT, FALSE); + LONG Prev = KePulseEvent(Event, EVENT_INCREMENT, FALSE); ObDereferenceObject(Event); - /* FIXME - Return the previous state! */ + if(PreviousState != NULL) + { + _SEH_TRY + { + *PreviousState = Prev; + } + _SEH_HANDLE + { + Status = _SEH_GetExceptionCode(); + } + _SEH_END; + } } return Status; diff --git a/reactos/ntoskrnl/ke/event.c b/reactos/ntoskrnl/ke/event.c index acca6f21367..dcb8f737f23 100644 --- a/reactos/ntoskrnl/ke/event.c +++ b/reactos/ntoskrnl/ke/event.c @@ -108,16 +108,17 @@ LONG STDCALL KeSetEvent (PKEVENT Event, /* * @implemented */ -NTSTATUS STDCALL KePulseEvent (PKEVENT Event, - KPRIORITY Increment, - BOOLEAN Wait) +LONG STDCALL +KePulseEvent (IN PKEVENT Event, + IN KPRIORITY Increment, + IN BOOLEAN Wait) { KIRQL OldIrql; - int ret; + LONG Ret; DPRINT("KePulseEvent(Event %x, Wait %x)\n",Event,Wait); OldIrql = KeAcquireDispatcherDatabaseLock(); - ret = InterlockedExchange(&Event->Header.SignalState,1); + Ret = InterlockedExchange(&Event->Header.SignalState,1); KiDispatcherObjectWake(&Event->Header, Increment); InterlockedExchange(&(Event->Header.SignalState),0); @@ -132,7 +133,7 @@ NTSTATUS STDCALL KePulseEvent (PKEVENT Event, Thread->WaitIrql = OldIrql; } - return ((NTSTATUS)ret); + return Ret; } /* diff --git a/reactos/w32api/include/ddk/winddk.h b/reactos/w32api/include/ddk/winddk.h index 0fa70e5ee21..2d3dd8174ef 100644 --- a/reactos/w32api/include/ddk/winddk.h +++ b/reactos/w32api/include/ddk/winddk.h @@ -7607,7 +7607,7 @@ KeLeaveCriticalRegion( VOID); NTOSAPI -NTSTATUS +LONG DDKAPI KePulseEvent( IN PRKEVENT Event,