update for HEAD-2003021201
[reactos.git] / lib / kernel32 / synch / event.c
1 /* $Id$
2  *
3  * COPYRIGHT:       See COPYING in the top level directory
4  * PROJECT:         ReactOS system libraries
5  * FILE:            lib/kernel32/synch/event.c
6  * PURPOSE:         Local string functions
7  * PROGRAMMER:      Ariadne ( ariadne@xs4all.nl)
8  * UPDATE HISTORY:
9  *                  Created 01/11/98
10  */
11
12 /* INCLUDES *****************************************************************/
13
14 #include <k32.h>
15
16 #define NDEBUG
17 #include <kernel32/kernel32.h>
18
19 /* FUNCTIONS ****************************************************************/
20
21 HANDLE STDCALL
22 CreateEventA(LPSECURITY_ATTRIBUTES lpEventAttributes,
23              WINBOOL bManualReset,
24              WINBOOL bInitialState,
25              LPCSTR lpName)
26 {
27    UNICODE_STRING EventNameU;
28    ANSI_STRING EventName;
29    HANDLE EventHandle;
30
31    RtlInitUnicodeString (&EventNameU, NULL);
32
33    if (lpName)
34      {
35         RtlInitAnsiString(&EventName,
36                           (LPSTR)lpName);
37         RtlAnsiStringToUnicodeString(&EventNameU,
38                                      &EventName,
39                                      TRUE);
40      }
41
42    EventHandle = CreateEventW(lpEventAttributes,
43                               bManualReset,
44                               bInitialState,
45                               EventNameU.Buffer);
46
47    if (lpName)
48      {
49         RtlFreeUnicodeString(&EventNameU);
50      }
51
52    return EventHandle;
53 }
54
55
56 HANDLE STDCALL
57 CreateEventW(LPSECURITY_ATTRIBUTES lpEventAttributes,
58              WINBOOL bManualReset,
59              WINBOOL bInitialState,
60              LPCWSTR lpName)
61 {
62    NTSTATUS Status;
63    HANDLE hEvent;
64    UNICODE_STRING EventNameString;
65    POBJECT_ATTRIBUTES PtrObjectAttributes;
66    OBJECT_ATTRIBUTES ObjectAttributes;
67
68    ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
69    ObjectAttributes.RootDirectory = hBaseDir;
70    ObjectAttributes.ObjectName = NULL;
71    ObjectAttributes.Attributes = 0;
72    ObjectAttributes.SecurityDescriptor = NULL;
73    ObjectAttributes.SecurityQualityOfService = NULL;
74
75    if (lpName != NULL)
76      {
77         RtlInitUnicodeString(&EventNameString, (LPWSTR)lpName);
78         ObjectAttributes.ObjectName = &EventNameString;
79      }
80
81    Status = NtCreateEvent(&hEvent,
82                           STANDARD_RIGHTS_ALL|EVENT_READ_ACCESS|EVENT_WRITE_ACCESS,
83                           &ObjectAttributes,
84                           bManualReset,
85                           bInitialState);
86    DPRINT( "Called\n" );
87    if (!NT_SUCCESS(Status))
88      {
89         SetLastErrorByStatus(Status);
90         return NULL;
91      }
92
93    return hEvent;
94 }
95
96
97 HANDLE STDCALL
98 OpenEventA(DWORD dwDesiredAccess,
99            WINBOOL bInheritHandle,
100            LPCSTR lpName)
101 {
102    UNICODE_STRING EventNameU;
103    ANSI_STRING EventName;
104    HANDLE EventHandle;
105
106    RtlInitUnicodeString(&EventNameU,
107                         NULL);
108
109    if (lpName)
110      {
111         RtlInitAnsiString(&EventName,
112                           (LPSTR)lpName);
113         RtlAnsiStringToUnicodeString(&EventNameU,
114                                      &EventName,
115                                      TRUE);
116     }
117
118    EventHandle = OpenEventW(dwDesiredAccess,
119                             bInheritHandle,
120                             EventNameU.Buffer);
121
122    if (lpName)
123      {
124         RtlFreeUnicodeString(&EventNameU);
125      }
126
127    return EventHandle;
128 }
129
130
131 HANDLE STDCALL
132 OpenEventW(DWORD dwDesiredAccess,
133            WINBOOL bInheritHandle,
134            LPCWSTR lpName)
135 {
136    OBJECT_ATTRIBUTES ObjectAttributes;
137    UNICODE_STRING EventNameString;
138    NTSTATUS Status;
139    HANDLE hEvent = NULL;
140
141    if (lpName == NULL)
142      {
143         SetLastError(ERROR_INVALID_PARAMETER);
144         return NULL;
145      }
146
147    RtlInitUnicodeString(&EventNameString, (LPWSTR)lpName);
148
149    ObjectAttributes.Length = sizeof(OBJECT_ATTRIBUTES);
150    ObjectAttributes.RootDirectory = hBaseDir;
151    ObjectAttributes.ObjectName = &EventNameString;
152    ObjectAttributes.Attributes = 0;
153    ObjectAttributes.SecurityDescriptor = NULL;
154    ObjectAttributes.SecurityQualityOfService = NULL;
155    if (bInheritHandle == TRUE)
156      {
157         ObjectAttributes.Attributes |= OBJ_INHERIT;
158      }
159
160    Status = NtOpenEvent(&hEvent,
161                         dwDesiredAccess,
162                         &ObjectAttributes);
163    if (!NT_SUCCESS(Status))
164      {
165         SetLastErrorByStatus(Status);
166         return NULL;
167      }
168
169    return hEvent;
170 }
171
172
173 WINBOOL STDCALL
174 PulseEvent(HANDLE hEvent)
175 {
176    ULONG Count;
177    NTSTATUS Status;
178
179    Status = NtPulseEvent(hEvent,
180                          &Count);
181    if (!NT_SUCCESS(Status))
182      {
183         SetLastErrorByStatus (Status);
184         return FALSE;
185      }
186
187    return TRUE;
188 }
189
190
191 WINBOOL STDCALL
192 ResetEvent(HANDLE hEvent)
193 {
194    NTSTATUS Status;
195    ULONG Count;
196
197    Status = NtResetEvent(hEvent,
198                          &Count);
199    if (!NT_SUCCESS(Status))
200      {
201         SetLastErrorByStatus(Status);
202         return FALSE;
203      }
204
205    return TRUE;
206 }
207
208
209 WINBOOL STDCALL
210 SetEvent(HANDLE hEvent)
211 {
212    NTSTATUS Status;
213    ULONG Count;
214
215    Status = NtSetEvent(hEvent,
216                        &Count);
217    if (!NT_SUCCESS(Status))
218      {
219         SetLastErrorByStatus(Status);
220         return FALSE;
221      }
222
223    return TRUE;
224 }
225
226 /* EOF */