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
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
;
42 static LRESULT WINAPI
main_window_procA(HWND hwnd
, UINT msg
, WPARAM wparam
, LPARAM lparam
)
46 trace("main_window_procA: Sleeping for %lu ms\n", wparam
);
49 if (WaitForSingleObject(hevent
, wparam
) == WAIT_TIMEOUT
)
52 trace("main_window_procA: Returning WM_NULL with parameter %08lx\n", lparam
);
56 return DefWindowProcA(hwnd
, msg
, wparam
, lparam
);
59 static BOOL
init_procs(void)
62 HANDLE user32
= GetModuleHandleA("user32.dll");
63 pBroadcastA
= (PBROADCAST
)GetProcAddress(user32
, "BroadcastSystemMessageA");
65 pBroadcastA
= (PBROADCAST
)GetProcAddress(user32
, "BroadcastSystemMessage");
66 ok(pBroadcastA
!= NULL
, "No BroadcastSystemMessage found\n");
69 win_skip("BroadcastA is not available\n");
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
;
83 cls
.hInstance
= GetModuleHandleA(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
))
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
))
100 static void test_parameters(PBROADCAST broadcast
, const char *functionname
)
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
);
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
;
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");
156 SetLastError( 0xdeadbeef );
157 recips
= BSM_APPLICATIONS
;
158 ret
= broadcast( BSF_POSTMESSAGE
|BSF_SENDNOTIFYMESSAGE
, &recips
, WM_NULL
, 100, 0 );
161 ok(ret
==1, "Returned: %d\n", ret
);
162 ok(WaitForSingleObject(hevent
, 0) != WAIT_OBJECT_0
, "Synchronous message sent instead\n");
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");
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");
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");
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
)
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
;
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");
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");
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");
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");
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");
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");
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");
287 if (!pAdjustTokenPrivileges(token
, TRUE
, NULL
, 0, NULL
, NULL
))
289 skip("Can't adjust security token for process\n");
293 trace("Trying privileged edition!\n");
294 SetLastError(0xcafebabe);
295 recips
= BSM_ALLDESKTOPS
;
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
);
305 SetLastError(0xcafebabe);
306 recips
= BSM_ALLCOMPONENTS
;
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
);
316 SetLastError(0xcafebabe);
317 recips
= BSM_ALLDESKTOPS
|BSM_APPLICATIONS
;
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
);
327 SetLastError(0xcafebabe);
328 recips
= BSM_ALLDESKTOPS
|BSM_APPLICATIONS
;
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
);
339 START_TEST(broadcast
)
344 trace("Running BroadcastSystemMessageA tests\n");
345 test_parameters(pBroadcastA
, "BroadcastSystemMessageA");
348 trace("Running BroadcastSystemMessageW tests\n");
349 test_parameters(pBroadcastW
, "BroadcastSystemMessageW");
352 win_skip("No BroadcastSystemMessageW, skipping\n");
355 trace("Running BroadcastSystemMessageExA tests\n");
356 test_parametersEx(pBroadcastExA
);
359 win_skip("No BroadcastSystemMessageExA, skipping\n");
362 trace("Running BroadcastSystemMessageExW tests\n");
363 test_parametersEx(pBroadcastExW
);
364 trace("Attempting privileges checking tests\n");
368 win_skip("No BroadcastSystemMessageExW, skipping\n");