2 * Process synchronisation
9 #include "debugtools.h"
12 #include "wine/unicode.h"
15 #include "ntdll_misc.h"
17 DEFAULT_DEBUG_CHANNEL(ntdll);
24 /******************************************************************************
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 )
33 DWORD len = attr && attr->ObjectName ? attr->ObjectName->Length : 0;
36 if ((MaximumCount <= 0) || (InitialCount < 0) || (InitialCount > MaximumCount))
37 return STATUS_INVALID_PARAMETER;
43 struct create_semaphore_request *req = server_alloc_req( sizeof(*req), len );
44 req->initial = InitialCount;
45 req->max = MaximumCount;
46 req->inherit = attr && (attr->Attributes & OBJ_INHERIT);
47 if (len) memcpy( server_data_ptr(req), attr->ObjectName->Buffer, len );
48 if (!(ret = server_call_noerr( REQ_CREATE_SEMAPHORE )))
49 *SemaphoreHandle = req->handle;
55 /******************************************************************************
58 NTSTATUS WINAPI NtOpenSemaphore( OUT PHANDLE SemaphoreHandle,
59 IN ACCESS_MASK access,
60 IN const OBJECT_ATTRIBUTES *attr )
62 DWORD len = attr && attr->ObjectName ? attr->ObjectName->Length : 0;
69 struct open_semaphore_request *req = server_alloc_req( sizeof(*req), len );
71 req->inherit = attr && (attr->Attributes & OBJ_INHERIT);
72 if (len) memcpy( server_data_ptr(req), attr->ObjectName->Buffer, len );
73 if (!(ret = server_call_noerr( REQ_OPEN_SEMAPHORE )))
74 *SemaphoreHandle = req->handle;
80 /******************************************************************************
83 NTSTATUS WINAPI NtQuerySemaphore(
84 HANDLE SemaphoreHandle,
85 PVOID SemaphoreInformationClass,
86 OUT PVOID SemaphoreInformation,
90 FIXME("(0x%08x,%p,%p,0x%08lx,%p) stub!\n",
91 SemaphoreHandle, SemaphoreInformationClass, SemaphoreInformation, Length, ReturnLength);
92 return STATUS_SUCCESS;
95 /******************************************************************************
98 NTSTATUS WINAPI NtReleaseSemaphore( HANDLE handle, ULONG count, PULONG previous )
103 struct release_semaphore_request *req = server_alloc_req( sizeof(*req), 0 );
104 req->handle = handle;
106 if (!(ret = server_call_noerr( REQ_RELEASE_SEMAPHORE )))
108 if (previous) *previous = req->prev_count;
119 /**************************************************************************
122 NTSTATUS WINAPI NtCreateEvent(
123 OUT PHANDLE EventHandle,
124 IN ACCESS_MASK DesiredAccess,
125 IN const OBJECT_ATTRIBUTES *attr,
126 IN BOOLEAN ManualReset,
127 IN BOOLEAN InitialState)
129 DWORD len = attr && attr->ObjectName ? attr->ObjectName->Length : 0;
136 struct create_event_request *req = server_alloc_req( sizeof(*req), len );
137 req->manual_reset = ManualReset;
138 req->initial_state = InitialState;
139 req->inherit = attr && (attr->Attributes & OBJ_INHERIT);
140 if (len) memcpy( server_data_ptr(req), attr->ObjectName->Buffer, len );
141 if (!(ret = server_call_noerr( REQ_CREATE_EVENT ))) *EventHandle = req->handle;
147 /******************************************************************************
150 NTSTATUS WINAPI NtOpenEvent(
151 OUT PHANDLE EventHandle,
152 IN ACCESS_MASK DesiredAccess,
153 IN const OBJECT_ATTRIBUTES *attr )
155 DWORD len = attr && attr->ObjectName ? attr->ObjectName->Length : 0;
162 struct open_event_request *req = server_alloc_req( sizeof(*req), len );
164 req->access = DesiredAccess;
165 req->inherit = attr && (attr->Attributes & OBJ_INHERIT);
166 if (len) memcpy( server_data_ptr(req), attr->ObjectName->Buffer, len );
167 if (!(ret = server_call_noerr( REQ_OPEN_EVENT ))) *EventHandle = req->handle;
174 /******************************************************************************
177 NTSTATUS WINAPI NtSetEvent( HANDLE handle, PULONG NumberOfThreadsReleased )
181 /* FIXME: set NumberOfThreadsReleased */
185 struct event_op_request *req = server_alloc_req( sizeof(*req), 0 );
186 req->handle = handle;
188 ret = server_call_noerr( REQ_EVENT_OP );
194 /******************************************************************************
197 NTSTATUS WINAPI NtResetEvent( HANDLE handle, PULONG NumberOfThreadsReleased )
201 /* resetting an event can't release any thread... */
202 if (NumberOfThreadsReleased) *NumberOfThreadsReleased = 0;
206 struct event_op_request *req = server_alloc_req( sizeof(*req), 0 );
207 req->handle = handle;
208 req->op = RESET_EVENT;
209 ret = server_call_noerr( REQ_EVENT_OP );
215 /******************************************************************************
219 * same as NtResetEvent ???
221 NTSTATUS WINAPI NtClearEvent ( HANDLE handle )
223 return NtResetEvent( handle, NULL );
226 /******************************************************************************
232 NTSTATUS WINAPI NtPulseEvent( HANDLE handle, PULONG PulseCount )
235 FIXME("(0x%08x,%p)\n", handle, PulseCount);
238 struct event_op_request *req = server_alloc_req( sizeof(*req), 0 );
239 req->handle = handle;
240 req->op = PULSE_EVENT;
241 ret = server_call_noerr( REQ_EVENT_OP );
247 /******************************************************************************
250 NTSTATUS WINAPI NtQueryEvent (
251 IN HANDLE EventHandle,
252 IN UINT EventInformationClass,
253 OUT PVOID EventInformation,
254 IN ULONG EventInformationLength,
255 OUT PULONG ReturnLength)
257 FIXME("(0x%08x)\n", EventHandle);
258 return STATUS_SUCCESS;