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