- Check that all pins have been closed when the last filter reference is gone
[reactos.git] / reactos / subsystems / win32 / win32k / eng / engevent.c
1 /*
2 * PROJECT: ReactOS Win32K
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: subsystems/win32/win32k/eng/engevent.c
5 * PURPOSE: Event Support Routines
6 * PROGRAMMERS: Aleksey Bragin <aleksey@reactos.org>
7 */
8
9 /* INCLUDES ******************************************************************/
10
11 #include <w32k.h>
12 #define NDEBUG
13 #include <debug.h>
14
15 #define TAG_ENG TAG('E', 'n', 'g', ' ')
16
17 /* PUBLIC FUNCTIONS **********************************************************/
18
19 BOOL
20 APIENTRY
21 EngCreateEvent(OUT PEVENT* Event)
22 {
23 PENG_EVENT EngEvent;
24
25 /* Allocate memory for the event structure */
26 EngEvent = EngAllocMem(FL_NONPAGED_MEMORY | FL_ZERO_MEMORY,
27 sizeof(ENG_EVENT),
28 TAG_ENG);
29
30 /* Check if we are out of memory */
31 if (!EngEvent)
32 {
33 /* We are, fail */
34 return FALSE;
35 }
36
37 /* Set KEVENT pointer */
38 EngEvent->pKEvent = &EngEvent->KEvent;
39
40 /* Initialize the kernel event */
41 KeInitializeEvent(EngEvent->pKEvent,
42 SynchronizationEvent,
43 FALSE);
44
45 /* Pass pointer to our structure to the caller */
46 *Event = EngEvent;
47
48 DPRINT("EngCreateEvent() created %p\n", EngEvent);
49
50 /* Return success */
51 return TRUE;
52 }
53
54 BOOL
55 APIENTRY
56 EngDeleteEvent(IN PEVENT Event)
57 {
58 DPRINT("EngDeleteEvent(%p)\n", Event);
59
60 /* Check if it's a usermapped event */
61 if (Event->fFlags & ENG_EVENT_USERMAPPED)
62 {
63 /* Disallow deletion of usermapped events */
64 DPRINT1("Driver attempted to delete a usermapped event!\n");
65 return FALSE;
66 }
67
68 /* Free the allocated memory */
69 EngFreeMem(Event);
70
71 /* Return success */
72 return TRUE;
73 }
74
75 VOID
76 APIENTRY
77 EngClearEvent(IN PEVENT Event)
78 {
79 /* Clear the event */
80 KeClearEvent(Event->pKEvent);
81 }
82
83 LONG
84 APIENTRY
85 EngSetEvent(IN PEVENT Event)
86 {
87 /* Set the event */
88 return KeSetEvent(Event->pKEvent,
89 IO_NO_INCREMENT,
90 FALSE);
91 }
92
93 LONG
94 APIENTRY
95 EngReadStateEvent(IN PEVENT Event)
96 {
97 /* Read the event state */
98 return KeReadStateEvent(Event->pKEvent);
99 }
100
101 PEVENT
102 APIENTRY
103 EngMapEvent(IN HDEV hDev,
104 IN HANDLE hUserObject,
105 IN PVOID Reserved1,
106 IN PVOID Reserved2,
107 IN PVOID Reserved3)
108 {
109 DPRINT("EngMapEvent(%x %x %p %p %p)\n", hDev, hUserObject, Reserved1, Reserved2, Reserved3);
110 UNIMPLEMENTED;
111 return NULL;
112 }
113
114 BOOL
115 APIENTRY
116 EngUnmapEvent(IN PEVENT Event)
117 {
118 DPRINT("EngUnmapEvent(%p)\n", Event);
119 UNIMPLEMENTED;
120 return FALSE;
121 }
122
123 BOOL
124 APIENTRY
125 EngWaitForSingleObject(IN PEVENT Event,
126 IN PLARGE_INTEGER TimeOut)
127 {
128 NTSTATUS Status;
129
130 DPRINT("EngWaitForSingleObject(%p %I64d)\n", Event, TimeOut->QuadPart);
131
132 /* Validate parameters */
133 if (!Event) return FALSE;
134
135 /* Check if it's a usermapped event and fail in that case */
136 if (Event->fFlags & ENG_EVENT_USERMAPPED)
137 {
138 /* Disallow deletion of usermapped events */
139 DPRINT1("Driver attempted to wait on a usermapped event!\n");
140 return FALSE;
141 }
142
143 /* Wait for the event */
144 Status = KeWaitForSingleObject(Event->pKEvent,
145 Executive,
146 KernelMode,
147 FALSE,
148 TimeOut);
149
150 /* Check if there is a failure or a timeout */
151 if (!NT_SUCCESS(Status))
152 {
153 /* Return failure */
154 return FALSE;
155 }
156
157 /* Return success */
158 return TRUE;
159 }