OpenPrinter should fail if pPrinterName is "".
[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 "wine/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 (NTDLL.@)
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 > 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 (NTDLL.@)
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 (NTDLL.@)
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 (NTDLL.@)
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 (NTDLL.@)
114  * ZwCreateEvent (NTDLL.@)
115  */
116 NTSTATUS WINAPI NtCreateEvent(
117         OUT PHANDLE EventHandle,
118         IN ACCESS_MASK DesiredAccess,
119         IN const OBJECT_ATTRIBUTES *attr,
120         IN BOOLEAN ManualReset,
121         IN BOOLEAN InitialState)
122 {
123     DWORD len = attr && attr->ObjectName ? attr->ObjectName->Length : 0;
124     NTSTATUS ret;
125
126     SERVER_START_VAR_REQ( create_event, len )
127     {
128         req->manual_reset = ManualReset;
129         req->initial_state = InitialState;
130         req->inherit = attr && (attr->Attributes & OBJ_INHERIT);
131         if (len) memcpy( server_data_ptr(req), attr->ObjectName->Buffer, len );
132         ret = SERVER_CALL();
133         *EventHandle = req->handle;
134     }
135     SERVER_END_VAR_REQ;
136     return ret;
137 }
138
139 /******************************************************************************
140  *  NtOpenEvent (NTDLL.@)
141  *  ZwOpenEvent (NTDLL.@)
142  */
143 NTSTATUS WINAPI NtOpenEvent(
144         OUT PHANDLE EventHandle,
145         IN ACCESS_MASK DesiredAccess,
146         IN const OBJECT_ATTRIBUTES *attr )
147 {
148     DWORD len = attr && attr->ObjectName ? attr->ObjectName->Length : 0;
149     NTSTATUS ret;
150
151     SERVER_START_VAR_REQ( open_event, len )
152     {
153         req->access  = DesiredAccess;
154         req->inherit = attr && (attr->Attributes & OBJ_INHERIT);
155         if (len) memcpy( server_data_ptr(req), attr->ObjectName->Buffer, len );
156         ret = SERVER_CALL();
157         *EventHandle = req->handle;
158     }
159     SERVER_END_VAR_REQ;
160     return ret;
161 }
162
163
164 /******************************************************************************
165  *  NtSetEvent (NTDLL.@)
166  *  ZwSetEvent (NTDLL.@)
167  */
168 NTSTATUS WINAPI NtSetEvent( HANDLE handle, PULONG NumberOfThreadsReleased )
169 {
170     NTSTATUS ret;
171
172     /* FIXME: set NumberOfThreadsReleased */
173
174     SERVER_START_REQ( event_op )
175     {
176         req->handle = handle;
177         req->op     = SET_EVENT;
178         ret = SERVER_CALL();
179     }
180     SERVER_END_REQ;
181     return ret;
182 }
183
184 /******************************************************************************
185  *  NtResetEvent (NTDLL.@)
186  */
187 NTSTATUS WINAPI NtResetEvent( HANDLE handle, PULONG NumberOfThreadsReleased )
188 {
189     NTSTATUS ret;
190
191     /* resetting an event can't release any thread... */
192     if (NumberOfThreadsReleased) *NumberOfThreadsReleased = 0;
193
194     SERVER_START_REQ( event_op )
195     {
196         req->handle = handle;
197         req->op     = RESET_EVENT;
198         ret = SERVER_CALL();
199     }
200     SERVER_END_REQ;
201     return ret;
202 }
203
204 /******************************************************************************
205  *  NtClearEvent (NTDLL.@)
206  *
207  * FIXME
208  *   same as NtResetEvent ???
209  */
210 NTSTATUS WINAPI NtClearEvent ( HANDLE handle )
211 {
212     return NtResetEvent( handle, NULL );
213 }
214
215 /******************************************************************************
216  *  NtPulseEvent (NTDLL.@)
217  *
218  * FIXME
219  *   PulseCount
220  */
221 NTSTATUS WINAPI NtPulseEvent( HANDLE handle, PULONG PulseCount )
222 {
223     NTSTATUS ret;
224     FIXME("(0x%08x,%p)\n", handle, PulseCount);
225     SERVER_START_REQ( event_op )
226     {
227         req->handle = handle;
228         req->op     = PULSE_EVENT;
229         ret = SERVER_CALL();
230     }
231     SERVER_END_REQ;
232     return ret;
233 }
234
235 /******************************************************************************
236  *  NtQueryEvent (NTDLL.@)
237  */
238 NTSTATUS WINAPI NtQueryEvent (
239         IN  HANDLE EventHandle,
240         IN  UINT EventInformationClass,
241         OUT PVOID EventInformation,
242         IN  ULONG EventInformationLength,
243         OUT PULONG  ReturnLength)
244 {
245         FIXME("(0x%08x)\n", EventHandle);
246         return STATUS_SUCCESS;
247 }