- Fix some formatting.
[reactos.git] / reactos / ntoskrnl / ex / evtpair.c
index 05876a7..2378610 100644 (file)
@@ -1,12 +1,10 @@
 /*
  * COPYRIGHT:       See COPYING in the top level directory
- * PROJECT:         ReactOS kernel
+ * PROJECT:         ReactOS Kernel
  * FILE:            ntoskrnl/ex/evtpair.c
  * PURPOSE:         Support for event pairs
- *
- * PROGRAMMERS:     Alex Ionescu (Commented, reorganized, removed Thread Pair, used KeInitializeEventPair, added SEH)
- *                  David Welch (welch@mcmail.com)
- *                  Skywing (skywing@valhallalegends.com)
+ * PROGRAMMERS:     Alex Ionescu (alex@relsoft.net)
+ *                  Thomas Weidenmueller
  */
 
 /* INCLUDES *****************************************************************/
 #define NDEBUG
 #include <internal/debug.h>
 
+#if defined (ALLOC_PRAGMA)
+#pragma alloc_text(INIT, ExpInitializeEventPairImplementation)
+#endif
+
 /* GLOBALS *******************************************************************/
 
-POBJECT_TYPE EXPORTED ExEventPairObjectType = NULL;
+POBJECT_TYPE ExEventPairObjectType = NULL;
 
-static GENERIC_MAPPING ExEventPairMapping = {
+GENERIC_MAPPING ExEventPairMapping =
+{
     STANDARD_RIGHTS_READ,
     STANDARD_RIGHTS_WRITE,
     STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE,
-    EVENT_PAIR_ALL_ACCESS};
-
+    EVENT_PAIR_ALL_ACCESS
+};
 
 /* FUNCTIONS *****************************************************************/
 
 VOID
 INIT_FUNCTION
+NTAPI
 ExpInitializeEventPairImplementation(VOID)
 {
+    OBJECT_TYPE_INITIALIZER ObjectTypeInitializer;
+    UNICODE_STRING Name;
+    DPRINT("Creating Event Pair Object Type\n");
+
     /* Create the Event Pair Object Type */
-    ExEventPairObjectType = ExAllocatePool(NonPagedPool,sizeof(OBJECT_TYPE));
-    RtlpCreateUnicodeString(&ExEventPairObjectType->TypeName, L"EventPair", NonPagedPool);
-    ExEventPairObjectType->Tag = TAG('E', 'v', 'P', 'a');
-    ExEventPairObjectType->PeakObjects = 0;
-    ExEventPairObjectType->PeakHandles = 0;
-    ExEventPairObjectType->TotalObjects = 0;
-    ExEventPairObjectType->TotalHandles = 0;
-    ExEventPairObjectType->PagedPoolCharge = 0;
-    ExEventPairObjectType->NonpagedPoolCharge = sizeof(KEVENT_PAIR);
-    ExEventPairObjectType->Mapping = &ExEventPairMapping;
-    ExEventPairObjectType->Dump = NULL;
-    ExEventPairObjectType->Open = NULL;
-    ExEventPairObjectType->Close = NULL;
-    ExEventPairObjectType->Delete = NULL;
-    ExEventPairObjectType->Parse = NULL;
-    ExEventPairObjectType->Security = NULL;
-    ExEventPairObjectType->QueryName = NULL;
-    ExEventPairObjectType->OkayToClose = NULL;
-    ExEventPairObjectType->Create = NULL;
-    ExEventPairObjectType->DuplicationNotify = NULL;
-    ObpCreateTypeObject(ExEventPairObjectType);
+    RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer));
+    RtlInitUnicodeString(&Name, L"EventPair");
+    ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer);
+    ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(KEVENT_PAIR);
+    ObjectTypeInitializer.GenericMapping = ExEventPairMapping;
+    ObjectTypeInitializer.PoolType = NonPagedPool;
+    ObjectTypeInitializer.ValidAccessMask = EVENT_PAIR_ALL_ACCESS;
+    ObjectTypeInitializer.UseDefaultObject = TRUE;
+    ObpCreateTypeObject(&ObjectTypeInitializer, &Name, &ExEventPairObjectType);
 }
 
 NTSTATUS
-STDCALL
+NTAPI
 NtCreateEventPair(OUT PHANDLE EventPairHandle,
                   IN ACCESS_MASK DesiredAccess,
                   IN POBJECT_ATTRIBUTES ObjectAttributes)
