IoGetDevicePropertyData is used to implement the `IOCTL_BTH_GET_DEVICE_INFO` Bluetooth IOCTL to fetch cached information for remote devices, without having to access the device extension pointer (which is arguably racy and more fragile).
-- v5: ntoskrnl/tests: Add test for getting and setting device properties. ntoskrnl: Implement IoGetDevicePropertyData().
From: Vibhav Pant vibhavp@gmail.com
--- dlls/ntoskrnl.exe/ntoskrnl.exe.spec | 1 + dlls/ntoskrnl.exe/pnp.c | 51 +++++++++++++++++++++++++++++ include/ddk/wdm.h | 1 + 3 files changed, 53 insertions(+)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec index 1bf8ce22fd0..e9ad2aa7e74 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec +++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec @@ -406,6 +406,7 @@ @ stdcall IoGetDeviceInterfaces(ptr ptr long ptr) @ stdcall IoGetDeviceObjectPointer(ptr long ptr ptr) @ stdcall IoGetDeviceProperty(ptr long long ptr ptr) +@ stdcall IoGetDevicePropertyData(ptr ptr long long long ptr ptr ptr) @ stub IoGetDeviceToVerify @ stub IoGetDiskDeviceObject @ stub IoGetDmaAdapter diff --git a/dlls/ntoskrnl.exe/pnp.c b/dlls/ntoskrnl.exe/pnp.c index 7444b81823c..13387d5b6de 100644 --- a/dlls/ntoskrnl.exe/pnp.c +++ b/dlls/ntoskrnl.exe/pnp.c @@ -503,6 +503,57 @@ void WINAPI IoInvalidateDeviceRelations( DEVICE_OBJECT *device_object, DEVICE_RE } }
+/*********************************************************************** + * IoGetDevicePropertyData (NTOSKRNL.EXE.@) + */ +NTSTATUS WINAPI IoGetDevicePropertyData( DEVICE_OBJECT *device, const DEVPROPKEY *property_key, + LCID lcid, ULONG flags, ULONG size, void *data, + ULONG *required_size, DEVPROPTYPE *property_type ) +{ + SP_DEVINFO_DATA sp_device = {sizeof(sp_device)}; + WCHAR device_instance_id[MAX_DEVICE_ID_LEN]; + HDEVINFO set; + NTSTATUS status; + + TRACE( "device %p, property_key %s, lcid %#lx, flags %#lx, size %lu, data %p, required_size %p, property_type %p\n", + device, debugstr_propkey( property_key ), lcid, flags, size, data, required_size, + property_type ); + + if (lcid == LOCALE_SYSTEM_DEFAULT || lcid == LOCALE_USER_DEFAULT) return STATUS_INVALID_PARAMETER; + if (lcid != LOCALE_NEUTRAL) FIXME( "Only LOCALE_NEUTRAL is supported\n" ); + + status = get_device_instance_id( device, device_instance_id ); + if (status != STATUS_SUCCESS) return status; + + set = SetupDiCreateDeviceInfoList( &GUID_NULL, NULL ); + if (set == INVALID_HANDLE_VALUE) + { + ERR( "Failed to create device list, error %#lx.\n", GetLastError() ); + return GetLastError(); + } + + if (!SetupDiOpenDeviceInfoW( set, device_instance_id, NULL, 0, &sp_device )) + { + ERR( "Failed to open device, error %#lx.\n", GetLastError() ); + SetupDiDestroyDeviceInfoList( set ); + return GetLastError(); + } + + if (!SetupDiGetDevicePropertyW( set, &sp_device, property_key, property_type, data, size, required_size, flags )) + { + DWORD err = GetLastError(); + if (err != ERROR_INSUFFICIENT_BUFFER) + ERR( "Failed to get device property, error %#lx.\n", err); + SetupDiDestroyDeviceInfoList( set ); + return GetLastError() == ERROR_SUCCESS + ? (err == ERROR_INSUFFICIENT_BUFFER ? STATUS_BUFFER_TOO_SMALL : err) + : GetLastError(); + } + + SetupDiDestroyDeviceInfoList( set ); + return STATUS_SUCCESS; +} + /*********************************************************************** * IoGetDeviceProperty (NTOSKRNL.EXE.@) */ diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h index 78d14a95b6a..e0c21d0ccfd 100644 --- a/include/ddk/wdm.h +++ b/include/ddk/wdm.h @@ -1765,6 +1765,7 @@ PEPROCESS WINAPI IoGetCurrentProcess(void); NTSTATUS WINAPI IoGetDeviceInterfaces(const GUID*,PDEVICE_OBJECT,ULONG,PWSTR*); NTSTATUS WINAPI IoGetDeviceObjectPointer(UNICODE_STRING*,ACCESS_MASK,PFILE_OBJECT*,PDEVICE_OBJECT*); NTSTATUS WINAPI IoGetDeviceProperty(PDEVICE_OBJECT,DEVICE_REGISTRY_PROPERTY,ULONG,PVOID,PULONG); +NTSTATUS WINAPI IoGetDevicePropertyData(PDEVICE_OBJECT,const DEVPROPKEY*,LCID,ULONG,ULONG,void*,ULONG*,DEVPROPTYPE*); PVOID WINAPI IoGetDriverObjectExtension(PDRIVER_OBJECT,PVOID); PDEVICE_OBJECT WINAPI IoGetRelatedDeviceObject(PFILE_OBJECT); void WINAPI IoGetStackLimits(ULONG_PTR*,ULONG_PTR*);
From: Vibhav Pant vibhavp@gmail.com
--- dlls/ntoskrnl.exe/tests/driver.h | 19 ++++++++ dlls/ntoskrnl.exe/tests/driver_pnp.c | 73 ++++++++++++++++++++++++++++ dlls/ntoskrnl.exe/tests/ntoskrnl.c | 3 ++ 3 files changed, 95 insertions(+)
diff --git a/dlls/ntoskrnl.exe/tests/driver.h b/dlls/ntoskrnl.exe/tests/driver.h index fd91211e6d0..1dbe2a7d4d2 100644 --- a/dlls/ntoskrnl.exe/tests/driver.h +++ b/dlls/ntoskrnl.exe/tests/driver.h @@ -43,6 +43,7 @@ #define IOCTL_WINETEST_BUS_DISABLE_IFACE CTL_CODE(FILE_DEVICE_BUS_EXTENDER, 0x803, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_WINETEST_BUS_ADD_CHILD CTL_CODE(FILE_DEVICE_BUS_EXTENDER, 0x804, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_WINETEST_BUS_REMOVE_CHILD CTL_CODE(FILE_DEVICE_BUS_EXTENDER, 0x805, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_WINETEST_BUS_SET_PROPERTY CTL_CODE(FILE_DEVICE_BUS_EXTENDER, 0x806, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_WINETEST_CHILD_GET_ID CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_WINETEST_CHILD_MARK_PENDING CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_NEITHER, FILE_ANY_ACCESS) @@ -80,3 +81,21 @@ static const GUID control_class = {0xdeadbeef, 0x29ef, 0x4538, {0xa5, 0xfd, 0xb6
#define SERVER_LISTEN_PORT 9374 #define CLIENT_LISTEN_PORT 9375 + +#define WINETEST_DEFINE_DEVPROPS \ + WINETEST_DRIVER_DEVPROP( 1, DEVPROP_TYPE_BYTE, {.byte = 0xde}, sizeof( BYTE ) ) \ + WINETEST_DRIVER_DEVPROP( 2, DEVPROP_TYPE_INT16, {.int16 = 0xbeef}, sizeof( INT16 ) ) \ + WINETEST_DRIVER_DEVPROP( 3, DEVPROP_TYPE_UINT16, {.uint16 = 0xbeef}, sizeof( UINT16 ) ) \ + WINETEST_DRIVER_DEVPROP( 4, DEVPROP_TYPE_INT32, {.int32 = 0xdeadbeef}, sizeof( INT32 ) ) \ + WINETEST_DRIVER_DEVPROP( 5, DEVPROP_TYPE_UINT32, {.uint32 = 0xdeadbeef}, sizeof( UINT32 ) ) \ + WINETEST_DRIVER_DEVPROP( 6, DEVPROP_TYPE_INT64, {.int64 = 0xdeadbeefdeadbeef}, sizeof( INT64 ) ) \ + WINETEST_DRIVER_DEVPROP( 7, DEVPROP_TYPE_UINT64, {.uint64 = 0xdeadbeefdeadbeef}, sizeof( UINT64 ) ) \ + WINETEST_DRIVER_DEVPROP( 8, DEVPROP_TYPE_GUID, {.guid = control_class}, sizeof( GUID ) ) + +#define WINETEST_DRIVER_DEVPROP( i, typ, val, size ) \ + DEFINE_DEVPROPKEY( DEVPKEY_Winetest_##i, 0xdeadbeef, 0xdead, 0xbeef, 0xde, 0xad, 0xbe, 0xef, \ + 0xde, 0xad, 0xbe, 0xef, ( i ) ); + +WINETEST_DEFINE_DEVPROPS; + +#undef WINETEST_DRIVER_DEVPROP diff --git a/dlls/ntoskrnl.exe/tests/driver_pnp.c b/dlls/ntoskrnl.exe/tests/driver_pnp.c index f66d56de8c7..30751ce9ae3 100644 --- a/dlls/ntoskrnl.exe/tests/driver_pnp.c +++ b/dlls/ntoskrnl.exe/tests/driver_pnp.c @@ -35,6 +35,8 @@
#include "wine/list.h"
+#include "initguid.h" +#include "devpkey.h" #include "driver.h" #include "utils.h"
@@ -610,6 +612,27 @@ static void test_bus_query(void) ObDereferenceObject(top_device); }
+struct winetest_deviceprop +{ + const DEVPROPKEY *key; + DEVPROPTYPE type; + union { + BYTE byte; + INT16 int16; + UINT16 uint16; + INT32 int32; + UINT32 uint32; + INT64 int64; + UINT64 uint64; + GUID guid; + } value; + SIZE_T size; +}; + +#define WINETEST_DRIVER_DEVPROP(i, typ, val, size) {&DEVPKEY_Winetest_##i, (typ), val, (size)}, +static struct winetest_deviceprop deviceprops[] = { WINETEST_DEFINE_DEVPROPS }; +#undef WINETEST_DRIVER_DEVPROP + static NTSTATUS fdo_ioctl(IRP *irp, IO_STACK_LOCATION *stack, ULONG code) { switch (code) @@ -629,6 +652,56 @@ static NTSTATUS fdo_ioctl(IRP *irp, IO_STACK_LOCATION *stack, ULONG code) IoSetDeviceInterfaceState(&bus_symlink, FALSE); return STATUS_SUCCESS;
+ case IOCTL_WINETEST_BUS_SET_PROPERTY: + { + SIZE_T i; + + for (i = 0; i < ARRAY_SIZE( deviceprops ); i++) + { + NTSTATUS status; + SIZE_T size = deviceprops[i].size; + DEVPROPTYPE type = deviceprops[i].type; + const DEVPROPKEY *key = deviceprops[i].key; + void *value = &deviceprops[i].value; + + status = IoSetDevicePropertyData( bus_pdo, key, LOCALE_NEUTRAL, 0, type, size, value ); + ok( status == STATUS_SUCCESS, "Failed to set device property, status %#lx.\n", + status ); + if (status == STATUS_SUCCESS) + { + void *buf; + ULONG req_size; + DEVPROPTYPE stored_type; + + status = IoGetDevicePropertyData( bus_pdo, key, LOCALE_NEUTRAL, 0, 0, NULL, + &req_size, &stored_type ); + ok( status == STATUS_BUFFER_TOO_SMALL, "Expected status %#lx, got %#lx.\n", + STATUS_BUFFER_TOO_SMALL, status ); + ok( req_size == size, "Expected required size %lu, got %lu.\n", req_size, + size ); + ok( stored_type == type, "Expected DEVPROPTYPE value %#lx, got %#lx.\n", type, + stored_type ); + + buf = ExAllocatePool( PagedPool, size ); + ok( buf != NULL, "Failed to allocate buffer.\n" ); + if (buf != NULL) + { + memset( buf, 0, size ); + status = IoGetDevicePropertyData( bus_pdo, key, LOCALE_NEUTRAL, 0, size, + buf, NULL, &stored_type ); + ok( status == STATUS_SUCCESS, + "Failed to get device property, status %#lx.\n", status ); + if (status == STATUS_SUCCESS) + ok( memcmp( buf, value, size ) == 0, + "Got unexpected device property value.\n" ); + ExFreePool( buf ); + } + } + status = IoSetDevicePropertyData( bus_pdo, key, LOCALE_NEUTRAL, 0, type, 0, NULL ); + ok( status == STATUS_SUCCESS, "Failed to delete device property, status %#lx.\n" ); + } + return STATUS_SUCCESS; + } case IOCTL_WINETEST_BUS_ADD_CHILD: { static const LARGE_INTEGER wait_time = {.QuadPart = -500 * 10000}; diff --git a/dlls/ntoskrnl.exe/tests/ntoskrnl.c b/dlls/ntoskrnl.exe/tests/ntoskrnl.c index 48deda7c455..8481cfe4f61 100644 --- a/dlls/ntoskrnl.exe/tests/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/tests/ntoskrnl.c @@ -1567,6 +1567,9 @@ static void test_pnp_devices(void) ok(got_bus_arrival == 1, "got %u bus arrival messages\n", got_bus_arrival); ok(got_bus_removal == 1, "got %u bus removal messages\n", got_bus_removal);
+ ret = DeviceIoControl( bus, IOCTL_WINETEST_BUS_SET_PROPERTY, NULL, 0, NULL, 0, &size, NULL ); + ok(ret, "got error %lu\n", GetLastError()); + set = SetupDiGetClassDevsA(&bus_class, NULL, NULL, DIGCF_DEVICEINTERFACE); ok(set != INVALID_HANDLE_VALUE, "failed to get device list, error %#lx\n", GetLastError()); ret = SetupDiEnumDeviceInterfaces(set, NULL, &bus_class, 0, &iface);
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=147927
Your paranoid android.
=== w7u_2qxl (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w7u_adm (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w7u_el (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w8 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w8adm (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w864 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w1064v1507 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w1064v1809 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w1064_tsign (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w10pro64 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w10pro64_en_AE_u8 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w11pro64 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w7pro64 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w864 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w1064v1507 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w1064v1809 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w1064_2qxl (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w1064_adm (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w1064_tsign (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w10pro64 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w10pro64_ar (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w10pro64_ja (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w10pro64_zh_CN (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w11pro64_amd (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver' does not exist.
=== w7u_2qxl (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w7u_adm (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w7u_el (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w8 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w8adm (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w864 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w1064v1507 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w1064v1809 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w1064_tsign (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w10pro64 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w10pro64_en_AE_u8 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w11pro64 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w7pro64 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w864 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w1064v1507 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w1064v1809 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w1064_2qxl (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w1064_adm (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w1064_tsign (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w10pro64 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w10pro64_ar (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w10pro64_ja (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w10pro64_zh_CN (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w11pro64_amd (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver2' does not exist.
=== w7u_2qxl (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w7u_adm (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w7u_el (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w8 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w8adm (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w864 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w1064v1507 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w1064v1809 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w1064_tsign (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w10pro64 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w10pro64_en_AE_u8 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w11pro64 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w7pro64 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w864 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w1064v1507 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w1064v1809 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w1064_2qxl (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w1064_adm (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w1064_tsign (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w10pro64 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w10pro64_ar (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w10pro64_ja (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w10pro64_zh_CN (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w11pro64_amd (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver3' does not exist.
=== w7u_2qxl (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w7u_adm (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w7u_el (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w8 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w8adm (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w864 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w1064v1507 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w1064v1809 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w1064_tsign (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w10pro64 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w10pro64_en_AE_u8 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w11pro64 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w7pro64 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w864 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w1064v1507 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w1064v1809 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w1064_2qxl (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w1064_adm (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w1064_tsign (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w10pro64 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w10pro64_ar (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w10pro64_ja (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w10pro64_zh_CN (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w11pro64_amd (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_netio' does not exist.
=== w7u_2qxl (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w7u_adm (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w7u_el (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w8 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w8adm (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w864 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w1064v1507 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w1064v1809 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w1064_tsign (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w10pro64 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w10pro64_en_AE_u8 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w11pro64 (32 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w7pro64 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w864 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w1064v1507 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w1064v1809 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w1064_2qxl (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w1064_adm (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w1064_tsign (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w10pro64 (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w10pro64_ar (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w10pro64_ja (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w10pro64_zh_CN (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w11pro64_amd (64 bit report) ===
ntoskrnl.exe: Fatal: test 'driver_pnp' does not exist.
=== w7u_2qxl (32 bit report) ===
ntoskrnl.exe: ntoskrnl.c:1493: Test failed: wrong class {00000000-0000-0000-0000-000000000000} ntoskrnl.c:1501: Test failed: wrong class {00000000-0000-0000-0000-000000000000} ntoskrnl.c:1503: Test failed: got flags 0 ntoskrnl.c:1507: Test failed: failed to get interface path, error 0x57 ntoskrnl.c:1508: Test failed: wrong path "\" ntoskrnl.c:1514: Test failed: got error 3 ntoskrnl.c:1535: Test failed: wrong class {00000000-0000-0000-0000-000000000000} ntoskrnl.c:1558: Test failed: wrong class {00000000-0000-0000-0000-000000000000} ntoskrnl.c:1560: Test failed: got flags 0 ntoskrnl.c:1577: Test failed: wrong class {00000000-0000-0000-0000-000000000000} ntoskrnl.c:1631: Test failed: got type 451484418 ntoskrnl.c:1646: Test failed: got type 451484418 ntoskrnl.c:1647: Test failed: got size 6940496 ntoskrnl.c:1648: Test failed: got hardware IDs "\x05\x00\x00\x00\\x00w\x00\x04\x00\x00\x00e\x00t\x00e\x00s\x00\x04\x00\x00\x00\xc4\xebi\x00\x00\x00\x00\x00R\x00O\x00O\x00T\x00\\x00W\x00I\x00N\x00E\x00T\x00E\x00S\x00T\x00\\x000\x00\x00\x00i\x00n\x00e\x00t\x00e\x00s\x00t\x00.\x00i\x00n\x00f\x00\x00\x00\x00\x00\x00\x00\xcaj=u\xc7\xc0\xc4"... ntoskrnl.c:1654: Test failed: got type 451484418 ntoskrnl.c:1655: Test failed: got size 6940496 ntoskrnl.c:1656: Test failed: got container ID L"" ntoskrnl.c:1661: Test failed: got type 451484418 ntoskrnl.c:1662: Test failed: got size 6940496 ntoskrnl.c:1663: Test failed: got compatible IDs "\x05\x00\x00\x00\\x00w\x00\x04\x00\x00\x00e\x00t\x00e\x00s\x00\x04\x00\x00\x00\xc4\xebi\x00\x00\x00\x00\x00R\x00O\x00O\x00T\x00\\x00W\x00I\x00N\x00E\x00T\x00E\x00S\x00T\x00\\x000\x00\x00\x00i\x00n\x00e\x00t\x00e\x00s\x00t\x00.\x00i\x00n\x00f\x00\x00\x00\x00\x00\x00\x00\xcaj=u\xc7\xc0\xc4"... ntoskrnl.c:1676: Test failed: wrong class {00000000-0000-0000-0000-000000000000} ntoskrnl.c:1678: Test failed: got flags 0 ntoskrnl.c:1682: Test failed: failed to get interface path, error 0x57 ntoskrnl.c:1683: Test failed: wrong path "\" ntoskrnl.c:1697: Test failed: got size 6940496 ntoskrnl.c:1707: Test failed: got size 6940496 ntoskrnl.c:1726: Test failed: got size 6940496 ntoskrnl.c:1846: Test failed: failed to get device list, error 0xd
=== w7u_el (32 bit report) ===
ntoskrnl.exe: ntoskrnl.c:1493: Test failed: wrong class {00000000-0000-0000-0000-000000000000} ntoskrnl.c:1501: Test failed: wrong class {00000000-0000-0000-0000-000000000000} ntoskrnl.c:1503: Test failed: got flags 0 ntoskrnl.c:1507: Test failed: failed to get interface path, error 0x57 ntoskrnl.c:1508: Test failed: wrong path "\" ntoskrnl.c:1514: Test failed: got error 3 ntoskrnl.c:1535: Test failed: wrong class {00000000-0000-0000-0000-000000000000} ntoskrnl.c:1558: Test failed: wrong class {00000000-0000-0000-0000-000000000000} ntoskrnl.c:1560: Test failed: got flags 0 ntoskrnl.c:1577: Test failed: wrong class {00000000-0000-0000-0000-000000000000} ntoskrnl.c:1631: Test failed: got type 1923122355 ntoskrnl.c:1646: Test failed: got type 1923122355 ntoskrnl.c:1647: Test failed: got size 2943732 ntoskrnl.c:1648: Test failed: got hardware IDs "\x05\x00\x00\x00\\x00w\x00\x04\x00\x00\x00e\x00t\x00e\x00s\x00\x04\x00\x00\x00h\xef,\x00\x00\x00\x00\x00R\x00O\x00O\x00T\x00\\x00W\x00I\x00N\x00E\x00T\x00E\x00S\x00T\x00\\x000\x00\x00\x00i\x00n\x00e\x00t\x00e\x00s\x00t\x00.\x00i\x00n\x00f\x00\x00\x00\x00\x00\x00\x00\xcaj\x0eu\x15B\xc0r\x02"... ntoskrnl.c:1654: Test failed: got type 1923122355 ntoskrnl.c:1655: Test failed: got size 2943732 ntoskrnl.c:1656: Test failed: got container ID L"" ntoskrnl.c:1661: Test failed: got type 1923122355 ntoskrnl.c:1662: Test failed: got size 2943732 ntoskrnl.c:1663: Test failed: got compatible IDs "\x05\x00\x00\x00\\x00w\x00\x04\x00\x00\x00e\x00t\x00e\x00s\x00\x04\x00\x00\x00h\xef,\x00\x00\x00\x00\x00R\x00O\x00O\x00T\x00\\x00W\x00I\x00N\x00E\x00T\x00E\x00S\x00T\x00\\x000\x00\x00\x00i\x00n\x00e\x00t\x00e\x00s\x00t\x00.\x00i\x00n\x00f\x00\x00\x00\x00\x00\x00\x00\xcaj\x0eu\x15B\xc0r\x02"... ntoskrnl.c:1676: Test failed: wrong class {00000000-0000-0000-0000-000000000000} ntoskrnl.c:1678: Test failed: got flags 0 ntoskrnl.c:1682: Test failed: failed to get interface path, error 0x57 ntoskrnl.c:1683: Test failed: wrong path "\" ntoskrnl.c:1697: Test failed: got size 2943732 ntoskrnl.c:1707: Test failed: got size 2943732 ntoskrnl.c:1726: Test failed: got size 2943732 ntoskrnl.c:1846: Test failed: failed to get device list, error 0xd
=== w8 (testbot log) ===
WineRunTask.pl:error: An error occurred while waiting for the test to complete: the 2992 process does not exist or is not a child process WineRunTask.pl:error: The test VM has crashed, rebooted or lost connectivity (or the TestAgent server died)
=== w1064_tsign (64 bit report) ===
Report validation errors: The report seems to have been truncated
=== w1064_tsign (testbot log) ===
WineRunTask.pl:error: An error occurred while waiting for the test to complete: the 7784 process does not exist or is not a child process WineRunTask.pl:error: The test VM has crashed, rebooted or lost connectivity (or the TestAgent server died)
I have also added a new test IOCTL to `dlls/ntoskrnl.exe/tests/driver_pnp.c` for setting and getting basic test properties using `Io{Set|Get}PropertyData`. While the two functions use the corresponding `setupapi.dll` methods which already have tests, I figured testing the driver APIs additionally shouldn't hurt.