vcomp120: Add vcomp120 stub dll.
[wine.git] / dlls / user32 / tests / broadcast.c
blob322fbd04140995e2d7ad29b6051639db48c24b33
1 /*
2 * Unit tests for BroadcastSystemMessage
4 * Copyright 2008 Maarten Lankhorst
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #define _WIN32_WINNT 0x0501
23 #include <stdarg.h>
24 #include <stdio.h>
26 #include "windef.h"
27 #include "winbase.h"
28 #include "wingdi.h"
29 #include "winuser.h"
30 #include "winnls.h"
32 #include "wine/test.h"
34 typedef LONG (WINAPI *PBROADCAST)( DWORD,LPDWORD,UINT,WPARAM,LPARAM );
35 typedef LONG (WINAPI *PBROADCASTEX)( DWORD,LPDWORD,UINT,WPARAM,LPARAM,PBSMINFO );
36 static PBROADCAST pBroadcastA;
37 static PBROADCAST pBroadcastW;
38 static PBROADCASTEX pBroadcastExA;
39 static PBROADCASTEX pBroadcastExW;
40 static HANDLE hevent;
42 static LRESULT WINAPI main_window_procA(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
44 if (msg == WM_NULL)
46 trace("main_window_procA: Sleeping for %lu ms\n", wparam);
47 if (wparam)
49 if (WaitForSingleObject(hevent, wparam) == WAIT_TIMEOUT)
50 SetEvent(hevent);
52 trace("main_window_procA: Returning WM_NULL with parameter %08lx\n", lparam);
53 return lparam;
56 return DefWindowProcA(hwnd, msg, wparam, lparam);
59 static BOOL init_procs(void)
61 WNDCLASSA cls;
62 HANDLE user32 = GetModuleHandleA("user32.dll");
63 pBroadcastA = (PBROADCAST)GetProcAddress(user32, "BroadcastSystemMessageA");
64 if (!pBroadcastA)
65 pBroadcastA = (PBROADCAST)GetProcAddress(user32, "BroadcastSystemMessage");
66 ok(pBroadcastA != NULL, "No BroadcastSystemMessage found\n");
67 if (!pBroadcastA)
69 win_skip("BroadcastA is not available\n");
70 return FALSE;
73 pBroadcastW = (PBROADCAST)GetProcAddress(user32, "BroadcastSystemMessageW");
74 pBroadcastExA = (PBROADCASTEX)GetProcAddress(user32, "BroadcastSystemMessageExA");
75 pBroadcastExW = (PBROADCASTEX)GetProcAddress(user32, "BroadcastSystemMessageExW");
77 hevent = CreateEventA(NULL, TRUE, FALSE, "Asynchronous checking event");
79 cls.style = CS_DBLCLKS;
80 cls.lpfnWndProc = main_window_procA;
81 cls.cbClsExtra = 0;
82 cls.cbWndExtra = 0;
83 cls.hInstance = GetModuleHandleA(0);
84 cls.hIcon = 0;
85 cls.hCursor = LoadCursorA(0, (LPCSTR)IDC_ARROW);
86 cls.hbrBackground = GetStockObject(WHITE_BRUSH);
87 cls.lpszMenuName = NULL;
88 cls.lpszClassName = "MainWindowClass";
90 if (!RegisterClassA(&cls))
91 return FALSE;
93 if (!CreateWindowExA(0, "MainWindowClass", "Main window", WS_CAPTION | WS_SYSMENU |
94 WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP, 100, 100, 200,
95 200, 0, 0, GetModuleHandleA(NULL), NULL))
96 return FALSE;
97 return TRUE;
100 static void test_parameters(PBROADCAST broadcast, const char *functionname)
102 LONG ret;
103 DWORD recips;
105 SetLastError(0xcafebabe);
106 recips = BSM_APPLICATIONS;
107 ret = broadcast( 0x80000000, &recips, WM_NULL, 0, 0 );
108 if (!ret && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
110 win_skip("%s is not implemented\n", functionname);
111 return;
113 ok(!ret || broken(ret), "Returned: %d\n", ret);
114 if (!ret) ok(GetLastError() == ERROR_INVALID_PARAMETER, "Last error: %08x\n", GetLastError());
116 SetLastError(0xcafebabe);
117 recips = BSM_APPLICATIONS;
118 ret = broadcast( 0x80000000, &recips, WM_NULL, 0, 0 );
119 ok(!ret || broken(ret), "Returned: %d\n", ret);
120 if (!ret) ok(GetLastError() == ERROR_INVALID_PARAMETER, "Last error: %08x\n", GetLastError());
122 if (0) /* TODO: Check the hang flags */
124 SetLastError(0xcafebabe);
125 recips = BSM_APPLICATIONS;
126 ret = broadcast( BSF_QUERY|(BSF_NOHANG|BSF_FORCEIFHUNG), &recips, WM_NULL, 30000, 0 );
127 ok(0, "Last error: %08x\n", GetLastError());
128 ok(0, "Returned: %d\n", ret);
130 SetLastError(0xcafebabe);
131 recips = BSM_APPLICATIONS;
132 ret = broadcast( BSF_QUERY|(BSF_NOHANG|BSF_NOTIMEOUTIFNOTHUNG), &recips, WM_NULL, 30000, 0 );
133 ok(0, "Last error: %08x\n", GetLastError());
134 ok(0, "Returned: %d\n", ret);
136 SetLastError(0xcafebabe);
137 recips = BSM_APPLICATIONS;
138 ret = broadcast( BSF_QUERY|(BSF_NOTIMEOUTIFNOTHUNG|BSF_FORCEIFHUNG), &recips, WM_NULL, 30000, 0 );
139 ok(0, "Last error: %08x\n", GetLastError());
140 ok(0, "Returned: %d\n", ret);
142 SetLastError(0xcafebabe);
143 recips = BSM_APPLICATIONS;
144 ret = broadcast( BSF_POSTMESSAGE|(BSF_NOTIMEOUTIFNOTHUNG|BSF_FORCEIFHUNG), &recips, WM_NULL, 30000, 0 );
145 ok(0, "Last error: %08x\n", GetLastError());
146 ok(0, "Returned: %d\n", ret);
149 recips = BSM_APPLICATIONS;
150 ResetEvent(hevent);
151 ret = broadcast( BSF_POSTMESSAGE|BSF_QUERY, &recips, WM_NULL, 100, 0 );
152 ok(ret==1, "Returned: %d\n", ret);
153 ok(WaitForSingleObject(hevent, 0) != WAIT_TIMEOUT, "Asynchronous message sent instead\n");
154 PulseEvent(hevent);
156 SetLastError( 0xdeadbeef );
157 recips = BSM_APPLICATIONS;
158 ret = broadcast( BSF_POSTMESSAGE|BSF_SENDNOTIFYMESSAGE, &recips, WM_NULL, 100, 0 );
159 if (ret)
161 ok(ret==1, "Returned: %d\n", ret);
162 ok(WaitForSingleObject(hevent, 0) != WAIT_OBJECT_0, "Synchronous message sent instead\n");
163 PulseEvent(hevent);
165 recips = BSM_APPLICATIONS;
166 ret = broadcast( BSF_SENDNOTIFYMESSAGE, &recips, WM_NULL, 100, BROADCAST_QUERY_DENY );
167 ok(ret==1, "Returned: %d\n", ret);
168 ok(WaitForSingleObject(hevent, 0) != WAIT_TIMEOUT, "Asynchronous message sent instead\n");
169 PulseEvent(hevent);
171 recips = BSM_APPLICATIONS;
172 ret = broadcast( BSF_SENDNOTIFYMESSAGE|BSF_QUERY, &recips, WM_NULL, 100, BROADCAST_QUERY_DENY );
173 ok(!ret, "Returned: %d\n", ret);
174 ok(WaitForSingleObject(hevent, 0) != WAIT_TIMEOUT, "Asynchronous message sent instead\n");
175 PulseEvent(hevent);
177 else /* BSF_SENDNOTIFYMESSAGE not supported on NT4 */
178 ok( GetLastError() == ERROR_INVALID_PARAMETER, "failed with err %u\n", GetLastError() );
180 recips = BSM_APPLICATIONS;
181 ret = broadcast( 0, &recips, WM_NULL, 100, 0 );
182 ok(ret==1, "Returned: %d\n", ret);
183 ok(WaitForSingleObject(hevent, 0) != WAIT_TIMEOUT, "Asynchronous message sent instead\n");
184 PulseEvent(hevent);
187 /* BSF_SENDNOTIFYMESSAGE and BSF_QUERY are both synchronous within the same process
188 * However you should be able to distinguish them by sending the BROADCAST_QUERY_DENY flag
191 static void test_parametersEx(PBROADCASTEX broadcastex)
193 LONG ret;
194 DWORD recips;
196 SetLastError(0xcafebabe);
197 recips = BSM_APPLICATIONS;
198 ret = broadcastex( 0x80000000, &recips, WM_NULL, 0, 0, NULL );
199 ok(GetLastError() == ERROR_INVALID_PARAMETER, "Last error: %08x\n", GetLastError());
200 ok(!ret, "Returned: %d\n", ret);
202 SetLastError(0xcafebabe);
203 recips = BSM_APPLICATIONS;
204 ret = broadcastex( 0x80000000, &recips, WM_NULL, 0, 0, NULL );
205 ok(GetLastError() == ERROR_INVALID_PARAMETER, "Last error: %08x\n", GetLastError());
206 ok(!ret, "Returned: %d\n", ret);
208 if (0) /* TODO: Check the hang flags */
210 SetLastError(0xcafebabe);
211 recips = BSM_APPLICATIONS;
212 ret = broadcastex( BSF_QUERY|(BSF_NOHANG|BSF_FORCEIFHUNG), &recips, WM_NULL, 30000, 0, NULL );
213 ok(0, "Last error: %08x\n", GetLastError());
214 ok(0, "Returned: %d\n", ret);
216 SetLastError(0xcafebabe);
217 recips = BSM_APPLICATIONS;
218 ret = broadcastex( BSF_QUERY|(BSF_NOHANG|BSF_NOTIMEOUTIFNOTHUNG), &recips, WM_NULL, 30000, 0, NULL );
219 ok(0, "Last error: %08x\n", GetLastError());
220 ok(0, "Returned: %d\n", ret);
222 SetLastError(0xcafebabe);
223 recips = BSM_APPLICATIONS;
224 ret = broadcastex( BSF_QUERY|(BSF_NOTIMEOUTIFNOTHUNG|BSF_FORCEIFHUNG), &recips, WM_NULL, 30000, 0, NULL );
225 ok(0, "Last error: %08x\n", GetLastError());
226 ok(0, "Returned: %d\n", ret);
228 SetLastError(0xcafebabe);
229 recips = BSM_APPLICATIONS;
230 ret = broadcastex( BSF_POSTMESSAGE|(BSF_NOTIMEOUTIFNOTHUNG|BSF_FORCEIFHUNG), &recips, WM_NULL, 30000, 0, NULL );
231 ok(0, "Last error: %08x\n", GetLastError());
232 ok(0, "Returned: %d\n", ret);
235 recips = BSM_APPLICATIONS;
236 ResetEvent(hevent);
237 ret = broadcastex( BSF_POSTMESSAGE|BSF_QUERY, &recips, WM_NULL, 100, 0, NULL );
238 ok(ret==1, "Returned: %d\n", ret);
239 ok(WaitForSingleObject(hevent, 0) != WAIT_TIMEOUT, "Asynchronous message sent instead\n");
240 PulseEvent(hevent);
242 recips = BSM_APPLICATIONS;
243 ret = broadcastex( BSF_POSTMESSAGE|BSF_SENDNOTIFYMESSAGE, &recips, WM_NULL, 100, 0, NULL );
244 ok(ret==1, "Returned: %d\n", ret);
245 ok(WaitForSingleObject(hevent, 0) != WAIT_OBJECT_0, "Synchronous message sent instead\n");
246 PulseEvent(hevent);
248 recips = BSM_APPLICATIONS;
249 ret = broadcastex( BSF_SENDNOTIFYMESSAGE, &recips, WM_NULL, 100, BROADCAST_QUERY_DENY, NULL );
250 ok(ret==1, "Returned: %d\n", ret);
251 ok(WaitForSingleObject(hevent, 0) != WAIT_TIMEOUT, "Asynchronous message sent instead\n");
252 PulseEvent(hevent);
254 recips = BSM_APPLICATIONS;
255 ret = broadcastex( BSF_SENDNOTIFYMESSAGE|BSF_QUERY, &recips, WM_NULL, 100, BROADCAST_QUERY_DENY, NULL );
256 ok(!ret, "Returned: %d\n", ret);
257 ok(WaitForSingleObject(hevent, 0) != WAIT_TIMEOUT, "Asynchronous message sent instead\n");
258 PulseEvent(hevent);
260 recips = BSM_APPLICATIONS;
261 ret = broadcastex( 0, &recips, WM_NULL, 100, 0, NULL );
262 ok(ret==1, "Returned: %d\n", ret);
263 ok(WaitForSingleObject(hevent, 0) != WAIT_TIMEOUT, "Asynchronous message sent instead\n");
264 PulseEvent(hevent);
267 static BOOL (WINAPI *pOpenProcessToken)(HANDLE, DWORD, HANDLE*);
268 static BOOL (WINAPI *pAdjustTokenPrivileges)(HANDLE, BOOL, PTOKEN_PRIVILEGES, DWORD, PTOKEN_PRIVILEGES, PDWORD);
270 static void test_noprivileges(void)
272 HANDLE advapi32 = GetModuleHandleA("advapi32");
273 HANDLE token;
274 DWORD recips;
275 BOOL ret;
277 static const DWORD BSM_ALL_RECIPS = BSM_VXDS | BSM_NETDRIVER |
278 BSM_INSTALLABLEDRIVERS | BSM_APPLICATIONS;
280 pOpenProcessToken = (void *)GetProcAddress(advapi32, "OpenProcessToken");
281 pAdjustTokenPrivileges = (void *)GetProcAddress(advapi32, "AdjustTokenPrivileges");
282 if (!pOpenProcessToken || !pAdjustTokenPrivileges || !pOpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &token))
284 skip("Can't open security token for process\n");
285 return;
287 if (!pAdjustTokenPrivileges(token, TRUE, NULL, 0, NULL, NULL))
289 skip("Can't adjust security token for process\n");
290 return;
293 trace("Trying privileged edition!\n");
294 SetLastError(0xcafebabe);
295 recips = BSM_ALLDESKTOPS;
296 ResetEvent(hevent);
297 ret = pBroadcastExW( BSF_QUERY, &recips, WM_NULL, 100, 0, NULL );
298 ok(ret==1, "Returned: %d error %u\n", ret, GetLastError());
299 ok(WaitForSingleObject(hevent, 0) != WAIT_TIMEOUT, "Asynchronous message sent instead\n");
300 ok(recips == BSM_ALLDESKTOPS ||
301 recips == BSM_ALL_RECIPS, /* win2k3 */
302 "Received by: %08x\n", recips);
303 PulseEvent(hevent);
305 SetLastError(0xcafebabe);
306 recips = BSM_ALLCOMPONENTS;
307 ResetEvent(hevent);
308 ret = pBroadcastExW( BSF_QUERY, &recips, WM_NULL, 100, 0, NULL );
309 ok(ret==1, "Returned: %d error %u\n", ret, GetLastError());
310 ok(WaitForSingleObject(hevent, 0) != WAIT_TIMEOUT, "Asynchronous message sent instead\n");
311 ok(recips == BSM_ALLCOMPONENTS ||
312 recips == BSM_ALL_RECIPS, /* win2k3 */
313 "Received by: %08x\n", recips);
314 PulseEvent(hevent);
316 SetLastError(0xcafebabe);
317 recips = BSM_ALLDESKTOPS|BSM_APPLICATIONS;
318 ResetEvent(hevent);
319 ret = pBroadcastExW( BSF_QUERY, &recips, WM_NULL, 100, 0, NULL );
320 ok(ret==1, "Returned: %d error %u\n", ret, GetLastError());
321 ok(WaitForSingleObject(hevent, 0) != WAIT_TIMEOUT, "Asynchronous message sent instead\n");
322 ok(recips == (BSM_ALLDESKTOPS|BSM_APPLICATIONS) ||
323 recips == BSM_APPLICATIONS, /* win2k3 */
324 "Received by: %08x\n", recips);
325 PulseEvent(hevent);
327 SetLastError(0xcafebabe);
328 recips = BSM_ALLDESKTOPS|BSM_APPLICATIONS;
329 ResetEvent(hevent);
330 ret = pBroadcastExW( BSF_QUERY, &recips, WM_NULL, 100, BROADCAST_QUERY_DENY, NULL );
331 ok(!ret, "Returned: %d\n", ret);
332 ok(WaitForSingleObject(hevent, 0) != WAIT_TIMEOUT, "Asynchronous message sent instead\n");
333 ok(recips == (BSM_ALLDESKTOPS|BSM_APPLICATIONS) ||
334 recips == BSM_APPLICATIONS, /* win2k3 */
335 "Received by: %08x\n", recips);
336 PulseEvent(hevent);
339 START_TEST(broadcast)
341 if (!init_procs())
342 return;
344 trace("Running BroadcastSystemMessageA tests\n");
345 test_parameters(pBroadcastA, "BroadcastSystemMessageA");
346 if (pBroadcastW)
348 trace("Running BroadcastSystemMessageW tests\n");
349 test_parameters(pBroadcastW, "BroadcastSystemMessageW");
351 else
352 win_skip("No BroadcastSystemMessageW, skipping\n");
353 if (pBroadcastExA)
355 trace("Running BroadcastSystemMessageExA tests\n");
356 test_parametersEx(pBroadcastExA);
358 else
359 win_skip("No BroadcastSystemMessageExA, skipping\n");
360 if (pBroadcastExW)
362 trace("Running BroadcastSystemMessageExW tests\n");
363 test_parametersEx(pBroadcastExW);
364 trace("Attempting privileges checking tests\n");
365 test_noprivileges();
367 else
368 win_skip("No BroadcastSystemMessageExW, skipping\n");