4 * Copyright 1998 Alexandre Julliard
11 #include "wine/unicode.h"
16 /***********************************************************************
17 * CreateEventA (KERNEL32.156)
19 HANDLE WINAPI
CreateEventA( SECURITY_ATTRIBUTES
*sa
, BOOL manual_reset
,
20 BOOL initial_state
, LPCSTR name
)
23 DWORD len
= name
? MultiByteToWideChar( CP_ACP
, 0, name
, strlen(name
), NULL
, 0 ) : 0;
26 SetLastError( ERROR_FILENAME_EXCED_RANGE
);
31 struct create_event_request
*req
= server_alloc_req( sizeof(*req
), len
* sizeof(WCHAR
) );
33 req
->manual_reset
= manual_reset
;
34 req
->initial_state
= initial_state
;
35 req
->inherit
= (sa
&& (sa
->nLength
>=sizeof(*sa
)) && sa
->bInheritHandle
);
36 if (len
) MultiByteToWideChar( CP_ACP
, 0, name
, strlen(name
), server_data_ptr(req
), len
);
38 server_call( REQ_CREATE_EVENT
);
42 if (ret
== -1) ret
= 0; /* must return 0 on failure, not -1 */
47 /***********************************************************************
48 * CreateEventW (KERNEL32.157)
50 HANDLE WINAPI
CreateEventW( SECURITY_ATTRIBUTES
*sa
, BOOL manual_reset
,
51 BOOL initial_state
, LPCWSTR name
)
54 DWORD len
= name
? strlenW(name
) : 0;
57 SetLastError( ERROR_FILENAME_EXCED_RANGE
);
62 struct create_event_request
*req
= server_alloc_req( sizeof(*req
), len
* sizeof(WCHAR
) );
64 req
->manual_reset
= manual_reset
;
65 req
->initial_state
= initial_state
;
66 req
->inherit
= (sa
&& (sa
->nLength
>=sizeof(*sa
)) && sa
->bInheritHandle
);
67 memcpy( server_data_ptr(req
), name
, len
* sizeof(WCHAR
) );
69 server_call( REQ_CREATE_EVENT
);
73 if (ret
== -1) ret
= 0; /* must return 0 on failure, not -1 */
77 /***********************************************************************
78 * WIN16_CreateEvent (KERNEL.457)
80 HANDLE WINAPI
WIN16_CreateEvent( BOOL manual_reset
, BOOL initial_state
)
82 return CreateEventA( NULL
, manual_reset
, initial_state
, NULL
);
86 /***********************************************************************
87 * OpenEventA (KERNEL32.536)
89 HANDLE WINAPI
OpenEventA( DWORD access
, BOOL inherit
, LPCSTR name
)
92 DWORD len
= name
? MultiByteToWideChar( CP_ACP
, 0, name
, strlen(name
), NULL
, 0 ) : 0;
95 SetLastError( ERROR_FILENAME_EXCED_RANGE
);
100 struct open_event_request
*req
= server_alloc_req( sizeof(*req
), len
* sizeof(WCHAR
) );
102 req
->access
= access
;
103 req
->inherit
= inherit
;
104 if (len
) MultiByteToWideChar( CP_ACP
, 0, name
, strlen(name
), server_data_ptr(req
), len
);
105 server_call( REQ_OPEN_EVENT
);
109 if (ret
== -1) ret
= 0; /* must return 0 on failure, not -1 */
114 /***********************************************************************
115 * OpenEventW (KERNEL32.537)
117 HANDLE WINAPI
OpenEventW( DWORD access
, BOOL inherit
, LPCWSTR name
)
120 DWORD len
= name
? strlenW(name
) : 0;
123 SetLastError( ERROR_FILENAME_EXCED_RANGE
);
128 struct open_event_request
*req
= server_alloc_req( sizeof(*req
), len
* sizeof(WCHAR
) );
130 req
->access
= access
;
131 req
->inherit
= inherit
;
132 memcpy( server_data_ptr(req
), name
, len
* sizeof(WCHAR
) );
133 server_call( REQ_OPEN_EVENT
);
137 if (ret
== -1) ret
= 0; /* must return 0 on failure, not -1 */
142 /***********************************************************************
145 * Execute an event operation (set,reset,pulse).
147 static BOOL
EVENT_Operation( HANDLE handle
, enum event_op op
)
152 struct event_op_request
*req
= server_alloc_req( sizeof(*req
), 0 );
153 req
->handle
= handle
;
155 ret
= !server_call( REQ_EVENT_OP
);
162 /***********************************************************************
163 * PulseEvent (KERNEL32.557)
165 BOOL WINAPI
PulseEvent( HANDLE handle
)
167 return EVENT_Operation( handle
, PULSE_EVENT
);
171 /***********************************************************************
172 * SetEvent (KERNEL32.644)
174 BOOL WINAPI
SetEvent( HANDLE handle
)
176 return EVENT_Operation( handle
, SET_EVENT
);
180 /***********************************************************************
181 * ResetEvent (KERNEL32.586)
183 BOOL WINAPI
ResetEvent( HANDLE handle
)
185 return EVENT_Operation( handle
, RESET_EVENT
);
189 /***********************************************************************
190 * NOTE: The Win95 VWin32_Event routines given below are really low-level
191 * routines implemented directly by VWin32. The user-mode libraries
192 * implement Win32 synchronisation routines on top of these low-level
193 * primitives. We do it the other way around here :-)
196 /***********************************************************************
197 * VWin32_EventCreate (KERNEL.442)
199 HANDLE WINAPI
VWin32_EventCreate(VOID
)
201 HANDLE hEvent
= CreateEventA( NULL
, FALSE
, 0, NULL
);
202 return ConvertToGlobalHandle( hEvent
);
205 /***********************************************************************
206 * VWin32_EventDestroy (KERNEL.443)
208 VOID WINAPI
VWin32_EventDestroy(HANDLE event
)
210 CloseHandle( event
);
213 /***********************************************************************
214 * VWin32_EventWait (KERNEL.450)
216 VOID WINAPI
VWin32_EventWait(HANDLE event
)
218 SYSLEVEL_ReleaseWin16Lock();
219 WaitForSingleObject( event
, INFINITE
);
220 SYSLEVEL_RestoreWin16Lock();
223 /***********************************************************************
224 * VWin32_EventSet (KERNEL.451)
226 VOID WINAPI
VWin32_EventSet(HANDLE event
)