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
)
93 Status
= ObReferenceObjectByHandle(EventHandle
,
99 if(NT_SUCCESS(Status
))
102 ObDereferenceObject(Event
);
113 NtCreateEvent(OUT PHANDLE EventHandle
,
114 IN ACCESS_MASK DesiredAccess
,
115 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
116 IN EVENT_TYPE EventType
,
117 IN BOOLEAN InitialState
)
119 KPROCESSOR_MODE PreviousMode
;
122 NTSTATUS Status
= STATUS_SUCCESS
;
126 PreviousMode
= ExGetPreviousMode();
128 if(PreviousMode
== UserMode
)
132 ProbeForWrite(EventHandle
,
138 Status
= _SEH_GetExceptionCode();
142 if(!NT_SUCCESS(Status
))
148 Status
= ObCreateObject(PreviousMode
,
157 if(NT_SUCCESS(Status
))
159 KeInitializeEvent(Event
,
164 Status
= ObInsertObject((PVOID
)Event
,
170 ObDereferenceObject(Event
);
172 if(NT_SUCCESS(Status
))
176 *EventHandle
= hEvent
;
180 Status
= _SEH_GetExceptionCode();
194 NtOpenEvent(OUT PHANDLE EventHandle
,
195 IN ACCESS_MASK DesiredAccess
,
196 IN POBJECT_ATTRIBUTES ObjectAttributes
)
199 KPROCESSOR_MODE PreviousMode
;
200 NTSTATUS Status
= STATUS_SUCCESS
;
204 DPRINT("NtOpenEvent(0x%x, 0x%x, 0x%x)\n", EventHandle
, DesiredAccess
, ObjectAttributes
);
206 PreviousMode
= ExGetPreviousMode();
208 if(PreviousMode
== UserMode
)
212 ProbeForWrite(EventHandle
,
218 Status
= _SEH_GetExceptionCode();
222 if(!NT_SUCCESS(Status
))
228 Status
= ObOpenObjectByName(ObjectAttributes
,
236 if(NT_SUCCESS(Status
))
240 *EventHandle
= hEvent
;
244 Status
= _SEH_GetExceptionCode();
257 NtPulseEvent(IN HANDLE EventHandle
,
258 OUT PLONG PreviousState OPTIONAL
)
261 KPROCESSOR_MODE PreviousMode
;
262 NTSTATUS Status
= STATUS_SUCCESS
;
266 DPRINT("NtPulseEvent(EventHandle 0%x PreviousState 0%x)\n",
267 EventHandle
, PreviousState
);
269 PreviousMode
= ExGetPreviousMode();
271 if(PreviousState
!= NULL
&& PreviousMode
== UserMode
)
275 ProbeForWrite(PreviousState
,
281 Status
= _SEH_GetExceptionCode();
285 if(!NT_SUCCESS(Status
))
291 Status
= ObReferenceObjectByHandle(EventHandle
,
297 if(NT_SUCCESS(Status
))
299 LONG Prev
= KePulseEvent(Event
, EVENT_INCREMENT
, FALSE
);
300 ObDereferenceObject(Event
);
302 if(PreviousState
!= NULL
)
306 *PreviousState
= Prev
;
310 Status
= _SEH_GetExceptionCode();
324 NtQueryEvent(IN HANDLE EventHandle
,
325 IN EVENT_INFORMATION_CLASS EventInformationClass
,
326 OUT PVOID EventInformation
,
327 IN ULONG EventInformationLength
,
328 OUT PULONG ReturnLength OPTIONAL
)
331 KPROCESSOR_MODE PreviousMode
;
332 NTSTATUS Status
= STATUS_SUCCESS
;
336 PreviousMode
= ExGetPreviousMode();
338 DefaultQueryInfoBufferCheck(EventInformationClass
,
341 EventInformationLength
,
345 if(!NT_SUCCESS(Status
))
347 DPRINT1("NtQueryEvent() failed, Status: 0x%x\n", Status
);
351 Status
= ObReferenceObjectByHandle(EventHandle
,
357 if(NT_SUCCESS(Status
))
359 switch(EventInformationClass
)
361 case EventBasicInformation
:
363 PEVENT_BASIC_INFORMATION BasicInfo
= (PEVENT_BASIC_INFORMATION
)EventInformation
;
367 if (Event
->Header
.Type
== InternalNotificationEvent
)
368 BasicInfo
->EventType
= NotificationEvent
;
370 BasicInfo
->EventType
= SynchronizationEvent
;
371 BasicInfo
->EventState
= KeReadStateEvent(Event
);
373 if(ReturnLength
!= NULL
)
375 *ReturnLength
= sizeof(EVENT_BASIC_INFORMATION
);
380 Status
= _SEH_GetExceptionCode();
387 Status
= STATUS_NOT_IMPLEMENTED
;
391 ObDereferenceObject(Event
);
402 NtResetEvent(IN HANDLE EventHandle
,
403 OUT PLONG PreviousState OPTIONAL
)
406 KPROCESSOR_MODE PreviousMode
;
407 NTSTATUS Status
= STATUS_SUCCESS
;
411 DPRINT("NtResetEvent(EventHandle 0%x PreviousState 0%x)\n",
412 EventHandle
, PreviousState
);
414 PreviousMode
= ExGetPreviousMode();
416 if(PreviousState
!= NULL
&& PreviousMode
== UserMode
)
420 ProbeForWrite(PreviousState
,
426 Status
= _SEH_GetExceptionCode();
430 if(!NT_SUCCESS(Status
))
436 Status
= ObReferenceObjectByHandle(EventHandle
,
442 if(NT_SUCCESS(Status
))
444 LONG Prev
= KeResetEvent(Event
);
445 ObDereferenceObject(Event
);
447 if(PreviousState
!= NULL
)
451 *PreviousState
= Prev
;
455 Status
= _SEH_GetExceptionCode();
469 NtSetEvent(IN HANDLE EventHandle
,
470 OUT PLONG PreviousState OPTIONAL
)
473 KPROCESSOR_MODE PreviousMode
;
474 NTSTATUS Status
= STATUS_SUCCESS
;
478 DPRINT("NtSetEvent(EventHandle 0%x PreviousState 0%x)\n",
479 EventHandle
, PreviousState
);
481 PreviousMode
= ExGetPreviousMode();
483 if(PreviousState
!= NULL
&& PreviousMode
== UserMode
)
487 ProbeForWrite(PreviousState
,
493 Status
= _SEH_GetExceptionCode();
497 if(!NT_SUCCESS(Status
))
503 Status
= ObReferenceObjectByHandle(EventHandle
,
509 if(NT_SUCCESS(Status
))
511 LONG Prev
= KeSetEvent(Event
, EVENT_INCREMENT
, FALSE
);
512 ObDereferenceObject(Event
);
514 if(PreviousState
!= NULL
)
518 *PreviousState
= Prev
;
522 Status
= _SEH_GetExceptionCode();
538 IN ULONG TraceHandle
,
540 IN ULONG TraceHeaderLength
,
541 IN
struct _EVENT_TRACE_HEADER
* TraceHeader
545 return STATUS_NOT_IMPLEMENTED
;