ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

evtpair.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.