Vitaliy Margolen : dinput: Restore checks for DirectX 3 buffer size.

Alexandre Julliard julliard at winehq.org
Tue Oct 25 13:50:29 CDT 2011


Module: wine
Branch: master
Commit: 67e0b356c08e122114ade9786352f097c0fd4521
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=67e0b356c08e122114ade9786352f097c0fd4521

Author: Vitaliy Margolen <wine-patches at kievinfo.com>
Date:   Thu Oct 20 07:42:49 2011 -0600

dinput: Restore checks for DirectX 3 buffer size.

---

 dlls/dinput/device.c       |    4 +-
 dlls/dinput/tests/device.c |   69 ++++++++++++++++++++++++++-----------------
 2 files changed, 44 insertions(+), 29 deletions(-)

diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c
index b72b0d5..72670f7 100644
--- a/dlls/dinput/device.c
+++ b/dlls/dinput/device.c
@@ -1288,10 +1288,10 @@ 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->dinput->dwVersion == 0x0800)
+    if (This->dinput->dwVersion == 0x0800 || dodsize == sizeof(DIDEVICEOBJECTDATA_DX3))
     {
-        if (!This->acquired) return DIERR_NOTACQUIRED;
         if (!This->queue_len) return DIERR_NOTBUFFERED;
+        if (!This->acquired) return DIERR_NOTACQUIRED;
     }
 
     if (!This->queue_len)
diff --git a/dlls/dinput/tests/device.c b/dlls/dinput/tests/device.c
index 7171bb8..f03a3b6 100644
--- a/dlls/dinput/tests/device.c
+++ b/dlls/dinput/tests/device.c
@@ -78,7 +78,9 @@ static void test_object_info(LPDIRECTINPUTDEVICE device, HWND hwnd)
     DIDEVICEOBJECTINSTANCE obj_info;
     DWORD obj_types[] = {DIDFT_BUTTON, DIDFT_AXIS, DIDFT_POV};
     int type_index;
-    int cnt = 0, cnt1 = 0;
+    int cnt1 = 0;
+    DWORD cnt = 0;
+    DIDEVICEOBJECTDATA buffer[5];
 
     hr = IDirectInputDevice_EnumObjects(device, enum_callback, &cnt, DIDFT_ALL);
     ok(SUCCEEDED(hr), "EnumObjects() failed: %08x\n", hr);
@@ -98,18 +100,51 @@ static void test_object_info(LPDIRECTINPUTDEVICE device, HWND hwnd)
         ok(SUCCEEDED(hr), "EnumObjects() failed: %08x\n", hr);
     }
 
+    /* Test buffered mode */
+    memset(&dp, 0, sizeof(dp));
+    dp.diph.dwSize = sizeof(DIPROPDWORD);
+    dp.diph.dwHeaderSize = sizeof(DIPROPHEADER);
+    dp.diph.dwHow = DIPH_DEVICE;
+    dp.diph.dwObj = 0;
+    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[0]), buffer, &cnt, 0);
+    ok(hr == DI_OK && cnt == 5, "GetDeviceData() failed: %08x cnt: %d\n", hr, cnt);
+    hr = IDirectInputDevice_GetDeviceData(device, sizeof(DIDEVICEOBJECTDATA_DX3), buffer, &cnt, 0);
+    ok(hr == DIERR_NOTBUFFERED, "GetDeviceData() should have failed: %08x\n", hr);
+    IDirectInputDevice_Acquire(device);
+    hr = IDirectInputDevice_GetDeviceData(device, sizeof(DIDEVICEOBJECTDATA_DX3), buffer, &cnt, 0);
+    ok(hr == DIERR_NOTBUFFERED, "GetDeviceData() should have failed: %08x\n", hr);
+    IDirectInputDevice_Unacquire(device);
+
+    dp.dwData = 20;
+    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[0]), buffer, &cnt, 0);
+    ok(hr == DI_OK, "GetDeviceData() failed: %08x\n", hr);
+    hr = IDirectInputDevice_GetDeviceData(device, sizeof(DIDEVICEOBJECTDATA_DX3), buffer, &cnt, 0);
+    ok(hr == DIERR_NOTACQUIRED, "GetDeviceData() should have failed: %08x\n", hr);
+    hr = IDirectInputDevice_Acquire(device);
+    ok(hr == DI_OK, "Acquire() failed: %08x\n", hr);
+    cnt = 1;
+    hr = IDirectInputDevice_GetDeviceData(device, sizeof(buffer[0]), buffer, &cnt, 0);
+    ok(hr == DI_OK, "GetDeviceData() failed: %08x\n", hr);
+    hr = IDirectInputDevice_Unacquire(device);
+    ok(hr == DI_OK, "Unacquire() failed: %08x\n", hr);
+    cnt = 1;
+    hr = IDirectInputDevice_GetDeviceData(device, sizeof(buffer[0]), buffer, &cnt, 0);
+    ok(hr == DI_OK, "GetDeviceData() failed: %08x\n", hr);
+
     /* No need to test devices without axis */
     obj_info.dwSize = sizeof(obj_info);
     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);
-        dp.diph.dwHeaderSize = sizeof(DIPROPHEADER);
         dp.diph.dwHow = DIPH_BYOFFSET;
         dp.diph.dwObj = 16;
         dp.dwData = DIPROPAXISMODE_ABS;
@@ -122,29 +157,9 @@ 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[0]), 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[0]), 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[0]), 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);




More information about the wine-cvs mailing list