diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c index a4052ea4e2..83740c5705 100644 --- a/dlls/dinput/device.c +++ b/dlls/dinput/device.c @@ -1286,10 +1286,8 @@ HRESULT WINAPI IDirectInputDevice2WImpl_GetDeviceData(LPDIRECTINPUTDEVICE8W ifac TRACE("(%p) %p -> %p(%d) x%d, 0x%08x\n", This, dod, entries, entries ? *entries : 0, dodsize, flags); - if (!This->acquired) - return DIERR_NOTACQUIRED; if (!This->queue_len) - return DIERR_NOTBUFFERED; + return DI_OK; if (dodsize < sizeof(DIDEVICEOBJECTDATA_DX3)) return DIERR_INVALIDPARAM; diff --git a/dlls/dinput/tests/device.c b/dlls/dinput/tests/device.c index e79c56429f..2e4e4f8da8 100644 --- a/dlls/dinput/tests/device.c +++ b/dlls/dinput/tests/device.c @@ -103,6 +103,9 @@ static void test_object_info(LPDIRECTINPUTDEVICE device, HWND hwnd) hr = IDirectInputDevice_GetObjectInfo(device, &obj_info, 16, DIPH_BYOFFSET); if (SUCCEEDED(hr)) { + DWORD cnt; + DIDEVICEOBJECTDATA buffer[5]; + /* No device supports per axis relative/absolute mode */ memset(&dp, 0, sizeof(dp)); dp.diph.dwSize = sizeof(DIPROPDWORD); @@ -119,9 +122,28 @@ static void test_object_info(LPDIRECTINPUTDEVICE device, HWND hwnd) hr = IDirectInputDevice_SetProperty(device, DIPROP_AXISMODE, &dp.diph); ok(hr == DI_OK, "SetProperty() failed: %08x\n", hr); + dp.dwData = 0; + hr = IDirectInputDevice_SetProperty(device, DIPROP_BUFFERSIZE, (LPCDIPROPHEADER)&dp.diph); + ok(hr == DI_OK, "SetProperty() failed: %08x\n", hr); + + cnt = 5; + hr = IDirectInputDevice_GetDeviceData(device, sizeof(buffer), buffer, &cnt, 0); + ok(hr == DI_OK && cnt == 5, "GetDeviceData() failed: %08x cnt: %d\n", hr, cnt); + + dp.dwData = 20; + hr = IDirectInputDevice_SetProperty(device, DIPROP_BUFFERSIZE, (LPCDIPROPHEADER)&dp.diph); + ok(hr == DI_OK, "SetProperty() failed: %08x\n", hr); + + cnt = 1; + hr = IDirectInputDevice_GetDeviceData(device, sizeof(buffer), buffer, &cnt, 0); + ok(hr == DI_OK, "GetDeviceData() failed: %08x\n", hr); + /* Cannot change mode while acquired */ hr = IDirectInputDevice_Acquire(device); ok(hr == DI_OK, "Acquire() failed: %08x\n", hr); + cnt = 1; + hr = IDirectInputDevice_GetDeviceData(device, sizeof(buffer), buffer, &cnt, 0); + ok(hr == DI_OK, "GetDeviceData() failed: %08x\n", hr); hr = IDirectInputDevice_SetProperty(device, DIPROP_AXISMODE, &dp.diph); ok(hr == DIERR_ACQUIRED, "SetProperty() returned: %08x\n", hr); hr = IDirectInputDevice_Unacquire(device);