Added an unknown VxD error code.
[wine] / dlls / ntdll / sync.c
1 /*
2  *      Process synchronisation
3  */
4
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <string.h>
8 #include <time.h>
9 #include "debugtools.h"
10
11 #include "winerror.h"
12 #include "wine/unicode.h"
13 #include "server.h"
14 #include "ntddk.h"
15 #include "ntdll_misc.h"
16
17 DEFAULT_DEBUG_CHANNEL(ntdll);
18
19
20 /*
21  *      Semaphores
22  */
23
24 /******************************************************************************
25  *  NtCreateSemaphore
26  */
27 NTSTATUS WINAPI NtCreateSemaphore( OUT PHANDLE SemaphoreHandle,
28                                    IN ACCESS_MASK access,
29                                    IN const OBJECT_ATTRIBUTES *attr OPTIONAL,
30                                    IN ULONG InitialCount,
31                                    IN ULONG MaximumCount )
32 {
33     DWORD len = attr && attr->ObjectName ? attr->ObjectName->Length : 0;
34     NTSTATUS ret;
35
36     if ((MaximumCount <= 0) || (InitialCount < 0) || (InitialCount > MaximumCount))
37         return STATUS_INVALID_PARAMETER;
38
39     SERVER_START_VAR_REQ( create_semaphore, len )
40     {
41         req->initial = InitialCount;
42         req->max     = MaximumCount;
43         req->inherit = attr && (attr->Attributes & OBJ_INHERIT);
44         if (len) memcpy( server_data_ptr(req), attr->ObjectName->Buffer, len );
45         ret = SERVER_CALL();
46         *SemaphoreHandle = req->handle;
47     }
48     SERVER_END_VAR_REQ;
49     return ret;
50 }
51
52 /******************************************************************************
53  *  NtOpenSemaphore
54  */
55 NTSTATUS WINAPI NtOpenSemaphore( OUT PHANDLE SemaphoreHandle,
56                                  IN ACCESS_MASK access,
57                                  IN const OBJECT_ATTRIBUTES *attr )
58 {
59     DWORD len = attr && attr->ObjectName ? attr->ObjectName->Length : 0;
60     NTSTATUS ret;
61
62     SERVER_START_VAR_REQ( open_semaphore, len )
63     {
64         req->access  = access;
65         req->inherit = attr && (attr->Attributes & OBJ_INHERIT);
66         if (len) memcpy( server_data_ptr(req), attr->ObjectName->Buffer, len );
67         ret = SERVER_CALL();
68         *SemaphoreHandle = req->handle;
69     }
70     SERVER_END_VAR_REQ;
71     return ret;
72 }
73
74 /******************************************************************************
75  *  NtQuerySemaphore
76  */
77 NTSTATUS WINAPI NtQuerySemaphore(
78         HANDLE SemaphoreHandle,
79         PVOID SemaphoreInformationClass,
80         OUT PVOID SemaphoreInformation,
81         ULONG Length,
82         PULONG ReturnLength) 
83 {
84         FIXME("(0x%08x,%p,%p,0x%08lx,%p) stub!\n",
85         SemaphoreHandle, SemaphoreInformationClass, SemaphoreInformation, Length, ReturnLength);
86         return STATUS_SUCCESS;
87 }
88
89 /******************************************************************************
90  *  NtReleaseSemaphore
91  */
92 NTSTATUS WINAPI NtReleaseSemaphore( HANDLE handle, ULONG count, PULONG previous )
93 {
94     NTSTATUS ret;
95     SERVER_START_REQ( release_semaphore )
96     {
97         req->handle = handle;
98         req->count  = count;
99         if (!(ret = SERVER_CALL()))
100         {
101             if (previous) *previous = req->prev_count;
102         }
103     }
104     SERVER_END_REQ;
105     return ret;
106 }
107
108 /*
109  *      Events
110  */
111  
112 /**************************************************************************
113  * NtCreateEvent
114  */
115 NTSTATUS WINAPI NtCreateEvent(
116         OUT PHANDLE EventHandle,
117         IN ACCESS_MASK DesiredAccess,
118         IN const OBJECT_ATTRIBUTES *attr,
119         IN BOOLEAN ManualReset,
120         IN BOOLEAN InitialState)
121 {
122     DWORD len = attr && attr->ObjectName ? attr->ObjectName->Length : 0;
123     NTSTATUS ret;
124
125     SERVER_START_VAR_REQ( create_event, len )
126     {
127         req->manual_reset = ManualReset;
128         req->initial_state = InitialState;
129         req->inherit = attr && (attr->Attributes & OBJ_INHERIT);
130         if (len) memcpy( server_data_ptr(req), attr->ObjectName->Buffer, len );
131         ret = SERVER_CALL();
132         *EventHandle = req->handle;
133     }
134     SERVER_END_VAR_REQ;
135     return ret;
136 }
137
138 /******************************************************************************
139  *  NtOpenEvent
140  */
141 NTSTATUS WINAPI NtOpenEvent(
142         OUT PHANDLE EventHandle,
143         IN ACCESS_MASK DesiredAccess,
144         IN const OBJECT_ATTRIBUTES *attr )
145 {
146     DWORD len = attr && attr->ObjectName ? attr->ObjectName->Length : 0;
147     NTSTATUS ret;
148
149     SERVER_START_VAR_REQ( open_event, len )
150     {
151         req->access  = DesiredAccess;
152         req->inherit = attr && (attr->Attributes & OBJ_INHERIT);
153         if (len) memcpy( server_data_ptr(req), attr->ObjectName->Buffer, len );
154         ret = SERVER_CALL();
155         *EventHandle = req->handle;
156     }
157     SERVER_END_VAR_REQ;
158     return ret;
159 }
160
161
162 /******************************************************************************
163  *  NtSetEvent
164  */
165 NTSTATUS WINAPI NtSetEvent( HANDLE handle, PULONG NumberOfThreadsReleased )
166 {
167     NTSTATUS ret;
168
169     /* FIXME: set NumberOfThreadsReleased */
170
171     SERVER_START_REQ( event_op )
172     {
173         req->handle = handle;
174         req->op     = SET_EVENT;
175         ret = SERVER_CALL();
176     }
177     SERVER_END_REQ;
178     return ret;
179 }
180
181 /******************************************************************************
182  *  NtResetEvent
183  */
184 NTSTATUS WINAPI NtResetEvent( HANDLE handle, PULONG NumberOfThreadsReleased )
185 {
186     NTSTATUS ret;
187
188     /* resetting an event can't release any thread... */
189     if (NumberOfThreadsReleased) *NumberOfThreadsReleased = 0;
190
191     SERVER_START_REQ( event_op )
192     {
193         req->handle = handle;
194         req->op     = RESET_EVENT;
195         ret = SERVER_CALL();
196     }
197     SERVER_END_REQ;
198     return ret;
199 }
200
201 /******************************************************************************
202  *  NtClearEvent
203  *
204  * FIXME
205  *   same as NtResetEvent ???
206  */
207 NTSTATUS WINAPI NtClearEvent ( HANDLE handle )
208 {
209     return NtResetEvent( handle, NULL );
210 }
211
212 /******************************************************************************
213  *  NtPulseEvent
214  *
215  * FIXME
216  *   PulseCount
217  */
218 NTSTATUS WINAPI NtPulseEvent( HANDLE handle, PULONG PulseCount )
219 {
220     NTSTATUS ret;
221     FIXME("(0x%08x,%p)\n", handle, PulseCount);
222     SERVER_START_REQ( event_op )
223     {
224         req->handle = handle;
225         req->op     = PULSE_EVENT;
226         ret = SERVER_CALL();
227     }
228     SERVER_END_REQ;
229     return ret;
230 }
231
232 /******************************************************************************
233  *  NtQueryEvent
234  */
235 NTSTATUS WINAPI NtQueryEvent (
236         IN  HANDLE EventHandle,
237         IN  UINT EventInformationClass,
238         OUT PVOID EventInformation,
239         IN  ULONG EventInformationLength,
240         OUT PULONG  ReturnLength)
241 {
242         FIXME("(0x%08x)\n", EventHandle);
243         return STATUS_SUCCESS;
244 }