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
22 #define _WIN32_WINNT 0x0501
34 #include "wine/test.h"
36 typedef LONG (WINAPI
*PBROADCAST
)( DWORD
,LPDWORD
,UINT
,WPARAM
,LPARAM
);
37 typedef LONG (WINAPI
*PBROADCASTEX
)( DWORD
,LPDWORD
,UINT
,WPARAM
,LPARAM
,PBSMINFO
);
40 static LRESULT WINAPI
main_window_procA(HWND hwnd
, UINT msg
, WPARAM wparam
, LPARAM lparam
)
44 trace("main_window_procA: Sleeping for %lu ms\n", wparam
);
47 if (WaitForSingleObject(hevent
, wparam
) == WAIT_TIMEOUT
)
50 trace("main_window_procA: Returning WM_NULL with parameter %08lx\n", lparam
);
54 return DefWindowProcA(hwnd
, msg
, wparam
, lparam
);
57 static BOOL
init_procs(void)
61 hevent
= CreateEventA(NULL
, TRUE
, FALSE
, "Asynchronous checking event");
63 cls
.style
= CS_DBLCLKS
;
64 cls
.lpfnWndProc
= main_window_procA
;
67 cls
.hInstance
= GetModuleHandleA(0);
69 cls
.hCursor
= LoadCursorA(0, (LPCSTR
)IDC_ARROW
);
70 cls
.hbrBackground
= GetStockObject(WHITE_BRUSH
);
71 cls
.lpszMenuName
= NULL
;
72 cls
.lpszClassName
= "MainWindowClass";
74 if (!RegisterClassA(&cls
))
77 if (!CreateWindowExA(0, "MainWindowClass", "Main window", WS_CAPTION
| WS_SYSMENU
|
78 WS_MINIMIZEBOX
| WS_MAXIMIZEBOX
| WS_POPUP
, 100, 100, 200,
79 200, 0, 0, GetModuleHandleA(NULL
), NULL
))
84 static void test_parameters(PBROADCAST broadcast
, const char *functionname
)
89 SetLastError(0xcafebabe);
90 recips
= BSM_APPLICATIONS
;
91 ret
= broadcast( 0x80000000, &recips
, WM_NULL
, 0, 0 );
92 if (!ret
&& GetLastError() == ERROR_CALL_NOT_IMPLEMENTED
)
94 win_skip("%s is not implemented\n", functionname
);
97 ok(!ret
|| broken(ret
), "Returned: %d\n", ret
);
98 if (!ret
) ok(GetLastError() == ERROR_INVALID_PARAMETER
, "Last error: %08x\n", GetLastError());
100 SetLastError(0xcafebabe);
101 recips
= BSM_APPLICATIONS
;
102 ret
= broadcast( 0x80000000, &recips
, WM_NULL
, 0, 0 );
103 ok(!ret
|| broken(ret
), "Returned: %d\n", ret
);
104 if (!ret
) ok(GetLastError() == ERROR_INVALID_PARAMETER
, "Last error: %08x\n", GetLastError());
106 if (0) /* TODO: Check the hang flags */
108 SetLastError(0xcafebabe);
109 recips
= BSM_APPLICATIONS
;
110 ret
= broadcast( BSF_QUERY
|(BSF_NOHANG
|BSF_FORCEIFHUNG
), &recips
, WM_NULL
, 30000, 0 );
111 ok(0, "Last error: %08x\n", GetLastError());
112 ok(0, "Returned: %d\n", ret
);
114 SetLastError(0xcafebabe);
115 recips
= BSM_APPLICATIONS
;
116 ret
= broadcast( BSF_QUERY
|(BSF_NOHANG
|BSF_NOTIMEOUTIFNOTHUNG
), &recips
, WM_NULL
, 30000, 0 );
117 ok(0, "Last error: %08x\n", GetLastError());
118 ok(0, "Returned: %d\n", ret
);
120 SetLastError(0xcafebabe);
121 recips
= BSM_APPLICATIONS
;
122 ret
= broadcast( BSF_QUERY
|(BSF_NOTIMEOUTIFNOTHUNG
|BSF_FORCEIFHUNG
), &recips
, WM_NULL
, 30000, 0 );
123 ok(0, "Last error: %08x\n", GetLastError());
124 ok(0, "Returned: %d\n", ret
);
126 SetLastError(0xcafebabe);
127 recips
= BSM_APPLICATIONS
;
128 ret
= broadcast( BSF_POSTMESSAGE
|(BSF_NOTIMEOUTIFNOTHUNG
|BSF_FORCEIFHUNG
), &recips
, WM_NULL
, 30000, 0 );
129 ok(0, "Last error: %08x\n", GetLastError());
130 ok(0, "Returned: %d\n", ret
);
133 recips
= BSM_APPLICATIONS
;
135 ret
= broadcast( BSF_POSTMESSAGE
|BSF_QUERY
, &recips
, WM_NULL
, 100, 0 );
136 ok(ret
==1, "Returned: %d\n", ret
);
137 ok(WaitForSingleObject(hevent
, 0) != WAIT_TIMEOUT
, "Asynchronous message sent instead\n");
140 SetLastError( 0xdeadbeef );
141 recips
= BSM_APPLICATIONS
;
142 ret
= broadcast( BSF_POSTMESSAGE
|BSF_SENDNOTIFYMESSAGE
, &recips
, WM_NULL
, 100, 0 );
145 ok(ret
==1, "Returned: %d\n", ret
);
146 ok(WaitForSingleObject(hevent
, 0) != WAIT_OBJECT_0
, "Synchronous message sent instead\n");
149 recips
= BSM_APPLICATIONS
;
150 ret
= broadcast( BSF_SENDNOTIFYMESSAGE
, &recips
, WM_NULL
, 100, BROADCAST_QUERY_DENY
);
151 ok(ret
==1, "Returned: %d\n", ret
);
152 ok(WaitForSingleObject(hevent
, 0) != WAIT_TIMEOUT
, "Asynchronous message sent instead\n");
155 recips
= BSM_APPLICATIONS
;
156 ret
= broadcast( BSF_SENDNOTIFYMESSAGE
|BSF_QUERY
, &recips
, WM_NULL
, 100, BROADCAST_QUERY_DENY
);
157 ok(!ret
, "Returned: %d\n", ret
);
158 ok(WaitForSingleObject(hevent
, 0) != WAIT_TIMEOUT
, "Asynchronous message sent instead\n");
161 else /* BSF_SENDNOTIFYMESSAGE not supported on NT4 */
162 ok( GetLastError() == ERROR_INVALID_PARAMETER
, "failed with err %u\n", GetLastError() );
164 recips
= BSM_APPLICATIONS
;
165 ret
= broadcast( 0, &recips
, WM_NULL
, 100, 0 );
166 ok(ret
==1, "Returned: %d\n", ret
);
167 ok(WaitForSingleObject(hevent
, 0) != WAIT_TIMEOUT
, "Asynchronous message sent instead\n");
171 /* BSF_SENDNOTIFYMESSAGE and BSF_QUERY are both synchronous within the same process
172 * However you should be able to distinguish them by sending the BROADCAST_QUERY_DENY flag
175 static void test_parametersEx(PBROADCASTEX broadcastex
)
180 SetLastError(0xcafebabe);
181 recips
= BSM_APPLICATIONS
;
182 ret
= broadcastex( 0x80000000, &recips
, WM_NULL
, 0, 0, NULL
);
183 ok(GetLastError() == ERROR_INVALID_PARAMETER
, "Last error: %08x\n", GetLastError());
184 ok(!ret
, "Returned: %d\n", ret
);
186 SetLastError(0xcafebabe);
187 recips
= BSM_APPLICATIONS
;
188 ret
= broadcastex( 0x80000000, &recips
, WM_NULL
, 0, 0, NULL
);
189 ok(GetLastError() == ERROR_INVALID_PARAMETER
, "Last error: %08x\n", GetLastError());
190 ok(!ret
, "Returned: %d\n", ret
);
192 if (0) /* TODO: Check the hang flags */
194 SetLastError(0xcafebabe);
195 recips
= BSM_APPLICATIONS
;
196 ret
= broadcastex( BSF_QUERY
|(BSF_NOHANG
|BSF_FORCEIFHUNG
), &recips
, WM_NULL
, 30000, 0, NULL
);
197 ok(0, "Last error: %08x\n", GetLastError());
198 ok(0, "Returned: %d\n", ret
);
200 SetLastError(0xcafebabe);
201 recips
= BSM_APPLICATIONS
;
202 ret
= broadcastex( BSF_QUERY
|(BSF_NOHANG
|BSF_NOTIMEOUTIFNOTHUNG
), &recips
, WM_NULL
, 30000, 0, NULL
);
203 ok(0, "Last error: %08x\n", GetLastError());
204 ok(0, "Returned: %d\n", ret
);
206 SetLastError(0xcafebabe);
207 recips
= BSM_APPLICATIONS
;
208 ret
= broadcastex( BSF_QUERY
|(BSF_NOTIMEOUTIFNOTHUNG
|BSF_FORCEIFHUNG
), &recips
, WM_NULL
, 30000, 0, NULL
);
209 ok(0, "Last error: %08x\n", GetLastError());
210 ok(0, "Returned: %d\n", ret
);
212 SetLastError(0xcafebabe);
213 recips
= BSM_APPLICATIONS
;
214 ret
= broadcastex( BSF_POSTMESSAGE
|(BSF_NOTIMEOUTIFNOTHUNG
|BSF_FORCEIFHUNG
), &recips
, WM_NULL
, 30000, 0, NULL
);
215 ok(0, "Last error: %08x\n", GetLastError());
216 ok(0, "Returned: %d\n", ret
);
219 recips
= BSM_APPLICATIONS
;
221 ret
= broadcastex( BSF_POSTMESSAGE
|BSF_QUERY
, &recips
, WM_NULL
, 100, 0, NULL
);
222 ok(ret
==1, "Returned: %d\n", ret
);
223 ok(WaitForSingleObject(hevent
, 0) != WAIT_TIMEOUT
, "Asynchronous message sent instead\n");
226 recips
= BSM_APPLICATIONS
;
227 ret
= broadcastex( BSF_POSTMESSAGE
|BSF_SENDNOTIFYMESSAGE
, &recips
, WM_NULL
, 100, 0, NULL
);
228 ok(ret
==1, "Returned: %d\n", ret
);
229 ok(WaitForSingleObject(hevent
, 0) != WAIT_OBJECT_0
, "Synchronous message sent instead\n");
232 recips
= BSM_APPLICATIONS
;
233 ret
= broadcastex( BSF_SENDNOTIFYMESSAGE
, &recips
, WM_NULL
, 100, BROADCAST_QUERY_DENY
, NULL
);
234 ok(ret
==1, "Returned: %d\n", ret
);
235 ok(WaitForSingleObject(hevent
, 0) != WAIT_TIMEOUT
, "Asynchronous message sent instead\n");
238 recips
= BSM_APPLICATIONS
;
239 ret
= broadcastex( BSF_SENDNOTIFYMESSAGE
|BSF_QUERY
, &recips
, WM_NULL
, 100, BROADCAST_QUERY_DENY
, NULL
);
240 ok(!ret
, "Returned: %d\n", ret
);
241 ok(WaitForSingleObject(hevent
, 0) != WAIT_TIMEOUT
, "Asynchronous message sent instead\n");
244 recips
= BSM_APPLICATIONS
;
245 ret
= broadcastex( 0, &recips
, WM_NULL
, 100, 0, NULL
);
246 ok(ret
==1, "Returned: %d\n", ret
);
247 ok(WaitForSingleObject(hevent
, 0) != WAIT_TIMEOUT
, "Asynchronous message sent instead\n");
251 static void test_noprivileges(void)
257 static const DWORD BSM_ALL_RECIPS
= BSM_VXDS
| BSM_NETDRIVER
|
258 BSM_INSTALLABLEDRIVERS
| BSM_APPLICATIONS
;
260 if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES
, &token
))
262 skip("Can't open security token for process\n");
265 if (!AdjustTokenPrivileges(token
, TRUE
, NULL
, 0, NULL
, NULL
))
267 skip("Can't adjust security token for process\n");
271 trace("Trying privileged edition!\n");
272 SetLastError(0xcafebabe);
273 recips
= BSM_ALLDESKTOPS
;
275 ret
= BroadcastSystemMessageExW( BSF_QUERY
, &recips
, WM_NULL
, 100, 0, NULL
);
276 ok(ret
==1, "Returned: %d error %u\n", ret
, GetLastError());
277 ok(WaitForSingleObject(hevent
, 0) != WAIT_TIMEOUT
, "Asynchronous message sent instead\n");
278 ok(recips
== BSM_ALLDESKTOPS
||
279 recips
== BSM_ALL_RECIPS
, /* win2k3 */
280 "Received by: %08x\n", recips
);
283 SetLastError(0xcafebabe);
284 recips
= BSM_ALLCOMPONENTS
;
286 ret
= BroadcastSystemMessageExW( BSF_QUERY
, &recips
, WM_NULL
, 100, 0, NULL
);
287 ok(ret
==1, "Returned: %d error %u\n", ret
, GetLastError());
288 ok(WaitForSingleObject(hevent
, 0) != WAIT_TIMEOUT
, "Asynchronous message sent instead\n");
289 ok(recips
== BSM_ALLCOMPONENTS
||
290 recips
== BSM_ALL_RECIPS
, /* win2k3 */
291 "Received by: %08x\n", recips
);
294 SetLastError(0xcafebabe);
295 recips
= BSM_ALLDESKTOPS
|BSM_APPLICATIONS
;
297 ret
= BroadcastSystemMessageExW( 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
|BSM_APPLICATIONS
) ||
301 recips
== BSM_APPLICATIONS
, /* win2k3 */
302 "Received by: %08x\n", recips
);
305 SetLastError(0xcafebabe);
306 recips
= BSM_ALLDESKTOPS
|BSM_APPLICATIONS
;
308 ret
= BroadcastSystemMessageExW( BSF_QUERY
, &recips
, WM_NULL
, 100, BROADCAST_QUERY_DENY
, NULL
);
309 ok(!ret
, "Returned: %d\n", ret
);
310 ok(WaitForSingleObject(hevent
, 0) != WAIT_TIMEOUT
, "Asynchronous message sent instead\n");
311 ok(recips
== (BSM_ALLDESKTOPS
|BSM_APPLICATIONS
) ||
312 recips
== BSM_APPLICATIONS
, /* win2k3 */
313 "Received by: %08x\n", recips
);
317 START_TEST(broadcast
)
322 trace("Running BroadcastSystemMessageA tests\n");
323 test_parameters(BroadcastSystemMessageA
, "BroadcastSystemMessageA");
325 trace("Running BroadcastSystemMessageW tests\n");
326 test_parameters(BroadcastSystemMessageW
, "BroadcastSystemMessageW");
328 trace("Running BroadcastSystemMessageExA tests\n");
329 test_parametersEx(BroadcastSystemMessageExA
);
331 trace("Running BroadcastSystemMessageExW tests\n");
332 test_parametersEx(BroadcastSystemMessageExW
);
334 trace("Attempting privileges checking tests\n");