4 * Copyright 1998 Alexandre Julliard
13 /***********************************************************************
14 * CreateSemaphoreA (KERNEL32.174)
16 HANDLE WINAPI
CreateSemaphoreA( SECURITY_ATTRIBUTES
*sa
, LONG initial
, LONG max
, LPCSTR name
)
18 struct create_semaphore_request
*req
= get_req_buffer();
20 /* Check parameters */
22 if ((max
<= 0) || (initial
< 0) || (initial
> max
))
24 SetLastError( ERROR_INVALID_PARAMETER
);
28 req
->initial
= (unsigned int)initial
;
29 req
->max
= (unsigned int)max
;
30 req
->inherit
= (sa
&& (sa
->nLength
>=sizeof(*sa
)) && sa
->bInheritHandle
);
31 server_strcpyAtoW( req
->name
, name
);
33 server_call( REQ_CREATE_SEMAPHORE
);
34 if (req
->handle
== -1) return 0;
39 /***********************************************************************
40 * CreateSemaphoreW (KERNEL32.175)
42 HANDLE WINAPI
CreateSemaphoreW( SECURITY_ATTRIBUTES
*sa
, LONG initial
,
43 LONG max
, LPCWSTR name
)
45 struct create_semaphore_request
*req
= get_req_buffer();
47 /* Check parameters */
49 if ((max
<= 0) || (initial
< 0) || (initial
> max
))
51 SetLastError( ERROR_INVALID_PARAMETER
);
55 req
->initial
= (unsigned int)initial
;
56 req
->max
= (unsigned int)max
;
57 req
->inherit
= (sa
&& (sa
->nLength
>=sizeof(*sa
)) && sa
->bInheritHandle
);
58 server_strcpyW( req
->name
, name
);
60 server_call( REQ_CREATE_SEMAPHORE
);
61 if (req
->handle
== -1) return 0;
66 /***********************************************************************
67 * OpenSemaphoreA (KERNEL32.545)
69 HANDLE WINAPI
OpenSemaphoreA( DWORD access
, BOOL inherit
, LPCSTR name
)
71 struct open_semaphore_request
*req
= get_req_buffer();
74 req
->inherit
= inherit
;
75 server_strcpyAtoW( req
->name
, name
);
76 server_call( REQ_OPEN_SEMAPHORE
);
77 if (req
->handle
== -1) return 0; /* must return 0 on failure, not -1 */
82 /***********************************************************************
83 * OpenSemaphoreW (KERNEL32.546)
85 HANDLE WINAPI
OpenSemaphoreW( DWORD access
, BOOL inherit
, LPCWSTR name
)
87 struct open_semaphore_request
*req
= get_req_buffer();
90 req
->inherit
= inherit
;
91 server_strcpyW( req
->name
, name
);
92 server_call( REQ_OPEN_SEMAPHORE
);
93 if (req
->handle
== -1) return 0; /* must return 0 on failure, not -1 */
98 /***********************************************************************
99 * ReleaseSemaphore (KERNEL32.583)
101 BOOL WINAPI
ReleaseSemaphore( HANDLE handle
, LONG count
, LONG
*previous
)
104 struct release_semaphore_request
*req
= get_req_buffer();
108 SetLastError( ERROR_INVALID_PARAMETER
);
111 req
->handle
= handle
;
112 req
->count
= (unsigned int)count
;
113 if (!server_call( REQ_RELEASE_SEMAPHORE
))
115 if (previous
) *previous
= req
->prev_count
;