2 * Kernel synchronization objects
4 * Copyright 1998 Alexandre Julliard
10 #include "wine/unicode.h"
12 #include "debugtools.h"
14 DEFAULT_DEBUG_CHANNEL(win32);
21 /***********************************************************************
22 * CreateEventA (KERNEL32.156)
24 HANDLE WINAPI CreateEventA( SECURITY_ATTRIBUTES *sa, BOOL manual_reset,
25 BOOL initial_state, LPCSTR name )
28 DWORD len = name ? MultiByteToWideChar( CP_ACP, 0, name, strlen(name), NULL, 0 ) : 0;
31 SetLastError( ERROR_FILENAME_EXCED_RANGE );
36 struct create_event_request *req = server_alloc_req( sizeof(*req), len * sizeof(WCHAR) );
38 req->manual_reset = manual_reset;
39 req->initial_state = initial_state;
40 req->inherit = (sa && (sa->nLength>=sizeof(*sa)) && sa->bInheritHandle);
41 if (len) MultiByteToWideChar( CP_ACP, 0, name, strlen(name), server_data_ptr(req), len );
43 server_call( REQ_CREATE_EVENT );
51 /***********************************************************************
52 * CreateEventW (KERNEL32.157)
54 HANDLE WINAPI CreateEventW( SECURITY_ATTRIBUTES *sa, BOOL manual_reset,
55 BOOL initial_state, LPCWSTR name )
58 DWORD len = name ? strlenW(name) : 0;
61 SetLastError( ERROR_FILENAME_EXCED_RANGE );
64 /* one buggy program needs this
65 * ("Van Dale Groot woordenboek der Nederlandse taal")
67 if (sa && IsBadReadPtr(sa,sizeof(SECURITY_ATTRIBUTES)))
69 ERR("Bad security attributes pointer %p\n",sa);
70 SetLastError( ERROR_INVALID_PARAMETER);
75 struct create_event_request *req = server_alloc_req( sizeof(*req), len * sizeof(WCHAR) );
77 req->manual_reset = manual_reset;
78 req->initial_state = initial_state;
79 req->inherit = (sa && (sa->nLength>=sizeof(*sa)) && sa->bInheritHandle);
80 memcpy( server_data_ptr(req), name, len * sizeof(WCHAR) );
82 server_call( REQ_CREATE_EVENT );
90 /***********************************************************************
91 * WIN16_CreateEvent (KERNEL.457)
93 HANDLE WINAPI WIN16_CreateEvent( BOOL manual_reset, BOOL initial_state )
95 return CreateEventA( NULL, manual_reset, initial_state, NULL );
99 /***********************************************************************
100 * OpenEventA (KERNEL32.536)
102 HANDLE WINAPI OpenEventA( DWORD access, BOOL inherit, LPCSTR name )
105 DWORD len = name ? MultiByteToWideChar( CP_ACP, 0, name, strlen(name), NULL, 0 ) : 0;
108 SetLastError( ERROR_FILENAME_EXCED_RANGE );
113 struct open_event_request *req = server_alloc_req( sizeof(*req), len * sizeof(WCHAR) );
115 req->access = access;
116 req->inherit = inherit;
117 if (len) MultiByteToWideChar( CP_ACP, 0, name, strlen(name), server_data_ptr(req), len );
118 server_call( REQ_OPEN_EVENT );
126 /***********************************************************************
127 * OpenEventW (KERNEL32.537)
129 HANDLE WINAPI OpenEventW( DWORD access, BOOL inherit, LPCWSTR name )
132 DWORD len = name ? strlenW(name) : 0;
135 SetLastError( ERROR_FILENAME_EXCED_RANGE );
140 struct open_event_request *req = server_alloc_req( sizeof(*req), len * sizeof(WCHAR) );
142 req->access = access;
143 req->inherit = inherit;
144 memcpy( server_data_ptr(req), name, len * sizeof(WCHAR) );
145 server_call( REQ_OPEN_EVENT );
153 /***********************************************************************
156 * Execute an event operation (set,reset,pulse).
158 static BOOL EVENT_Operation( HANDLE handle, enum event_op op )
163 struct event_op_request *req = server_alloc_req( sizeof(*req), 0 );
164 req->handle = handle;
166 ret = !server_call( REQ_EVENT_OP );
173 /***********************************************************************
174 * PulseEvent (KERNEL32.557)
176 BOOL WINAPI PulseEvent( HANDLE handle )
178 return EVENT_Operation( handle, PULSE_EVENT );
182 /***********************************************************************
183 * SetEvent (KERNEL32.644)
185 BOOL WINAPI SetEvent( HANDLE handle )
187 return EVENT_Operation( handle, SET_EVENT );
191 /***********************************************************************
192 * ResetEvent (KERNEL32.586)
194 BOOL WINAPI ResetEvent( HANDLE handle )
196 return EVENT_Operation( handle, RESET_EVENT );
200 /***********************************************************************
201 * NOTE: The Win95 VWin32_Event routines given below are really low-level
202 * routines implemented directly by VWin32. The user-mode libraries
203 * implement Win32 synchronisation routines on top of these low-level
204 * primitives. We do it the other way around here :-)
207 /***********************************************************************
208 * VWin32_EventCreate (KERNEL.442)
210 HANDLE WINAPI VWin32_EventCreate(VOID)
212 HANDLE hEvent = CreateEventA( NULL, FALSE, 0, NULL );
213 return ConvertToGlobalHandle( hEvent );
216 /***********************************************************************
217 * VWin32_EventDestroy (KERNEL.443)
219 VOID WINAPI VWin32_EventDestroy(HANDLE event)
221 CloseHandle( event );
224 /***********************************************************************
225 * VWin32_EventWait (KERNEL.450)
227 VOID WINAPI VWin32_EventWait(HANDLE event)
231 ReleaseThunkLock( &mutex_count );
232 WaitForSingleObject( event, INFINITE );
233 RestoreThunkLock( mutex_count );
236 /***********************************************************************
237 * VWin32_EventSet (KERNEL.451)
239 VOID WINAPI VWin32_EventSet(HANDLE event)
246 /***********************************************************************
247 * CreateMutexA (KERNEL32.166)
249 HANDLE WINAPI CreateMutexA( SECURITY_ATTRIBUTES *sa, BOOL owner, LPCSTR name )
252 DWORD len = name ? MultiByteToWideChar( CP_ACP, 0, name, strlen(name), NULL, 0 ) : 0;
255 SetLastError( ERROR_FILENAME_EXCED_RANGE );
260 struct create_mutex_request *req = server_alloc_req( sizeof(*req), len * sizeof(WCHAR) );
263 req->inherit = (sa && (sa->nLength>=sizeof(*sa)) && sa->bInheritHandle);
264 if (len) MultiByteToWideChar( CP_ACP, 0, name, strlen(name), server_data_ptr(req), len );
266 server_call( REQ_CREATE_MUTEX );
274 /***********************************************************************
275 * CreateMutexW (KERNEL32.167)
277 HANDLE WINAPI CreateMutexW( SECURITY_ATTRIBUTES *sa, BOOL owner, LPCWSTR name )
280 DWORD len = name ? strlenW(name) : 0;
283 SetLastError( ERROR_FILENAME_EXCED_RANGE );
288 struct create_mutex_request *req = server_alloc_req( sizeof(*req), len * sizeof(WCHAR) );
291 req->inherit = (sa && (sa->nLength>=sizeof(*sa)) && sa->bInheritHandle);
292 memcpy( server_data_ptr(req), name, len * sizeof(WCHAR) );
294 server_call( REQ_CREATE_MUTEX );
307 /***********************************************************************
308 * OpenMutexA (KERNEL32.541)
310 HANDLE WINAPI OpenMutexA( DWORD access, BOOL inherit, LPCSTR name )
313 DWORD len = name ? MultiByteToWideChar( CP_ACP, 0, name, strlen(name), NULL, 0 ) : 0;
316 SetLastError( ERROR_FILENAME_EXCED_RANGE );
321 struct open_mutex_request *req = server_alloc_req( sizeof(*req), len * sizeof(WCHAR) );
323 req->access = access;
324 req->inherit = inherit;
325 if (len) MultiByteToWideChar( CP_ACP, 0, name, strlen(name), server_data_ptr(req), len );
326 server_call( REQ_OPEN_MUTEX );
334 /***********************************************************************
335 * OpenMutexW (KERNEL32.542)
337 HANDLE WINAPI OpenMutexW( DWORD access, BOOL inherit, LPCWSTR name )
340 DWORD len = name ? strlenW(name) : 0;
343 SetLastError( ERROR_FILENAME_EXCED_RANGE );
348 struct open_mutex_request *req = server_alloc_req( sizeof(*req), len * sizeof(WCHAR) );
350 req->access = access;
351 req->inherit = inherit;
352 memcpy( server_data_ptr(req), name, len * sizeof(WCHAR) );
353 server_call( REQ_OPEN_MUTEX );
361 /***********************************************************************
362 * ReleaseMutex (KERNEL32.582)
364 BOOL WINAPI ReleaseMutex( HANDLE handle )
369 struct release_mutex_request *req = server_alloc_req( sizeof(*req), 0 );
370 req->handle = handle;
371 ret = !server_call( REQ_RELEASE_MUTEX );
383 /***********************************************************************
384 * CreateSemaphoreA (KERNEL32.174)
386 HANDLE WINAPI CreateSemaphoreA( SECURITY_ATTRIBUTES *sa, LONG initial, LONG max, LPCSTR name )
389 DWORD len = name ? MultiByteToWideChar( CP_ACP, 0, name, strlen(name), NULL, 0 ) : 0;
391 /* Check parameters */
393 if ((max <= 0) || (initial < 0) || (initial > max))
395 SetLastError( ERROR_INVALID_PARAMETER );
400 SetLastError( ERROR_FILENAME_EXCED_RANGE );
406 struct create_semaphore_request *req = server_alloc_req( sizeof(*req),
407 len * sizeof(WCHAR) );
409 req->initial = (unsigned int)initial;
410 req->max = (unsigned int)max;
411 req->inherit = (sa && (sa->nLength>=sizeof(*sa)) && sa->bInheritHandle);
412 if (len) MultiByteToWideChar( CP_ACP, 0, name, strlen(name), server_data_ptr(req), len );
414 server_call( REQ_CREATE_SEMAPHORE );
422 /***********************************************************************
423 * CreateSemaphoreW (KERNEL32.175)
425 HANDLE WINAPI CreateSemaphoreW( SECURITY_ATTRIBUTES *sa, LONG initial,
426 LONG max, LPCWSTR name )
429 DWORD len = name ? strlenW(name) : 0;
431 /* Check parameters */
433 if ((max <= 0) || (initial < 0) || (initial > max))
435 SetLastError( ERROR_INVALID_PARAMETER );
440 SetLastError( ERROR_FILENAME_EXCED_RANGE );
446 struct create_semaphore_request *req = server_alloc_req( sizeof(*req),
447 len * sizeof(WCHAR) );
449 req->initial = (unsigned int)initial;
450 req->max = (unsigned int)max;
451 req->inherit = (sa && (sa->nLength>=sizeof(*sa)) && sa->bInheritHandle);
452 memcpy( server_data_ptr(req), name, len * sizeof(WCHAR) );
454 server_call( REQ_CREATE_SEMAPHORE );
462 /***********************************************************************
463 * OpenSemaphoreA (KERNEL32.545)
465 HANDLE WINAPI OpenSemaphoreA( DWORD access, BOOL inherit, LPCSTR name )
468 DWORD len = name ? MultiByteToWideChar( CP_ACP, 0, name, strlen(name), NULL, 0 ) : 0;
471 SetLastError( ERROR_FILENAME_EXCED_RANGE );
476 struct open_semaphore_request *req = server_alloc_req( sizeof(*req),
477 len * sizeof(WCHAR) );
478 req->access = access;
479 req->inherit = inherit;
480 if (len) MultiByteToWideChar( CP_ACP, 0, name, strlen(name), server_data_ptr(req), len );
481 server_call( REQ_OPEN_SEMAPHORE );
489 /***********************************************************************
490 * OpenSemaphoreW (KERNEL32.546)
492 HANDLE WINAPI OpenSemaphoreW( DWORD access, BOOL inherit, LPCWSTR name )
495 DWORD len = name ? strlenW(name) : 0;
498 SetLastError( ERROR_FILENAME_EXCED_RANGE );
503 struct open_semaphore_request *req = server_alloc_req( sizeof(*req), len * sizeof(WCHAR) );
504 req->access = access;
505 req->inherit = inherit;
506 memcpy( server_data_ptr(req), name, len * sizeof(WCHAR) );
507 server_call( REQ_OPEN_SEMAPHORE );
515 /***********************************************************************
516 * ReleaseSemaphore (KERNEL32.583)
518 BOOL WINAPI ReleaseSemaphore( HANDLE handle, LONG count, LONG *previous )
520 NTSTATUS status = NtReleaseSemaphore( handle, count, previous );
521 if (status) SetLastError( RtlNtStatusToDosError(status) );
531 /***********************************************************************
532 * CreateNamedPipeA (KERNEL32.168)
534 HANDLE WINAPI CreateNamedPipeA( LPCSTR name, DWORD dwOpenMode,
535 DWORD dwPipeMode, DWORD nMaxInstances,
536 DWORD nOutBufferSize, DWORD nInBufferSize,
537 DWORD nDefaultTimeOut, LPSECURITY_ATTRIBUTES attr )
539 FIXME("(Name=%s, OpenMode=%#08lx, dwPipeMode=%#08lx, MaxInst=%ld, OutBSize=%ld, InBuffSize=%ld, DefTimeOut=%ld, SecAttr=%p): stub\n",
540 debugstr_a(name), dwOpenMode, dwPipeMode, nMaxInstances,
541 nOutBufferSize, nInBufferSize, nDefaultTimeOut, attr );
542 SetLastError (ERROR_UNKNOWN);
543 return INVALID_HANDLE_VALUE;
547 /***********************************************************************
548 * CreateNamedPipeW (KERNEL32.169)
550 HANDLE WINAPI CreateNamedPipeW( LPCWSTR name, DWORD dwOpenMode,
551 DWORD dwPipeMode, DWORD nMaxInstances,
552 DWORD nOutBufferSize, DWORD nInBufferSize,
553 DWORD nDefaultTimeOut, LPSECURITY_ATTRIBUTES attr )
555 FIXME("(Name=%s, OpenMode=%#08lx, dwPipeMode=%#08lx, MaxInst=%ld, OutBSize=%ld, InBuffSize=%ld, DefTimeOut=%ld, SecAttr=%p): stub\n",
556 debugstr_w(name), dwOpenMode, dwPipeMode, nMaxInstances,
557 nOutBufferSize, nInBufferSize, nDefaultTimeOut, attr );
559 SetLastError (ERROR_UNKNOWN);
560 return INVALID_HANDLE_VALUE;
564 /***********************************************************************
565 * PeekNamedPipe (KERNEL32.552)
567 BOOL WINAPI PeekNamedPipe( HANDLE hPipe, LPVOID lpvBuffer, DWORD cbBuffer,
568 LPDWORD lpcbRead, LPDWORD lpcbAvail, LPDWORD lpcbMessage )
570 FIXME("(%08x, %p, %08lx, %p, %p, %p): stub\n",
571 hPipe, lpvBuffer, cbBuffer, lpcbRead, lpcbAvail, lpcbMessage);
572 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
577 /***********************************************************************
578 * WaitNamedPipeA (KERNEL32.@)
580 BOOL WINAPI WaitNamedPipeA (LPCSTR lpNamedPipeName, DWORD nTimeOut)
582 FIXME("%s 0x%08lx\n",lpNamedPipeName,nTimeOut);
583 SetLastError(ERROR_PIPE_NOT_CONNECTED);
588 /***********************************************************************
589 * WaitNamedPipeW (KERNEL32.@)
591 BOOL WINAPI WaitNamedPipeW (LPCWSTR lpNamedPipeName, DWORD nTimeOut)
593 FIXME("%s 0x%08lx\n",debugstr_w(lpNamedPipeName),nTimeOut);
594 SetLastError(ERROR_PIPE_NOT_CONNECTED);