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

engevent.c
Go to the documentation of this file.
00001 /*
00002  * PROJECT:         ReactOS Win32K
00003  * LICENSE:         BSD - See COPYING.ARM in the top level directory
00004  * FILE:            subsystems/win32/win32k/eng/engevent.c
00005  * PURPOSE:         Event Support Routines
00006  * PROGRAMMERS:     Aleksey Bragin <aleksey@reactos.org>
00007  *                  ReactOS Portable Systems Group
00008  */
00009 
00010 /* INCLUDES *******************************************************************/
00011 
00012 #include <win32k.h>
00013 #define NDEBUG
00014 #include <debug.h>
00015 
00016 /* PUBLIC FUNCTIONS ***********************************************************/
00017 
00018 BOOL
00019 APIENTRY
00020 EngCreateEvent(OUT PEVENT* Event)
00021 {
00022     BOOLEAN Result = TRUE;
00023     PENG_EVENT EngEvent;
00024 
00025     /* Allocate memory for the event structure */
00026     EngEvent = ExAllocatePoolWithTag(NonPagedPool,
00027                                      sizeof(ENG_EVENT) + sizeof(KEVENT),
00028                                      GDITAG_ENG_EVENT);
00029     if (EngEvent)
00030     {
00031         /* Set KEVENT pointer */
00032         EngEvent->fFlags = 0;
00033         EngEvent->pKEvent = EngEvent + 1;
00034 
00035         /* Initialize the kernel event */
00036         KeInitializeEvent(EngEvent->pKEvent,
00037                           SynchronizationEvent,
00038                           FALSE);
00039 
00040         /* Pass pointer to our structure to the caller */
00041         *Event = EngEvent;
00042         DPRINT("EngCreateEvent() created %p\n", EngEvent);
00043     }
00044     else
00045     {
00046         /* Out of memory */
00047         DPRINT("EngCreateEvent() failed\n");
00048         Result = FALSE;
00049     }
00050 
00051     /* Return result */
00052     return Result;
00053 }
00054 
00055 BOOL
00056 APIENTRY
00057 EngDeleteEvent(IN PEVENT Event)
00058 {
00059     DPRINT("EngDeleteEvent(%p)\n", Event);
00060 
00061     /* Check if it's a usermapped event */
00062     if (Event->fFlags & ENG_EVENT_USERMAPPED)
00063     {
00064         /* Disallow deletion of usermapped events */
00065         DPRINT1("Driver attempted to delete a usermapped event!\n");
00066         return FALSE;
00067     }
00068 
00069     /* Free the allocated memory */
00070     ExFreePool(Event);
00071 
00072     /* Return success */
00073     return TRUE;
00074 }
00075 
00076 VOID
00077 APIENTRY
00078 EngClearEvent(IN PEVENT Event)
00079 {
00080     /* Clear the event */
00081     KeClearEvent(Event->pKEvent);
00082 }
00083 
00084 LONG
00085 APIENTRY
00086 EngSetEvent(IN PEVENT Event)
00087 {
00088     /* Set the event */
00089     return KeSetEvent(Event->pKEvent,
00090                       IO_NO_INCREMENT,
00091                       FALSE);
00092 }
00093 
00094 LONG
00095 APIENTRY
00096 EngReadStateEvent(IN PEVENT Event)
00097 {
00098     /* Read the event state */
00099     return KeReadStateEvent(Event->pKEvent);
00100 }
00101 
00102 PEVENT
00103 APIENTRY
00104 EngMapEvent(IN HDEV hDev,
00105             IN HANDLE hUserObject,
00106             IN PVOID Reserved1,
00107             IN PVOID Reserved2,
00108             IN PVOID Reserved3)
00109 {
00110     PENG_EVENT EngEvent;
00111     NTSTATUS Status;
00112 
00113     /* Allocate memory for the event structure */
00114     EngEvent = ExAllocatePoolWithTag(NonPagedPool,
00115                                      sizeof(ENG_EVENT),
00116                                      GDITAG_ENG_EVENT);
00117     if (!EngEvent) return NULL;
00118 
00119     /* Zero it out */
00120     EngEvent->fFlags = 0;
00121     EngEvent->pKEvent = NULL;
00122 
00123     /* Create a handle, and have Ob fill out the pKEvent field */
00124     Status = ObReferenceObjectByHandle(EngEvent,
00125                                        EVENT_ALL_ACCESS,
00126                                        ExEventObjectType,
00127                                        UserMode,
00128                                        &EngEvent->pKEvent,
00129                                        NULL);
00130     if (NT_SUCCESS(Status))
00131     {
00132         /* Pulse the event and set that it's mapped by user */
00133         KePulseEvent(EngEvent->pKEvent, EVENT_INCREMENT, FALSE);
00134         EngEvent->fFlags |= ENG_EVENT_USERMAPPED;
00135     }
00136     else
00137     {
00138         /* Free the allocation */
00139         ExFreePool(EngEvent);
00140         EngEvent = NULL;
00141     }
00142 
00143     /* Support legacy interface */
00144     if (Reserved1) *(PVOID*)Reserved1 = EngEvent;
00145     return EngEvent;
00146 }
00147 
00148 BOOL
00149 APIENTRY
00150 EngUnmapEvent(IN PEVENT Event)
00151 {
00152     /* Must be a usermapped event */
00153     if (!(Event->fFlags & ENG_EVENT_USERMAPPED)) return FALSE;
00154 
00155     /* Dereference the object, destroying it */
00156     ObDereferenceObject(Event->pKEvent);
00157 
00158     /* Free the Eng object */
00159     ExFreePool(Event);
00160     return TRUE;
00161 }
00162 
00163 BOOL
00164 APIENTRY
00165 EngWaitForSingleObject(IN PEVENT Event,
00166                        IN PLARGE_INTEGER TimeOut)
00167 {
00168     NTSTATUS Status;
00169     DPRINT("EngWaitForSingleObject(%p %I64d)\n", Event, TimeOut->QuadPart);
00170 
00171     /* Validate parameters */
00172     if (!Event) return FALSE;
00173 
00174     /* Check if it's a usermapped event and fail in that case */
00175     if (Event->fFlags & ENG_EVENT_USERMAPPED)
00176     {
00177         /* Disallow deletion of usermapped events */
00178         DPRINT1("Driver attempted to wait on a usermapped event!\n");
00179         return FALSE;
00180     }
00181 
00182     /* Wait for the event */
00183     Status = KeWaitForSingleObject(Event->pKEvent,
00184                                    Executive,
00185                                    KernelMode,
00186                                    FALSE,
00187                                    TimeOut);
00188 
00189     /* Check if there is a failure or a timeout */
00190     return NT_SUCCESS(Status);
00191 }
00192 
00193 /* EOF */

Generated on Sun May 27 2012 04:38:20 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.