ReactOS 0.4.16-dev-1946-g52006dd
event.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Kernel
4 * FILE: ntoskrnl/ex/event.c
5 * PURPOSE: Event support
6 * PROGRAMMERS: Alex Ionescu(alex@relsoft.net)
7 * Thomas Weidenmueller
8 */
9
10/* INCLUDES *****************************************************************/
11
12#include <ntoskrnl.h>
13#define NDEBUG
14#include <debug.h>
15
16/* GLOBALS *******************************************************************/
17
19
21{
26};
27
29{
30 /* EventBasicInformation */
32};
33
34/* FUNCTIONS *****************************************************************/
35
36CODE_SEG("INIT")
40{
41 OBJECT_TYPE_INITIALIZER ObjectTypeInitializer;
44 DPRINT("Creating Event Object Type\n");
45
46 /* Create the Event Object Type */
47 RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer));
48 RtlInitUnicodeString(&Name, L"Event");
49 ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer);
50 ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(KEVENT);
51 ObjectTypeInitializer.GenericMapping = ExpEventMapping;
52 ObjectTypeInitializer.PoolType = NonPagedPool;
53 ObjectTypeInitializer.ValidAccessMask = EVENT_ALL_ACCESS;
54 ObjectTypeInitializer.InvalidAttributes = OBJ_OPENLINK;
55 Status = ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &ExEventObjectType);
56 if (!NT_SUCCESS(Status)) return FALSE;
57 return TRUE;
58}
59
60/*
61 * @implemented
62 */
66{
69 PAGED_CODE();
70
71 /* Reference the Object */
76 (PVOID*)&Event,
77 NULL);
78
79 /* Check for Success */
81 {
82 /* Clear the Event and Dereference */
85 }
86
87 /* Return Status */
88 return Status;
89}
90
91/*
92 * @implemented
93 */
101{
106 PAGED_CODE();
107 DPRINT("NtCreateEvent(0x%p, 0x%x, 0x%p)\n",
109
110 /* Validate the event type */
111 if ((EventType != NotificationEvent) &&
113 {
115 }
116
117 /* Check if we were called from user-mode */
119 {
120 /* Enter SEH Block */
122 {
123 /* Check handle pointer */
125 }
127 {
128 /* Return the exception code */
130 }
131 _SEH2_END;
132 }
133
134 /* Create the Object */
139 NULL,
140 sizeof(KEVENT),
141 0,
142 0,
143 (PVOID*)&Event);
144 if (!NT_SUCCESS(Status))
145 {
146 DPRINT1("ObCreateObject failed: 0x%X\n", Status);
147 return Status;
148 }
149
150 /* Initialize the Event */
152
153 /* Insert it */
155 NULL,
157 0,
158 NULL,
159 &hEvent);
160 if (!NT_SUCCESS(Status))
161 {
162 DPRINT1("ObInsertObject failed: 0x%X\n", Status);
163 /* Note: ObInsertObject dereferences Event on failure */
164 return Status;
165 }
166
167 /* Enter SEH for return */
169 {
170 /* Return the handle to the caller */
172 }
174 {
175 /* Get the exception code */
177 }
178 _SEH2_END;
179
180 /* Return Status */
181 return Status;
182}
183
184/*
185 * @implemented
186 */
188NTAPI
192{
196 PAGED_CODE();
197 DPRINT("NtOpenEvent(0x%p, 0x%x, 0x%p)\n",
199
200 /* Check if we were called from user-mode */
202 {
203 /* Enter SEH Block */
205 {
206 /* Check handle pointer */
208 }
210 {
211 /* Return the exception code */
213 }
214 _SEH2_END;
215 }
216
217 /* Open the Object */
221 NULL,
223 NULL,
224 &hEvent);
225
226 /* Check for success */
227 if (NT_SUCCESS(Status))
228 {
229 /* Enter SEH for return */
231 {
232 /* Return the handle to the caller */
234 }
236 {
237 /* Get the exception code */
239 }
240 _SEH2_END;
241 }
242
243 /* Return status */
244 return Status;
245}
246
247/*
248 * @implemented
249 */
251NTAPI
254{
258 PAGED_CODE();
259 DPRINT("NtPulseEvent(EventHandle 0%p PreviousState 0%p)\n",
261
262 /* Check if we were called from user-mode */
264 {
265 /* Entry SEH Block */
267 {
268 /* Make sure the state pointer is valid */
270 }
272 {
273 /* Return the exception code */
275 }
276 _SEH2_END;
277 }
278
279 /* Open the Object */
284 (PVOID*)&Event,
285 NULL);
286
287 /* Check for success */
288 if(NT_SUCCESS(Status))
289 {
290 /* Pulse the Event */
293
294 /* Check if caller wants the old state back */
295 if(PreviousState)
296 {
297 /* Entry SEH Block for return */
299 {
300 /* Return previous state */
301 *PreviousState = Prev;
302 }
304 {
305 /* Get the exception code */
307 }
308 _SEH2_END;
309 }
310 }
311
312 /* Return Status */
313 return Status;
314}
315
316/*
317 * @implemented
318 */
320NTAPI
322 IN EVENT_INFORMATION_CLASS EventInformationClass,
323 OUT PVOID EventInformation,
324 IN ULONG EventInformationLength,
326{
330 PEVENT_BASIC_INFORMATION BasicInfo =
331 (PEVENT_BASIC_INFORMATION)EventInformation;
332 PAGED_CODE();
333 DPRINT("NtQueryEvent(0x%p, 0x%x)\n", EventHandle, EventInformationClass);
334
335 /* Check buffers and class validity */
336 Status = DefaultQueryInfoBufferCheck(EventInformationClass,
338 sizeof(ExEventInfoClass) /
339 sizeof(ExEventInfoClass[0]),
341 EventInformation,
342 EventInformationLength,
344 NULL,
346 if(!NT_SUCCESS(Status))
347 {
348 /* Invalid buffers */
349 DPRINT("NtQuerySemaphore() failed, Status: 0x%x\n", Status);
350 return Status;
351 }
352
353 /* Get the Object */
358 (PVOID*)&Event,
359 NULL);
360
361 /* Check for success */
362 if(NT_SUCCESS(Status))
363 {
364 /* Entry SEH Block */
366 {
367 /* Return Event Type and State */
368 BasicInfo->EventType = Event->Header.Type;
369 BasicInfo->EventState = KeReadStateEvent(Event);
370
371 /* Return length */
373 }
375 {
376 /* Get the exception code */
378 }
379 _SEH2_END;
380
381 /* Dereference the Object */
383 }
384
385 /* Return status */
386 return Status;
387}
388
389/*
390 * @implemented
391 */
393NTAPI
396{
400 PAGED_CODE();
401 DPRINT("NtResetEvent(EventHandle 0%p PreviousState 0%p)\n",
403
404 /* Check if we were called from user-mode */
406 {
407 /* Entry SEH Block */
409 {
410 /* Make sure the state pointer is valid */
412 }
414 {
415 /* Return the exception code */
417 }
418 _SEH2_END;
419 }
420
421 /* Open the Object */
426 (PVOID*)&Event,
427 NULL);
428
429 /* Check for success */
430 if(NT_SUCCESS(Status))
431 {
432 /* Reset the Event */
433 LONG Prev = KeResetEvent(Event);
435
436 /* Check if caller wants the old state back */
437 if(PreviousState)
438 {
439 /* Entry SEH Block for return */
441 {
442 /* Return previous state */
443 *PreviousState = Prev;
444 }
446 {
447 /* Get the exception code */
449 }
450 _SEH2_END;
451 }
452 }
453
454 /* Return Status */
455 return Status;
456}
457
458/*
459 * @implemented
460 */
462NTAPI
465{
469 PAGED_CODE();
470 DPRINT("NtSetEvent(EventHandle 0%p PreviousState 0%p)\n",
472
473 /* Check if we were called from user-mode */
475 {
476 /* Entry SEH Block */
478 {
479 /* Make sure the state pointer is valid */
481 }
483 {
484 /* Return the exception code */
486 }
487 _SEH2_END;
488 }
489
490 /* Open the Object */
495 (PVOID*)&Event,
496 NULL);
497 if (NT_SUCCESS(Status))
498 {
499 /* Set the Event */
502
503 /* Check if caller wants the old state back */
504 if (PreviousState)
505 {
506 /* Entry SEH Block for return */
508 {
509 /* Return previous state */
510 *PreviousState = Prev;
511 }
513 {
515 }
516 _SEH2_END;
517 }
518 }
519
520 /* Return Status */
521 return Status;
522}
523
524/*
525 * @implemented
526 */
528NTAPI
530{
533 PAGED_CODE();
534
535 /* Open the Object */
540 (PVOID*)&Event,
541 NULL);
542 if (NT_SUCCESS(Status))
543 {
544 /* Set the Event */
547 }
548
549 /* Return Status */
550 return Status;
551}
552
553/* EOF */
#define PAGED_CODE()
#define CODE_SEG(...)
_In_ PVOID _In_ ULONG _Out_ PVOID _In_ ULONG _Inout_ PULONG ReturnLength
_In_ PVOID _In_ ULONG _Out_ PVOID _In_ ULONG _Inout_ PULONG _In_ KPROCESSOR_MODE PreviousMode
unsigned char BOOLEAN
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
LPWSTR Name
Definition: desk.c:124
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define L(x)
Definition: resources.c:13
#define KEVENT
Definition: env_spec_w32.h:69
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
#define KeSetEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:476
#define NonPagedPool
Definition: env_spec_w32.h:307
LONG NTAPI KePulseEvent(IN PKEVENT Event, IN KPRIORITY Increment, IN BOOLEAN Wait)
Definition: eventobj.c:69
VOID NTAPI KeClearEvent(IN PKEVENT Event)
Definition: eventobj.c:22
VOID NTAPI KeSetEventBoostPriority(IN PKEVENT Event, IN PKTHREAD *WaitingThread OPTIONAL)
Definition: eventobj.c:230
LONG NTAPI KeReadStateEvent(IN PKEVENT Event)
Definition: eventobj.c:121
LONG NTAPI KeResetEvent(IN PKEVENT Event)
Definition: eventobj.c:134
#define ExGetPreviousMode
Definition: ex.h:143
Status
Definition: gdiplustypes.h:25
LONG NTAPI ExSystemExceptionFilter(VOID)
Definition: harderr.c:349
#define ICIF_QUERY
Definition: icif.h:18
#define IQS_SAME(Type, Alignment, Flags)
Definition: icif.h:37
#define ICIF_PROBE_READ_WRITE
Definition: icif.h:24
#define OBJ_OPENLINK
Definition: winternl.h:230
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:90
#define EVENT_ALL_ACCESS
Definition: isotest.c:82
#define EVENT_QUERY_STATE
Definition: security.c:53
static HANDLE hEvent
Definition: comm.c:54
_In_ ACCESS_MASK _In_opt_ POBJECT_ATTRIBUTES _In_ EVENT_TYPE EventType
Definition: exfuncs.h:167
_In_ ACCESS_MASK _In_opt_ POBJECT_ATTRIBUTES _In_ EVENT_TYPE _In_ BOOLEAN InitialState
Definition: exfuncs.h:169
enum _EVENT_INFORMATION_CLASS EVENT_INFORMATION_CLASS
struct _EVENT_BASIC_INFORMATION EVENT_BASIC_INFORMATION
struct _EVENT_BASIC_INFORMATION * PEVENT_BASIC_INFORMATION
#define KernelMode
Definition: asm.h:38
#define SYNCHRONIZE
Definition: nt_native.h:61
ULONG ACCESS_MASK
Definition: nt_native.h:40
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define STANDARD_RIGHTS_READ
Definition: nt_native.h:65
#define STANDARD_RIGHTS_WRITE
Definition: nt_native.h:66
#define STANDARD_RIGHTS_EXECUTE
Definition: nt_native.h:67
@ NotificationEvent
@ SynchronizationEvent
enum _EVENT_TYPE EVENT_TYPE
NTSTATUS NTAPI NtSetEventBoostPriority(IN HANDLE EventHandle)
Definition: event.c:529
NTSTATUS NTAPI NtPulseEvent(IN HANDLE EventHandle, OUT PLONG PreviousState OPTIONAL)
Definition: event.c:252
NTSTATUS NTAPI NtSetEvent(IN HANDLE EventHandle, OUT PLONG PreviousState OPTIONAL)
Definition: event.c:463
NTSTATUS NTAPI NtOpenEvent(OUT PHANDLE EventHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes)
Definition: event.c:189
NTSTATUS NTAPI NtResetEvent(IN HANDLE EventHandle, OUT PLONG PreviousState OPTIONAL)
Definition: event.c:394
BOOLEAN NTAPI ExpInitializeEventImplementation(VOID)
Definition: event.c:39
NTSTATUS NTAPI NtCreateEvent(OUT PHANDLE EventHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN EVENT_TYPE EventType, IN BOOLEAN InitialState)
Definition: event.c:96
NTSTATUS NTAPI NtQueryEvent(IN HANDLE EventHandle, IN EVENT_INFORMATION_CLASS EventInformationClass, OUT PVOID EventInformation, IN ULONG EventInformationLength, OUT PULONG ReturnLength OPTIONAL)
Definition: event.c:321
NTSTATUS NTAPI NtClearEvent(IN HANDLE EventHandle)
Definition: event.c:65
GENERIC_MAPPING ExpEventMapping
Definition: event.c:20
POBJECT_TYPE ExEventObjectType
Definition: event.c:18
static const INFORMATION_CLASS_INFO ExEventInfoClass[]
Definition: event.c:28
static __inline NTSTATUS DefaultQueryInfoBufferCheck(_In_ ULONG Class, _In_ const INFORMATION_CLASS_INFO *ClassList, _In_ ULONG ClassListEntries, _In_ ULONG Flags, _In_opt_ PVOID Buffer, _In_ ULONG BufferLength, _In_opt_ PULONG ReturnLength, _In_opt_ PULONG_PTR ReturnLengthPtr, _In_ KPROCESSOR_MODE PreviousMode)
Probe helper that validates the provided parameters whenever a NtQuery*** system call is invoked from...
Definition: probe.h:219
PVOID *typedef PHANDLE
Definition: ntsecpkg.h:455
NTSTATUS NTAPI ObInsertObject(IN PVOID Object, IN PACCESS_STATE AccessState OPTIONAL, IN ACCESS_MASK DesiredAccess, IN ULONG ObjectPointerBias, OUT PVOID *NewObject OPTIONAL, OUT PHANDLE Handle)
Definition: obhandle.c:2935
NTSTATUS NTAPI ObOpenObjectByName(IN POBJECT_ATTRIBUTES ObjectAttributes, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, IN PACCESS_STATE PassedAccessState, IN ACCESS_MASK DesiredAccess, IN OUT PVOID ParseContext, OUT PHANDLE Handle)
Definition: obhandle.c:2532
NTSTATUS NTAPI ObCreateObject(IN KPROCESSOR_MODE ProbeMode OPTIONAL, IN POBJECT_TYPE Type, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN KPROCESSOR_MODE AccessMode, IN OUT PVOID ParseContext OPTIONAL, IN ULONG ObjectSize, IN ULONG PagedPoolCharge OPTIONAL, IN ULONG NonPagedPoolCharge OPTIONAL, OUT PVOID *Object)
Definition: oblife.c:1039
NTSTATUS NTAPI ObCreateObjectType(IN PUNICODE_STRING TypeName, IN POBJECT_TYPE_INITIALIZER ObjectTypeInitializer, IN PVOID Reserved, OUT POBJECT_TYPE *ObjectType)
Definition: oblife.c:1136
NTSTATUS NTAPI ObReferenceObjectByHandle(IN HANDLE Handle, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object, OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL)
Definition: obref.c:494
long LONG
Definition: pedump.c:60
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:181
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:82
#define _SEH2_END
Definition: pseh2_64.h:171
#define _SEH2_TRY
Definition: pseh2_64.h:71
#define _SEH2_YIELD(__stmt)
Definition: pseh2_64.h:184
#define ProbeForWriteLong(Ptr)
Definition: probe.h:37
#define ProbeForWriteHandle(Ptr)
Definition: probe.h:43
#define DPRINT
Definition: sndvol32.h:73
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
EVENT_TYPE EventType
Definition: extypes.h:902
GENERIC_MAPPING GenericMapping
Definition: obtypes.h:358
ULONG DefaultNonPagedPoolCharge
Definition: obtypes.h:365
uint32_t * PULONG
Definition: typedefs.h:59
#define NTAPI
Definition: typedefs.h:36
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define IN
Definition: typedefs.h:39
int32_t * PLONG
Definition: typedefs.h:58
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
_In_ WDF_POWER_DEVICE_STATE PreviousState
Definition: wdfdevice.h:829
_Must_inspect_result_ _In_ WDFDEVICE _In_ ULONG _In_ ACCESS_MASK DesiredAccess
Definition: wdfdevice.h:2664
#define EVENT_MODIFY_STATE
Definition: winbase.h:165
_Out_ PHANDLE EventHandle
Definition: iofuncs.h:857
#define EVENT_INCREMENT
Definition: iotypes.h:597
CCHAR KPROCESSOR_MODE
Definition: ketypes.h:7
#define ObDereferenceObject
Definition: obfuncs.h:203