ReactOS 0.4.15-dev-7907-g95bf896
dinput.c File Reference
#include <initguid.h>
#include <windows.h>
#include <dinput.h>
#include <dinputd.h>
#include "wine/test.h"
Include dependency graph for dinput.c:

Go to the source code of this file.

Classes

struct  enum_devices_test
 

Macros

#define DIRECTINPUT_VERSION   0x0700
 
#define COBJMACROS
 

Enumerations

enum  directinput_versions {
  DIRECTINPUT_VERSION_300 = 0x0300 , DIRECTINPUT_VERSION_500 = 0x0500 , DIRECTINPUT_VERSION_50A = 0x050A , DIRECTINPUT_VERSION_5B2 = 0x05B2 ,
  DIRECTINPUT_VERSION_602 = 0x0602 , DIRECTINPUT_VERSION_61A = 0x061A , DIRECTINPUT_VERSION_700 = 0x0700 , DIRECTINPUT_VERSION_300 = 0x0300 ,
  DIRECTINPUT_VERSION_500 = 0x0500 , DIRECTINPUT_VERSION_50A = 0x050A , DIRECTINPUT_VERSION_5B2 = 0x05B2 , DIRECTINPUT_VERSION_602 = 0x0602 ,
  DIRECTINPUT_VERSION_61A = 0x061A , DIRECTINPUT_VERSION_700 = 0x0700
}
 

Functions

static HRESULT (WINAPI *pDirectInputCreateEx)(HINSTANCE
 
static BOOL CALLBACK dummy_callback (const DIDEVICEINSTANCEA *instance, void *context)
 
static void test_preinitialization (void)
 
static void test_DirectInputCreateEx (void)
 
static void test_QueryInterface (void)
 
static void test_CreateDevice (void)
 
static BOOL CALLBACK enum_devices_callback (const DIDEVICEINSTANCEA *instance, void *context)
 
static void test_EnumDevices (void)
 
static void test_GetDeviceStatus (void)
 
static void test_Initialize (void)
 
static void test_RunControlPanel (void)
 
static void test_DirectInputJoyConfig8 (void)
 
 START_TEST (dinput)
 

Variables

HINSTANCE hInstance
 
static const DWORD directinput_version_list []
 
static DWORD
 
static REFIID
 
static LPVOID LPUNKNOWN
 

Macro Definition Documentation

◆ COBJMACROS

#define COBJMACROS

Definition at line 21 of file dinput.c.

◆ DIRECTINPUT_VERSION

#define DIRECTINPUT_VERSION   0x0700

Definition at line 19 of file dinput.c.

Enumeration Type Documentation

◆ directinput_versions

Enumerator
DIRECTINPUT_VERSION_300 
DIRECTINPUT_VERSION_500 
DIRECTINPUT_VERSION_50A 
DIRECTINPUT_VERSION_5B2 
DIRECTINPUT_VERSION_602 
DIRECTINPUT_VERSION_61A 
DIRECTINPUT_VERSION_700 
DIRECTINPUT_VERSION_300 
DIRECTINPUT_VERSION_500 
DIRECTINPUT_VERSION_50A 
DIRECTINPUT_VERSION_5B2 
DIRECTINPUT_VERSION_602 
DIRECTINPUT_VERSION_61A 
DIRECTINPUT_VERSION_700 

Definition at line 31 of file dinput.c.

32{
40};
@ 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

Function Documentation

◆ dummy_callback()

static BOOL CALLBACK dummy_callback ( const DIDEVICEINSTANCEA instance,
void context 
)
static

Definition at line 55 of file dinput.c.

56{
57 ok(0, "Callback was invoked with parameters (%p, %p)\n", instance, context);
58 return DIENUM_STOP;
59}
#define ok(value,...)
Definition: atltest.h:57
#define DIENUM_STOP
Definition: dinput.h:187
static HINSTANCE instance
Definition: main.c:40
Definition: http.c:7252

Referenced by test_preinitialization().

◆ enum_devices_callback()

static BOOL CALLBACK enum_devices_callback ( const DIDEVICEINSTANCEA instance,
void context 
)
static

Definition at line 375 of file dinput.c.

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}
int memcmp(void *Buffer1, void *Buffer2, ACPI_SIZE Count)
Definition: utclib.c:112
#define DIDEVTYPE_KEYBOARD
Definition: dinput.h:199
#define DIDEVTYPE_MOUSE
Definition: dinput.h:198
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:197
Definition: devices.h:37
BOOL return_value
Definition: dinput.c:372
unsigned int device_count
Definition: dinput.c:371

Referenced by test_EnumDevices().

◆ HRESULT()

static HRESULT ( WINAPI pDirectInputCreateEx)
static

◆ START_TEST()

START_TEST ( dinput  )

Definition at line 626 of file dinput.c.

627{
628 HMODULE dinput_mod = GetModuleHandleA("dinput.dll");
629
631
632 pDirectInputCreateEx = (void *)GetProcAddress(dinput_mod, "DirectInputCreateEx");
633
645}
static void test_Initialize(void)
Definition: dinput.c:503
static void test_DirectInputCreateEx(void)
Definition: dinput.c:154
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 void test_EnumDevices(void)
Definition: dinput.c:417
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
#define NULL
Definition: types.h:112
#define GetProcAddress(x, y)
Definition: compat.h:753
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1964
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:2067

