Zebediah Figura : ntoskrnl/tests: Add some tests for device interfaces.
Alexandre Julliard
julliard at winehq.org
Thu Apr 8 16:14:02 CDT 2021
Module: wine
Branch: master
Commit: 3b08a51b4ef380a2a7bf039248537a7ba717f72c
URL: https://source.winehq.org/git/wine.git/?a=commit;h=3b08a51b4ef380a2a7bf039248537a7ba717f72c
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Wed Apr 7 23:56:45 2021 -0500
ntoskrnl/tests: Add some tests for device interfaces.
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntoskrnl.exe/tests/driver.h | 5 ++-
dlls/ntoskrnl.exe/tests/driver_pnp.c | 15 ++++++++-
dlls/ntoskrnl.exe/tests/ntoskrnl.c | 60 ++++++++++++++++++++++++++++++++++++
3 files changed, 78 insertions(+), 2 deletions(-)
diff --git a/dlls/ntoskrnl.exe/tests/driver.h b/dlls/ntoskrnl.exe/tests/driver.h
index c95de67be3a..10e2f13ed7b 100644
--- a/dlls/ntoskrnl.exe/tests/driver.h
+++ b/dlls/ntoskrnl.exe/tests/driver.h
@@ -36,7 +36,10 @@
#define IOCTL_WINETEST_MISMATCHED_STATUS CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80b, METHOD_NEITHER, FILE_ANY_ACCESS)
#define IOCTL_WINETEST_COMPLETION CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80c, METHOD_NEITHER, FILE_ANY_ACCESS)
-#define IOCTL_WINETEST_BUS_MAIN CTL_CODE(FILE_DEVICE_BUS_EXTENDER, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_WINETEST_BUS_MAIN CTL_CODE(FILE_DEVICE_BUS_EXTENDER, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_WINETEST_BUS_REGISTER_IFACE CTL_CODE(FILE_DEVICE_BUS_EXTENDER, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_WINETEST_BUS_ENABLE_IFACE CTL_CODE(FILE_DEVICE_BUS_EXTENDER, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_WINETEST_BUS_DISABLE_IFACE CTL_CODE(FILE_DEVICE_BUS_EXTENDER, 0x803, METHOD_BUFFERED, FILE_ANY_ACCESS)
static const char teststr[] = "Wine is not an emulator";
diff --git a/dlls/ntoskrnl.exe/tests/driver_pnp.c b/dlls/ntoskrnl.exe/tests/driver_pnp.c
index f9d331f1716..b8d97f9cfb5 100644
--- a/dlls/ntoskrnl.exe/tests/driver_pnp.c
+++ b/dlls/ntoskrnl.exe/tests/driver_pnp.c
@@ -33,7 +33,8 @@
#include "utils.h"
static const GUID control_class = {0xdeadbeef, 0x29ef, 0x4538, {0xa5, 0xfd, 0xb6, 0x95, 0x73, 0xa3, 0x62, 0xc0}};
-static UNICODE_STRING control_symlink;
+static const GUID bus_class = {0xdeadbeef, 0x29ef, 0x4538, {0xa5, 0xfd, 0xb6, 0x95, 0x73, 0xa3, 0x62, 0xc1}};
+static UNICODE_STRING control_symlink, bus_symlink;
static DEVICE_OBJECT *bus_fdo, *bus_pdo;
@@ -60,6 +61,7 @@ static NTSTATUS fdo_pnp(IRP *irp)
IoDetachDevice(bus_pdo);
IoDeleteDevice(bus_fdo);
RtlFreeUnicodeString(&control_symlink);
+ RtlFreeUnicodeString(&bus_symlink);
return ret;
}
@@ -259,6 +261,17 @@ static NTSTATUS fdo_ioctl(IRP *irp, IO_STACK_LOCATION *stack, ULONG code)
test_bus_query();
return STATUS_SUCCESS;
+ case IOCTL_WINETEST_BUS_REGISTER_IFACE:
+ return IoRegisterDeviceInterface(bus_pdo, &bus_class, NULL, &bus_symlink);
+
+ case IOCTL_WINETEST_BUS_ENABLE_IFACE:
+ IoSetDeviceInterfaceState(&bus_symlink, TRUE);
+ return STATUS_SUCCESS;
+
+ case IOCTL_WINETEST_BUS_DISABLE_IFACE:
+ IoSetDeviceInterfaceState(&bus_symlink, FALSE);
+ return STATUS_SUCCESS;
+
default:
ok(0, "Unexpected ioctl %#x.\n", code);
return STATUS_NOT_IMPLEMENTED;
diff --git a/dlls/ntoskrnl.exe/tests/ntoskrnl.c b/dlls/ntoskrnl.exe/tests/ntoskrnl.c
index 43b662de2f6..571d983ae8d 100644
--- a/dlls/ntoskrnl.exe/tests/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/tests/ntoskrnl.c
@@ -987,6 +987,7 @@ static void add_file_to_catalog(HANDLE catalog, const WCHAR *file)
static void test_pnp_devices(void)
{
static const GUID control_class = {0xdeadbeef, 0x29ef, 0x4538, {0xa5, 0xfd, 0xb6, 0x95, 0x73, 0xa3, 0x62, 0xc0}};
+ static const GUID bus_class = {0xdeadbeef, 0x29ef, 0x4538, {0xa5, 0xfd, 0xb6, 0x95, 0x73, 0xa3, 0x62, 0xc1}};
char buffer[200];
SP_DEVICE_INTERFACE_DETAIL_DATA_A *iface_detail = (void *)buffer;
@@ -1028,6 +1029,65 @@ static void test_pnp_devices(void)
ret = DeviceIoControl(bus, IOCTL_WINETEST_BUS_MAIN, NULL, 0, NULL, 0, &size, NULL);
ok(ret, "got error %u\n", GetLastError());
+ /* Test IoRegisterDeviceInterface() and IoSetDeviceInterfaceState(). */
+
+ set = SetupDiGetClassDevsA(&bus_class, NULL, NULL, DIGCF_DEVICEINTERFACE);
+ ok(set != INVALID_HANDLE_VALUE, "failed to get device list, error %#x\n", GetLastError());
+ ret = SetupDiEnumDeviceInterfaces(set, NULL, &bus_class, 0, &iface);
+ ok(!ret, "expected failure\n");
+ ok(GetLastError() == ERROR_NO_MORE_ITEMS, "got error %#x\n", GetLastError());
+ SetupDiDestroyDeviceInfoList(set);
+
+ ret = DeviceIoControl(bus, IOCTL_WINETEST_BUS_REGISTER_IFACE, NULL, 0, NULL, 0, &size, NULL);
+ ok(ret, "got error %u\n", GetLastError());
+
+ set = SetupDiGetClassDevsA(&bus_class, NULL, NULL, DIGCF_DEVICEINTERFACE);
+ ok(set != INVALID_HANDLE_VALUE, "failed to get device list, error %#x\n", GetLastError());
+ ret = SetupDiEnumDeviceInterfaces(set, NULL, &bus_class, 0, &iface);
+ ok(ret, "failed to get interface, error %#x\n", GetLastError());
+ ok(IsEqualGUID(&iface.InterfaceClassGuid, &bus_class),
+ "wrong class %s\n", debugstr_guid(&iface.InterfaceClassGuid));
+ ok(!iface.Flags, "got flags %#x\n", iface.Flags);
+ SetupDiDestroyDeviceInfoList(set);
+
+ set = SetupDiGetClassDevsA(&bus_class, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
+ ok(set != INVALID_HANDLE_VALUE, "failed to get device list, error %#x\n", GetLastError());
+ ret = SetupDiEnumDeviceInterfaces(set, NULL, &bus_class, 0, &iface);
+ ok(!ret, "expected failure\n");
+ ok(GetLastError() == ERROR_NO_MORE_ITEMS, "got error %#x\n", GetLastError());
+ SetupDiDestroyDeviceInfoList(set);
+
+ ret = DeviceIoControl(bus, IOCTL_WINETEST_BUS_ENABLE_IFACE, NULL, 0, NULL, 0, &size, NULL);
+ ok(ret, "got error %u\n", GetLastError());
+
+ set = SetupDiGetClassDevsA(&bus_class, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
+ ok(set != INVALID_HANDLE_VALUE, "failed to get device list, error %#x\n", GetLastError());
+ ret = SetupDiEnumDeviceInterfaces(set, NULL, &bus_class, 0, &iface);
+ ok(ret, "failed to get interface, error %#x\n", GetLastError());
+ ok(IsEqualGUID(&iface.InterfaceClassGuid, &bus_class),
+ "wrong class %s\n", debugstr_guid(&iface.InterfaceClassGuid));
+ ok(iface.Flags == SPINT_ACTIVE, "got flags %#x\n", iface.Flags);
+ SetupDiDestroyDeviceInfoList(set);
+
+ ret = DeviceIoControl(bus, IOCTL_WINETEST_BUS_DISABLE_IFACE, NULL, 0, NULL, 0, &size, NULL);
+ ok(ret, "got error %u\n", GetLastError());
+
+ set = SetupDiGetClassDevsA(&bus_class, NULL, NULL, DIGCF_DEVICEINTERFACE);
+ ok(set != INVALID_HANDLE_VALUE, "failed to get device list, error %#x\n", GetLastError());
+ ret = SetupDiEnumDeviceInterfaces(set, NULL, &bus_class, 0, &iface);
+ ok(ret, "failed to get interface, error %#x\n", GetLastError());
+ ok(IsEqualGUID(&iface.InterfaceClassGuid, &bus_class),
+ "wrong class %s\n", debugstr_guid(&iface.InterfaceClassGuid));
+ ok(!iface.Flags, "got flags %#x\n", iface.Flags);
+ SetupDiDestroyDeviceInfoList(set);
+
+ set = SetupDiGetClassDevsA(&bus_class, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT);
+ ok(set != INVALID_HANDLE_VALUE, "failed to get device list, error %#x\n", GetLastError());
+ ret = SetupDiEnumDeviceInterfaces(set, NULL, &bus_class, 0, &iface);
+ ok(!ret, "expected failure\n");
+ ok(GetLastError() == ERROR_NO_MORE_ITEMS, "got error %#x\n", GetLastError());
+ SetupDiDestroyDeviceInfoList(set);
+
CloseHandle(bus);
}
More information about the wine-cvs
mailing list