From: Vibhav Pant vibhavp@gmail.com
--- dlls/ntoskrnl.exe/tests/driver.h | 20 ++++++++ dlls/ntoskrnl.exe/tests/driver_pnp.c | 77 ++++++++++++++++++++++++++++ dlls/ntoskrnl.exe/tests/ntoskrnl.c | 3 ++ 3 files changed, 100 insertions(+)
diff --git a/dlls/ntoskrnl.exe/tests/driver.h b/dlls/ntoskrnl.exe/tests/driver.h index fd91211e6d0..7d3a196070d 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,22 @@ 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 ) ) + +#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; +DEFINE_DEVPROPKEY( DEVPKEY_Winetest_8, 0xdeadbeef, 0xdead, 0xbeef, 0xde, 0xad, 0xbe, 0xef, 0xde, + 0xad, 0xbe, 0xef, 8 ); /* DEVPROP_TYPE_GUID */ + +#undef WINETEST_DRIVER_DEVPROP diff --git a/dlls/ntoskrnl.exe/tests/driver_pnp.c b/dlls/ntoskrnl.exe/tests/driver_pnp.c index f66d56de8c7..cc7b4f470b5 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,31 @@ 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 + {&DEVPKEY_Winetest_8, DEVPROP_TYPE_GUID, + {.guid = {0xdeadbeef, 0xdead, 0xbeef, {0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef}}}, sizeof(GUID)} +}; +#undef WINETEST_DRIVER_DEVPROP + static NTSTATUS fdo_ioctl(IRP *irp, IO_STACK_LOCATION *stack, ULONG code) { switch (code) @@ -629,6 +656,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; + ULONG 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", status ); + } + 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);