◆ test_CreateDevice()

static void test_CreateDevice ( void  )
static

Definition at line 330 of file dinput.c.

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}
#define DIRECTINPUT_VERSION
Definition: dinput.c:19
#define IDirectInput_CreateDevice(p, a, b, c)
Definition: dinput.h:2296
#define DIERR_DEVICENOTREG
Definition: dinput.h:147
#define DI_OK
Definition: dinput.h:128
#define IDirectInput_Release(p)
Definition: dinput.h:2294
#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
#define FAILED(hr)
Definition: intsafe.h:51
#define win_skip
Definition: test.h:160
HRESULT hr
Definition: shlfolder.c:183
#define E_POINTER
Definition: winerror.h:2365

Referenced by START_TEST().

◆ test_DirectInputCreateEx()

static void test_DirectInputCreateEx ( void  )
static

Definition at line 154 of file dinput.c.

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}
#define ARRAY_SIZE(A)
Definition: main.h:33
const GUID IID_IUnknown
static const DWORD directinput_version_list[]
Definition: dinput.c:42
static REFIID
Definition: dinput.c:53
#define DIERR_INVALIDPARAM
Definition: dinput.h:152
#define DIERR_NOINTERFACE
Definition: dinput.h:153
#define DIERR_OLDDIRECTINPUTVERSION
Definition: dinput.h:141
#define DIERR_BETADIRECTINPUTVERSION
Definition: dinput.h:143
#define DIERR_NOTINITIALIZED
Definition: dinput.h:157
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
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 const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
REFIID riid
Definition: atlbase.h:39
static HINSTANCE hinst
Definition: edit.c:551

Referenced by START_TEST().

◆ test_DirectInputJoyConfig8()

static void test_DirectInputJoyConfig8 ( void  )
static

Definition at line 579 of file dinput.c.

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}
#define IDirectInput_QueryInterface(p, a, b)
Definition: dinput.h:2292
#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 SUCCEEDED(hr)
Definition: intsafe.h:50

Referenced by START_TEST().

◆ test_EnumDevices()

static void test_EnumDevices ( void  )
static

Definition at line 417 of file dinput.c.

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}
static BOOL CALLBACK enum_devices_callback(const DIDEVICEINSTANCEA *instance, void *context)
Definition: dinput.c:375
#define DIENUM_CONTINUE
Definition: dinput.h:188
#define IDirectInput_EnumDevices(p, a, b, c, d)
Definition: dinput.h:2297
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

Referenced by START_TEST().

◆ test_GetDeviceStatus()

static void test_GetDeviceStatus ( void  )
static

Definition at line 478 of file dinput.c.

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}
#define IDirectInput_GetDeviceStatus(p, a)
Definition: dinput.h:2298
#define todo_wine
Definition: custom.c:79

Referenced by START_TEST().

◆ test_Initialize()

static void test_Initialize ( void  )
static

Definition at line 503 of file dinput.c.

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}
#define IDirectInput_Initialize(p, a, b)
Definition: dinput.h:2300
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325

Referenced by START_TEST().

◆ test_preinitialization()

static void test_preinitialization ( void  )
static

Definition at line 61 of file dinput.c.

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}
#define skip(...)
Definition: atltest.h:64
static BOOL CALLBACK dummy_callback(const DIDEVICEINSTANCEA *instance, void *context)
Definition: dinput.c:55
BOOL(CALLBACK * LPDIENUMDEVICESCALLBACKA)(LPCDIDEVICEINSTANCEA, LPVOID)
Definition: dinput.h:441
#define IDirectInput_RunControlPanel(p, a, b)
Definition: dinput.h:2299
BOOL todo
Definition: filedlg.c:313
#define todo_wine_if(is_todo)
Definition: custom.c:76
Definition: scsiwmi.h:51
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1176
#define E_HANDLE
Definition: winerror.h:2850

Referenced by START_TEST().

◆ test_QueryInterface()

static void test_QueryInterface ( void  )
static

Definition at line 266 of file dinput.c.

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}
#define S_OK
Definition: intsafe.h:52
#define E_NOINTERFACE
Definition: winerror.h:2364

Referenced by START_TEST(), and test_HTMLDocument().

◆ test_RunControlPanel()

static void test_RunControlPanel ( void  )
static

Definition at line 546 of file dinput.c.

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}
int winetest_interactive
HWND WINAPI GetDesktopWindow(void)
Definition: window.c:656

Referenced by START_TEST().

Variable Documentation

◆ directinput_version_list

◆ DWORD

Definition at line 53 of file dinput.c.

◆ hInstance

◆ LPUNKNOWN

LPVOID LPUNKNOWN

Definition at line 53 of file dinput.c.

◆ REFIID

REFIID

Definition at line 53 of file dinput.c.

Referenced by test_DirectInput8Create(), test_DirectInputCreateEx(), and test_QueryInterface().