Signed-off-by: Zhiyi Zhang zzhang@codeweavers.com --- dlls/gdi32/tests/Makefile.in | 1 + dlls/gdi32/tests/driver.c | 101 +++++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 dlls/gdi32/tests/driver.c
diff --git a/dlls/gdi32/tests/Makefile.in b/dlls/gdi32/tests/Makefile.in index 90d7223f47..9d82c278e9 100644 --- a/dlls/gdi32/tests/Makefile.in +++ b/dlls/gdi32/tests/Makefile.in @@ -7,6 +7,7 @@ C_SRCS = \ clipping.c \ dc.c \ dib.c \ + driver.c \ font.c \ gdiobj.c \ generated.c \ diff --git a/dlls/gdi32/tests/driver.c b/dlls/gdi32/tests/driver.c new file mode 100644 index 0000000000..57b158f16b --- /dev/null +++ b/dlls/gdi32/tests/driver.c @@ -0,0 +1,101 @@ +/* + * Unit test suite for kernel mode graphics driver + * + * Copyright 2019 Zhiyi Zhang + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include <stdarg.h> + +#include "ntstatus.h" +#define WIN32_NO_STATUS +#include "windef.h" +#include "winbase.h" +#include "wingdi.h" +#include "winuser.h" +#include "winternl.h" +#include "ddk/d3dkmthk.h" + +#include "wine/test.h" + +static const WCHAR display1W[] = {'\','\','.','\','D','I','S','P','L','A','Y','1',0}; + +static NTSTATUS (WINAPI *pD3DKMTCloseAdapter)(const D3DKMT_CLOSEADAPTER *); +static NTSTATUS (WINAPI *pD3DKMTOpenAdapterFromGdiDisplayName)(D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME *); + +static void test_D3DKMTOpenAdapterFromGdiDisplayName(void) +{ + D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME open_adapter_gdi_desc; + D3DKMT_CLOSEADAPTER close_adapter_desc; + DISPLAY_DEVICEW display_device = {sizeof(display_device)}; + NTSTATUS status; + DWORD i; + + /* STATUS_PROCEDURE_NOT_FOUND on vista~win7 */ + lstrcpyW(open_adapter_gdi_desc.DeviceName, display1W); + if (!pD3DKMTOpenAdapterFromGdiDisplayName + || pD3DKMTOpenAdapterFromGdiDisplayName(&open_adapter_gdi_desc) == STATUS_PROCEDURE_NOT_FOUND + || !pD3DKMTCloseAdapter) + { + skip("Required functions are unavailable.\n"); + return; + } + + /* Invalid parameters */ + status = pD3DKMTOpenAdapterFromGdiDisplayName(NULL); + ok(status == STATUS_UNSUCCESSFUL, "Got unexpected return code %#x.\n", status); + + memset(&open_adapter_gdi_desc, 0, sizeof(open_adapter_gdi_desc)); + status = pD3DKMTOpenAdapterFromGdiDisplayName(&open_adapter_gdi_desc); + ok(status == STATUS_UNSUCCESSFUL, "Got unexpected return code %#x.\n", status); + + /* Open adapter */ + for (i = 0; EnumDisplayDevicesW(NULL, i, &display_device, 0); ++i) + { + lstrcpyW(open_adapter_gdi_desc.DeviceName, display_device.DeviceName); + status = pD3DKMTOpenAdapterFromGdiDisplayName(&open_adapter_gdi_desc); + if (display_device.StateFlags & DISPLAY_DEVICE_ATTACHED_TO_DESKTOP) + ok(status == STATUS_SUCCESS, "Got unexpected return code %#x.\n", status); + else + { + ok(status == STATUS_UNSUCCESSFUL, "Got unexpected return code %#x.\n", status); + continue; + } + + ok(open_adapter_gdi_desc.hAdapter, "Expect not null.\n"); + if (display_device.StateFlags & DISPLAY_DEVICE_PRIMARY_DEVICE) + ok(open_adapter_gdi_desc.VidPnSourceId == 0, "Got unexpected value %#x.\n", + open_adapter_gdi_desc.VidPnSourceId); + else + ok(open_adapter_gdi_desc.VidPnSourceId, "Got unexpected value %#x.\n", open_adapter_gdi_desc.VidPnSourceId); + + close_adapter_desc.hAdapter = open_adapter_gdi_desc.hAdapter; + status = pD3DKMTCloseAdapter(&close_adapter_desc); + ok(status == STATUS_SUCCESS, "Got unexpected return code %#x.\n", status); + } +} + +START_TEST(driver) +{ + HMODULE gdi32 = LoadLibraryA("gdi32.dll"); + + pD3DKMTCloseAdapter = (void *)GetProcAddress(gdi32, "D3DKMTCloseAdapter"); + pD3DKMTOpenAdapterFromGdiDisplayName = (void *)GetProcAddress(gdi32, "D3DKMTOpenAdapterFromGdiDisplayName"); + + test_D3DKMTOpenAdapterFromGdiDisplayName(); + + FreeLibrary(gdi32); +}
On Mon, May 20, 2019 at 08:43:43PM +0800, Zhiyi Zhang wrote:
+static void test_D3DKMTOpenAdapterFromGdiDisplayName(void) +{
- D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME open_adapter_gdi_desc;
- D3DKMT_CLOSEADAPTER close_adapter_desc;
- DISPLAY_DEVICEW display_device = {sizeof(display_device)};
- NTSTATUS status;
- DWORD i;
- /* STATUS_PROCEDURE_NOT_FOUND on vista~win7 */
- lstrcpyW(open_adapter_gdi_desc.DeviceName, display1W);
- if (!pD3DKMTOpenAdapterFromGdiDisplayName
|| pD3DKMTOpenAdapterFromGdiDisplayName(&open_adapter_gdi_desc) == STATUS_PROCEDURE_NOT_FOUND
If you called pD3DKKMTOpenAdapterFromGdiDisplayName( NULL ) here you wouldn't leak the adaptor handle. This would also get the invalid parameter test out of the way.
|| !pD3DKMTCloseAdapter)
There doesn't seem to be a need to test for D3DKMTCloseAdaper, we can assume that's going to be present if we get this far.
Similar things apply to other patches in the series.
Huw.
On 5/23/19 8:55 PM, Huw Davies wrote:
On Mon, May 20, 2019 at 08:43:43PM +0800, Zhiyi Zhang wrote:
+static void test_D3DKMTOpenAdapterFromGdiDisplayName(void) +{
- D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME open_adapter_gdi_desc;
- D3DKMT_CLOSEADAPTER close_adapter_desc;
- DISPLAY_DEVICEW display_device = {sizeof(display_device)};
- NTSTATUS status;
- DWORD i;
- /* STATUS_PROCEDURE_NOT_FOUND on vista~win7 */
- lstrcpyW(open_adapter_gdi_desc.DeviceName, display1W);
- if (!pD3DKMTOpenAdapterFromGdiDisplayName
|| pD3DKMTOpenAdapterFromGdiDisplayName(&open_adapter_gdi_desc) == STATUS_PROCEDURE_NOT_FOUND
If you called pD3DKKMTOpenAdapterFromGdiDisplayName( NULL ) here you wouldn't leak the adaptor handle. This would also get the invalid parameter test out of the way.
Thanks.
The reason I am not using NULL parameter here because it will return STATUS_INVALID_PARAMETER instead of STATUS_PROCEDURE_NOT_FOUND.
|| !pD3DKMTCloseAdapter)
There doesn't seem to be a need to test for D3DKMTCloseAdaper, we can assume that's going to be present if we get this far.
Similar things apply to other patches in the series.
Sure.
Huw.
On Thu, May 23, 2019 at 09:07:00PM +0800, Zhiyi Zhang wrote:
On 5/23/19 8:55 PM, Huw Davies wrote:
On Mon, May 20, 2019 at 08:43:43PM +0800, Zhiyi Zhang wrote:
+static void test_D3DKMTOpenAdapterFromGdiDisplayName(void) +{
- D3DKMT_OPENADAPTERFROMGDIDISPLAYNAME open_adapter_gdi_desc;
- D3DKMT_CLOSEADAPTER close_adapter_desc;
- DISPLAY_DEVICEW display_device = {sizeof(display_device)};
- NTSTATUS status;
- DWORD i;
- /* STATUS_PROCEDURE_NOT_FOUND on vista~win7 */
- lstrcpyW(open_adapter_gdi_desc.DeviceName, display1W);
- if (!pD3DKMTOpenAdapterFromGdiDisplayName
|| pD3DKMTOpenAdapterFromGdiDisplayName(&open_adapter_gdi_desc) == STATUS_PROCEDURE_NOT_FOUND
If you called pD3DKKMTOpenAdapterFromGdiDisplayName( NULL ) here you wouldn't leak the adaptor handle. This would also get the invalid parameter test out of the way.
Thanks.
The reason I am not using NULL parameter here because it will return STATUS_INVALID_PARAMETER instead of STATUS_PROCEDURE_NOT_FOUND.
Oh, that's a drag. In that case you'll need to close the adaptor to fix the leak.
Huw.