c21129e29277ee4c3cc642f2ff0e6df7cf82fe85
[reactos.git] / reactos / ntoskrnl / io / iomgr / ioevent.c
1 /*
2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: ntoskrnl/io/event.c
5 * PURPOSE: I/O Wrappers for the Executive Event Functions
6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
7 * Eric Kohl
8 */
9
10 /* INCLUDES *****************************************************************/
11
12 #include <ntoskrnl.h>
13 #include <debug.h>
14
15 /* PRIVATE FUNCTIONS *********************************************************/
16
17 PKEVENT
18 NTAPI
19 IopCreateEvent(IN PUNICODE_STRING EventName,
20 IN PHANDLE EventHandle,
21 IN EVENT_TYPE Type)
22 {
23 OBJECT_ATTRIBUTES ObjectAttributes;
24 PKEVENT Event;
25 HANDLE Handle;
26 NTSTATUS Status;
27 PAGED_CODE();
28
29 /* Initialize the object attributes */
30 InitializeObjectAttributes(&ObjectAttributes,
31 EventName,
32 OBJ_OPENIF | OBJ_KERNEL_HANDLE,
33 NULL,
34 NULL);
35
36 /* Create the event */
37 Status = ZwCreateEvent(&Handle,
38 EVENT_ALL_ACCESS,
39 &ObjectAttributes,
40 Type,
41 TRUE);
42 if (!NT_SUCCESS(Status)) return NULL;
43
44 /* Get a handle to it */
45 Status = ObReferenceObjectByHandle(Handle,
46 0,
47 ExEventObjectType,
48 KernelMode,
49 (PVOID*)&Event,
50 NULL);
51 if (!NT_SUCCESS(Status))
52 {
53 ZwClose(Handle);
54 return NULL;
55 }
56
57 /* Dereference the extra count, and return the handle */
58 ObDereferenceObject(Event);
59 *EventHandle = Handle;
60 return Event;
61 }
62
63 /* PUBLIC FUNCTIONS **********************************************************/
64
65 /*
66 * @implemented
67 */
68 PKEVENT
69 NTAPI
70 IoCreateNotificationEvent(IN PUNICODE_STRING EventName,
71 IN PHANDLE EventHandle)
72 {
73 /* Call the internal API */
74 return IopCreateEvent(EventName, EventHandle, NotificationEvent);
75 }
76
77 /*
78 * @implemented
79 */
80 PKEVENT
81 NTAPI
82 IoCreateSynchronizationEvent(IN PUNICODE_STRING EventName,
83 IN PHANDLE EventHandle)
84 {
85 /* Call the internal API */
86 return IopCreateEvent(EventName, EventHandle, SynchronizationEvent);
87 }
88
89 /* EOF */