ReactOS 0.4.15-dev-7704-gc07eb9f
dinput.c
Go to the documentation of this file.
1/*
2 * Copyright (c) 2011 Andrew Nguyen
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19#define DIRECTINPUT_VERSION 0x0700
20
21#define COBJMACROS
22#include <initguid.h>
23#include <windows.h>
24#include <dinput.h>
25#include <dinputd.h>
26
27#include "wine/test.h"
28
30
32{
40};
41
43{
51};
52
53static HRESULT (WINAPI *pDirectInputCreateEx)(HINSTANCE, DWORD, REFIID, LPVOID *, LPUNKNOWN);
54
56{
57 ok(0, "Callback was invoked with parameters (%p, %p)\n", instance, context);
58 return DIENUM_STOP;
59}
60
61static void test_preinitialization(void)
62{
63 static const struct
64 {
65 REFGUID rguid;
66 BOOL pdev;
67 HRESULT expected_hr;
68 } create_device_tests[] =
69 {
72 {&GUID_Unknown, FALSE, E_POINTER},
73 {&GUID_Unknown, TRUE, DIERR_NOTINITIALIZED},
74 {&GUID_SysMouse, FALSE, E_POINTER},
75 {&GUID_SysMouse, TRUE, DIERR_NOTINITIALIZED},
76 };
77
78 static const struct
79 {
80 DWORD dwDevType;
81 LPDIENUMDEVICESCALLBACKA lpCallback;
83 HRESULT expected_hr;
84 int todo;
85 } enum_devices_tests[] =
86 {
87 {0, NULL, 0, DIERR_INVALIDPARAM},
88 {0, NULL, ~0u, DIERR_INVALIDPARAM},
91 {0xdeadbeef, NULL, 0, DIERR_INVALIDPARAM},
92 {0xdeadbeef, NULL, ~0u, DIERR_INVALIDPARAM},
93 {0xdeadbeef, dummy_callback, 0, DIERR_INVALIDPARAM},
94 {0xdeadbeef, dummy_callback, ~0u, DIERR_INVALIDPARAM},
95 };
96
97 IDirectInputA *pDI;
98 HRESULT hr;
99 int i;
100 IDirectInputDeviceA *pDID;
101
102 hr = CoCreateInstance(&CLSID_DirectInput, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectInputA, (void **)&pDI);
103 if (FAILED(hr))
104 {
105 skip("Failed to instantiate a IDirectInputA instance: 0x%08x\n", hr);
106 return;
107 }
108
109 for (i = 0; i < ARRAY_SIZE(create_device_tests); i++)
110 {
111 if (create_device_tests[i].pdev) pDID = (void *)0xdeadbeef;
112 hr = IDirectInput_CreateDevice(pDI, create_device_tests[i].rguid,
113 create_device_tests[i].pdev ? &pDID : NULL,
114 NULL);
115 ok(hr == create_device_tests[i].expected_hr, "[%d] IDirectInput_CreateDevice returned 0x%08x\n", i, hr);
116 if (create_device_tests[i].pdev)
117 ok(pDID == NULL, "[%d] Output interface pointer is %p\n", i, pDID);
118 }
119
120 for (i = 0; i < ARRAY_SIZE(enum_devices_tests); i++)
121 {
122 hr = IDirectInput_EnumDevices(pDI, enum_devices_tests[i].dwDevType,
123 enum_devices_tests[i].lpCallback,
124 NULL,
125 enum_devices_tests[i].dwFlags);
126 todo_wine_if(enum_devices_tests[i].todo)
127 ok(hr == enum_devices_tests[i].expected_hr, "[%d] IDirectInput_EnumDevice returned 0x%08x\n", i, hr);
128 }
129
131 ok(hr == E_POINTER, "IDirectInput_GetDeviceStatus returned 0x%08x\n", hr);
132
133 hr = IDirectInput_GetDeviceStatus(pDI, &GUID_Unknown);
134 ok(hr == DIERR_NOTINITIALIZED, "IDirectInput_GetDeviceStatus returned 0x%08x\n", hr);
135
136 hr = IDirectInput_GetDeviceStatus(pDI, &GUID_SysMouse);
137 ok(hr == DIERR_NOTINITIALIZED, "IDirectInput_GetDeviceStatus returned 0x%08x\n", hr);
138
140 ok(hr == DIERR_NOTINITIALIZED, "IDirectInput_RunControlPanel returned 0x%08x\n", hr);
141
143 ok(hr == DIERR_INVALIDPARAM, "IDirectInput_RunControlPanel returned 0x%08x\n", hr);
144
145 hr = IDirectInput_RunControlPanel(pDI, (HWND)0xdeadbeef, 0);
146 ok(hr == E_HANDLE, "IDirectInput_RunControlPanel returned 0x%08x\n", hr);
147
148 hr = IDirectInput_RunControlPanel(pDI, (HWND)0xdeadbeef, ~0u);
149 ok(hr == E_HANDLE, "IDirectInput_RunControlPanel returned 0x%08x\n", hr);
150
152}
153
155{
156 static const struct
157 {
158 BOOL hinst;
159 DWORD dwVersion;
160 REFIID riid;
161 BOOL ppdi;
162 HRESULT expected_hr;
163 IUnknown *expected_ppdi;
164 } invalid_param_list[] =
165 {
167 {FALSE, 0, &IID_IUnknown, TRUE, DIERR_NOINTERFACE, (void *)0xdeadbeef},
168 {FALSE, 0, &IID_IDirectInputA, FALSE, E_POINTER},
169 {FALSE, 0, &IID_IDirectInputA, TRUE, DIERR_INVALIDPARAM, NULL},
172 {FALSE, DIRECTINPUT_VERSION, &IID_IDirectInputA, FALSE, E_POINTER},
173 {FALSE, DIRECTINPUT_VERSION, &IID_IDirectInputA, TRUE, DIERR_INVALIDPARAM, NULL},
175 {FALSE, DIRECTINPUT_VERSION - 1, &IID_IUnknown, TRUE, DIERR_NOINTERFACE, (void *)0xdeadbeef},
176 {FALSE, DIRECTINPUT_VERSION - 1, &IID_IDirectInputA, FALSE, E_POINTER},
177 {FALSE, DIRECTINPUT_VERSION - 1, &IID_IDirectInputA, TRUE, DIERR_INVALIDPARAM, NULL},
179 {FALSE, DIRECTINPUT_VERSION + 1, &IID_IUnknown, TRUE, DIERR_NOINTERFACE, (void *)0xdeadbeef},
180 {FALSE, DIRECTINPUT_VERSION + 1, &IID_IDirectInputA, FALSE, E_POINTER},
181 {FALSE, DIRECTINPUT_VERSION + 1, &IID_IDirectInputA, TRUE, DIERR_INVALIDPARAM, NULL},
183 {TRUE, 0, &IID_IUnknown, TRUE, DIERR_NOINTERFACE, (void *)0xdeadbeef},
184 {TRUE, 0, &IID_IDirectInputA, FALSE, E_POINTER},
185 {TRUE, 0, &IID_IDirectInputA, TRUE, DIERR_NOTINITIALIZED, NULL},
188 {TRUE, DIRECTINPUT_VERSION, &IID_IDirectInputA, FALSE, E_POINTER},
190 {TRUE, DIRECTINPUT_VERSION - 1, &IID_IUnknown, TRUE, DIERR_NOINTERFACE, (void *)0xdeadbeef},
191 {TRUE, DIRECTINPUT_VERSION - 1, &IID_IDirectInputA, FALSE, E_POINTER},
192 {TRUE, DIRECTINPUT_VERSION - 1, &IID_IDirectInputA, TRUE, DIERR_BETADIRECTINPUTVERSION, NULL},
194 {TRUE, DIRECTINPUT_VERSION + 1, &IID_IUnknown, TRUE, DIERR_NOINTERFACE, (void *)0xdeadbeef},
195 {TRUE, DIRECTINPUT_VERSION + 1, &IID_IDirectInputA, FALSE, E_POINTER},
196 {TRUE, DIRECTINPUT_VERSION + 1, &IID_IDirectInputA, TRUE, DIERR_OLDDIRECTINPUTVERSION, NULL},
197 };
198
199 static REFIID no_interface_list[] = {&IID_IUnknown, &IID_IDirectInput8A,
200 &IID_IDirectInput8W, &IID_IDirectInputDeviceA,
201 &IID_IDirectInputDeviceW, &IID_IDirectInputDevice2A,
202 &IID_IDirectInputDevice2W, &IID_IDirectInputDevice7A,
203 &IID_IDirectInputDevice7W, &IID_IDirectInputDevice8A,
204 &IID_IDirectInputDevice8W, &IID_IDirectInputEffect};
205
206 static REFIID iid_list[] = {&IID_IDirectInputA, &IID_IDirectInputW,
207 &IID_IDirectInput2A, &IID_IDirectInput2W,
208 &IID_IDirectInput7A, &IID_IDirectInput7W};
209
210 int i, j;
211 IUnknown *pUnk;
212 HRESULT hr;
213
214 if (!pDirectInputCreateEx)
215 {
216 win_skip("DirectInputCreateEx is not available\n");
217 return;
218 }
219
220 for (i = 0; i < ARRAY_SIZE(invalid_param_list); i++)
221 {
222 if (invalid_param_list[i].ppdi) pUnk = (void *)0xdeadbeef;
223 hr = pDirectInputCreateEx(invalid_param_list[i].hinst ? hInstance : NULL,
224 invalid_param_list[i].dwVersion,
225 invalid_param_list[i].riid,
226 invalid_param_list[i].ppdi ? (void **)&pUnk : NULL,
227 NULL);
228 ok(hr == invalid_param_list[i].expected_hr, "[%d] DirectInputCreateEx returned 0x%08x\n", i, hr);
229 if (invalid_param_list[i].ppdi)
230 ok(pUnk == invalid_param_list[i].expected_ppdi, "[%d] Output interface pointer is %p\n", i, pUnk);
231 }
232
233 for (i = 0; i < ARRAY_SIZE(no_interface_list); i++)
234 {
235 pUnk = (void *)0xdeadbeef;
236 hr = pDirectInputCreateEx(hInstance, DIRECTINPUT_VERSION, no_interface_list[i], (void **)&pUnk, NULL);
237 ok(hr == DIERR_NOINTERFACE, "[%d] DirectInputCreateEx returned 0x%08x\n", i, hr);
238 ok(pUnk == (void *)0xdeadbeef, "[%d] Output interface pointer is %p\n", i, pUnk);
239 }
240
241 for (i = 0; i < ARRAY_SIZE(iid_list); i++)
242 {
243 pUnk = NULL;
244 hr = pDirectInputCreateEx(hInstance, DIRECTINPUT_VERSION, iid_list[i], (void **)&pUnk, NULL);
245 ok(hr == DI_OK, "[%d] DirectInputCreateEx returned 0x%08x\n", i, hr);
246 ok(pUnk != NULL, "[%d] Output interface pointer is NULL\n", i);
247 if (pUnk)
248 IUnknown_Release(pUnk);
249 }
250
251 /* Examine combinations of requested interfaces and version numbers. */
252 for (i = 0; i < ARRAY_SIZE(directinput_version_list); i++)
253 {
254 for (j = 0; j < ARRAY_SIZE(iid_list); j++)
255 {
256 pUnk = NULL;
257 hr = pDirectInputCreateEx(hInstance, directinput_version_list[i], iid_list[j], (void **)&pUnk, NULL);
258 ok(hr == DI_OK, "[%d/%d] DirectInputCreateEx returned 0x%08x\n", i, j, hr);
259 ok(pUnk != NULL, "[%d] Output interface pointer is NULL\n", i);
260 if (pUnk)
261 IUnknown_Release(pUnk);
262 }
263 }
264}
265
266static void test_QueryInterface(void)
267{
268 static REFIID iid_list[] = {&IID_IUnknown, &IID_IDirectInputA, &IID_IDirectInputW,
269 &IID_IDirectInput2A, &IID_IDirectInput2W,
270 &IID_IDirectInput7A, &IID_IDirectInput7W};
271
272 static REFIID no_interface_list[] =
273 {
274 &IID_IDirectInput8A,
275 &IID_IDirectInput8W,
276 &IID_IDirectInputDeviceA,
277 &IID_IDirectInputDeviceW,
278 &IID_IDirectInputDevice2A,
279 &IID_IDirectInputDevice2W,
280 &IID_IDirectInputDevice7A,
281 &IID_IDirectInputDevice7W,
282 &IID_IDirectInputDevice8A,
283 &IID_IDirectInputDevice8W,
284 &IID_IDirectInputEffect,
285 };
286
287 IDirectInputA *pDI;
288 HRESULT hr;
289 IUnknown *pUnk;
290 int i;
291
293 if (FAILED(hr))
294 {
295 win_skip("Failed to instantiate a IDirectInputA instance: 0x%08x\n", hr);
296 return;
297 }
298
300 ok(hr == E_POINTER, "IDirectInput_QueryInterface returned 0x%08x\n", hr);
301
302 pUnk = (void *)0xdeadbeef;
303 hr = IDirectInput_QueryInterface(pDI, NULL, (void **)&pUnk);
304 ok(hr == E_POINTER, "IDirectInput_QueryInterface returned 0x%08x\n", hr);
305 ok(pUnk == (void *)0xdeadbeef, "Output interface pointer is %p\n", pUnk);
306
308 ok(hr == E_POINTER, "IDirectInput_QueryInterface returned 0x%08x\n", hr);
309
310 for (i = 0; i < ARRAY_SIZE(iid_list); i++)
311 {
312 pUnk = NULL;
313 hr = IDirectInput_QueryInterface(pDI, iid_list[i], (void **)&pUnk);
314 ok(hr == S_OK, "[%d] IDirectInput_QueryInterface returned 0x%08x\n", i, hr);
315 ok(pUnk != NULL, "[%d] Output interface pointer is NULL\n", i);
316 if (pUnk) IUnknown_Release(pUnk);
317 }
318
319 for (i = 0; i < ARRAY_SIZE(no_interface_list); i++)
320 {
321 pUnk = (void *)0xdeadbeef;
322 hr = IDirectInput_QueryInterface(pDI, no_interface_list[i], (void **)&pUnk);
323 ok(hr == E_NOINTERFACE, "[%d] IDirectInput_QueryInterface returned 0x%08x\n", i, hr);
324 ok(pUnk == NULL, "[%d] Output interface pointer is %p\n", i, pUnk);
325 }
326
328}
329
330static void test_CreateDevice(void)
331{
332 IDirectInputA *pDI;
333 HRESULT hr;
334 IDirectInputDeviceA *pDID;
335
337 if (FAILED(hr))
338 {
339 win_skip("Failed to instantiate a IDirectInputA instance: 0x%08x\n", hr);
340 return;
341 }
342
344 ok(hr == E_POINTER, "IDirectInput_CreateDevice returned 0x%08x\n", hr);
345
346 pDID = (void *)0xdeadbeef;
347 hr = IDirectInput_CreateDevice(pDI, NULL, &pDID, NULL);
348 ok(hr == E_POINTER, "IDirectInput_CreateDevice returned 0x%08x\n", hr);
349 ok(pDID == NULL, "Output interface pointer is %p\n", pDID);
350
351 hr = IDirectInput_CreateDevice(pDI, &GUID_Unknown, NULL, NULL);
352 ok(hr == E_POINTER, "IDirectInput_CreateDevice returned 0x%08x\n", hr);
353
354 pDID = (void *)0xdeadbeef;
355 hr = IDirectInput_CreateDevice(pDI, &GUID_Unknown, &pDID, NULL);
356 ok(hr == DIERR_DEVICENOTREG, "IDirectInput_CreateDevice returned 0x%08x\n", hr);
357 ok(pDID == NULL, "Output interface pointer is %p\n", pDID);
358
359 hr = IDirectInput_CreateDevice(pDI, &GUID_SysMouse, NULL, NULL);
360 ok(hr == E_POINTER, "IDirectInput_CreateDevice returned 0x%08x\n", hr);
361
362 hr = IDirectInput_CreateDevice(pDI, &GUID_SysMouse, &pDID, NULL);
363 ok(hr == DI_OK, "IDirectInput_CreateDevice returned 0x%08x\n", hr);
364
367}
368
370{
371 unsigned int device_count;
373};
374
376{
377 struct enum_devices_test *enum_test = context;
378
379 if ((instance->dwDevType & 0xff) == DIDEVTYPE_KEYBOARD ||
380 (instance->dwDevType & 0xff) == DIDEVTYPE_MOUSE) {
381 const char *device = ((instance->dwDevType & 0xff) ==
382 DIDEVTYPE_KEYBOARD) ? "Keyboard" : "Mouse";
383 ok(IsEqualGUID(&instance->guidInstance, &instance->guidProduct),
384 "%s guidInstance (%s) does not match guidProduct (%s)\n",
385 device, wine_dbgstr_guid(&instance->guidInstance),
386 wine_dbgstr_guid(&instance->guidProduct));
387 }
388
389 if ((instance->dwDevType & 0xff) == DIDEVTYPE_KEYBOARD)
390 ok(IsEqualGUID(&instance->guidProduct, &GUID_SysKeyboard),
391 "Keyboard guidProduct (%s) does not match GUID_SysKeyboard (%s)\n",
392 wine_dbgstr_guid(&instance->guidProduct),
393 wine_dbgstr_guid(&GUID_SysMouse));
394 else if ((instance->dwDevType & 0xff) == DIDEVTYPE_MOUSE)
395 ok(IsEqualGUID(&instance->guidProduct, &GUID_SysMouse),
396 "Mouse guidProduct (%s) does not match GUID_SysMouse (%s)\n",
397 wine_dbgstr_guid(&instance->guidProduct),
398 wine_dbgstr_guid(&GUID_SysMouse));
399 else {
400 /* Non-keyboard/mouse devices use the "PIDVID" guidProduct */
401 static const GUID pidvid_product_guid = { /* device_pidvid-0000-0000-0000-504944564944 "PIDVID" */
402 0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x50, 0x49, 0x44, 0x56, 0x49, 0x44}
403 };
404
405 ok(instance->guidProduct.Data2 == pidvid_product_guid.Data2,
406 "guidProduct.Data2 is %04x\n", instance->guidProduct.Data2);
407 ok(instance->guidProduct.Data3 == pidvid_product_guid.Data3,
408 "guidProduct.Data3 is %04x\n", instance->guidProduct.Data3);
409 ok(!memcmp(instance->guidProduct.Data4, pidvid_product_guid.Data4, sizeof(pidvid_product_guid.Data4)),
410 "guidProduct.Data4 does not match: %s\n", wine_dbgstr_guid(&instance->guidProduct));
411 }
412
413 enum_test->device_count++;
414 return enum_test->return_value;
415}
416
417static void test_EnumDevices(void)
418{
419 IDirectInputA *pDI;
420 HRESULT hr;
421 struct enum_devices_test enum_test, enum_test_return;
422
424 if (FAILED(hr))
425 {
426 win_skip("Failed to instantiate a IDirectInputA instance: 0x%08x\n", hr);
427 return;
428 }
429
430 hr = IDirectInput_EnumDevices(pDI, 0, NULL, NULL, 0);
431 ok(hr == DIERR_INVALIDPARAM, "IDirectInput_EnumDevices returned 0x%08x\n", hr);
432
433 hr = IDirectInput_EnumDevices(pDI, 0, NULL, NULL, ~0u);
434 ok(hr == DIERR_INVALIDPARAM, "IDirectInput_EnumDevices returned 0x%08x\n", hr);
435
436 /* Test crashes on Wine. */
437 if (0)
438 {
440 ok(hr == DIERR_INVALIDPARAM, "IDirectInput_EnumDevices returned 0x%08x\n", hr);
441 }
442
443 hr = IDirectInput_EnumDevices(pDI, 0xdeadbeef, NULL, NULL, 0);
444 ok(hr == DIERR_INVALIDPARAM, "IDirectInput_EnumDevices returned 0x%08x\n", hr);
445
446 hr = IDirectInput_EnumDevices(pDI, 0xdeadbeef, NULL, NULL, ~0u);
447 ok(hr == DIERR_INVALIDPARAM, "IDirectInput_EnumDevices returned 0x%08x\n", hr);
448
450 ok(hr == DIERR_INVALIDPARAM, "IDirectInput_EnumDevices returned 0x%08x\n", hr);
451
453 ok(hr == DIERR_INVALIDPARAM, "IDirectInput_EnumDevices returned 0x%08x\n", hr);
454
455 enum_test.device_count = 0;
456 enum_test.return_value = DIENUM_CONTINUE;
457 hr = IDirectInput_EnumDevices(pDI, 0, enum_devices_callback, &enum_test, 0);
458 ok(hr == DI_OK, "IDirectInput_EnumDevices returned 0x%08x\n", hr);
459 ok(enum_test.device_count != 0, "Device count is %u\n", enum_test.device_count);
460
461 /* Enumeration only stops with an explicit DIENUM_STOP. */
462 enum_test_return.device_count = 0;
463 enum_test_return.return_value = 42;
464 hr = IDirectInput_EnumDevices(pDI, 0, enum_devices_callback, &enum_test_return, 0);
465 ok(hr == DI_OK, "IDirectInput_EnumDevices returned 0x%08x\n", hr);
466 ok(enum_test_return.device_count == enum_test.device_count,
467 "Device count is %u vs. %u\n", enum_test_return.device_count, enum_test.device_count);
468
469 enum_test.device_count = 0;
470 enum_test.return_value = DIENUM_STOP;
471 hr = IDirectInput_EnumDevices(pDI, 0, enum_devices_callback, &enum_test, 0);
472 ok(hr == DI_OK, "IDirectInput_EnumDevices returned 0x%08x\n", hr);
473 ok(enum_test.device_count == 1, "Device count is %u\n", enum_test.device_count);
474
476}
477
478static void test_GetDeviceStatus(void)
479{
480 IDirectInputA *pDI;
481 HRESULT hr;
482
484 if (FAILED(hr))
485 {
486 win_skip("Failed to instantiate a IDirectInputA instance: 0x%08x\n", hr);
487 return;
488 }
489
491 ok(hr == E_POINTER, "IDirectInput_GetDeviceStatus returned 0x%08x\n", hr);
492
493 hr = IDirectInput_GetDeviceStatus(pDI, &GUID_Unknown);
495 ok(hr == DIERR_DEVICENOTREG, "IDirectInput_GetDeviceStatus returned 0x%08x\n", hr);
496
497 hr = IDirectInput_GetDeviceStatus(pDI, &GUID_SysMouse);
498 ok(hr == DI_OK, "IDirectInput_GetDeviceStatus returned 0x%08x\n", hr);
499
501}
502
503static void test_Initialize(void)
504{
505 IDirectInputA *pDI;
506 HRESULT hr;
507 int i;
508
509 hr = CoCreateInstance(&CLSID_DirectInput, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectInputA, (void **)&pDI);
510 if (FAILED(hr))
511 {
512 win_skip("Failed to instantiate a IDirectInputA instance: 0x%08x\n", hr);
513 return;
514 }
515
517 ok(hr == DIERR_INVALIDPARAM, "IDirectInput_Initialize returned 0x%08x\n", hr);
518
520 ok(hr == DIERR_INVALIDPARAM, "IDirectInput_Initialize returned 0x%08x\n", hr);
521
523 ok(hr == DIERR_NOTINITIALIZED, "IDirectInput_Initialize returned 0x%08x\n", hr);
524
525 /* Invalid DirectInput versions less than 0x0700 yield DIERR_BETADIRECTINPUTVERSION. */
526 hr = IDirectInput_Initialize(pDI, hInstance, 0x0123);
527 ok(hr == DIERR_BETADIRECTINPUTVERSION, "IDirectInput_Initialize returned 0x%08x\n", hr);
528
529 /* Invalid DirectInput versions greater than 0x0700 yield DIERR_BETADIRECTINPUTVERSION. */
530 hr = IDirectInput_Initialize(pDI, hInstance, 0xcafe);
531 ok(hr == DIERR_OLDDIRECTINPUTVERSION, "IDirectInput_Initialize returned 0x%08x\n", hr);
532
533 for (i = 0; i < ARRAY_SIZE(directinput_version_list); i++)
534 {
536 ok(hr == DI_OK, "IDirectInput_Initialize returned 0x%08x\n", hr);
537 }
538
539 /* Parameters are still validated after successful initialization. */
541 ok(hr == DIERR_NOTINITIALIZED, "IDirectInput_Initialize returned 0x%08x\n", hr);
542
544}
545
546static void test_RunControlPanel(void)
547{
548 IDirectInputA *pDI;
549 HRESULT hr;
550
552 if (FAILED(hr))
553 {
554 win_skip("Failed to instantiate a IDirectInputA instance: 0x%08x\n", hr);
555 return;
556 }
557
559 {
561 ok(hr == S_OK, "IDirectInput_RunControlPanel returned 0x%08x\n", hr);
562
564 ok(hr == S_OK, "IDirectInput_RunControlPanel returned 0x%08x\n", hr);
565 }
566
568 ok(hr == DIERR_INVALIDPARAM, "IDirectInput_RunControlPanel returned 0x%08x\n", hr);
569
570 hr = IDirectInput_RunControlPanel(pDI, (HWND)0xdeadbeef, 0);
571 ok(hr == E_HANDLE, "IDirectInput_RunControlPanel returned 0x%08x\n", hr);
572
573 hr = IDirectInput_RunControlPanel(pDI, (HWND)0xdeadbeef, ~0u);
574 ok(hr == E_HANDLE, "IDirectInput_RunControlPanel returned 0x%08x\n", hr);
575
577}
578
580{
581 IDirectInputA *pDI;
582 IDirectInputDeviceA *pDID;
583 IDirectInputJoyConfig8 *pDIJC;
585 HRESULT hr;
586 int i;
587
589 if (FAILED(hr))
590 {
591 win_skip("Failed to instantiate a IDirectInputA instance: 0x%08x\n", hr);
592 return;
593 }
594
595 hr = IDirectInput_QueryInterface(pDI, &IID_IDirectInputJoyConfig8, (void **)&pDIJC);
596 if (FAILED(hr))
597 {
598 win_skip("Failed to instantiate a IDirectInputJoyConfig8 instance: 0x%08x\n", hr);
599 return;
600 }
601
602 info.dwSize = sizeof(info);
603 hr = DI_OK;
604 i = 0;
605
606 /* Enumerate all connected joystick GUIDs and try to create the respective devices */
607 for (i = 0; SUCCEEDED(hr); i++)
608 {
610
611 ok (hr == DI_OK || hr == DIERR_NOMOREITEMS,
612 "IDirectInputJoyConfig8_GetConfig returned 0x%08x\n", hr);
613
614 if (SUCCEEDED(hr))
615 {
616 hr = IDirectInput_CreateDevice(pDI, &info.guidInstance, &pDID, NULL);
617 ok (SUCCEEDED(hr), "IDirectInput_CreateDevice failed with guid from GetConfig hr = 0x%08x\n", hr);
619 }
620 }
621
624}
625
627{
628 HMODULE dinput_mod = GetModuleHandleA("dinput.dll");
629
631
632 pDirectInputCreateEx = (void *)GetProcAddress(dinput_mod, "DirectInputCreateEx");
633
645}
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define START_TEST(x)
Definition: atltest.h:75
#define ARRAY_SIZE(A)
Definition: main.h:33
const GUID IID_IUnknown
static void test_Initialize(void)
Definition: dinput.c:503
static BOOL CALLBACK dummy_callback(const DIDEVICEINSTANCEA *instance, void *context)
Definition: dinput.c:55
#define DIRECTINPUT_VERSION
Definition: dinput.c:19
static void test_DirectInputCreateEx(void)
Definition: dinput.c:154
static const DWORD directinput_version_list[]
Definition: dinput.c:42
HINSTANCE hInstance
Definition: dinput.c:29
static void test_GetDeviceStatus(void)
Definition: dinput.c:478
static void test_QueryInterface(void)
Definition: dinput.c:266
static DWORD
Definition: dinput.c:53
static BOOL CALLBACK enum_devices_callback(const DIDEVICEINSTANCEA *instance, void *context)
Definition: dinput.c:375
static void test_EnumDevices(void)
Definition: dinput.c:417
static LPVOID LPUNKNOWN
Definition: dinput.c:53
static REFIID
Definition: dinput.c:53
static void test_CreateDevice(void)
Definition: dinput.c:330
static void test_RunControlPanel(void)
Definition: dinput.c:546
static void test_preinitialization(void)
Definition: dinput.c:61
static void test_DirectInputJoyConfig8(void)
Definition: dinput.c:579
@ DIRECTINPUT_VERSION_300
Definition: dinput.c:33
@ DIRECTINPUT_VERSION_500
Definition: dinput.c:34
@ DIRECTINPUT_VERSION_50A
Definition: dinput.c:35
@ DIRECTINPUT_VERSION_700
Definition: dinput.c:39
@ DIRECTINPUT_VERSION_602
Definition: dinput.c:37
@ DIRECTINPUT_VERSION_61A
Definition: dinput.c:38
@ DIRECTINPUT_VERSION_5B2
Definition: dinput.c:36
#define IDirectInput_GetDeviceStatus(p, a)
Definition: dinput.h:2298
#define DIENUM_STOP
Definition: dinput.h:187
#define DIDEVTYPE_KEYBOARD
Definition: dinput.h:199
#define DIERR_INVALIDPARAM
Definition: dinput.h:152
#define DIENUM_CONTINUE
Definition: dinput.h:188
#define DIERR_NOINTERFACE
Definition: dinput.h:153
BOOL(CALLBACK * LPDIENUMDEVICESCALLBACKA)(LPCDIDEVICEINSTANCEA, LPVOID)
Definition: dinput.h:441
#define IDirectInput_QueryInterface(p, a, b)
Definition: dinput.h:2292
#define IDirectInput_RunControlPanel(p, a, b)
Definition: dinput.h:2299
#define DIDEVTYPE_MOUSE
Definition: dinput.h:198
#define IDirectInput_CreateDevice(p, a, b, c)
Definition: dinput.h:2296
#define DIERR_DEVICENOTREG
Definition: dinput.h:147
#define DIERR_OLDDIRECTINPUTVERSION
Definition: dinput.h:141
#define DI_OK
Definition: dinput.h:128
#define DIERR_BETADIRECTINPUTVERSION
Definition: dinput.h:143
#define IDirectInput_EnumDevices(p, a, b, c, d)
Definition: dinput.h:2297
#define IDirectInput_Release(p)
Definition: dinput.h:2294
#define DIERR_NOTINITIALIZED
Definition: dinput.h:157
#define IDirectInput_Initialize(p, a, b)
Definition: dinput.h:2300
#define IDirectInputDevice_Release(p)
Definition: dinput.h:1602
HRESULT WINAPI DECLSPEC_HOTPATCH DirectInputCreateA(HINSTANCE hinst, DWORD dwVersion, LPDIRECTINPUTA *ppDI, LPUNKNOWN punkOuter)
Definition: dinput_main.c:229
directinput_versions
Definition: dinput_main.c:682
#define IDirectInputJoyConfig8_GetConfig(p, a, b, c)
Definition: dinputd.h:213
#define DIJC_GUIDINSTANCE
Definition: dinputd.h:130
#define DIERR_NOMOREITEMS
Definition: dinputd.h:47
#define IDirectInputJoyConfig8_Release(p)
Definition: dinputd.h:203
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
static HINSTANCE instance
Definition: main.c:40
#define GetProcAddress(x, y)
Definition: compat.h:753
#define CALLBACK
Definition: compat.h:35
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1964
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:2067
static void *static void *static LPDIRECTPLAY IUnknown * pUnk
Definition: dplayx.c:30
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
Definition: glfuncs.h:240
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
REFIID riid
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
static HINSTANCE hinst
Definition: edit.c:551
BOOL todo
Definition: filedlg.c:313
#define todo_wine_if(is_todo)
Definition: custom.c:76
#define todo_wine
Definition: custom.c:79
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:197
#define win_skip
Definition: test.h:160
int winetest_interactive
HRESULT hr
Definition: shlfolder.c:183
Definition: scsiwmi.h:51
Definition: http.c:7252
Definition: devices.h:37
BOOL return_value
Definition: dinput.c:372
unsigned int device_count
Definition: dinput.c:371
HANDLE HINSTANCE
Definition: typedefs.h:77
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
#define HRESULT
Definition: msvc.h:7
#define WINAPI
Definition: msvc.h:6
#define E_NOINTERFACE
Definition: winerror.h:2364
#define E_HANDLE
Definition: winerror.h:2850
#define E_POINTER
Definition: winerror.h:2365
HWND WINAPI GetDesktopWindow(void)
Definition: window.c:656