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();
155 if(!NT_SUCCESS(Status
))
161 Status
= ObCreateObject(PreviousMode
,
170 if(NT_SUCCESS(Status
))
172 KeInitializeEvent(Event
,
177 Status
= ObInsertObject((PVOID
)Event
,
183 ObDereferenceObject(Event
);
185 if(NT_SUCCESS(Status
))
189 *EventHandle
= hEvent
;
193 Status
= _SEH_GetExceptionCode();
207 NtOpenEvent(OUT PHANDLE EventHandle
,
208 IN ACCESS_MASK DesiredAccess
,
209 IN POBJECT_ATTRIBUTES ObjectAttributes
)
212 KPROCESSOR_MODE PreviousMode
;
213 NTSTATUS Status
= STATUS_SUCCESS
;
215 DPRINT("NtOpenEvent(0x%x, 0x%x, 0x%x)\n", EventHandle
, DesiredAccess
, ObjectAttributes
);
217 PreviousMode
= ExGetPreviousMode();
219 if(PreviousMode
== UserMode
)
223 ProbeForWrite(EventHandle
,
229 Status
= _SEH_GetExceptionCode();
233 if(!NT_SUCCESS(Status
))
239 Status
= ObOpenObjectByName(ObjectAttributes
,
247 if(NT_SUCCESS(Status
))
251 *EventHandle
= hEvent
;
255 Status
= _SEH_GetExceptionCode();
268 NtPulseEvent(IN HANDLE EventHandle
,
269 OUT PLONG PreviousState OPTIONAL
)
272 KPROCESSOR_MODE PreviousMode
;
273 NTSTATUS Status
= STATUS_SUCCESS
;
275 DPRINT("NtPulseEvent(EventHandle 0%x PreviousState 0%x)\n",
276 EventHandle
, PreviousState
);
278 PreviousMode
= ExGetPreviousMode();
280 if(PreviousState
!= NULL
&& PreviousMode
== UserMode
)
284 ProbeForWrite(PreviousState
,
290 Status
= _SEH_GetExceptionCode();
294 if(!NT_SUCCESS(Status
))
300 Status
= ObReferenceObjectByHandle(EventHandle
,
306 if(NT_SUCCESS(Status
))
308 LONG Prev
= KePulseEvent(Event
, EVENT_INCREMENT
, FALSE
);
309 ObDereferenceObject(Event
);
311 if(PreviousState
!= NULL
)
315 *PreviousState
= Prev
;
319 Status
= _SEH_GetExceptionCode();
333 NtQueryEvent(IN HANDLE EventHandle
,
334 IN EVENT_INFORMATION_CLASS EventInformationClass
,
335 OUT PVOID EventInformation
,
336 IN ULONG EventInformationLength
,
337 OUT PULONG ReturnLength OPTIONAL
)
340 KPROCESSOR_MODE PreviousMode
;
341 NTSTATUS Status
= STATUS_SUCCESS
;
343 PreviousMode
= ExGetPreviousMode();
345 DefaultQueryInfoBufferCheck(EventInformationClass
,
348 EventInformationLength
,
352 if(!NT_SUCCESS(Status
))
354 DPRINT1("NtQueryEvent() failed, Status: 0x%x\n", Status
);
358 Status
= ObReferenceObjectByHandle(EventHandle
,
364 if(NT_SUCCESS(Status
))
366 switch(EventInformationClass
)
368 case EventBasicInformation
:
370 PEVENT_BASIC_INFORMATION BasicInfo
= (PEVENT_BASIC_INFORMATION
)EventInformation
;
374 if (Event
->Header
.Type
== InternalNotificationEvent
)
375 BasicInfo
->EventType
= NotificationEvent
;
377 BasicInfo
->EventType
= SynchronizationEvent
;
378 BasicInfo
->EventState
= KeReadStateEvent(Event
);
380 if(ReturnLength
!= NULL
)
382 *ReturnLength
= sizeof(EVENT_BASIC_INFORMATION
);
387 Status
= _SEH_GetExceptionCode();
394 Status
= STATUS_NOT_IMPLEMENTED
;
398 ObDereferenceObject(Event
);
409 NtResetEvent(IN HANDLE EventHandle
,
410 OUT PLONG PreviousState OPTIONAL
)
413 KPROCESSOR_MODE PreviousMode
;
414 NTSTATUS Status
= STATUS_SUCCESS
;
416 DPRINT("NtResetEvent(EventHandle 0%x PreviousState 0%x)\n",
417 EventHandle
, PreviousState
);
419 PreviousMode
= ExGetPreviousMode();
421 if(PreviousState
!= NULL
&& PreviousMode
== UserMode
)
425 ProbeForWrite(PreviousState
,
431 Status
= _SEH_GetExceptionCode();
435 if(!NT_SUCCESS(Status
))
441 Status
= ObReferenceObjectByHandle(EventHandle
,
447 if(NT_SUCCESS(Status
))
449 LONG Prev
= KeResetEvent(Event
);
450 ObDereferenceObject(Event
);
452 if(PreviousState
!= NULL
)
456 *PreviousState
= Prev
;
460 Status
= _SEH_GetExceptionCode();
474 NtSetEvent(IN HANDLE EventHandle
,
475 OUT PLONG PreviousState OPTIONAL
)
478 KPROCESSOR_MODE PreviousMode
;
479 NTSTATUS Status
= STATUS_SUCCESS
;
481 DPRINT("NtSetEvent(EventHandle 0%x PreviousState 0%x)\n",
482 EventHandle
, PreviousState
);
484 PreviousMode
= ExGetPreviousMode();
486 if(PreviousState
!= NULL
&& PreviousMode
== UserMode
)
490 ProbeForWrite(PreviousState
,
496 Status
= _SEH_GetExceptionCode();
500 if(!NT_SUCCESS(Status
))
506 Status
= ObReferenceObjectByHandle(EventHandle
,
512 if(NT_SUCCESS(Status
))
514 LONG Prev
= KeSetEvent(Event
, EVENT_INCREMENT
, FALSE
);
515 ObDereferenceObject(Event
);
517 if(PreviousState
!= NULL
)
521 *PreviousState
= Prev
;
525 Status
= _SEH_GetExceptionCode();
541 IN ULONG TraceHandle
,
543 IN ULONG TraceHeaderLength
,
544 IN
struct _EVENT_TRACE_HEADER
* TraceHeader
548 return STATUS_NOT_IMPLEMENTED
;