@@ -66,28 +62,30 @@ NtCreateEventPair(OUT PHANDLE EventPairHandle,
     HANDLE hEventPair;
     KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
     NTSTATUS Status = STATUS_SUCCESS;
-    
-    DPRINT1("NtCreateEventPair: %x\n", EventPairHandle);
-   
-    /* Check Output Safety */
-    if(PreviousMode == UserMode) {
-        
-        _SEH_TRY {
-            
-            ProbeForWrite(EventPairHandle,
-                          sizeof(HANDLE),
-                          sizeof(ULONG));
-        } _SEH_HANDLE {
-            
+    PAGED_CODE();
+    DPRINT("NtCreateEventPair: 0x%p\n", EventPairHandle);
+
+    /* Check if we were called from user-mode */
+    if(PreviousMode != KernelMode)
+    {
+        /* Enter SEH Block */
+        _SEH_TRY
+        {
+            /* Check handle pointer */
+            ProbeForWriteHandle(EventPairHandle);
+        }
+        _SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
+        {
             Status = _SEH_GetExceptionCode();
-        
-        } _SEH_END;
-     
+        }
+        _SEH_END;
+
+        /* Bail out if pointer was invalid */
         if(!NT_SUCCESS(Status)) return Status;
     }
-    
+
     /* Create the Object */
-    DPRINT1("Creating EventPair\n");
+    DPRINT("Creating EventPair\n");
     Status = ObCreateObject(PreviousMode,
                             ExEventPairObjectType,
                             ObjectAttributes,
@@ -97,14 +95,14 @@ NtCreateEventPair(OUT PHANDLE EventPairHandle,
                             0,
                             0,
                             (PVOID*)&EventPair);
-    
+
     /* Check for Success */
-    if(NT_SUCCESS(Status)) {
-        
+    if(NT_SUCCESS(Status))
+    {
         /* Initalize the Event */
-        DPRINT1("Initializing EventPair\n");
+        DPRINT("Initializing EventPair\n");
         KeInitializeEventPair(EventPair);
-        
+
         /* Insert it */
         Status = ObInsertObject((PVOID)EventPair,
                                  NULL,
@@ -113,19 +111,19 @@ NtCreateEventPair(OUT PHANDLE EventPairHandle,
                                  NULL,
                                  &hEventPair);
         ObDereferenceObject(EventPair);
+
         /* Check for success and return handle */
-        if(NT_SUCCESS(Status)) {
-            
-            _SEH_TRY {
-                
+        if(NT_SUCCESS(Status))
+        {
+            _SEH_TRY
+            {
                 *EventPairHandle = hEventPair;
-            
-            } _SEH_HANDLE {
-                
+            }
+            _SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
+            {
                 Status = _SEH_GetExceptionCode();
-                
-            _SEH_END;
+            }
+            _SEH_END;
         }
     }
 
@@ -133,9 +131,8 @@ NtCreateEventPair(OUT PHANDLE EventPairHandle,
     return Status;
 }
 
-
-NTSTATUS 
-STDCALL
+NTSTATUS
+NTAPI
 NtOpenEventPair(OUT PHANDLE EventPairHandle,
                 IN ACCESS_MASK DesiredAccess,
                 IN POBJECT_ATTRIBUTES ObjectAttributes)
@@ -143,24 +140,27 @@ NtOpenEventPair(OUT PHANDLE EventPairHandle,
     HANDLE hEventPair;
     KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
     NTSTATUS Status = STATUS_SUCCESS;
-   
-    /* Check Output Safety */
-    if(PreviousMode == UserMode) {
-        
-        _SEH_TRY {
-            
-            ProbeForWrite(EventPairHandle,
-                          sizeof(HANDLE),
-                          sizeof(ULONG));
-        } _SEH_HANDLE {
-            
+    PAGED_CODE();
+
+    /* Check if we were called from user-mode */
+    if(PreviousMode != KernelMode)
+    {
+        /* Enter SEH Block */
+        _SEH_TRY
+        {
+            /* Check handle pointer */
+            ProbeForWriteHandle(EventPairHandle);
+        }
+        _SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
+        {
             Status = _SEH_GetExceptionCode();
-        
-        } _SEH_END;
-     
+        }
+        _SEH_END;
+
+        /* Bail out if pointer was invalid */
         if(!NT_SUCCESS(Status)) return Status;
     }
-    
+
     /* Open the Object */
     Status = ObOpenObjectByName(ObjectAttributes,
                                 ExEventPairObjectType,
@@ -169,36 +169,35 @@ NtOpenEventPair(OUT PHANDLE EventPairHandle,
                                 DesiredAccess,
                                 NULL,
                                 &hEventPair);
-             
+
     /* Check for success and return handle */
-    if(NT_SUCCESS(Status)) {
-            
-        _SEH_TRY {
-            
+    if(NT_SUCCESS(Status))
+    {
+        _SEH_TRY
+        {
             *EventPairHandle = hEventPair;
-                
-        } _SEH_HANDLE {
-            
+        }
+        _SEH_EXCEPT(_SEH_ExSystemExceptionFilter)
+        {
             Status = _SEH_GetExceptionCode();
-            
-        _SEH_END;
+        }
+        _SEH_END;
     }
-   
+
     /* Return status */
     return Status;
 }
 
-
 NTSTATUS
-STDCALL
+NTAPI
 NtSetHighEventPair(IN HANDLE EventPairHandle)
 {
     PKEVENT_PAIR EventPair;
     KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
     NTSTATUS Status;
+    PAGED_CODE();
+    DPRINT("NtSetHighEventPair(EventPairHandle 0x%p)\n", EventPairHandle);
 
-    DPRINT1("NtSetHighEventPair(EventPairHandle %x)\n", EventPairHandle);
-   
     /* Open the Object */
     Status = ObReferenceObjectByHandle(EventPairHandle,
                                        SYNCHRONIZE,
@@ -206,32 +205,31 @@ NtSetHighEventPair(IN HANDLE EventPairHandle)
                                        PreviousMode,
                                        (PVOID*)&EventPair,
                                        NULL);
-    
+
     /* Check for Success */
-    if(NT_SUCCESS(Status)) {
-        
+    if(NT_SUCCESS(Status))
+    {
         /* Set the Event */
         KeSetEvent(&EventPair->HighEvent, EVENT_INCREMENT, FALSE);
 
         /* Dereference Object */
         ObDereferenceObject(EventPair);
     }
-   
+
     /* Return status */
     return Status;
 }
 
-
 NTSTATUS
-STDCALL
+NTAPI
 NtSetHighWaitLowEventPair(IN HANDLE EventPairHandle)
 {
     PKEVENT_PAIR EventPair;
     KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
     NTSTATUS Status;
+    PAGED_CODE();
+    DPRINT("NtSetHighWaitLowEventPair(Handle 0x%p)\n", EventPairHandle);
 
-    DPRINT1("NtSetHighWaitLowEventPair(EventPairHandle %x)\n", EventPairHandle);
-    
     /* Open the Object */
     Status = ObReferenceObjectByHandle(EventPairHandle,
                                        SYNCHRONIZE,
@@ -239,13 +237,13 @@ NtSetHighWaitLowEventPair(IN HANDLE EventPairHandle)
                                        PreviousMode,
                                        (PVOID*)&EventPair,
                                        NULL);
-    
+
     /* Check for Success */
-    if(NT_SUCCESS(Status)) {
-        
+    if(NT_SUCCESS(Status))
+    {
         /* Set the Event */
         KeSetEvent(&EventPair->HighEvent, EVENT_INCREMENT, FALSE);
-        
+
         /* Wait for the Other one */
         KeWaitForSingleObject(&EventPair->LowEvent,
                               WrEventPair,
@@ -256,21 +254,21 @@ NtSetHighWaitLowEventPair(IN HANDLE EventPairHandle)
         /* Dereference Object */
         ObDereferenceObject(EventPair);
     }
-   
+
     /* Return status */
     return Status;
 }
 
-NTSTATUS 
-STDCALL
+NTSTATUS
+NTAPI
 NtSetLowEventPair(IN HANDLE EventPairHandle)
 {
     PKEVENT_PAIR EventPair;
     KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
     NTSTATUS Status;
+    PAGED_CODE();
+    DPRINT1("NtSetHighEventPair(EventPairHandle 0x%p)\n", EventPairHandle);
 
-    DPRINT1("NtSetHighEventPair(EventPairHandle %x)\n", EventPairHandle);
-   
     /* Open the Object */
     Status = ObReferenceObjectByHandle(EventPairHandle,
                                        SYNCHRONIZE,
@@ -278,31 +276,31 @@ NtSetLowEventPair(IN HANDLE EventPairHandle)
                                        PreviousMode,
                                        (PVOID*)&EventPair,
                                        NULL);
-    
+
     /* Check for Success */
-    if(NT_SUCCESS(Status)) {
-        
+    if(NT_SUCCESS(Status))
+    {
         /* Set the Event */
         KeSetEvent(&EventPair->LowEvent, EVENT_INCREMENT, FALSE);
 
         /* Dereference Object */
         ObDereferenceObject(EventPair);
     }
-    
+
     /* Return status */
     return Status;
 }
 
-
-NTSTATUS STDCALL
+NTSTATUS
+NTAPI
 NtSetLowWaitHighEventPair(IN HANDLE EventPairHandle)
 {
     PKEVENT_PAIR EventPair;
     KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
     NTSTATUS Status;
+    PAGED_CODE();
+    DPRINT("NtSetHighWaitLowEventPair(Handle 0x%p)\n", EventPairHandle);
 
-    DPRINT1("NtSetHighWaitLowEventPair(EventPairHandle %x)\n", EventPairHandle);
-    
     /* Open the Object */
     Status = ObReferenceObjectByHandle(EventPairHandle,
                                        SYNCHRONIZE,
@@ -310,13 +308,13 @@ NtSetLowWaitHighEventPair(IN HANDLE EventPairHandle)
                                        PreviousMode,
                                        (PVOID*)&EventPair,
                                        NULL);
-    
+
     /* Check for Success */
-    if(NT_SUCCESS(Status)) {
-        
+    if(NT_SUCCESS(Status))
+    {
         /* Set the Event */
         KeSetEvent(&EventPair->LowEvent, EVENT_INCREMENT, FALSE);
-        
+
         /* Wait for the Other one */
         KeWaitForSingleObject(&EventPair->HighEvent,
                               WrEventPair,
@@ -327,22 +325,22 @@ NtSetLowWaitHighEventPair(IN HANDLE EventPairHandle)
         /* Dereference Object */
         ObDereferenceObject(EventPair);
     }
-   
+
     /* Return status */
     return Status;
 }
 
 
-NTSTATUS 
-STDCALL
+NTSTATUS
+NTAPI
 NtWaitLowEventPair(IN HANDLE EventPairHandle)
 {
     PKEVENT_PAIR EventPair;
     KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
     NTSTATUS Status;
+    PAGED_CODE();
+    DPRINT("NtSetHighWaitLowEventPair(Handle 0x%p)\n", EventPairHandle);
 
-    DPRINT1("NtSetHighWaitLowEventPair(EventPairHandle %x)\n", EventPairHandle);
-    
     /* Open the Object */
     Status = ObReferenceObjectByHandle(EventPairHandle,
                                        SYNCHRONIZE,
@@ -350,10 +348,10 @@ NtWaitLowEventPair(IN HANDLE EventPairHandle)
                                        PreviousMode,
                                        (PVOID*)&EventPair,
                                        NULL);
-    
+
     /* Check for Success */
-    if(NT_SUCCESS(Status)) {
-               
+    if(NT_SUCCESS(Status))
+    {
         /* Wait for the Event */
         KeWaitForSingleObject(&EventPair->LowEvent,
                               WrEventPair,
@@ -364,21 +362,22 @@ NtWaitLowEventPair(IN HANDLE EventPairHandle)
         /* Dereference Object */
         ObDereferenceObject(EventPair);
     }
-   
+
     /* Return status */
     return Status;
 }
 
-NTSTATUS 
-STDCALL
+NTSTATUS
+NTAPI
 NtWaitHighEventPair(IN HANDLE EventPairHandle)
 {
     PKEVENT_PAIR EventPair;
     KPROCESSOR_MODE PreviousMode = ExGetPreviousMode();
     NTSTATUS Status;
 
-    DPRINT1("NtSetHighWaitLowEventPair(EventPairHandle %x)\n", EventPairHandle);
-    
+    PAGED_CODE();
+    DPRINT("NtSetHighWaitLowEventPair(Handle 0x%p)\n", EventPairHandle);
+
     /* Open the Object */
     Status = ObReferenceObjectByHandle(EventPairHandle,
                                        SYNCHRONIZE,
@@ -386,10 +385,10 @@ NtWaitHighEventPair(IN HANDLE EventPairHandle)
                                        PreviousMode,
                                        (PVOID*)&EventPair,
                                        NULL);
-    
+
     /* Check for Success */
-    if(NT_SUCCESS(Status)) {
-               
+    if(NT_SUCCESS(Status))
+    {
         /* Wait for the Event */
         KeWaitForSingleObject(&EventPair->HighEvent,
                               WrEventPair,
@@ -400,7 +399,7 @@ NtWaitHighEventPair(IN HANDLE EventPairHandle)
         /* Dereference Object */
         ObDereferenceObject(EventPair);
     }
-   
+
     /* Return status */
     return Status;
 }