[PATCH v2 1/1] ddraw/tests: Port test_lockrect_invalid to other versions.

Stefan Dösinger stefandoesinger at gmail.com
Sat Jan 23 09:52:19 CST 2016


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

Signed-off-by: Stefan Dösinger <stefandoesinger at gmx.at>

Am 2016-01-21 um 15:40 schrieb Henri Verbeet:
> From: Stefan Dösinger <stefandoesinger at gmx.at>
> 
> Signed-off-by: Stefan Dösinger <stefandoesinger at gmx.at>
> Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
> ---
> Version 2: Surface capability check to make this pass on the testbot.
> Include the 64 bit ddraw texture check / workaround.
> ---
>  dlls/ddraw/tests/ddraw1.c   | 148 +++++++++++++++++++++++++++++++++++++++
>  dlls/ddraw/tests/ddraw2.c   | 152 ++++++++++++++++++++++++++++++++++++++++
>  dlls/ddraw/tests/ddraw4.c   | 151 ++++++++++++++++++++++++++++++++++++++++
>  dlls/ddraw/tests/ddraw7.c   | 165 ++++++++++++++++++++++++++++++++++++++++++++
>  dlls/ddraw/tests/dsurface.c | 121 --------------------------------
>  5 files changed, 616 insertions(+), 121 deletions(-)
> 
> diff --git a/dlls/ddraw/tests/ddraw1.c b/dlls/ddraw/tests/ddraw1.c
> index 25b988a..491b696 100644
> --- a/dlls/ddraw/tests/ddraw1.c
> +++ b/dlls/ddraw/tests/ddraw1.c
> @@ -8010,6 +8010,153 @@ static void test_shademode(void)
>      DestroyWindow(window);
>  }
>  
> +static void test_lockrect_invalid(void)
> +{
> +    unsigned int i, r;
> +    IDirectDraw *ddraw;
> +    IDirectDrawSurface *surface;
> +    HWND window;
> +    HRESULT hr;
> +    DDSURFACEDESC surface_desc;
> +    DDCAPS hal_caps;
> +    DWORD needed_caps = DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY;
> +    static RECT valid[] =
> +    {
> +        {60, 60, 68, 68},
> +        {60, 60, 60, 68},
> +        {60, 60, 68, 60},
> +        {120, 60, 128, 68},
> +        {60, 120, 68, 128},
> +    };
> +    static RECT invalid[] =
> +    {
> +        {68, 60, 60, 68},       /* left > right */
> +        {60, 68, 68, 60},       /* top > bottom */
> +        {-8, 60,  0, 68},       /* left < surface */
> +        {60, -8, 68,  0},       /* top < surface */
> +        {-16, 60, -8, 68},      /* right < surface */
> +        {60, -16, 68, -8},      /* bottom < surface */
> +        {60, 60, 136, 68},      /* right > surface */
> +        {60, 60, 68, 136},      /* bottom > surface */
> +        {136, 60, 144, 68},     /* left > surface */
> +        {60, 136, 68, 144},     /* top > surface */
> +    };
> +    static const struct
> +    {
> +        DWORD caps;
> +        const char *name;
> +        HRESULT hr;
> +    }
> +    resources[] =
> +    {
> +        {DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY, "sysmem offscreenplain", DDERR_INVALIDPARAMS},
> +        {DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY, "vidmem offscreenplain", DDERR_INVALIDPARAMS},
> +        {DDSCAPS_TEXTURE | DDSCAPS_SYSTEMMEMORY, "sysmem texture", DDERR_INVALIDPARAMS},
> +        {DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY, "vidmem texture", DDERR_INVALIDPARAMS},
> +    };
> +
> +    window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
> +            0, 0, 640, 480, 0, 0, 0, 0);
> +    ddraw = create_ddraw();
> +    ok(!!ddraw, "Failed to create a ddraw object.\n");
> +    hr = IDirectDraw_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL);
> +    ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
> +
> +    memset(&hal_caps, 0, sizeof(hal_caps));
> +    hal_caps.dwSize = sizeof(hal_caps);
> +    hr = IDirectDraw_GetCaps(ddraw, &hal_caps, NULL);
> +    ok(SUCCEEDED(hr), "Failed to get caps, hr %#x.\n", hr);
> +    if ((hal_caps.ddsCaps.dwCaps & needed_caps) != needed_caps)
> +    {
> +        skip("Required surface types not supported, skipping test.\n");
> +        goto done;
> +    }
> +
> +    for (r = 0; r < sizeof(resources) / sizeof(*resources); ++r)
> +    {
> +        memset(&surface_desc, 0, sizeof(surface_desc));
> +        surface_desc.dwSize = sizeof(surface_desc);
> +        surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
> +        surface_desc.ddsCaps.dwCaps = resources[r].caps;
> +        surface_desc.dwWidth = 128;
> +        surface_desc.dwHeight = 128;
> +        surface_desc.ddpfPixelFormat.dwSize = sizeof(surface_desc.ddpfPixelFormat);
> +        surface_desc.ddpfPixelFormat.dwFlags = DDPF_RGB;
> +        U1(surface_desc.ddpfPixelFormat).dwRGBBitCount = 32;
> +        U2(surface_desc.ddpfPixelFormat).dwRBitMask = 0xff0000;
> +        U3(surface_desc.ddpfPixelFormat).dwGBitMask = 0x00ff00;
> +        U4(surface_desc.ddpfPixelFormat).dwBBitMask = 0x0000ff;
> +
> +        hr = IDirectDraw_CreateSurface(ddraw, &surface_desc, &surface, NULL);
> +        ok(SUCCEEDED(hr), "Failed to create surface, hr %#x, type %s.\n", hr, resources[r].name);
> +
> +        hr = IDirectDrawSurface_Lock(surface, NULL, NULL, DDLOCK_WAIT, NULL);
> +        ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x, type %s.\n", hr, resources[r].name);
> +
> +        for (i = 0; i < sizeof(valid) / sizeof(*valid); ++i)
> +        {
> +            RECT *rect = &valid[i];
> +
> +            memset(&surface_desc, 0, sizeof(surface_desc));
> +            surface_desc.dwSize = sizeof(surface_desc);
> +
> +            hr = IDirectDrawSurface_Lock(surface, rect, &surface_desc, DDLOCK_WAIT, NULL);
> +            ok(SUCCEEDED(hr), "Lock failed (%#x) for rect [%d, %d]->[%d, %d], type %s.\n",
> +                    hr, rect->left, rect->top, rect->right, rect->bottom, resources[r].name);
> +
> +            hr = IDirectDrawSurface_Unlock(surface, NULL);
> +            ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
> +        }
> +
> +        for (i = 0; i < sizeof(invalid) / sizeof(*invalid); ++i)
> +        {
> +            RECT *rect = &invalid[i];
> +
> +            memset(&surface_desc, 1, sizeof(surface_desc));
> +            surface_desc.dwSize = sizeof(surface_desc);
> +
> +            hr = IDirectDrawSurface_Lock(surface, rect, &surface_desc, DDLOCK_WAIT, NULL);
> +            ok(hr == resources[r].hr, "Lock returned %#x for rect [%d, %d]->[%d, %d], type %s.\n",
> +                    hr, rect->left, rect->top, rect->right, rect->bottom, resources[r].name);
> +            if (SUCCEEDED(hr))
> +            {
> +                hr = IDirectDrawSurface_Unlock(surface, NULL);
> +                ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
> +            }
> +            else
> +                ok(!surface_desc.lpSurface, "Got unexpected lpSurface %p.\n", surface_desc.lpSurface);
> +        }
> +
> +        hr = IDirectDrawSurface_Lock(surface, NULL, &surface_desc, DDLOCK_WAIT, NULL);
> +        ok(SUCCEEDED(hr), "Lock(rect = NULL) failed, hr %#x, type %s.\n",
> +                hr, resources[r].name);
> +        hr = IDirectDrawSurface_Lock(surface, NULL, &surface_desc, DDLOCK_WAIT, NULL);
> +        ok(hr == DDERR_SURFACEBUSY, "Double lock(rect = NULL) returned %#x, type %s.\n",
> +                hr, resources[r].name);
> +        hr = IDirectDrawSurface_Unlock(surface, NULL);
> +        ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
> +
> +        hr = IDirectDrawSurface_Lock(surface, &valid[0], &surface_desc, DDLOCK_WAIT, NULL);
> +        ok(SUCCEEDED(hr), "Lock(rect = [%d, %d]->[%d, %d]) failed (%#x).\n",
> +                valid[0].left, valid[0].top, valid[0].right, valid[0].bottom, hr);
> +        hr = IDirectDrawSurface_Lock(surface, &valid[0], &surface_desc, DDLOCK_WAIT, NULL);
> +        ok(hr == DDERR_SURFACEBUSY, "Double lock(rect = [%d, %d]->[%d, %d]) failed (%#x).\n",
> +                valid[0].left, valid[0].top, valid[0].right, valid[0].bottom, hr);
> +
> +        /* Locking a different rectangle returns DD_OK, but it seems to break the surface.
> +         * Afterwards unlocking the surface fails(NULL rectangle or both locked rectangles) */
> +
> +        hr = IDirectDrawSurface_Unlock(surface, NULL);
> +        ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
> +
> +        IDirectDrawSurface_Release(surface);
> +    }
> +
> +done:
> +    IDirectDraw_Release(ddraw);
> +    DestroyWindow(window);
> +}
> +
>  START_TEST(ddraw1)
>  {
>      IDirectDraw *ddraw;
> @@ -8082,4 +8229,5 @@ START_TEST(ddraw1)
>      test_colorkey_precision();
>      test_range_colorkey();
>      test_shademode();
> +    test_lockrect_invalid();
>  }
> diff --git a/dlls/ddraw/tests/ddraw2.c b/dlls/ddraw/tests/ddraw2.c
> index 2e26c52..560b101 100644
> --- a/dlls/ddraw/tests/ddraw2.c
> +++ b/dlls/ddraw/tests/ddraw2.c
> @@ -9112,6 +9112,157 @@ static void test_shademode(void)
>      DestroyWindow(window);
>  }
>  
> +static void test_lockrect_invalid(void)
> +{
> +    unsigned int i, r;
> +    IDirectDraw2 *ddraw;
> +    IDirectDrawSurface *surface1;
> +    IDirectDrawSurface2 *surface;
> +    HWND window;
> +    HRESULT hr;
> +    DDSURFACEDESC surface_desc;
> +    DDCAPS hal_caps;
> +    DWORD needed_caps = DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY;
> +    static RECT valid[] =
> +    {
> +        {60, 60, 68, 68},
> +        {60, 60, 60, 68},
> +        {60, 60, 68, 60},
> +        {120, 60, 128, 68},
> +        {60, 120, 68, 128},
> +    };
> +    static RECT invalid[] =
> +    {
> +        {68, 60, 60, 68},       /* left > right */
> +        {60, 68, 68, 60},       /* top > bottom */
> +        {-8, 60,  0, 68},       /* left < surface */
> +        {60, -8, 68,  0},       /* top < surface */
> +        {-16, 60, -8, 68},      /* right < surface */
> +        {60, -16, 68, -8},      /* bottom < surface */
> +        {60, 60, 136, 68},      /* right > surface */
> +        {60, 60, 68, 136},      /* bottom > surface */
> +        {136, 60, 144, 68},     /* left > surface */
> +        {60, 136, 68, 144},     /* top > surface */
> +    };
> +    static const struct
> +    {
> +        DWORD caps;
> +        const char *name;
> +        HRESULT hr;
> +    }
> +    resources[] =
> +    {
> +        {DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY, "sysmem offscreenplain", DDERR_INVALIDPARAMS},
> +        {DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY, "vidmem offscreenplain", DDERR_INVALIDPARAMS},
> +        {DDSCAPS_TEXTURE | DDSCAPS_SYSTEMMEMORY, "sysmem texture", DDERR_INVALIDPARAMS},
> +        {DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY, "vidmem texture", DDERR_INVALIDPARAMS},
> +    };
> +
> +    window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
> +            0, 0, 640, 480, 0, 0, 0, 0);
> +    ddraw = create_ddraw();
> +    ok(!!ddraw, "Failed to create a ddraw object.\n");
> +    hr = IDirectDraw2_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL);
> +    ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
> +
> +    memset(&hal_caps, 0, sizeof(hal_caps));
> +    hal_caps.dwSize = sizeof(hal_caps);
> +    hr = IDirectDraw2_GetCaps(ddraw, &hal_caps, NULL);
> +    ok(SUCCEEDED(hr), "Failed to get caps, hr %#x.\n", hr);
> +    if ((hal_caps.ddsCaps.dwCaps & needed_caps) != needed_caps)
> +    {
> +        skip("Required surface types not supported, skipping test.\n");
> +        goto done;
> +    }
> +
> +    for (r = 0; r < sizeof(resources) / sizeof(*resources); ++r)
> +    {
> +        memset(&surface_desc, 0, sizeof(surface_desc));
> +        surface_desc.dwSize = sizeof(surface_desc);
> +        surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
> +        surface_desc.ddsCaps.dwCaps = resources[r].caps;
> +        surface_desc.dwWidth = 128;
> +        surface_desc.dwHeight = 128;
> +        surface_desc.ddpfPixelFormat.dwSize = sizeof(surface_desc.ddpfPixelFormat);
> +        surface_desc.ddpfPixelFormat.dwFlags = DDPF_RGB;
> +        U1(surface_desc.ddpfPixelFormat).dwRGBBitCount = 32;
> +        U2(surface_desc.ddpfPixelFormat).dwRBitMask = 0xff0000;
> +        U3(surface_desc.ddpfPixelFormat).dwGBitMask = 0x00ff00;
> +        U4(surface_desc.ddpfPixelFormat).dwBBitMask = 0x0000ff;
> +
> +        hr = IDirectDraw2_CreateSurface(ddraw, &surface_desc, &surface1, NULL);
> +        ok(SUCCEEDED(hr), "Failed to create surface, hr %#x, type %s.\n", hr, resources[r].name);
> +        hr = IDirectDrawSurface_QueryInterface(surface1, &IID_IDirectDrawSurface2, (void **)&surface);
> +        ok(SUCCEEDED(hr), "Failed to QI IDirectDrawSurface2 interface, hr %#x.\n", hr);
> +        IDirectDrawSurface_Release(surface1);
> +
> +        hr = IDirectDrawSurface2_Lock(surface, NULL, NULL, DDLOCK_WAIT, NULL);
> +        ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x, type %s.\n", hr, resources[r].name);
> +
> +        for (i = 0; i < sizeof(valid) / sizeof(*valid); ++i)
> +        {
> +            RECT *rect = &valid[i];
> +
> +            memset(&surface_desc, 0, sizeof(surface_desc));
> +            surface_desc.dwSize = sizeof(surface_desc);
> +
> +            hr = IDirectDrawSurface2_Lock(surface, rect, &surface_desc, DDLOCK_WAIT, NULL);
> +            ok(SUCCEEDED(hr), "Lock failed (%#x) for rect [%d, %d]->[%d, %d], type %s.\n",
> +                    hr, rect->left, rect->top, rect->right, rect->bottom, resources[r].name);
> +
> +            hr = IDirectDrawSurface2_Unlock(surface, NULL);
> +            ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
> +        }
> +
> +        for (i = 0; i < sizeof(invalid) / sizeof(*invalid); ++i)
> +        {
> +            RECT *rect = &invalid[i];
> +
> +            memset(&surface_desc, 1, sizeof(surface_desc));
> +            surface_desc.dwSize = sizeof(surface_desc);
> +
> +            hr = IDirectDrawSurface2_Lock(surface, rect, &surface_desc, DDLOCK_WAIT, NULL);
> +            ok(hr == resources[r].hr, "Lock returned %#x for rect [%d, %d]->[%d, %d], type %s.\n",
> +                    hr, rect->left, rect->top, rect->right, rect->bottom, resources[r].name);
> +            if (SUCCEEDED(hr))
> +            {
> +                hr = IDirectDrawSurface2_Unlock(surface, NULL);
> +                ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
> +            }
> +            else
> +                ok(!surface_desc.lpSurface, "Got unexpected lpSurface %p.\n", surface_desc.lpSurface);
> +        }
> +
> +        hr = IDirectDrawSurface2_Lock(surface, NULL, &surface_desc, DDLOCK_WAIT, NULL);
> +        ok(SUCCEEDED(hr), "Lock(rect = NULL) failed, hr %#x, type %s.\n",
> +                hr, resources[r].name);
> +        hr = IDirectDrawSurface2_Lock(surface, NULL, &surface_desc, DDLOCK_WAIT, NULL);
> +        ok(hr == DDERR_SURFACEBUSY, "Double lock(rect = NULL) returned %#x, type %s.\n",
> +                hr, resources[r].name);
> +        hr = IDirectDrawSurface2_Unlock(surface, NULL);
> +        ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
> +
> +        hr = IDirectDrawSurface2_Lock(surface, &valid[0], &surface_desc, DDLOCK_WAIT, NULL);
> +        ok(SUCCEEDED(hr), "Lock(rect = [%d, %d]->[%d, %d]) failed (%#x).\n",
> +                valid[0].left, valid[0].top, valid[0].right, valid[0].bottom, hr);
> +        hr = IDirectDrawSurface2_Lock(surface, &valid[0], &surface_desc, DDLOCK_WAIT, NULL);
> +        ok(hr == DDERR_SURFACEBUSY, "Double lock(rect = [%d, %d]->[%d, %d]) failed (%#x).\n",
> +                valid[0].left, valid[0].top, valid[0].right, valid[0].bottom, hr);
> +
> +        /* Locking a different rectangle returns DD_OK, but it seems to break the surface.
> +         * Afterwards unlocking the surface fails(NULL rectangle or both locked rectangles) */
> +
> +        hr = IDirectDrawSurface2_Unlock(surface, NULL);
> +        ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
> +
> +        IDirectDrawSurface2_Release(surface);
> +    }
> +
> +done:
> +    IDirectDraw2_Release(ddraw);
> +    DestroyWindow(window);
> +}
> +
>  START_TEST(ddraw2)
>  {
>      IDirectDraw2 *ddraw;
> @@ -9191,4 +9342,5 @@ START_TEST(ddraw2)
>      test_colorkey_precision();
>      test_range_colorkey();
>      test_shademode();
> +    test_lockrect_invalid();
>  }
> diff --git a/dlls/ddraw/tests/ddraw4.c b/dlls/ddraw/tests/ddraw4.c
> index 8b99eaa..6ccedaf 100644
> --- a/dlls/ddraw/tests/ddraw4.c
> +++ b/dlls/ddraw/tests/ddraw4.c
> @@ -10281,6 +10281,156 @@ static void test_shademode(void)
>      DestroyWindow(window);
>  }
>  
> +static void test_lockrect_invalid(void)
> +{
> +    unsigned int i, r;
> +    IDirectDraw4 *ddraw;
> +    IDirectDrawSurface4 *surface;
> +    HWND window;
> +    HRESULT hr;
> +    DDSURFACEDESC2 surface_desc;
> +    DDCAPS hal_caps;
> +    DWORD needed_caps = DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY;
> +    static RECT valid[] =
> +    {
> +        {60, 60, 68, 68},
> +        {60, 60, 60, 68},
> +        {60, 60, 68, 60},
> +        {120, 60, 128, 68},
> +        {60, 120, 68, 128},
> +    };
> +    static RECT invalid[] =
> +    {
> +        {68, 60, 60, 68},       /* left > right */
> +        {60, 68, 68, 60},       /* top > bottom */
> +        {-8, 60,  0, 68},       /* left < surface */
> +        {60, -8, 68,  0},       /* top < surface */
> +        {-16, 60, -8, 68},      /* right < surface */
> +        {60, -16, 68, -8},      /* bottom < surface */
> +        {60, 60, 136, 68},      /* right > surface */
> +        {60, 60, 68, 136},      /* bottom > surface */
> +        {136, 60, 144, 68},     /* left > surface */
> +        {60, 136, 68, 144},     /* top > surface */
> +    };
> +    static const struct
> +    {
> +        DWORD caps, caps2;
> +        const char *name;
> +        HRESULT hr;
> +    }
> +    resources[] =
> +    {
> +        {DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY, 0, "sysmem offscreenplain", DDERR_INVALIDPARAMS},
> +        {DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY, 0, "vidmem offscreenplain", DDERR_INVALIDPARAMS},
> +        {DDSCAPS_TEXTURE | DDSCAPS_SYSTEMMEMORY, 0, "sysmem texture", DDERR_INVALIDPARAMS},
> +        {DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY, 0, "vidmem texture", DDERR_INVALIDPARAMS},
> +        {DDSCAPS_TEXTURE, DDSCAPS2_TEXTUREMANAGE, "managed texture", DDERR_INVALIDPARAMS},
> +    };
> +
> +    window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
> +            0, 0, 640, 480, 0, 0, 0, 0);
> +    ddraw = create_ddraw();
> +    ok(!!ddraw, "Failed to create a ddraw object.\n");
> +    hr = IDirectDraw4_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL);
> +    ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
> +
> +    memset(&hal_caps, 0, sizeof(hal_caps));
> +    hal_caps.dwSize = sizeof(hal_caps);
> +    hr = IDirectDraw4_GetCaps(ddraw, &hal_caps, NULL);
> +    ok(SUCCEEDED(hr), "Failed to get caps, hr %#x.\n", hr);
> +    if ((hal_caps.ddsCaps.dwCaps & needed_caps) != needed_caps
> +            || !(hal_caps.ddsCaps.dwCaps & DDSCAPS2_TEXTUREMANAGE))
> +    {
> +        skip("Required surface types not supported, skipping test.\n");
> +        goto done;
> +    }
> +
> +    for (r = 0; r < sizeof(resources) / sizeof(*resources); ++r)
> +    {
> +        memset(&surface_desc, 0, sizeof(surface_desc));
> +        surface_desc.dwSize = sizeof(surface_desc);
> +        surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
> +        surface_desc.ddsCaps.dwCaps = resources[r].caps;
> +        surface_desc.ddsCaps.dwCaps2 = resources[r].caps2;
> +        surface_desc.dwWidth = 128;
> +        surface_desc.dwHeight = 128;
> +        U4(surface_desc).ddpfPixelFormat.dwSize = sizeof(U4(surface_desc).ddpfPixelFormat);
> +        U4(surface_desc).ddpfPixelFormat.dwFlags = DDPF_RGB;
> +        U1(U4(surface_desc).ddpfPixelFormat).dwRGBBitCount = 32;
> +        U2(U4(surface_desc).ddpfPixelFormat).dwRBitMask = 0xff0000;
> +        U3(U4(surface_desc).ddpfPixelFormat).dwGBitMask = 0x00ff00;
> +        U4(U4(surface_desc).ddpfPixelFormat).dwBBitMask = 0x0000ff;
> +
> +        hr = IDirectDraw4_CreateSurface(ddraw, &surface_desc, &surface, NULL);
> +        ok(SUCCEEDED(hr), "Failed to create surface, hr %#x, type %s.\n", hr, resources[r].name);
> +
> +        hr = IDirectDrawSurface4_Lock(surface, NULL, NULL, DDLOCK_WAIT, NULL);
> +        ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x, type %s.\n", hr, resources[r].name);
> +
> +        for (i = 0; i < sizeof(valid) / sizeof(*valid); ++i)
> +        {
> +            RECT *rect = &valid[i];
> +
> +            memset(&surface_desc, 0, sizeof(surface_desc));
> +            surface_desc.dwSize = sizeof(surface_desc);
> +
> +            hr = IDirectDrawSurface4_Lock(surface, rect, &surface_desc, DDLOCK_WAIT, NULL);
> +            ok(SUCCEEDED(hr), "Lock failed (%#x) for rect [%d, %d]->[%d, %d], type %s.\n",
> +                    hr, rect->left, rect->top, rect->right, rect->bottom, resources[r].name);
> +
> +            hr = IDirectDrawSurface4_Unlock(surface, NULL);
> +            ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
> +        }
> +
> +        for (i = 0; i < sizeof(invalid) / sizeof(*invalid); ++i)
> +        {
> +            RECT *rect = &invalid[i];
> +
> +            memset(&surface_desc, 1, sizeof(surface_desc));
> +            surface_desc.dwSize = sizeof(surface_desc);
> +
> +            hr = IDirectDrawSurface4_Lock(surface, rect, &surface_desc, DDLOCK_WAIT, NULL);
> +            ok(hr == resources[r].hr, "Lock returned %#x for rect [%d, %d]->[%d, %d], type %s.\n",
> +                    hr, rect->left, rect->top, rect->right, rect->bottom, resources[r].name);
> +            if (SUCCEEDED(hr))
> +            {
> +                hr = IDirectDrawSurface4_Unlock(surface, NULL);
> +                ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
> +            }
> +            else
> +                ok(!surface_desc.lpSurface, "Got unexpected lpSurface %p.\n", surface_desc.lpSurface);
> +        }
> +
> +        hr = IDirectDrawSurface4_Lock(surface, NULL, &surface_desc, DDLOCK_WAIT, NULL);
> +        ok(SUCCEEDED(hr), "Lock(rect = NULL) failed, hr %#x, type %s.\n",
> +                hr, resources[r].name);
> +        hr = IDirectDrawSurface4_Lock(surface, NULL, &surface_desc, DDLOCK_WAIT, NULL);
> +        ok(hr == DDERR_SURFACEBUSY, "Double lock(rect = NULL) returned %#x, type %s.\n",
> +                hr, resources[r].name);
> +        hr = IDirectDrawSurface4_Unlock(surface, NULL);
> +        ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
> +
> +        hr = IDirectDrawSurface4_Lock(surface, &valid[0], &surface_desc, DDLOCK_WAIT, NULL);
> +        ok(SUCCEEDED(hr), "Lock(rect = [%d, %d]->[%d, %d]) failed (%#x).\n",
> +                valid[0].left, valid[0].top, valid[0].right, valid[0].bottom, hr);
> +        hr = IDirectDrawSurface4_Lock(surface, &valid[0], &surface_desc, DDLOCK_WAIT, NULL);
> +        ok(hr == DDERR_SURFACEBUSY, "Double lock(rect = [%d, %d]->[%d, %d]) failed (%#x).\n",
> +                valid[0].left, valid[0].top, valid[0].right, valid[0].bottom, hr);
> +
> +        /* Locking a different rectangle returns DD_OK, but it seems to break the surface.
> +         * Afterwards unlocking the surface fails(NULL rectangle or both locked rectangles) */
> +
> +        hr = IDirectDrawSurface4_Unlock(surface, NULL);
> +        ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
> +
> +        IDirectDrawSurface4_Release(surface);
> +    }
> +
> +done:
> +    IDirectDraw4_Release(ddraw);
> +    DestroyWindow(window);
> +}
> +
>  START_TEST(ddraw4)
>  {
>      IDirectDraw4 *ddraw;
> @@ -10367,4 +10517,5 @@ START_TEST(ddraw4)
>      test_colorkey_precision();
>      test_range_colorkey();
>      test_shademode();
> +    test_lockrect_invalid();
>  }
> diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c
> index 97ce7aa..268975f 100644
> --- a/dlls/ddraw/tests/ddraw7.c
> +++ b/dlls/ddraw/tests/ddraw7.c
> @@ -10544,6 +10544,170 @@ static void test_shademode(void)
>      DestroyWindow(window);
>  }
>  
> +static void test_lockrect_invalid(void)
> +{
> +    unsigned int i, r;
> +    IDirectDraw7 *ddraw;
> +    IDirectDrawSurface7 *surface;
> +    HWND window;
> +    HRESULT hr;
> +    DDSURFACEDESC2 surface_desc;
> +    DDSURFACEDESC2 locked_desc;
> +    DDCAPS hal_caps;
> +    DWORD needed_caps = DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY;
> +    static RECT valid[] =
> +    {
> +        {60, 60, 68, 68},
> +        {60, 60, 60, 68},
> +        {60, 60, 68, 60},
> +        {120, 60, 128, 68},
> +        {60, 120, 68, 128},
> +    };
> +    static RECT invalid[] =
> +    {
> +        {68, 60, 60, 68},       /* left > right */
> +        {60, 68, 68, 60},       /* top > bottom */
> +        {-8, 60,  0, 68},       /* left < surface */
> +        {60, -8, 68,  0},       /* top < surface */
> +        {-16, 60, -8, 68},      /* right < surface */
> +        {60, -16, 68, -8},      /* bottom < surface */
> +        {60, 60, 136, 68},      /* right > surface */
> +        {60, 60, 68, 136},      /* bottom > surface */
> +        {136, 60, 144, 68},     /* left > surface */
> +        {60, 136, 68, 144},     /* top > surface */
> +    };
> +    static const struct
> +    {
> +        DWORD caps, caps2;
> +        const char *name;
> +        HRESULT hr;
> +    }
> +    resources[] =
> +    {
> +        {DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY, 0, "sysmem offscreenplain", DDERR_INVALIDPARAMS},
> +        {DDSCAPS_OFFSCREENPLAIN | DDSCAPS_VIDEOMEMORY, 0, "vidmem offscreenplain", DDERR_INVALIDPARAMS},
> +        {DDSCAPS_TEXTURE | DDSCAPS_SYSTEMMEMORY, 0, "sysmem texture", DD_OK},
> +        {DDSCAPS_TEXTURE | DDSCAPS_VIDEOMEMORY, 0, "vidmem texture", DDERR_INVALIDPARAMS},
> +        {DDSCAPS_TEXTURE, DDSCAPS2_TEXTUREMANAGE, "managed texture", DD_OK},
> +    };
> +
> +    window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
> +            0, 0, 640, 480, 0, 0, 0, 0);
> +    ddraw = create_ddraw();
> +    ok(!!ddraw, "Failed to create a ddraw object.\n");
> +    hr = IDirectDraw7_SetCooperativeLevel(ddraw, window, DDSCL_NORMAL);
> +    ok(SUCCEEDED(hr), "Failed to set cooperative level, hr %#x.\n", hr);
> +
> +    memset(&hal_caps, 0, sizeof(hal_caps));
> +    hal_caps.dwSize = sizeof(hal_caps);
> +    hr = IDirectDraw7_GetCaps(ddraw, &hal_caps, NULL);
> +    ok(SUCCEEDED(hr), "Failed to get caps, hr %#x.\n", hr);
> +    if ((hal_caps.ddsCaps.dwCaps & needed_caps) != needed_caps
> +            || !(hal_caps.ddsCaps.dwCaps & DDSCAPS2_TEXTUREMANAGE))
> +    {
> +        skip("Required surface types not supported, skipping test.\n");
> +        goto done;
> +    }
> +
> +    for (r = 0; r < sizeof(resources) / sizeof(*resources); ++r)
> +    {
> +        memset(&surface_desc, 0, sizeof(surface_desc));
> +        surface_desc.dwSize = sizeof(surface_desc);
> +        surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
> +        surface_desc.ddsCaps.dwCaps = resources[r].caps;
> +        surface_desc.ddsCaps.dwCaps2 = resources[r].caps2;
> +        surface_desc.dwWidth = 128;
> +        surface_desc.dwHeight = 128;
> +        U4(surface_desc).ddpfPixelFormat.dwSize = sizeof(U4(surface_desc).ddpfPixelFormat);
> +        U4(surface_desc).ddpfPixelFormat.dwFlags = DDPF_RGB;
> +        U1(U4(surface_desc).ddpfPixelFormat).dwRGBBitCount = 32;
> +        U2(U4(surface_desc).ddpfPixelFormat).dwRBitMask = 0xff0000;
> +        U3(U4(surface_desc).ddpfPixelFormat).dwGBitMask = 0x00ff00;
> +        U4(U4(surface_desc).ddpfPixelFormat).dwBBitMask = 0x0000ff;
> +
> +        hr = IDirectDraw7_CreateSurface(ddraw, &surface_desc, &surface, NULL);
> +        if (is_ddraw64 && (resources[r].caps & DDSCAPS_TEXTURE))
> +        {
> +            todo_wine ok(hr == E_NOINTERFACE, "Got unexpected hr %#x, type %s.\n", hr, resources[r].name);
> +            if (SUCCEEDED(hr))
> +                IDirectDrawSurface7_Release(surface);
> +            continue;
> +        }
> +        ok(SUCCEEDED(hr), "Failed to create surface, hr %#x, type %s.\n", hr, resources[r].name);
> +
> +        /* Crashes in ddraw7
> +        hr = IDirectDrawSurface7_Lock(surface, NULL, NULL, DDLOCK_WAIT, NULL);
> +        ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x, type %s.\n", hr, resources[r].name);
> +        */
> +
> +        for (i = 0; i < sizeof(valid) / sizeof(*valid); ++i)
> +        {
> +            RECT *rect = &valid[i];
> +
> +            memset(&locked_desc, 0, sizeof(locked_desc));
> +            locked_desc.dwSize = sizeof(locked_desc);
> +
> +            hr = IDirectDrawSurface7_Lock(surface, rect, &locked_desc, DDLOCK_WAIT, NULL);
> +            ok(SUCCEEDED(hr), "Lock failed (%#x) for rect [%d, %d]->[%d, %d], type %s.\n",
> +                    hr, rect->left, rect->top, rect->right, rect->bottom, resources[r].name);
> +
> +            hr = IDirectDrawSurface7_Unlock(surface, NULL);
> +            ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
> +        }
> +
> +        for (i = 0; i < sizeof(invalid) / sizeof(*invalid); ++i)
> +        {
> +            RECT *rect = &invalid[i];
> +
> +            memset(&locked_desc, 1, sizeof(locked_desc));
> +            locked_desc.dwSize = sizeof(locked_desc);
> +
> +            hr = IDirectDrawSurface7_Lock(surface, rect, &locked_desc, DDLOCK_WAIT, NULL);
> +            if (SUCCEEDED(resources[r].hr))
> +                todo_wine ok(hr == resources[r].hr, "Lock returned %#x for rect [%d, %d]->[%d, %d], type %s.\n",
> +                        hr, rect->left, rect->top, rect->right, rect->bottom, resources[r].name);
> +            else
> +                ok(hr == resources[r].hr, "Lock returned %#x for rect [%d, %d]->[%d, %d], type %s.\n",
> +                        hr, rect->left, rect->top, rect->right, rect->bottom, resources[r].name);
> +            if (SUCCEEDED(hr))
> +            {
> +                hr = IDirectDrawSurface7_Unlock(surface, NULL);
> +                ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
> +            }
> +            else
> +                ok(!locked_desc.lpSurface, "Got unexpected lpSurface %p.\n", locked_desc.lpSurface);
> +        }
> +
> +        hr = IDirectDrawSurface7_Lock(surface, NULL, &locked_desc, DDLOCK_WAIT, NULL);
> +        ok(SUCCEEDED(hr), "Lock(rect = NULL) failed, hr %#x, type %s.\n",
> +                hr, resources[r].name);
> +        hr = IDirectDrawSurface7_Lock(surface, NULL, &locked_desc, DDLOCK_WAIT, NULL);
> +        ok(hr == DDERR_SURFACEBUSY, "Double lock(rect = NULL) returned %#x, type %s.\n",
> +                hr, resources[r].name);
> +        hr = IDirectDrawSurface7_Unlock(surface, NULL);
> +        ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
> +
> +        hr = IDirectDrawSurface7_Lock(surface, &valid[0], &locked_desc, DDLOCK_WAIT, NULL);
> +        ok(SUCCEEDED(hr), "Lock(rect = [%d, %d]->[%d, %d]) failed (%#x).\n",
> +                valid[0].left, valid[0].top, valid[0].right, valid[0].bottom, hr);
> +        hr = IDirectDrawSurface7_Lock(surface, &valid[0], &locked_desc, DDLOCK_WAIT, NULL);
> +        ok(hr == DDERR_SURFACEBUSY, "Double lock(rect = [%d, %d]->[%d, %d]) failed (%#x).\n",
> +                valid[0].left, valid[0].top, valid[0].right, valid[0].bottom, hr);
> +
> +        /* Locking a different rectangle returns DD_OK, but it seems to break the surface.
> +         * Afterwards unlocking the surface fails(NULL rectangle or both locked rectangles) */
> +
> +        hr = IDirectDrawSurface7_Unlock(surface, NULL);
> +        ok(SUCCEEDED(hr), "Failed to unlock surface, hr %#x, type %s.\n", hr, resources[r].name);
> +
> +        IDirectDrawSurface7_Release(surface);
> +    }
> +
> +done:
> +    IDirectDraw7_Release(ddraw);
> +    DestroyWindow(window);
> +}
> +
>  START_TEST(ddraw7)
>  {
>      HMODULE module = GetModuleHandleA("ddraw.dll");
> @@ -10641,4 +10805,5 @@ START_TEST(ddraw7)
>      test_colorkey_precision();
>      test_range_colorkey();
>      test_shademode();
> +    test_lockrect_invalid();
>  }
> diff --git a/dlls/ddraw/tests/dsurface.c b/dlls/ddraw/tests/dsurface.c
> index 83fa46d..781fa56 100644
> --- a/dlls/ddraw/tests/dsurface.c
> +++ b/dlls/ddraw/tests/dsurface.c
> @@ -1208,126 +1208,6 @@ static void CubeMapTest(void)
>      if (dd7) IDirectDraw7_Release(dd7);
>  }
>  
> -static void test_lockrect_invalid(void)
> -{
> -    unsigned int i, j;
> -
> -    RECT valid[] = {
> -        {60, 60, 68, 68},
> -        {60, 60, 60, 68},
> -        {60, 60, 68, 60},
> -        {120, 60, 128, 68},
> -        {60, 120, 68, 128},
> -    };
> -
> -    RECT invalid[] = {
> -        {68, 60, 60, 68},       /* left > right */
> -        {60, 68, 68, 60},       /* top > bottom */
> -        {-8, 60,  0, 68},       /* left < surface */
> -        {60, -8, 68,  0},       /* top < surface */
> -        {-16, 60, -8, 68},      /* right < surface */
> -        {60, -16, 68, -8},      /* bottom < surface */
> -        {60, 60, 136, 68},      /* right > surface */
> -        {60, 60, 68, 136},      /* bottom > surface */
> -        {136, 60, 144, 68},     /* left > surface */
> -        {60, 136, 68, 144},     /* top > surface */
> -    };
> -
> -    const DWORD dds_caps[] = {
> -        DDSCAPS_OFFSCREENPLAIN
> -    };
> -
> -    for (j = 0; j < (sizeof(dds_caps) / sizeof(*dds_caps)); ++j)
> -    {
> -        IDirectDrawSurface *surface = 0;
> -        DDSURFACEDESC surface_desc = {0};
> -        DDSURFACEDESC locked_desc = {0};
> -        HRESULT hr;
> -
> -        surface_desc.dwSize = sizeof(surface_desc);
> -        surface_desc.ddpfPixelFormat.dwSize = sizeof(surface_desc.ddpfPixelFormat);
> -        surface_desc.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT;
> -        surface_desc.ddsCaps.dwCaps = dds_caps[j];
> -        surface_desc.dwWidth = 128;
> -        surface_desc.dwHeight = 128;
> -        surface_desc.ddpfPixelFormat.dwFlags = DDPF_RGB;
> -        U1(surface_desc.ddpfPixelFormat).dwRGBBitCount = 32;
> -        U2(surface_desc.ddpfPixelFormat).dwRBitMask = 0xFF0000;
> -        U3(surface_desc.ddpfPixelFormat).dwGBitMask = 0x00FF00;
> -        U4(surface_desc.ddpfPixelFormat).dwBBitMask = 0x0000FF;
> -
> -        hr = IDirectDraw_CreateSurface(lpDD, &surface_desc, &surface, NULL);
> -        ok(SUCCEEDED(hr), "CreateSurface failed (0x%08x)\n", hr);
> -        if (FAILED(hr))
> -        {
> -            skip("failed to create surface\n");
> -            continue;
> -        }
> -
> -        hr = IDirectDrawSurface_Lock(surface, NULL, NULL, DDLOCK_WAIT, NULL);
> -        ok(hr == DDERR_INVALIDPARAMS, "Lock returned 0x%08x for NULL DDSURFACEDESC,"
> -                " expected DDERR_INVALIDPARAMS (0x%08x)\n", hr, DDERR_INVALIDPARAMS);
> -
> -        for (i = 0; i < (sizeof(valid) / sizeof(*valid)); ++i)
> -        {
> -            RECT *rect = &valid[i];
> -
> -            memset(&locked_desc, 0, sizeof(locked_desc));
> -            locked_desc.dwSize = sizeof(locked_desc);
> -
> -            hr = IDirectDrawSurface_Lock(surface, rect, &locked_desc, DDLOCK_WAIT, NULL);
> -            ok(SUCCEEDED(hr), "Lock failed (0x%08x) for rect [%d, %d]->[%d, %d]\n",
> -                    hr, rect->left, rect->top, rect->right, rect->bottom);
> -
> -            hr = IDirectDrawSurface_Unlock(surface, NULL);
> -            ok(SUCCEEDED(hr), "Unlock failed (0x%08x)\n", hr);
> -        }
> -
> -        for (i = 0; i < (sizeof(invalid) / sizeof(*invalid)); ++i)
> -        {
> -            RECT *rect = &invalid[i];
> -
> -            memset(&locked_desc, 1, sizeof(locked_desc));
> -            locked_desc.dwSize = sizeof(locked_desc);
> -
> -            hr = IDirectDrawSurface_Lock(surface, rect, &locked_desc, DDLOCK_WAIT, NULL);
> -            ok(hr == DDERR_INVALIDPARAMS, "Lock returned 0x%08x for rect [%d, %d]->[%d, %d]"
> -                    ", expected DDERR_INVALIDPARAMS (0x%08x)\n", hr, rect->left, rect->top,
> -                    rect->right, rect->bottom, DDERR_INVALIDPARAMS);
> -            ok(!locked_desc.lpSurface, "IDirectDrawSurface_Lock did not set lpSurface in the surface desc to zero.\n");
> -        }
> -
> -        hr = IDirectDrawSurface_Lock(surface, NULL, &locked_desc, DDLOCK_WAIT, NULL);
> -        ok(hr == DD_OK, "IDirectDrawSurface_Lock(rect = NULL) failed (0x%08x)\n", hr);
> -        hr = IDirectDrawSurface_Lock(surface, NULL, &locked_desc, DDLOCK_WAIT, NULL);
> -        ok(hr == DDERR_SURFACEBUSY, "Double lock(rect = NULL) returned 0x%08x\n", hr);
> -        if(SUCCEEDED(hr)) {
> -            hr = IDirectDrawSurface_Unlock(surface, NULL);
> -            ok(SUCCEEDED(hr), "Unlock failed (0x%08x)\n", hr);
> -        }
> -        hr = IDirectDrawSurface_Unlock(surface, NULL);
> -        ok(SUCCEEDED(hr), "Unlock failed (0x%08x)\n", hr);
> -
> -        memset(&locked_desc, 0, sizeof(locked_desc));
> -        locked_desc.dwSize = sizeof(locked_desc);
> -        hr = IDirectDrawSurface_Lock(surface, &valid[0], &locked_desc, DDLOCK_WAIT, NULL);
> -        ok(hr == DD_OK, "IDirectDrawSurface_Lock(rect = [%d, %d]->[%d, %d]) failed (0x%08x)\n",
> -           valid[0].left, valid[0].top, valid[0].right, valid[0].bottom, hr);
> -        hr = IDirectDrawSurface_Lock(surface, &valid[0], &locked_desc, DDLOCK_WAIT, NULL);
> -        ok(hr == DDERR_SURFACEBUSY, "Double lock(rect = [%d, %d]->[%d, %d]) failed (0x%08x)\n",
> -           valid[0].left, valid[0].top, valid[0].right, valid[0].bottom, hr);
> -
> -        /* Locking a different rectangle returns DD_OK, but it seems to break the surface.
> -         * Afterwards unlocking the surface fails(NULL rectangle, and both locked rectangles
> -         */
> -
> -        hr = IDirectDrawSurface_Unlock(surface, NULL);
> -        ok(hr == DD_OK, "Unlock returned (0x%08x)\n", hr);
> -
> -        IDirectDrawSurface_Release(surface);
> -    }
> -}
> -
>  static void CompressedTest(void)
>  {
>      HRESULT hr;
> @@ -3788,7 +3668,6 @@ START_TEST(dsurface)
>      GetDDInterface_7();
>      EnumTest();
>      CubeMapTest();
> -    test_lockrect_invalid();
>      CompressedTest();
>      SizeTest();
>      BltParamTest();
> 

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2

iQIcBAEBCAAGBQJWo6GzAAoJEN0/YqbEcdMwohgP/AorcUn9eXGmnaGuatVSwMws
NpZRLXRB/NWEcZYgBmULOeo3P7gjAQqBjNuq13tRxz2GezNCwSL9XqdjUct6gL9s
Y6rbay0R7vC7evHInRj3xGoeqE9L0nrnjq7Q8uGCyPV+SiEX2K33cFcz2AdmJzQx
Td86hZqN+DSUYC85nFzI99Xb5mq97InXFwLuMuAQBidhtXN9n3RlzDuU8dV0bCzD
4sb8P/qEIzQhHUsqvBOetobv7sRn2EWDavv2tQHRLn9PUJhskdnhfoJHdqQPxnEj
jDEYgjudfOxBKG+w7JswQZs1o65Bj7AqFDWbgZl+zi4E9Tu4pui9EBAp++q/yxg0
u4Uh94Qtn/cvwQLEaRgmTmvVTFjKt0Fz8NiKMgMDLB5GaIA8yaLLrYJQ4SVimPff
K90ocqNYqMOWXmB0helCinfcwVBE4/2gncPZdGf4cUg6wtDQoD3QA7fA+zr0DscD
eB2okL2EgAGrduu6luSfdJjF9qZMi5kYV3bb8F/qp453bc//yZPtPKbMlXezaqO8
BlioPjC1V22CfM/M6uN5e8OK6Gt3LJp5Ti0byUIpRxJR4rQWawCgg+D1PmH/ED+Y
eHEYobM8+xUti5pUAYlD8X02Mc0Oca88522xZyAXjuuryGsyz/S3VJvvs9NtnUIU
gViofTKq5OT3qssvQvKM
=yPgR
-----END PGP SIGNATURE-----



More information about the wine-patches mailing list