3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/nt/evtpair.c
6 * PURPOSE: Support for event pairs
7 * PROGRAMMER: David Welch (welch@mcmail.com)
12 /* INCLUDES *****************************************************************/
14 #include <ddk/ntddk.h>
15 #include <ntos/synch.h>
19 #include <internal/debug.h>
22 /* GLOBALS *******************************************************************/
24 POBJECT_TYPE EXPORTED ExEventPairObjectType = NULL;
26 static GENERIC_MAPPING ExEventPairMapping = {
28 STANDARD_RIGHTS_WRITE,
29 STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE,
30 EVENT_PAIR_ALL_ACCESS};
32 /* FUNCTIONS *****************************************************************/
35 NtpCreateEventPair(PVOID ObjectBody,
38 POBJECT_ATTRIBUTES ObjectAttributes)
40 DPRINT("NtpCreateEventPair(ObjectBody %x, Parent %x, RemainingPath %S)\n",
41 ObjectBody, Parent, RemainingPath);
43 if (RemainingPath != NULL && wcschr(RemainingPath+1, '\\') != NULL)
45 return(STATUS_UNSUCCESSFUL);
48 return(STATUS_SUCCESS);
51 VOID NtInitializeEventPairImplementation(VOID)
53 ExEventPairObjectType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
55 RtlCreateUnicodeString(&ExEventPairObjectType->TypeName, L"EventPair");
57 ExEventPairObjectType->MaxObjects = ULONG_MAX;
58 ExEventPairObjectType->MaxHandles = ULONG_MAX;
59 ExEventPairObjectType->TotalObjects = 0;
60 ExEventPairObjectType->TotalHandles = 0;
61 ExEventPairObjectType->PagedPoolCharge = 0;
62 ExEventPairObjectType->NonpagedPoolCharge = sizeof(KEVENT_PAIR);
63 ExEventPairObjectType->Mapping = &ExEventPairMapping;
64 ExEventPairObjectType->Dump = NULL;
65 ExEventPairObjectType->Open = NULL;
66 ExEventPairObjectType->Close = NULL;
67 ExEventPairObjectType->Delete = NULL;
68 ExEventPairObjectType->Parse = NULL;
69 ExEventPairObjectType->Security = NULL;
70 ExEventPairObjectType->QueryName = NULL;
71 ExEventPairObjectType->OkayToClose = NULL;
72 ExEventPairObjectType->Create = NtpCreateEventPair;
73 ExEventPairObjectType->DuplicationNotify = NULL;
78 NtCreateEventPair(OUT PHANDLE EventPairHandle,
79 IN ACCESS_MASK DesiredAccess,
80 IN POBJECT_ATTRIBUTES ObjectAttributes)
82 PKEVENT_PAIR EventPair;
85 DPRINT("NtCreateEventPair()\n");
86 Status = ObCreateObject(EventPairHandle,
89 ExEventPairObjectType,
91 if (!NT_SUCCESS(Status))
95 KeInitializeEvent(&EventPair->LowEvent,
98 KeInitializeEvent(&EventPair->HighEvent,
101 ObDereferenceObject(EventPair);
102 return(STATUS_SUCCESS);
107 NtOpenEventPair(OUT PHANDLE EventPairHandle,
108 IN ACCESS_MASK DesiredAccess,
109 IN POBJECT_ATTRIBUTES ObjectAttributes)
113 DPRINT("NtOpenEventPair()\n");
115 Status = ObOpenObjectByName(ObjectAttributes,
116 ExEventPairObjectType,
128 NtSetHighEventPair(IN HANDLE EventPairHandle)
130 PKEVENT_PAIR EventPair;
133 DPRINT("NtSetHighEventPair(EventPairHandle %x)\n",
136 Status = ObReferenceObjectByHandle(EventPairHandle,
137 EVENT_PAIR_ALL_ACCESS,
138 ExEventPairObjectType,
142 if (!NT_SUCCESS(Status))
145 KeSetEvent(&EventPair->HighEvent,
149 ObDereferenceObject(EventPair);
150 return(STATUS_SUCCESS);
155 NtSetHighWaitLowEventPair(IN HANDLE EventPairHandle)
157 PKEVENT_PAIR EventPair;
160 DPRINT("NtSetHighWaitLowEventPair(EventPairHandle %x)\n",
163 Status = ObReferenceObjectByHandle(EventPairHandle,
164 EVENT_PAIR_ALL_ACCESS,
165 ExEventPairObjectType,
169 if (!NT_SUCCESS(Status))
172 KeSetEvent(&EventPair->HighEvent,
176 KeWaitForSingleObject(&EventPair->LowEvent,
182 ObDereferenceObject(EventPair);
183 return(STATUS_SUCCESS);
188 NtSetLowEventPair(IN HANDLE EventPairHandle)
190 PKEVENT_PAIR EventPair;
193 DPRINT("NtSetLowEventPair(EventPairHandle %x)\n",
196 Status = ObReferenceObjectByHandle(EventPairHandle,
197 EVENT_PAIR_ALL_ACCESS,
198 ExEventPairObjectType,
202 if (!NT_SUCCESS(Status))
205 KeSetEvent(&EventPair->LowEvent,
209 ObDereferenceObject(EventPair);
210 return(STATUS_SUCCESS);
215 NtSetLowWaitHighEventPair(IN HANDLE EventPairHandle)
217 PKEVENT_PAIR EventPair;
220 DPRINT("NtSetLowWaitHighEventPair(EventPairHandle %x)\n",
223 Status = ObReferenceObjectByHandle(EventPairHandle,
224 EVENT_PAIR_ALL_ACCESS,
225 ExEventPairObjectType,
229 if (!NT_SUCCESS(Status))
232 KeSetEvent(&EventPair->LowEvent,
236 KeWaitForSingleObject(&EventPair->HighEvent,
242 ObDereferenceObject(EventPair);
243 return(STATUS_SUCCESS);
248 NtWaitLowEventPair(IN HANDLE EventPairHandle)
250 PKEVENT_PAIR EventPair;
253 DPRINT("NtWaitLowEventPair(EventPairHandle %x)\n",
256 Status = ObReferenceObjectByHandle(EventPairHandle,
257 EVENT_PAIR_ALL_ACCESS,
258 ExEventPairObjectType,
262 if (!NT_SUCCESS(Status))
265 KeWaitForSingleObject(&EventPair->LowEvent,
271 ObDereferenceObject(EventPair);
272 return(STATUS_SUCCESS);
277 NtWaitHighEventPair(IN HANDLE EventPairHandle)
279 PKEVENT_PAIR EventPair;
282 DPRINT("NtWaitHighEventPair(EventPairHandle %x)\n",
285 Status = ObReferenceObjectByHandle(EventPairHandle,
286 EVENT_PAIR_ALL_ACCESS,
287 ExEventPairObjectType,
291 if (!NT_SUCCESS(Status))
294 KeWaitForSingleObject(&EventPair->HighEvent,
300 ObDereferenceObject(EventPair);
301 return(STATUS_SUCCESS);