Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenevtpair.c
Go to the documentation of this file.
00001 /* 00002 * COPYRIGHT: See COPYING in the top level directory 00003 * PROJECT: ReactOS Kernel 00004 * FILE: ntoskrnl/ex/evtpair.c 00005 * PURPOSE: Support for event pairs 00006 * PROGRAMMERS: Alex Ionescu (alex@relsoft.net) 00007 * Thomas Weidenmueller 00008 */ 00009 00010 /* INCLUDES *****************************************************************/ 00011 00012 #include <ntoskrnl.h> 00013 #define NDEBUG 00014 #include <debug.h> 00015 00016 #if defined (ALLOC_PRAGMA) 00017 #pragma alloc_text(INIT, ExpInitializeEventPairImplementation) 00018 #endif 00019 00020 /* GLOBALS *******************************************************************/ 00021 00022 POBJECT_TYPE ExEventPairObjectType = NULL; 00023 00024 GENERIC_MAPPING ExEventPairMapping = 00025 { 00026 STANDARD_RIGHTS_READ, 00027 STANDARD_RIGHTS_WRITE, 00028 STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE, 00029 EVENT_PAIR_ALL_ACCESS 00030 }; 00031 00032 /* FUNCTIONS *****************************************************************/ 00033 00034 VOID 00035 INIT_FUNCTION 00036 NTAPI 00037 ExpInitializeEventPairImplementation(VOID) 00038 { 00039 OBJECT_TYPE_INITIALIZER ObjectTypeInitializer; 00040 UNICODE_STRING Name; 00041 DPRINT("Creating Event Pair Object Type\n"); 00042 00043 /* Create the Event Pair Object Type */ 00044 RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer)); 00045 RtlInitUnicodeString(&Name, L"EventPair"); 00046 ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer); 00047 ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(KEVENT_PAIR); 00048 ObjectTypeInitializer.GenericMapping = ExEventPairMapping; 00049 ObjectTypeInitializer.PoolType = NonPagedPool; 00050 ObjectTypeInitializer.ValidAccessMask = EVENT_PAIR_ALL_ACCESS; 00051 ObjectTypeInitializer.UseDefaultObject = TRUE; 00052 ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &ExEventPairObjectType); 00053 } 00054 00055 NTSTATUS 00056 NTAPI 00057 NtCreateEventPair(OUT PHANDLE EventPairHandle, 00058 IN ACCESS_MASK DesiredAccess, 00059 IN POBJECT_ATTRIBUTES ObjectAttributes) 00060 { 00061 PKEVENT_PAIR EventPair; 00062 HANDLE hEventPair; 00063 KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); 00064 NTSTATUS Status; 00065 PAGED_CODE(); 00066 DPRINT("NtCreateEventPair: 0x%p\n", EventPairHandle); 00067 00068 /* Check if we were called from user-mode */ 00069 if (PreviousMode != KernelMode) 00070 { 00071 /* Enter SEH Block */ 00072 _SEH2_TRY 00073 { 00074 /* Check handle pointer */ 00075 ProbeForWriteHandle(EventPairHandle); 00076 } 00077 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) 00078 { 00079 /* Return the exception code */ 00080 _SEH2_YIELD(return _SEH2_GetExceptionCode()); 00081 } 00082 _SEH2_END; 00083 } 00084 00085 /* Create the Object */ 00086 DPRINT("Creating EventPair\n"); 00087 Status = ObCreateObject(PreviousMode, 00088 ExEventPairObjectType, 00089 ObjectAttributes, 00090 PreviousMode, 00091 NULL, 00092 sizeof(KEVENT_PAIR), 00093 0, 00094 0, 00095 (PVOID*)&EventPair); 00096 00097 /* Check for Success */ 00098 if (NT_SUCCESS(Status)) 00099 { 00100 /* Initalize the Event */ 00101 DPRINT("Initializing EventPair\n"); 00102 KeInitializeEventPair(EventPair); 00103 00104 /* Insert it */ 00105 Status = ObInsertObject((PVOID)EventPair, 00106 NULL, 00107 DesiredAccess, 00108 0, 00109 NULL, 00110 &hEventPair); 00111 00112 /* Check for success */ 00113 if (NT_SUCCESS(Status)) 00114 { 00115 /* Enter SEH */ 00116 _SEH2_TRY 00117 { 00118 /* Return the handle */ 00119 *EventPairHandle = hEventPair; 00120 } 00121 _SEH2_EXCEPT(ExSystemExceptionFilter()) 00122 { 00123 /* Get the exception code */ 00124 Status = _SEH2_GetExceptionCode(); 00125 } 00126 _SEH2_END; 00127 } 00128 } 00129 00130 /* Return Status */ 00131 return Status; 00132 } 00133 00134 NTSTATUS 00135 NTAPI 00136 NtOpenEventPair(OUT PHANDLE EventPairHandle, 00137 IN ACCESS_MASK DesiredAccess, 00138 IN POBJECT_ATTRIBUTES ObjectAttributes) 00139 { 00140 HANDLE hEventPair; 00141 KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); 00142 NTSTATUS Status; 00143 PAGED_CODE(); 00144 00145 /* Check if we were called from user-mode */ 00146 if (PreviousMode != KernelMode) 00147 { 00148 /* Enter SEH Block */ 00149 _SEH2_TRY 00150 { 00151 /* Check handle pointer */ 00152 ProbeForWriteHandle(EventPairHandle); 00153 } 00154 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) 00155 { 00156 /* Return the exception code */ 00157 _SEH2_YIELD(return _SEH2_GetExceptionCode()); 00158 } 00159 _SEH2_END; 00160 } 00161 00162 /* Open the Object */ 00163 Status = ObOpenObjectByName(ObjectAttributes, 00164 ExEventPairObjectType, 00165 PreviousMode, 00166 NULL, 00167 DesiredAccess, 00168 NULL, 00169 &hEventPair); 00170 00171 /* Check for success */ 00172 if (NT_SUCCESS(Status)) 00173 { 00174 /* Enter SEH */ 00175 _SEH2_TRY 00176 { 00177 /* Return the handle */ 00178 *EventPairHandle = hEventPair; 00179 } 00180 _SEH2_EXCEPT(ExSystemExceptionFilter()) 00181 { 00182 /* Get the exception code */ 00183 Status = _SEH2_GetExceptionCode(); 00184 } 00185 _SEH2_END; 00186 } 00187 00188 /* Return status */ 00189 return Status; 00190 } 00191 00192 NTSTATUS 00193 NTAPI 00194 NtSetHighEventPair(IN HANDLE EventPairHandle) 00195 { 00196 PKEVENT_PAIR EventPair; 00197 KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); 00198 NTSTATUS Status; 00199 PAGED_CODE(); 00200 DPRINT("NtSetHighEventPair(EventPairHandle 0x%p)\n", EventPairHandle); 00201 00202 /* Open the Object */ 00203 Status = ObReferenceObjectByHandle(EventPairHandle, 00204 SYNCHRONIZE, 00205 ExEventPairObjectType, 00206 PreviousMode, 00207 (PVOID*)&EventPair, 00208 NULL); 00209 00210 /* Check for Success */ 00211 if(NT_SUCCESS(Status)) 00212 { 00213 /* Set the Event */ 00214 KeSetEvent(&EventPair->HighEvent, EVENT_INCREMENT, FALSE); 00215 00216 /* Dereference Object */ 00217 ObDereferenceObject(EventPair); 00218 } 00219 00220 /* Return status */ 00221 return Status; 00222 } 00223 00224 NTSTATUS 00225 NTAPI 00226 NtSetHighWaitLowEventPair(IN HANDLE EventPairHandle) 00227 { 00228 PKEVENT_PAIR EventPair; 00229 KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); 00230 NTSTATUS Status; 00231 PAGED_CODE(); 00232 DPRINT("NtSetHighWaitLowEventPair(Handle 0x%p)\n", EventPairHandle); 00233 00234 /* Open the Object */ 00235 Status = ObReferenceObjectByHandle(EventPairHandle, 00236 SYNCHRONIZE, 00237 ExEventPairObjectType, 00238 PreviousMode, 00239 (PVOID*)&EventPair, 00240 NULL); 00241 00242 /* Check for Success */ 00243 if(NT_SUCCESS(Status)) 00244 { 00245 /* Set the Event */ 00246 KeSetEvent(&EventPair->HighEvent, EVENT_INCREMENT, FALSE); 00247 00248 /* Wait for the Other one */ 00249 KeWaitForSingleObject(&EventPair->LowEvent, 00250 WrEventPair, 00251 PreviousMode, 00252 FALSE, 00253 NULL); 00254 00255 /* Dereference Object */ 00256 ObDereferenceObject(EventPair); 00257 } 00258 00259 /* Return status */ 00260 return Status; 00261 } 00262 00263 NTSTATUS 00264 NTAPI 00265 NtSetLowEventPair(IN HANDLE EventPairHandle) 00266 { 00267 PKEVENT_PAIR EventPair; 00268 KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); 00269 NTSTATUS Status; 00270 PAGED_CODE(); 00271 DPRINT1("NtSetHighEventPair(EventPairHandle 0x%p)\n", EventPairHandle); 00272 00273 /* Open the Object */ 00274 Status = ObReferenceObjectByHandle(EventPairHandle, 00275 SYNCHRONIZE, 00276 ExEventPairObjectType, 00277 PreviousMode, 00278 (PVOID*)&EventPair, 00279 NULL); 00280 00281 /* Check for Success */ 00282 if(NT_SUCCESS(Status)) 00283 { 00284 /* Set the Event */ 00285 KeSetEvent(&EventPair->LowEvent, EVENT_INCREMENT, FALSE); 00286 00287 /* Dereference Object */ 00288 ObDereferenceObject(EventPair); 00289 } 00290 00291 /* Return status */ 00292 return Status; 00293 } 00294 00295 NTSTATUS 00296 NTAPI 00297 NtSetLowWaitHighEventPair(IN HANDLE EventPairHandle) 00298 { 00299 PKEVENT_PAIR EventPair; 00300 KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); 00301 NTSTATUS Status; 00302 PAGED_CODE(); 00303 DPRINT("NtSetHighWaitLowEventPair(Handle 0x%p)\n", EventPairHandle); 00304 00305 /* Open the Object */ 00306 Status = ObReferenceObjectByHandle(EventPairHandle, 00307 SYNCHRONIZE, 00308 ExEventPairObjectType, 00309 PreviousMode, 00310 (PVOID*)&EventPair, 00311 NULL); 00312 00313 /* Check for Success */ 00314 if(NT_SUCCESS(Status)) 00315 { 00316 /* Set the Event */ 00317 KeSetEvent(&EventPair->LowEvent, EVENT_INCREMENT, FALSE); 00318 00319 /* Wait for the Other one */ 00320 KeWaitForSingleObject(&EventPair->HighEvent, 00321 WrEventPair, 00322 PreviousMode, 00323 FALSE, 00324 NULL); 00325 00326 /* Dereference Object */ 00327 ObDereferenceObject(EventPair); 00328 } 00329 00330 /* Return status */ 00331 return Status; 00332 } 00333 00334 00335 NTSTATUS 00336 NTAPI 00337 NtWaitLowEventPair(IN HANDLE EventPairHandle) 00338 { 00339 PKEVENT_PAIR EventPair; 00340 KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); 00341 NTSTATUS Status; 00342 PAGED_CODE(); 00343 DPRINT("NtSetHighWaitLowEventPair(Handle 0x%p)\n", EventPairHandle); 00344 00345 /* Open the Object */ 00346 Status = ObReferenceObjectByHandle(EventPairHandle, 00347 SYNCHRONIZE, 00348 ExEventPairObjectType, 00349 PreviousMode, 00350 (PVOID*)&EventPair, 00351 NULL); 00352 00353 /* Check for Success */ 00354 if(NT_SUCCESS(Status)) 00355 { 00356 /* Wait for the Event */ 00357 KeWaitForSingleObject(&EventPair->LowEvent, 00358 WrEventPair, 00359 PreviousMode, 00360 FALSE, 00361 NULL); 00362 00363 /* Dereference Object */ 00364 ObDereferenceObject(EventPair); 00365 } 00366 00367 /* Return status */ 00368 return Status; 00369 } 00370 00371 NTSTATUS 00372 NTAPI 00373 NtWaitHighEventPair(IN HANDLE EventPairHandle) 00374 { 00375 PKEVENT_PAIR EventPair; 00376 KPROCESSOR_MODE PreviousMode = ExGetPreviousMode(); 00377 NTSTATUS Status; 00378 00379 PAGED_CODE(); 00380 DPRINT("NtSetHighWaitLowEventPair(Handle 0x%p)\n", EventPairHandle); 00381 00382 /* Open the Object */ 00383 Status = ObReferenceObjectByHandle(EventPairHandle, 00384 SYNCHRONIZE, 00385 ExEventPairObjectType, 00386 PreviousMode, 00387 (PVOID*)&EventPair, 00388 NULL); 00389 00390 /* Check for Success */ 00391 if(NT_SUCCESS(Status)) 00392 { 00393 /* Wait for the Event */ 00394 KeWaitForSingleObject(&EventPair->HighEvent, 00395 WrEventPair, 00396 PreviousMode, 00397 FALSE, 00398 NULL); 00399 00400 /* Dereference Object */ 00401 ObDereferenceObject(EventPair); 00402 } 00403 00404 /* Return status */ 00405 return Status; 00406 } 00407 00408 /* EOF */ Generated on Fri May 25 2012 04:35:32 for ReactOS by
1.7.6.1
|