Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenengevent.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
1.7.6.1
|