3 * Copyright (C) 1998, 1999, 2000, 2001 ReactOS Team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 * PROJECT: ReactOS kernel
21 * FILE: ntoskrnl/nt/event.c
22 * PURPOSE: Named event support
23 * PROGRAMMER: Philip Susi and David Welch
28 /* INCLUDES *****************************************************************/
32 #include <internal/debug.h>
34 /* GLOBALS *******************************************************************/
36 POBJECT_TYPE EXPORTED ExEventObjectType
= NULL
;
38 static GENERIC_MAPPING ExpEventMapping
= {
39 STANDARD_RIGHTS_READ
| SYNCHRONIZE
| EVENT_QUERY_STATE
,
40 STANDARD_RIGHTS_WRITE
| SYNCHRONIZE
| EVENT_MODIFY_STATE
,
41 STANDARD_RIGHTS_EXECUTE
| SYNCHRONIZE
| EVENT_QUERY_STATE
,
44 static const INFORMATION_CLASS_INFO ExEventInfoClass
[] =
46 ICI_SQ_SAME( sizeof(EVENT_BASIC_INFORMATION
), sizeof(ULONG
), ICIF_QUERY
), /* EventBasicInformation */
49 /* FUNCTIONS *****************************************************************/
52 NtpCreateEvent(PVOID ObjectBody
,
55 POBJECT_ATTRIBUTES ObjectAttributes
)
57 DPRINT("NtpCreateEvent(ObjectBody %x, Parent %x, RemainingPath %S)\n",
58 ObjectBody
, Parent
, RemainingPath
);
60 if (RemainingPath
!= NULL
&& wcschr(RemainingPath
+1, '\\') != NULL
)
62 return(STATUS_UNSUCCESSFUL
);
65 return(STATUS_SUCCESS
);
70 ExpInitializeEventImplementation(VOID
)
72 ExEventObjectType
= ExAllocatePool(NonPagedPool
,sizeof(OBJECT_TYPE
));
74 RtlCreateUnicodeString(&ExEventObjectType
->TypeName
, L
"Event");
76 ExEventObjectType
->Tag
= TAG('E', 'V', 'T', 'T');
77 ExEventObjectType
->PeakObjects
= 0;
78 ExEventObjectType
->PeakHandles
= 0;
79 ExEventObjectType
->TotalObjects
= 0;
80 ExEventObjectType
->TotalHandles
= 0;
81 ExEventObjectType
->PagedPoolCharge
= 0;
82 ExEventObjectType
->NonpagedPoolCharge
= sizeof(KEVENT
);
83 ExEventObjectType
->Mapping
= &ExpEventMapping
;
84 ExEventObjectType
->Dump
= NULL
;
85 ExEventObjectType
->Open
= NULL
;
86 ExEventObjectType
->Close
= NULL
;
87 ExEventObjectType
->Delete
= NULL
;
88 ExEventObjectType
->Parse
= NULL
;
89 ExEventObjectType
->Security
= NULL
;
90 ExEventObjectType
->QueryName
= NULL
;
91 ExEventObjectType
->OkayToClose
= NULL
;
92 ExEventObjectType
->Create
= NtpCreateEvent
;
93 ExEventObjectType
->DuplicationNotify
= NULL
;
95 ObpCreateTypeObject(ExEventObjectType
);
103 NtClearEvent(IN HANDLE EventHandle
)
108 Status
= ObReferenceObjectByHandle(EventHandle
,
114 if(NT_SUCCESS(Status
))
117 ObDereferenceObject(Event
);
128 NtCreateEvent(OUT PHANDLE EventHandle
,
129 IN ACCESS_MASK DesiredAccess
,
130 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
131 IN EVENT_TYPE EventType
,
132 IN BOOLEAN InitialState
)
134 KPROCESSOR_MODE PreviousMode
;
137 NTSTATUS Status
= STATUS_SUCCESS
;
139 PreviousMode
= ExGetPreviousMode();
141 if(PreviousMode
== UserMode
)
145 ProbeForWrite(EventHandle
,
151 Status
= _SEH_GetExceptionCode();
156 Status
= ObCreateObject(PreviousMode
,
165 if(NT_SUCCESS(Status
))
167 KeInitializeEvent(Event
,
172 Status
= ObInsertObject((PVOID
)Event
,
178 ObDereferenceObject(Event
);
180 if(NT_SUCCESS(Status
))
184 *EventHandle
= hEvent
;
188 Status
= _SEH_GetExceptionCode();
202 NtOpenEvent(OUT PHANDLE EventHandle
,
203 IN ACCESS_MASK DesiredAccess
,
204 IN POBJECT_ATTRIBUTES ObjectAttributes
)
207 KPROCESSOR_MODE PreviousMode
;
208 NTSTATUS Status
= STATUS_SUCCESS
;
210 DPRINT("NtOpenEvent(0x%x, 0x%x, 0x%x)\n", EventHandle
, DesiredAccess
, ObjectAttributes
);
212 PreviousMode
= ExGetPreviousMode();
214 if(PreviousMode
== UserMode
)
218 ProbeForWrite(EventHandle
,
224 Status
= _SEH_GetExceptionCode();
228 if(!NT_SUCCESS(Status
))
234 Status
= ObOpenObjectByName(ObjectAttributes
,
242 if(NT_SUCCESS(Status
))
246 *EventHandle
= hEvent
;
250 Status
= _SEH_GetExceptionCode();
263 NtPulseEvent(IN HANDLE EventHandle
,
264 OUT PLONG PreviousState OPTIONAL
)
267 KPROCESSOR_MODE PreviousMode
;
268 NTSTATUS Status
= STATUS_SUCCESS
;
270 DPRINT("NtPulseEvent(EventHandle 0%x PreviousState 0%x)\n",
271 EventHandle
, PreviousState
);
273 PreviousMode
= ExGetPreviousMode();
275 if(PreviousState
!= NULL
&& PreviousMode
== UserMode
)
279 ProbeForWrite(PreviousState
,
285 Status
= _SEH_GetExceptionCode();
290 Status
= ObReferenceObjectByHandle(EventHandle
,
296 if(NT_SUCCESS(Status
))
298 LONG Prev
= KePulseEvent(Event
, EVENT_INCREMENT
, FALSE
);
299 ObDereferenceObject(Event
);
301 if(PreviousState
!= NULL
)
305 *PreviousState
= Prev
;
309 Status
= _SEH_GetExceptionCode();
323 NtQueryEvent(IN HANDLE EventHandle
,
324 IN EVENT_INFORMATION_CLASS EventInformationClass
,
325 OUT PVOID EventInformation
,
326 IN ULONG EventInformationLength
,
327 OUT PULONG ReturnLength OPTIONAL
)
330 KPROCESSOR_MODE PreviousMode
;
331 NTSTATUS Status
= STATUS_SUCCESS
;
333 PreviousMode
= ExGetPreviousMode();
335 DefaultQueryInfoBufferCheck(EventInformationClass
,
338 EventInformationLength
,
342 if(!NT_SUCCESS(Status
))
344 DPRINT1("NtQueryEvent() failed, Status: 0x%x\n", Status
);
348 Status
= ObReferenceObjectByHandle(EventHandle
,
354 if(NT_SUCCESS(Status
))
356 switch(EventInformationClass
)
358 case EventBasicInformation
:
360 PEVENT_BASIC_INFORMATION BasicInfo
= (PEVENT_BASIC_INFORMATION
)EventInformation
;
364 if (Event
->Header
.Type
== InternalNotificationEvent
)
365 BasicInfo
->EventType
= NotificationEvent
;
367 BasicInfo
->EventType
= SynchronizationEvent
;
368 BasicInfo
->EventState
= KeReadStateEvent(Event
);
370 if(ReturnLength
!= NULL
)
372 *ReturnLength
= sizeof(EVENT_BASIC_INFORMATION
);
377 Status
= _SEH_GetExceptionCode();
384 Status
= STATUS_NOT_IMPLEMENTED
;
388 ObDereferenceObject(Event
);
399 NtResetEvent(IN HANDLE EventHandle
,
400 OUT PLONG PreviousState OPTIONAL
)
403 KPROCESSOR_MODE PreviousMode
;
404 NTSTATUS Status
= STATUS_SUCCESS
;
406 DPRINT("NtResetEvent(EventHandle 0%x PreviousState 0%x)\n",
407 EventHandle
, PreviousState
);
409 PreviousMode
= ExGetPreviousMode();
411 if(PreviousState
!= NULL
&& PreviousMode
== UserMode
)
415 ProbeForWrite(PreviousState
,
421 Status
= _SEH_GetExceptionCode();
426 Status
= ObReferenceObjectByHandle(EventHandle
,
432 if(NT_SUCCESS(Status
))
434 LONG Prev
= KeResetEvent(Event
);
435 ObDereferenceObject(Event
);
437 if(PreviousState
!= NULL
)
441 *PreviousState
= Prev
;
445 Status
= _SEH_GetExceptionCode();
459 NtSetEvent(IN HANDLE EventHandle
,
460 OUT PLONG PreviousState OPTIONAL
)
463 KPROCESSOR_MODE PreviousMode
;
464 NTSTATUS Status
= STATUS_SUCCESS
;
466 DPRINT("NtSetEvent(EventHandle 0%x PreviousState 0%x)\n",
467 EventHandle
, PreviousState
);
469 PreviousMode
= ExGetPreviousMode();
471 if(PreviousState
!= NULL
&& PreviousMode
== UserMode
)
475 ProbeForWrite(PreviousState
,
481 Status
= _SEH_GetExceptionCode();
486 Status
= ObReferenceObjectByHandle(EventHandle
,
492 if(NT_SUCCESS(Status
))
494 LONG Prev
= KeSetEvent(Event
, EVENT_INCREMENT
, FALSE
);
495 ObDereferenceObject(Event
);
497 if(PreviousState
!= NULL
)
501 *PreviousState
= Prev
;
505 Status
= _SEH_GetExceptionCode();
521 IN ULONG TraceHandle
,
523 IN ULONG TraceHeaderLength
,
524 IN
struct _EVENT_TRACE_HEADER
* TraceHeader
528 return STATUS_NOT_IMPLEMENTED
;