3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/nt/event.c
6 * PURPOSE: Named event support
8 * PROGRAMMERS: Philip Susi and David Welch
11 /* INCLUDES *****************************************************************/
15 #include <internal/debug.h>
17 /* GLOBALS *******************************************************************/
19 POBJECT_TYPE EXPORTED ExEventObjectType
= NULL
;
21 static GENERIC_MAPPING ExpEventMapping
= {
22 STANDARD_RIGHTS_READ
| SYNCHRONIZE
| EVENT_QUERY_STATE
,
23 STANDARD_RIGHTS_WRITE
| SYNCHRONIZE
| EVENT_MODIFY_STATE
,
24 STANDARD_RIGHTS_EXECUTE
| SYNCHRONIZE
| EVENT_QUERY_STATE
,
27 static const INFORMATION_CLASS_INFO ExEventInfoClass
[] =
29 ICI_SQ_SAME( sizeof(EVENT_BASIC_INFORMATION
), sizeof(ULONG
), ICIF_QUERY
), /* EventBasicInformation */
32 /* FUNCTIONS *****************************************************************/
35 NtpCreateEvent(PVOID ObjectBody
,
38 POBJECT_ATTRIBUTES ObjectAttributes
)
40 DPRINT("NtpCreateEvent(ObjectBody %x, Parent %x, RemainingPath %S)\n",
41 ObjectBody
, Parent
, RemainingPath
);
43 if (RemainingPath
!= NULL
&& wcschr(RemainingPath
+1, '\\') != NULL
)
45 return(STATUS_UNSUCCESSFUL
);
48 return(STATUS_SUCCESS
);
53 ExpInitializeEventImplementation(VOID
)
55 ExEventObjectType
= ExAllocatePool(NonPagedPool
,sizeof(OBJECT_TYPE
));
57 RtlpCreateUnicodeString(&ExEventObjectType
->TypeName
, L
"Event", NonPagedPool
);
59 ExEventObjectType
->Tag
= TAG('E', 'V', 'T', 'T');
60 ExEventObjectType
->PeakObjects
= 0;
61 ExEventObjectType
->PeakHandles
= 0;
62 ExEventObjectType
->TotalObjects
= 0;
63 ExEventObjectType
->TotalHandles
= 0;
64 ExEventObjectType
->PagedPoolCharge
= 0;
65 ExEventObjectType
->NonpagedPoolCharge
= sizeof(KEVENT
);
66 ExEventObjectType
->Mapping
= &ExpEventMapping
;
67 ExEventObjectType
->Dump
= NULL
;
68 ExEventObjectType
->Open
= NULL
;
69 ExEventObjectType
->Close
= NULL
;
70 ExEventObjectType
->Delete
= NULL
;
71 ExEventObjectType
->Parse
= NULL
;
72 ExEventObjectType
->Security
= NULL
;
73 ExEventObjectType
->QueryName
= NULL
;
74 ExEventObjectType
->OkayToClose
= NULL
;
75 ExEventObjectType
->Create
= NtpCreateEvent
;
76 ExEventObjectType
->DuplicationNotify
= NULL
;
78 ObpCreateTypeObject(ExEventObjectType
);
86 NtClearEvent(IN HANDLE EventHandle
)
91 Status
= ObReferenceObjectByHandle(EventHandle
,
97 if(NT_SUCCESS(Status
))
100 ObDereferenceObject(Event
);
111 NtCreateEvent(OUT PHANDLE EventHandle
,
112 IN ACCESS_MASK DesiredAccess
,
113 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
114 IN EVENT_TYPE EventType
,
115 IN BOOLEAN InitialState
)
117 KPROCESSOR_MODE PreviousMode
;
120 NTSTATUS Status
= STATUS_SUCCESS
;
122 PreviousMode
= ExGetPreviousMode();
124 if(PreviousMode
== UserMode
)
128 ProbeForWrite(EventHandle
,
134 Status
= _SEH_GetExceptionCode();
138 if(!NT_SUCCESS(Status
))
144 Status
= ObCreateObject(PreviousMode
,
153 if(NT_SUCCESS(Status
))
155 KeInitializeEvent(Event
,
160 Status
= ObInsertObject((PVOID
)Event
,
166 ObDereferenceObject(Event
);
168 if(NT_SUCCESS(Status
))
172 *EventHandle
= hEvent
;
176 Status
= _SEH_GetExceptionCode();
190 NtOpenEvent(OUT PHANDLE EventHandle
,
191 IN ACCESS_MASK DesiredAccess
,
192 IN POBJECT_ATTRIBUTES ObjectAttributes
)
195 KPROCESSOR_MODE PreviousMode
;
196 NTSTATUS Status
= STATUS_SUCCESS
;
198 DPRINT("NtOpenEvent(0x%x, 0x%x, 0x%x)\n", EventHandle
, DesiredAccess
, ObjectAttributes
);
200 PreviousMode
= ExGetPreviousMode();
202 if(PreviousMode
== UserMode
)
206 ProbeForWrite(EventHandle
,
212 Status
= _SEH_GetExceptionCode();
216 if(!NT_SUCCESS(Status
))
222 Status
= ObOpenObjectByName(ObjectAttributes
,
230 if(NT_SUCCESS(Status
))
234 *EventHandle
= hEvent
;
238 Status
= _SEH_GetExceptionCode();
251 NtPulseEvent(IN HANDLE EventHandle
,
252 OUT PLONG PreviousState OPTIONAL
)
255 KPROCESSOR_MODE PreviousMode
;
256 NTSTATUS Status
= STATUS_SUCCESS
;
258 DPRINT("NtPulseEvent(EventHandle 0%x PreviousState 0%x)\n",
259 EventHandle
, PreviousState
);
261 PreviousMode
= ExGetPreviousMode();
263 if(PreviousState
!= NULL
&& PreviousMode
== UserMode
)
267 ProbeForWrite(PreviousState
,
273 Status
= _SEH_GetExceptionCode();
277 if(!NT_SUCCESS(Status
))
283 Status
= ObReferenceObjectByHandle(EventHandle
,
289 if(NT_SUCCESS(Status
))
291 LONG Prev
= KePulseEvent(Event
, EVENT_INCREMENT
, FALSE
);
292 ObDereferenceObject(Event
);
294 if(PreviousState
!= NULL
)
298 *PreviousState
= Prev
;
302 Status
= _SEH_GetExceptionCode();
316 NtQueryEvent(IN HANDLE EventHandle
,
317 IN EVENT_INFORMATION_CLASS EventInformationClass
,
318 OUT PVOID EventInformation
,
319 IN ULONG EventInformationLength
,
320 OUT PULONG ReturnLength OPTIONAL
)
323 KPROCESSOR_MODE PreviousMode
;
324 NTSTATUS Status
= STATUS_SUCCESS
;
326 PreviousMode
= ExGetPreviousMode();
328 DefaultQueryInfoBufferCheck(EventInformationClass
,
331 EventInformationLength
,
335 if(!NT_SUCCESS(Status
))
337 DPRINT1("NtQueryEvent() failed, Status: 0x%x\n", Status
);
341 Status
= ObReferenceObjectByHandle(EventHandle
,
347 if(NT_SUCCESS(Status
))
349 switch(EventInformationClass
)
351 case EventBasicInformation
:
353 PEVENT_BASIC_INFORMATION BasicInfo
= (PEVENT_BASIC_INFORMATION
)EventInformation
;
357 if (Event
->Header
.Type
== InternalNotificationEvent
)
358 BasicInfo
->EventType
= NotificationEvent
;
360 BasicInfo
->EventType
= SynchronizationEvent
;
361 BasicInfo
->EventState
= KeReadStateEvent(Event
);
363 if(ReturnLength
!= NULL
)
365 *ReturnLength
= sizeof(EVENT_BASIC_INFORMATION
);
370 Status
= _SEH_GetExceptionCode();
377 Status
= STATUS_NOT_IMPLEMENTED
;
381 ObDereferenceObject(Event
);
392 NtResetEvent(IN HANDLE EventHandle
,
393 OUT PLONG PreviousState OPTIONAL
)
396 KPROCESSOR_MODE PreviousMode
;
397 NTSTATUS Status
= STATUS_SUCCESS
;
399 DPRINT("NtResetEvent(EventHandle 0%x PreviousState 0%x)\n",
400 EventHandle
, PreviousState
);
402 PreviousMode
= ExGetPreviousMode();
404 if(PreviousState
!= NULL
&& PreviousMode
== UserMode
)
408 ProbeForWrite(PreviousState
,
414 Status
= _SEH_GetExceptionCode();
418 if(!NT_SUCCESS(Status
))
424 Status
= ObReferenceObjectByHandle(EventHandle
,
430 if(NT_SUCCESS(Status
))
432 LONG Prev
= KeResetEvent(Event
);
433 ObDereferenceObject(Event
);
435 if(PreviousState
!= NULL
)
439 *PreviousState
= Prev
;
443 Status
= _SEH_GetExceptionCode();
457 NtSetEvent(IN HANDLE EventHandle
,
458 OUT PLONG PreviousState OPTIONAL
)
461 KPROCESSOR_MODE PreviousMode
;
462 NTSTATUS Status
= STATUS_SUCCESS
;
464 DPRINT("NtSetEvent(EventHandle 0%x PreviousState 0%x)\n",
465 EventHandle
, PreviousState
);
467 PreviousMode
= ExGetPreviousMode();
469 if(PreviousState
!= NULL
&& PreviousMode
== UserMode
)
473 ProbeForWrite(PreviousState
,
479 Status
= _SEH_GetExceptionCode();
483 if(!NT_SUCCESS(Status
))
489 Status
= ObReferenceObjectByHandle(EventHandle
,
495 if(NT_SUCCESS(Status
))
497 LONG Prev
= KeSetEvent(Event
, EVENT_INCREMENT
, FALSE
);
498 ObDereferenceObject(Event
);
500 if(PreviousState
!= NULL
)
504 *PreviousState
= Prev
;
508 Status
= _SEH_GetExceptionCode();
524 IN ULONG TraceHandle
,
526 IN ULONG TraceHeaderLength
,
527 IN
struct _EVENT_TRACE_HEADER
* TraceHeader
531 return STATUS_NOT_IMPLEMENTED
;