Alex Ionescu <ionucu(a)videotron.ca>
Dispatcher Objects Rewrite (minus Queues, coming in next patch).
Global Changes:
- Use KOBJECT enumerations for all objects, remove
obsoleted ros-internal enumeration.
- Reformatting, commenting, and addition of Debug Prints
for easier debugging
- Properly create Executive Objects. They don't need a
creation routine.
- Make sure to properly lock and release the Dispatcher
Database.
Mutex/Mutant:
- Correct MUTANT_BASIC_INFORMATION
- Return previous state in Kernel Functions, intead of 1
or 0 all the time.
- Initialize listhead properly
- Removed code duplication between mutant and mutex
release.
- Fix bugs in release
- Add proper exeption if the mutex is not owned.
Kernel Queues:
- Optimize the code
- Use Inserted Flag
Timers:
- Some changes in setting the default data to allow
KiInsertTimer to be called internally
by the wait code in the next patch.
Events:
- Optimize and simplify KeInitializeEvent
- Implement KeInitializeEventPair
- Fix KePulseEvent. It was completely messed up and also
used unneeded Interlocked function.
- Fix KeResetEvent. It was not locking the dispatcher
lock but using Interlocked.
- Fix KeSetEvent. It was not differentiating between
Notification and Sycronization events
and also signaling the Event even if nobody was
waiting on it.
Semaphores:
- Fix KeReleaseSemaphore. It was not checking if nobody
was waiting on it before unwaiting the thread.
- Fix not releasing dispatcher database before raising
an exception.
- Add check to NtCreateSemaphore to make sure the counts
make sense.
Event Pairs:
- Remove Thread Event Pair. They are only used for NT4
QuickLPC which is obsoleted.
- Use KeInitializeEventPair
Modified: trunk/reactos/include/ddk/iotypes.h
Modified: trunk/reactos/include/ntos/zwtypes.h
Modified: trunk/reactos/ntoskrnl/ex/event.c
Modified: trunk/reactos/ntoskrnl/ex/evtpair.c
Modified: trunk/reactos/ntoskrnl/ex/mutant.c
Modified: trunk/reactos/ntoskrnl/ex/rundown.c
Modified: trunk/reactos/ntoskrnl/ex/sem.c
Modified: trunk/reactos/ntoskrnl/ex/timer.c
Deleted: trunk/reactos/ntoskrnl/include/internal/id.h
Modified: trunk/reactos/ntoskrnl/include/internal/ke.h
Modified: trunk/reactos/ntoskrnl/include/ntoskrnl.h
Modified: trunk/reactos/ntoskrnl/io/create.c
Modified: trunk/reactos/ntoskrnl/io/driver.c
Modified: trunk/reactos/ntoskrnl/io/wmi.c
Modified: trunk/reactos/ntoskrnl/ke/device.c
Modified: trunk/reactos/ntoskrnl/ke/event.c
Modified: trunk/reactos/ntoskrnl/ke/kqueue.c
Modified: trunk/reactos/ntoskrnl/ke/mutex.c
Modified: trunk/reactos/ntoskrnl/ke/queue.c
Modified: trunk/reactos/ntoskrnl/ke/sem.c
Modified: trunk/reactos/ntoskrnl/ke/timer.c
Modified: trunk/reactos/ntoskrnl/ke/wait.c
Modified: trunk/reactos/ntoskrnl/ps/process.c
Modified: trunk/reactos/tools/nci/sysfuncs.lst
_____
Modified: trunk/reactos/include/ddk/iotypes.h
--- trunk/reactos/include/ddk/iotypes.h 2005-03-14 01:47:18 UTC (rev
14044)
+++ trunk/reactos/include/ddk/iotypes.h 2005-03-14 02:08:17 UTC (rev
14045)
@@ -886,6 +886,8 @@
#endif
#define IO_TYPE_DRIVER 4L
+#define IO_TYPE_FILE 0x0F5L
+
#define DRVO_UNLOAD_INVOKED 0x1L
#define DRVO_LEGACY_DRIVER 0x2L
#define DRVO_BUILTIN_DRIVER 0x4L
_____
Modified: trunk/reactos/include/ntos/zwtypes.h
--- trunk/reactos/include/ntos/zwtypes.h 2005-03-14 01:47:18 UTC
(rev 14044)
+++ trunk/reactos/include/ntos/zwtypes.h 2005-03-14 02:08:17 UTC
(rev 14045)
@@ -58,6 +58,7 @@
ProfileTime
} KPROFILE_SOURCE;
+
// file disposition values
#define FILE_SUPERSEDE 0x0000
@@ -1271,9 +1272,9 @@
typedef struct _MUTANT_BASIC_INFORMATION
{
- LONG Count;
- BOOLEAN Owned;
- BOOLEAN Abandoned;
+ LONG CurrentCount;
+ BOOLEAN OwnedByCaller;
+ BOOLEAN AbandonedState;
} MUTANT_BASIC_INFORMATION, *PMUTANT_BASIC_INFORMATION;
_____
Modified: trunk/reactos/ntoskrnl/ex/event.c
--- trunk/reactos/ntoskrnl/ex/event.c 2005-03-14 01:47:18 UTC (rev
14044)
+++ trunk/reactos/ntoskrnl/ex/event.c 2005-03-14 02:08:17 UTC (rev
14045)
@@ -1,11 +1,11 @@
-/* $Id:$
- *
+/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/nt/event.c
* PURPOSE: Named event support
*
- * PROGRAMMERS: Philip Susi and David Welch
+ * PROGRAMMERS: Alex Ionescu(alex(a)relsoft.net) - Fixed
bugs/commented
+ * Philip Susi and David Welch
*/
/* INCLUDES
*****************************************************************/
@@ -19,300 +19,287 @@
POBJECT_TYPE EXPORTED ExEventObjectType = NULL;
static GENERIC_MAPPING ExpEventMapping = {
- STANDARD_RIGHTS_READ | SYNCHRONIZE | EVENT_QUERY_STATE,
- STANDARD_RIGHTS_WRITE | SYNCHRONIZE | EVENT_MODIFY_STATE,
- STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE | EVENT_QUERY_STATE,
- EVENT_ALL_ACCESS};
+ STANDARD_RIGHTS_READ | SYNCHRONIZE | EVENT_QUERY_STATE,
+ STANDARD_RIGHTS_WRITE | SYNCHRONIZE | EVENT_MODIFY_STATE,
+ STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE | EVENT_QUERY_STATE,
+ EVENT_ALL_ACCESS};
-static const INFORMATION_CLASS_INFO ExEventInfoClass[] =
-{
- ICI_SQ_SAME( sizeof(EVENT_BASIC_INFORMATION), sizeof(ULONG),
ICIF_QUERY ), /* EventBasicInformation */
+static const INFORMATION_CLASS_INFO ExEventInfoClass[] = {
+
+ /* EventBasicInformation */
+ ICI_SQ_SAME( sizeof(EVENT_BASIC_INFORMATION), sizeof(ULONG),
ICIF_QUERY),
};
/* FUNCTIONS
*****************************************************************/
-NTSTATUS STDCALL
-NtpCreateEvent(PVOID ObjectBody,
- PVOID Parent,
- PWSTR RemainingPath,
- POBJECT_ATTRIBUTES ObjectAttributes)
-{
- DPRINT("NtpCreateEvent(ObjectBody %x, Parent %x, RemainingPath
%S)\n",
- ObjectBody, Parent, RemainingPath);
-
- if (RemainingPath != NULL && wcschr(RemainingPath+1, '\\') != NULL)
- {
- return(STATUS_UNSUCCESSFUL);
- }
-
- return(STATUS_SUCCESS);
-}
-
-
-VOID INIT_FUNCTION
+VOID
+INIT_FUNCTION
ExpInitializeEventImplementation(VOID)
{
- ExEventObjectType =
ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
-
- RtlpCreateUnicodeString(&ExEventObjectType->TypeName, L"Event",
NonPagedPool);
-
- ExEventObjectType->Tag = TAG('E', 'V', 'T', 'T');
- ExEventObjectType->PeakObjects = 0;
- ExEventObjectType->PeakHandles = 0;
- ExEventObjectType->TotalObjects = 0;
- ExEventObjectType->TotalHandles = 0;
- ExEventObjectType->PagedPoolCharge = 0;
- ExEventObjectType->NonpagedPoolCharge = sizeof(KEVENT);
- ExEventObjectType->Mapping = &ExpEventMapping;
- ExEventObjectType->Dump = NULL;
- ExEventObjectType->Open = NULL;
- ExEventObjectType->Close = NULL;
- ExEventObjectType->Delete = NULL;
- ExEventObjectType->Parse = NULL;
- ExEventObjectType->Security = NULL;
- ExEventObjectType->QueryName = NULL;
- ExEventObjectType->OkayToClose = NULL;
- ExEventObjectType->Create = NtpCreateEvent;
- ExEventObjectType->DuplicationNotify = NULL;
-
- ObpCreateTypeObject(ExEventObjectType);
+ /* Create the Event Object Type */
+ ExEventObjectType =
ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
+ RtlInitUnicodeString(&ExEventObjectType->TypeName, L"Event");
+ ExEventObjectType->Tag = TAG('E', 'V', 'T', 'T');
+ ExEventObjectType->PeakObjects = 0;
+ ExEventObjectType->PeakHandles = 0;
+ ExEventObjectType->TotalObjects = 0;
+ ExEventObjectType->TotalHandles = 0;
+ ExEventObjectType->PagedPoolCharge = 0;
+ ExEventObjectType->NonpagedPoolCharge = sizeof(KEVENT);
+ ExEventObjectType->Mapping = &ExpEventMapping;
+ ExEventObjectType->Dump = NULL;
+ ExEventObjectType->Open = NULL;
+ ExEventObjectType->Close = NULL;
+ ExEventObjectType->Delete = NULL;
+ ExEventObjectType->Parse = NULL;
+ ExEventObjectType->Security = NULL;
+ ExEventObjectType->QueryName = NULL;
+ ExEventObjectType->OkayToClose = NULL;
+ ExEventObjectType->Create = NULL;
+ ExEventObjectType->DuplicationNotify = NULL;
+ ObpCreateTypeObject(ExEventObjectType);
}
-
/*
* @implemented
*/
-NTSTATUS STDCALL
+NTSTATUS
+STDCALL
NtClearEvent(IN HANDLE EventHandle)
{
- PKEVENT Event;
- NTSTATUS Status;
+ PKEVENT Event;
+ NTSTATUS Status;
+
+ PAGED_CODE();
- PAGED_CODE();
+ /* Reference the Object */
+ Status = ObReferenceObjectByHandle(EventHandle,
+ EVENT_MODIFY_STATE,
+ ExEventObjectType,
+ ExGetPreviousMode(),
+ (PVOID*)&Event,
+ NULL);
- Status = ObReferenceObjectByHandle(EventHandle,
- EVENT_MODIFY_STATE,
- ExEventObjectType,
- ExGetPreviousMode(),
- (PVOID*)&Event,
- NULL);
- if(NT_SUCCESS(Status))
- {
- KeClearEvent(Event);
- ObDereferenceObject(Event);
- }
+ /* Check for Success */
+ if(NT_SUCCESS(Status)) {
+
+ /* Clear the Event and Dereference */
+ KeClearEvent(Event);
+ ObDereferenceObject(Event);
+ }
- return Status;
+ /* Return Status */
+ return Status;
}
/*
* @implemented
*/
-NTSTATUS STDCALL
+NTSTATUS
+STDCALL
NtCreateEvent(OUT PHANDLE EventHandle,
- IN ACCESS_MASK DesiredAccess,
- IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
- IN EVENT_TYPE EventType,
- IN BOOLEAN InitialState)
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
+ IN EVENT_TYPE EventType,
+ IN BOOLEAN InitialState)
{
- KPROCESSOR_MODE PreviousMode;
- PKEVENT Event;
- HANDLE hEvent;
- NTSTATUS Status = STATUS_SUCCESS;
+ KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
+ PKEVENT Event;
+ HANDLE hEvent;
+ NTSTATUS Status = STATUS_SUCCESS;
- PAGED_CODE();
+ PAGED_CODE();
+ DPRINT("NtCreateEvent(0x%x, 0x%x, 0x%x)\n", EventHandle,
DesiredAccess, ObjectAttributes);
- PreviousMode = ExGetPreviousMode();
-
- if(PreviousMode == UserMode)
- {
- _SEH_TRY
- {
- ProbeForWrite(EventHandle,
- sizeof(HANDLE),
- sizeof(ULONG));
- }
- _SEH_HANDLE
- {
- Status = _SEH_GetExceptionCode();
- }
- _SEH_END;
+ /* Check Output Safety */
+ if(PreviousMode != KernelMode) {
+
+ _SEH_TRY {
+
+ ProbeForWrite(EventHandle,
+ sizeof(HANDLE),
+ sizeof(ULONG));
+ } _SEH_HANDLE {
+
+ Status = _SEH_GetExceptionCode();
+
+ } _SEH_END;
- if(!NT_SUCCESS(Status))
- {
- return Status;
- }
- }
+ if(!NT_SUCCESS(Status)) return Status;
+ }
+
+ /* Create the Object */
+ Status = ObCreateObject(PreviousMode,
+ ExEventObjectType,
+ ObjectAttributes,
+ PreviousMode,
+ NULL,
+ sizeof(KEVENT),
+ 0,
+ 0,
+ (PVOID*)&Event);
+
+ /* Check for Success */
+ if(NT_SUCCESS(Status)) {
+
+ /* Initalize the Event */
+ KeInitializeEvent(Event,
+ EventType,
+ InitialState);
+
+ /* Insert it */
+ Status = ObInsertObject((PVOID)Event,
+ NULL,
+ DesiredAccess,
+ 0,
+ NULL,
+ &hEvent);
+ ObDereferenceObject(Event);
- Status = ObCreateObject(PreviousMode,
- ExEventObjectType,
- ObjectAttributes,
- PreviousMode,
- NULL,
- sizeof(KEVENT),
- 0,
- 0,
- (PVOID*)&Event);
- if(NT_SUCCESS(Status))
- {
- KeInitializeEvent(Event,
- EventType,
- InitialState);
-
-
- Status = ObInsertObject((PVOID)Event,
- NULL,
- DesiredAccess,
- 0,
- NULL,
- &hEvent);
- ObDereferenceObject(Event);
-
- if(NT_SUCCESS(Status))
- {
- _SEH_TRY
- {
- *EventHandle = hEvent;
- }
- _SEH_HANDLE
- {
- Status = _SEH_GetExceptionCode();
- }
- _SEH_END;
- }
- }
-
- return Status;
+ /* Check for success and return handle */
+ if(NT_SUCCESS(Status)) {
+
+ _SEH_TRY {
+
+ *EventHandle = hEvent;
+
+ } _SEH_HANDLE {
+
+ Status = _SEH_GetExceptionCode();
+
+ } _SEH_END;
+ }
+ }
+
+ /* Return Status */
+ return Status;
}
-
/*
* @implemented
*/
-NTSTATUS STDCALL
+NTSTATUS
+STDCALL
NtOpenEvent(OUT PHANDLE EventHandle,
- IN ACCESS_MASK DesiredAccess,
- IN POBJECT_ATTRIBUTES ObjectAttributes)
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes)
{
- HANDLE hEvent;
- KPROCESSOR_MODE PreviousMode;
- NTSTATUS Status = STATUS_SUCCESS;
+ HANDLE hEvent;
+ KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
+ NTSTATUS Status = STATUS_SUCCESS;
- PAGED_CODE();
-
- DPRINT("NtOpenEvent(0x%x, 0x%x, 0x%x)\n", EventHandle,
DesiredAccess, ObjectAttributes);
+ PAGED_CODE();
+ DPRINT("NtOpenEvent(0x%x, 0x%x, 0x%x)\n", EventHandle,
DesiredAccess, ObjectAttributes);
- PreviousMode = ExGetPreviousMode();
-
- if(PreviousMode == UserMode)
- {
- _SEH_TRY
- {
- ProbeForWrite(EventHandle,
- sizeof(HANDLE),
- sizeof(ULONG));
- }
- _SEH_HANDLE
- {
- Status = _SEH_GetExceptionCode();
- }
- _SEH_END;
+ /* Check Output Safety */
+ if(PreviousMode != KernelMode) {
+
+ _SEH_TRY {
+
+ ProbeForWrite(EventHandle,
+ sizeof(HANDLE),
+ sizeof(ULONG));
+ } _SEH_HANDLE {
+
+ Status = _SEH_GetExceptionCode();
+
+ } _SEH_END;
- if(!NT_SUCCESS(Status))
- {
- return Status;
- }
- }
-
- Status = ObOpenObjectByName(ObjectAttributes,
- ExEventObjectType,
- NULL,
- PreviousMode,
- DesiredAccess,
- NULL,
- &hEvent);
+ if(!NT_SUCCESS(Status)) return Status;
+ }
+
+ /* Open the Object */
+ Status = ObOpenObjectByName(ObjectAttributes,
+ ExEventObjectType,
+ NULL,
+ PreviousMode,
+ DesiredAccess,
+ NULL,
+ &hEvent);
- if(NT_SUCCESS(Status))
- {
- _SEH_TRY
- {
- *EventHandle = hEvent;
- }
- _SEH_HANDLE
- {
- Status = _SEH_GetExceptionCode();
- }
- _SEH_END;
- }
+ /* Check for success and return handle */
+ if(NT_SUCCESS(Status)) {
+
+ _SEH_TRY {
+
+ *EventHandle = hEvent;
+
+ } _SEH_HANDLE {
+
+ Status = _SEH_GetExceptionCode();
+
+ } _SEH_END;
+ }
- return Status;
+ /* Return status */
+ return Status;
}
-
/*
* @implemented
*/
-NTSTATUS STDCALL
+NTSTATUS
+STDCALL
NtPulseEvent(IN HANDLE EventHandle,
- OUT PLONG PreviousState OPTIONAL)
+ OUT PLONG PreviousState OPTIONAL)
{
- PKEVENT Event;
- KPROCESSOR_MODE PreviousMode;
- NTSTATUS Status = STATUS_SUCCESS;
+ PKEVENT Event;
+ KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
+ NTSTATUS Status = STATUS_SUCCESS;
- PAGED_CODE();
+ PAGED_CODE();
+ DPRINT("NtPulseEvent(EventHandle 0%x PreviousState 0%x)\n",
+ EventHandle, PreviousState);
- DPRINT("NtPulseEvent(EventHandle 0%x PreviousState 0%x)\n",
- EventHandle, PreviousState);
+ /* Check buffer validity */
+ if(PreviousState && PreviousMode == UserMode) {
+
+ _SEH_TRY {
+
+ ProbeForWrite(PreviousState,
+ sizeof(LONG),
+ sizeof(ULONG));
+ } _SEH_HANDLE {
+
+ Status = _SEH_GetExceptionCode();
+
+ } _SEH_END;
- PreviousMode = ExGetPreviousMode();
-
- if(PreviousState != NULL && PreviousMode == UserMode)
- {
- _SEH_TRY
- {
- ProbeForWrite(PreviousState,
- sizeof(LONG),
- sizeof(ULONG));
- }
- _SEH_HANDLE
- {
- Status = _SEH_GetExceptionCode();
- }
- _SEH_END;
+ if(!NT_SUCCESS(Status)) return Status;
+ }
+
+ /* Open the Object */
+ Status = ObReferenceObjectByHandle(EventHandle,
+ EVENT_MODIFY_STATE,
+ ExEventObjectType,
+ PreviousMode,
+ (PVOID*)&Event,
+ NULL);
+
+ /* Check for success */
+ if(NT_SUCCESS(Status)) {
+
+ /* Pulse the Event */
+ LONG Prev = KePulseEvent(Event, EVENT_INCREMENT, FALSE);
+ ObDereferenceObject(Event);
- if(!NT_SUCCESS(Status))
- {
- return Status;
- }
+ /* Return it */
+ if(PreviousState) {
+
+ _SEH_TRY {
+
+ *PreviousState = Prev;
+
+ } _SEH_HANDLE {
+
+ Status = _SEH_GetExceptionCode();
+
+ } _SEH_END;
+ }
}
- Status = ObReferenceObjectByHandle(EventHandle,
- EVENT_MODIFY_STATE,
- ExEventObjectType,
- PreviousMode,
- (PVOID*)&Event,
- NULL);
- if(NT_SUCCESS(Status))
- {
- LONG Prev = KePulseEvent(Event, EVENT_INCREMENT, FALSE);
- ObDereferenceObject(Event);
-
- if(PreviousState != NULL)
- {
- _SEH_TRY
- {
- *PreviousState = Prev;
- }
- _SEH_HANDLE
- {
- Status = _SEH_GetExceptionCode();
- }
- _SEH_END;
- }
- }
-
+ /* Return Status */
return Status;
}
@@ -320,230 +307,203 @@
/*
* @implemented
*/
-NTSTATUS STDCALL
+NTSTATUS
+STDCALL
NtQueryEvent(IN HANDLE EventHandle,
- IN EVENT_INFORMATION_CLASS EventInformationClass,
- OUT PVOID EventInformation,
- IN ULONG EventInformationLength,
- OUT PULONG ReturnLength OPTIONAL)
+ IN EVENT_INFORMATION_CLASS EventInformationClass,
+ OUT PVOID EventInformation,
+ IN ULONG EventInformationLength,
+ OUT PULONG ReturnLength OPTIONAL)
{
- PKEVENT Event;
- KPROCESSOR_MODE PreviousMode;
- NTSTATUS Status = STATUS_SUCCESS;
+ PKEVENT Event;
+ KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
+ NTSTATUS Status = STATUS_SUCCESS;
+ PEVENT_BASIC_INFORMATION BasicInfo =
(PEVENT_BASIC_INFORMATION)EventInformation;
+
+ PAGED_CODE();
+ DPRINT("NtQueryEvent(0x%x, 0x%x, 0x%x)\n", EventHandle,
EventInformationClass);
+
+ /* Check buffers and class validity */
+ DefaultQueryInfoBufferCheck(EventInformationClass,
+ ExEventInfoClass,
+ EventInformation,
+ EventInformationLength,
+ ReturnLength,
+ PreviousMode,
+ &Status);
+ if(!NT_SUCCESS(Status)) {
+
+ /* Invalid buffers */
+ DPRINT("NtQuerySemaphore() failed, Status: 0x%x\n", Status);
+ return Status;
+ }
- PAGED_CODE();
+ /* Get the Object */
+ Status = ObReferenceObjectByHandle(EventHandle,
+ EVENT_QUERY_STATE,
+ ExEventObjectType,
+ PreviousMode,
+ (PVOID*)&Event,
+ NULL);
+
+ /* Check for success */
+ if(NT_SUCCESS(Status)) {
- PreviousMode = ExGetPreviousMode();
-
- DefaultQueryInfoBufferCheck(EventInformationClass,
- ExEventInfoClass,
- EventInformation,
- EventInformationLength,
- ReturnLength,
- PreviousMode,
- &Status);
- if(!NT_SUCCESS(Status))
- {
- DPRINT1("NtQueryEvent() failed, Status: 0x%x\n", Status);
- return Status;
- }
+ _SEH_TRY {
+
+ /* Return Event Type and State */
+ BasicInfo->EventType = Event->Header.Type;
+ BasicInfo->EventState = KeReadStateEvent(Event);
- Status = ObReferenceObjectByHandle(EventHandle,
- EVENT_QUERY_STATE,
- ExEventObjectType,
- PreviousMode,
- (PVOID*)&Event,
- NULL);
- if(NT_SUCCESS(Status))
- {
- switch(EventInformationClass)
- {
- case EventBasicInformation:
- {
- PEVENT_BASIC_INFORMATION BasicInfo =
(PEVENT_BASIC_INFORMATION)EventInformation;
-
- _SEH_TRY
- {
- if (Event->Header.Type == InternalNotificationEvent)
- BasicInfo->EventType = NotificationEvent;
- else
- BasicInfo->EventType = SynchronizationEvent;
- BasicInfo->EventState = KeReadStateEvent(Event);
-
- if(ReturnLength != NULL)
- {
- *ReturnLength = sizeof(EVENT_BASIC_INFORMATION);
- }
- }
- _SEH_HANDLE
- {
- Status = _SEH_GetExceptionCode();
- }
- _SEH_END;
- break;
- }
-
- default:
- Status = STATUS_NOT_IMPLEMENTED;
- break;
- }
-
- ObDereferenceObject(Event);
+ /* Return length */
+ if(ReturnLength) *ReturnLength =
sizeof(EVENT_BASIC_INFORMATION);
+
+ } _SEH_HANDLE {
+
+ Status = _SEH_GetExceptionCode();
+
+ } _SEH_END;
+
+ /* Dereference the Object */
+ ObDereferenceObject(Event);
}
+ /* Return status */
return Status;
}
-
/*
* @implemented
*/
-NTSTATUS STDCALL
+NTSTATUS
+STDCALL
NtResetEvent(IN HANDLE EventHandle,
- OUT PLONG PreviousState OPTIONAL)
+ OUT PLONG PreviousState OPTIONAL)
{
- PKEVENT Event;
- KPROCESSOR_MODE PreviousMode;
- NTSTATUS Status = STATUS_SUCCESS;
+ PKEVENT Event;
+ KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
+ NTSTATUS Status = STATUS_SUCCESS;
- PAGED_CODE();
+ PAGED_CODE();
+ DPRINT("NtResetEvent(EventHandle 0%x PreviousState 0%x)\n",
+ EventHandle, PreviousState);
- DPRINT("NtResetEvent(EventHandle 0%x PreviousState 0%x)\n",
- EventHandle, PreviousState);
+ /* Check buffer validity */
+ if(PreviousState && PreviousMode == UserMode) {
+
+ _SEH_TRY {
+
+ ProbeForWrite(PreviousState,
+ sizeof(LONG),
+ sizeof(ULONG));
+ } _SEH_HANDLE {
+
+ Status = _SEH_GetExceptionCode();
+
+ } _SEH_END;
- PreviousMode = ExGetPreviousMode();
+ if(!NT_SUCCESS(Status)) return Status;
+ }
- if(PreviousState != NULL && PreviousMode == UserMode)
- {
- _SEH_TRY
- {
- ProbeForWrite(PreviousState,
- sizeof(LONG),
- sizeof(ULONG));
- }
- _SEH_HANDLE
- {
- Status = _SEH_GetExceptionCode();
- }
- _SEH_END;
+ /* Open the Object */
+ Status = ObReferenceObjectByHandle(EventHandle,
+ EVENT_MODIFY_STATE,
+ ExEventObjectType,
+ PreviousMode,
+ (PVOID*)&Event,
+ NULL);
+
+ /* Check for success */
+ if(NT_SUCCESS(Status)) {
+
+ /* Reset the Event */
+ LONG Prev = KeResetEvent(Event);
+ ObDereferenceObject(Event);
- if(!NT_SUCCESS(Status))
- {
- return Status;
- }
+ /* Return it */
+ if(PreviousState) {
+
+ _SEH_TRY {
+
+ *PreviousState = Prev;
+
+ } _SEH_HANDLE {
+
+ Status = _SEH_GetExceptionCode();
+
+ } _SEH_END;
+ }
}
- Status = ObReferenceObjectByHandle(EventHandle,
- EVENT_MODIFY_STATE,
- ExEventObjectType,
- PreviousMode,
- (PVOID*)&Event,
- NULL);
- if(NT_SUCCESS(Status))
- {
- LONG Prev = KeResetEvent(Event);
- ObDereferenceObject(Event);
-
- if(PreviousState != NULL)
- {
- _SEH_TRY
- {
- *PreviousState = Prev;
- }
- _SEH_HANDLE
- {
- Status = _SEH_GetExceptionCode();
- }
- _SEH_END;
- }
- }
-
+ /* Return Status */
return Status;
}
-
/*
* @implemented
*/
-NTSTATUS STDCALL
+NTSTATUS
+STDCALL
NtSetEvent(IN HANDLE EventHandle,
- OUT PLONG PreviousState OPTIONAL)
+ OUT PLONG PreviousState OPTIONAL)
{
- PKEVENT Event;
- KPROCESSOR_MODE PreviousMode;
- NTSTATUS Status = STATUS_SUCCESS;
+ PKEVENT Event;
+ KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
+ NTSTATUS Status = STATUS_SUCCESS;
- PAGED_CODE();
+ PAGED_CODE();
+ DPRINT("NtSetEvent(EventHandle 0%x PreviousState 0%x)\n",
+ EventHandle, PreviousState);
- DPRINT("NtSetEvent(EventHandle 0%x PreviousState 0%x)\n",
- EventHandle, PreviousState);
+ /* Check buffer validity */
+ if(PreviousState != NULL && PreviousMode == UserMode) {
+
+ _SEH_TRY {
+
+ ProbeForWrite(PreviousState,
+ sizeof(LONG),
+ sizeof(ULONG));
+ } _SEH_HANDLE {
+
+ Status = _SEH_GetExceptionCode();
+
+ } _SEH_END;
- PreviousMode = ExGetPreviousMode();
+ if(!NT_SUCCESS(Status)) return Status;
+ }
- if(PreviousState != NULL && PreviousMode == UserMode)
- {
- _SEH_TRY
- {
- ProbeForWrite(PreviousState,
- sizeof(LONG),
- sizeof(ULONG));
- }
- _SEH_HANDLE
- {
- Status = _SEH_GetExceptionCode();
- }
- _SEH_END;
-
- if(!NT_SUCCESS(Status))
- {
- return Status;
- }
- }
+ /* Open the Object */
+ Status = ObReferenceObjectByHandle(EventHandle,
+ EVENT_MODIFY_STATE,
+ ExEventObjectType,
+ PreviousMode,
+ (PVOID*)&Event,
+ NULL);
+
+ /* Check for success */
+ if(NT_SUCCESS(Status)) {
- Status = ObReferenceObjectByHandle(EventHandle,
- EVENT_MODIFY_STATE,
- ExEventObjectType,
- PreviousMode,
- (PVOID*)&Event,
- NULL);
- if(NT_SUCCESS(Status))
- {
- LONG Prev = KeSetEvent(Event, EVENT_INCREMENT, FALSE);
- ObDereferenceObject(Event);
+ /* Set the Event */
+ LONG Prev = KeSetEvent(Event, EVENT_INCREMENT, FALSE);
+ ObDereferenceObject(Event);
- if(PreviousState != NULL)
- {
- _SEH_TRY
- {
- *PreviousState = Prev;
- }
- _SEH_HANDLE
- {
- Status = _SEH_GetExceptionCode();
- }
- _SEH_END;
- }
+ /* Return it */
+ if(PreviousState) {
+
+ _SEH_TRY {
+
+ *PreviousState = Prev;
+
+ } _SEH_HANDLE {
+
+ Status = _SEH_GetExceptionCode();
+
+ } _SEH_END;
+ }
}
+ /* Return Status */
return Status;
}
-
-/*
- * @unimplemented
- */
-NTSTATUS
-STDCALL
-NtTraceEvent(
- IN ULONG TraceHandle,
- IN ULONG Flags,
- IN ULONG TraceHeaderLength,
- IN struct _EVENT_TRACE_HEADER* TraceHeader
- )
-{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
-}
-
-
/* EOF */
_____
Modified: trunk/reactos/ntoskrnl/ex/evtpair.c
--- trunk/reactos/ntoskrnl/ex/evtpair.c 2005-03-14 01:47:18 UTC (rev
14044)
+++ trunk/reactos/ntoskrnl/ex/evtpair.c 2005-03-14 02:08:17 UTC (rev
14045)
@@ -1,11 +1,12 @@
-/* $Id: evtpair.c 12779 2005-01-04 04:45:00Z gdalsnes $
- *
+/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* FILE: ntoskrnl/ex/evtpair.c
* PURPOSE: Support for event pairs
*
- * PROGRAMMERS: David Welch (welch(a)mcmail.com)
+ * PROGRAMMERS: Alex Ionescu (Commented, reorganized, removed
Thread Pair, used
+ * KeInitializeEventPair, added SEH)
+ * David Welch (welch(a)mcmail.com)
* Skywing (skywing(a)valhallalegends.com)
*/
@@ -15,588 +16,404 @@
#define NDEBUG
#include <internal/debug.h>
-#ifndef NTSYSAPI
-#define NTSYSAPI
[truncated at 1000 lines; 4192 more skipped]