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
,
45 /* FUNCTIONS *****************************************************************/
48 NtpCreateEvent(PVOID ObjectBody
,
51 POBJECT_ATTRIBUTES ObjectAttributes
)
53 DPRINT("NtpCreateEvent(ObjectBody %x, Parent %x, RemainingPath %S)\n",
54 ObjectBody
, Parent
, RemainingPath
);
56 if (RemainingPath
!= NULL
&& wcschr(RemainingPath
+1, '\\') != NULL
)
58 return(STATUS_UNSUCCESSFUL
);
61 return(STATUS_SUCCESS
);
66 ExpInitializeEventImplementation(VOID
)
68 ExEventObjectType
= ExAllocatePool(NonPagedPool
,sizeof(OBJECT_TYPE
));
70 RtlCreateUnicodeString(&ExEventObjectType
->TypeName
, L
"Event");
72 ExEventObjectType
->Tag
= TAG('E', 'V', 'T', 'T');
73 ExEventObjectType
->PeakObjects
= 0;
74 ExEventObjectType
->PeakHandles
= 0;
75 ExEventObjectType
->TotalObjects
= 0;
76 ExEventObjectType
->TotalHandles
= 0;
77 ExEventObjectType
->PagedPoolCharge
= 0;
78 ExEventObjectType
->NonpagedPoolCharge
= sizeof(KEVENT
);
79 ExEventObjectType
->Mapping
= &ExpEventMapping
;
80 ExEventObjectType
->Dump
= NULL
;
81 ExEventObjectType
->Open
= NULL
;
82 ExEventObjectType
->Close
= NULL
;
83 ExEventObjectType
->Delete
= NULL
;
84 ExEventObjectType
->Parse
= NULL
;
85 ExEventObjectType
->Security
= NULL
;
86 ExEventObjectType
->QueryName
= NULL
;
87 ExEventObjectType
->OkayToClose
= NULL
;
88 ExEventObjectType
->Create
= NtpCreateEvent
;
89 ExEventObjectType
->DuplicationNotify
= NULL
;
91 ObpCreateTypeObject(ExEventObjectType
);
96 NtClearEvent(IN HANDLE EventHandle
)
101 Status
= ObReferenceObjectByHandle(EventHandle
,
107 if (!NT_SUCCESS(Status
))
112 ObDereferenceObject(Event
);
113 return(STATUS_SUCCESS
);
121 NtCreateEvent(OUT PHANDLE EventHandle
,
122 IN ACCESS_MASK DesiredAccess
,
123 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
124 IN EVENT_TYPE EventType
,
125 IN BOOLEAN InitialState
)
131 NtCreateEvent(OUT PHANDLE EventHandle
,
132 IN ACCESS_MASK DesiredAccess
,
133 IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL
,
134 IN EVENT_TYPE EventType
,
135 IN BOOLEAN InitialState
)
137 KPROCESSOR_MODE PreviousMode
;
140 NTSTATUS Status
= STATUS_SUCCESS
;
142 PreviousMode
= ExGetPreviousMode();
144 if(PreviousMode
== UserMode
)
148 ProbeForWrite(EventHandle
,
154 Status
= _SEH_GetExceptionCode();
159 Status
= ObCreateObject(PreviousMode
,
168 if(NT_SUCCESS(Status
))
170 KeInitializeEvent(Event
,
175 Status
= ObInsertObject((PVOID
)Event
,
181 ObDereferenceObject(Event
);
183 if(NT_SUCCESS(Status
))
187 *EventHandle
= hEvent
;
191 Status
= _SEH_GetExceptionCode();
202 NtOpenEvent(OUT PHANDLE EventHandle
,
203 IN ACCESS_MASK DesiredAccess
,
204 IN POBJECT_ATTRIBUTES ObjectAttributes
)
209 DPRINT("ObjectName '%wZ'\n", ObjectAttributes
->ObjectName
);
211 Status
= ObOpenObjectByName(ObjectAttributes
,
219 if (!NT_SUCCESS(Status
))
224 Status
= MmCopyToCaller(EventHandle
, &hEvent
, sizeof(HANDLE
));
225 if (!NT_SUCCESS(Status
))
227 ZwClose(EventHandle
);
236 NtPulseEvent(IN HANDLE EventHandle
,
237 OUT PLONG PreviousState OPTIONAL
)
242 DPRINT("NtPulseEvent(EventHandle %x PreviousState %x)\n",
243 EventHandle
, PreviousState
);
245 Status
= ObReferenceObjectByHandle(EventHandle
,
251 if (!NT_SUCCESS(Status
))
256 KePulseEvent(Event
, EVENT_INCREMENT
, FALSE
);
258 ObDereferenceObject(Event
);
259 return(STATUS_SUCCESS
);
264 NtQueryEvent(IN HANDLE EventHandle
,
265 IN EVENT_INFORMATION_CLASS EventInformationClass
,
266 OUT PVOID EventInformation
,
267 IN ULONG EventInformationLength
,
268 OUT PULONG ReturnLength OPTIONAL
)
270 EVENT_BASIC_INFORMATION Info
;
275 if (EventInformationClass
> EventBasicInformation
)
276 return STATUS_INVALID_INFO_CLASS
;
278 if (EventInformationLength
< sizeof(EVENT_BASIC_INFORMATION
))
279 return STATUS_INFO_LENGTH_MISMATCH
;
281 Status
= ObReferenceObjectByHandle(EventHandle
,
287 if (!NT_SUCCESS(Status
))
290 if (Event
->Header
.Type
== InternalNotificationEvent
)
291 Info
.EventType
= NotificationEvent
;
293 Info
.EventType
= SynchronizationEvent
;
294 Info
.EventState
= KeReadStateEvent(Event
);
296 Status
= MmCopyToCaller(EventInformation
, &Event
,
297 sizeof(EVENT_BASIC_INFORMATION
));
298 if (!NT_SUCCESS(Status
))
300 ObDereferenceObject(Event
);
304 if (ReturnLength
!= NULL
)
306 RetLen
= sizeof(EVENT_BASIC_INFORMATION
);
307 Status
= MmCopyToCaller(ReturnLength
, &RetLen
, sizeof(ULONG
));
308 if (!NT_SUCCESS(Status
))
310 ObDereferenceObject(Event
);
315 ObDereferenceObject(Event
);
316 return(STATUS_SUCCESS
);
321 NtResetEvent(IN HANDLE EventHandle
,
322 OUT PLONG PreviousState OPTIONAL
)
327 DPRINT("NtResetEvent(EventHandle %x)\n", EventHandle
);
329 Status
= ObReferenceObjectByHandle(EventHandle
,
335 if (!NT_SUCCESS(Status
))
340 ObDereferenceObject(Event
);
341 return(STATUS_SUCCESS
);
349 NtSetEvent(IN HANDLE EventHandle
,
350 OUT PLONG PreviousState OPTIONAL
)
355 DPRINT("NtSetEvent(EventHandle %x)\n", EventHandle
);
357 Status
= ObReferenceObjectByHandle(EventHandle
,
363 if (!NT_SUCCESS(Status
))
367 KeSetEvent(Event
,EVENT_INCREMENT
,FALSE
);
368 ObDereferenceObject(Event
);
369 return(STATUS_SUCCESS
);
378 IN ULONG TraceHandle
,
380 IN ULONG TraceHeaderLength
,
381 IN
struct _EVENT_TRACE_HEADER
* TraceHeader
385 return STATUS_NOT_IMPLEMENTED
;