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;
39 SERVER_START_VAR_REQ( create_semaphore, len )
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 );
46 *SemaphoreHandle = req->handle;
52 /******************************************************************************
55 NTSTATUS WINAPI NtOpenSemaphore( OUT PHANDLE SemaphoreHandle,
56 IN ACCESS_MASK access,
57 IN const OBJECT_ATTRIBUTES *attr )
59 DWORD len = attr && attr->ObjectName ? attr->ObjectName->Length : 0;
62 SERVER_START_VAR_REQ( open_semaphore, len )
65 req->inherit = attr && (attr->Attributes & OBJ_INHERIT);
66 if (len) memcpy( server_data_ptr(req), attr->ObjectName->Buffer, len );
68 *SemaphoreHandle = req->handle;
74 /******************************************************************************
77 NTSTATUS WINAPI NtQuerySemaphore(
78 HANDLE SemaphoreHandle,
79 PVOID SemaphoreInformationClass,
80 OUT PVOID SemaphoreInformation,
84 FIXME("(0x%08x,%p,%p,0x%08lx,%p) stub!\n",
85 SemaphoreHandle, SemaphoreInformationClass, SemaphoreInformation, Length, ReturnLength);
86 return STATUS_SUCCESS;
89 /******************************************************************************
92 NTSTATUS WINAPI NtReleaseSemaphore( HANDLE handle, ULONG count, PULONG previous )
95 SERVER_START_REQ( release_semaphore )
99 if (!(ret = SERVER_CALL()))
101 if (previous) *previous = req->prev_count;
112 /**************************************************************************
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)
122 DWORD len = attr && attr->ObjectName ? attr->ObjectName->Length : 0;
125 SERVER_START_VAR_REQ( create_event, len )
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 );
132 *EventHandle = req->handle;
138 /******************************************************************************
141 NTSTATUS WINAPI NtOpenEvent(
142 OUT PHANDLE EventHandle,
143 IN ACCESS_MASK DesiredAccess,
144 IN const OBJECT_ATTRIBUTES *attr )
146 DWORD len = attr && attr->ObjectName ? attr->ObjectName->Length : 0;
149 SERVER_START_VAR_REQ( open_event, len )
151 req->access = DesiredAccess;
152 req->inherit = attr && (attr->Attributes & OBJ_INHERIT);
153 if (len) memcpy( server_data_ptr(req), attr->ObjectName->Buffer, len );
155 *EventHandle = req->handle;
162 /******************************************************************************
165 NTSTATUS WINAPI NtSetEvent( HANDLE handle, PULONG NumberOfThreadsReleased )
169 /* FIXME: set NumberOfThreadsReleased */
171 SERVER_START_REQ( event_op )
173 req->handle = handle;
181 /******************************************************************************
184 NTSTATUS WINAPI NtResetEvent( HANDLE handle, PULONG NumberOfThreadsReleased )
188 /* resetting an event can't release any thread... */
189 if (NumberOfThreadsReleased) *NumberOfThreadsReleased = 0;
191 SERVER_START_REQ( event_op )
193 req->handle = handle;
194 req->op = RESET_EVENT;
201 /******************************************************************************
205 * same as NtResetEvent ???
207 NTSTATUS WINAPI NtClearEvent ( HANDLE handle )
209 return NtResetEvent( handle, NULL );
212 /******************************************************************************
218 NTSTATUS WINAPI NtPulseEvent( HANDLE handle, PULONG PulseCount )
221 FIXME("(0x%08x,%p)\n", handle, PulseCount);
222 SERVER_START_REQ( event_op )
224 req->handle = handle;
225 req->op = PULSE_EVENT;
232 /******************************************************************************
235 NTSTATUS WINAPI NtQueryEvent (
236 IN HANDLE EventHandle,
237 IN UINT EventInformationClass,
238 OUT PVOID EventInformation,
239 IN ULONG EventInformationLength,
240 OUT PULONG ReturnLength)
242 FIXME("(0x%08x)\n", EventHandle);
243 return STATUS_SUCCESS;