diff --git a/rostests/kmtests/CMakeLists.txt b/rostests/kmtests/CMakeLists.txt index 0abd9fba8da..828a290c960 100644 --- a/rostests/kmtests/CMakeLists.txt +++ b/rostests/kmtests/CMakeLists.txt @@ -22,6 +22,7 @@ list(APPEND COMMON_SOURCE # kmtest_drv.sys driver # list(APPEND KMTEST_DRV_SOURCE + kmtest_drv/guid.c kmtest_drv/kmtest_drv.c kmtest_drv/testlist.c diff --git a/rostests/kmtests/kmtest_drv/guid.c b/rostests/kmtests/kmtest_drv/guid.c new file mode 100644 index 00000000000..f6ebc0c574d --- /dev/null +++ b/rostests/kmtests/kmtest_drv/guid.c @@ -0,0 +1,7 @@ +/* DO NOT USE THE PRECOMPILED HEADER FOR THIS FILE! */ + +#include +#include +#include + +/* NO CODE HERE, THIS IS JUST REQUIRED FOR THE GUID DEFINITIONS */ diff --git a/rostests/kmtests/ntos_io/IoDeviceInterface.c b/rostests/kmtests/ntos_io/IoDeviceInterface.c index 98edc8f682e..d6181cdf37e 100644 --- a/rostests/kmtests/ntos_io/IoDeviceInterface.c +++ b/rostests/kmtests/ntos_io/IoDeviceInterface.c @@ -8,6 +8,7 @@ /* TODO: what's with the prototypes at the top, what's with the if-ed out part? Doesn't process most results */ #include +#include #define NDEBUG #include @@ -85,7 +86,9 @@ static VOID DeviceInterfaceTest_Func() ExFreePool(SymbolicLinkList); } -START_TEST(IoDeviceInterface) +static +VOID +Test_IoRegisterDeviceInterface(VOID) { GUID Guid = {0x378de44c, 0x56ef, 0x11d1, {0xbc, 0x8c, 0x00, 0xa0, 0xc9, 0x14, 0x05, 0xdd}}; DEVICE_OBJECT DeviceObject; @@ -118,3 +121,69 @@ START_TEST(IoDeviceInterface) DeviceInterfaceTest_Func(); } + +static UCHAR NotificationContext; + +static DRIVER_NOTIFICATION_CALLBACK_ROUTINE NotificationCallback; +static +NTSTATUS +NTAPI +NotificationCallback( + _In_ PVOID NotificationStructure, + _Inout_opt_ PVOID Context) +{ + PDEVICE_INTERFACE_CHANGE_NOTIFICATION Notification = NotificationStructure; + NTSTATUS Status; + OBJECT_ATTRIBUTES ObjectAttributes; + HANDLE Handle; + + ok_irql(PASSIVE_LEVEL); + ok_eq_pointer(Context, &NotificationContext); + ok_eq_uint(Notification->Version, 1); + ok_eq_uint(Notification->Size, sizeof(*Notification)); + + /* symbolic link must exist */ + trace("Interface change: %wZ\n", Notification->SymbolicLinkName); + InitializeObjectAttributes(&ObjectAttributes, + Notification->SymbolicLinkName, + OBJ_KERNEL_HANDLE, + NULL, + NULL); + Status = ZwOpenSymbolicLinkObject(&Handle, GENERIC_READ, &ObjectAttributes); + ok_eq_hex(Status, STATUS_SUCCESS); + if (!skip(NT_SUCCESS(Status), "No symbolic link\n")) + { + Status = ObCloseHandle(Handle, KernelMode); + ok_eq_hex(Status, STATUS_SUCCESS); + } + return STATUS_SUCCESS; +} + +static +VOID +Test_IoRegisterPlugPlayNotification(VOID) +{ + NTSTATUS Status; + PVOID NotificationEntry; + + Status = IoRegisterPlugPlayNotification(EventCategoryDeviceInterfaceChange, + PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES, + (PVOID)&GUID_DEVICE_SYS_BUTTON, + KmtDriverObject, + NotificationCallback, + &NotificationContext, + &NotificationEntry); + ok_eq_hex(Status, STATUS_SUCCESS); + if (!skip(NT_SUCCESS(Status), "PlugPlayNotification not registered\n")) + { + Status = IoUnregisterPlugPlayNotification(NotificationEntry); + ok_eq_hex(Status, STATUS_SUCCESS); + } +} + +START_TEST(IoDeviceInterface) +{ + // FIXME: This test crashes in Windows + (void)Test_IoRegisterDeviceInterface; + Test_IoRegisterPlugPlayNotification(); +} \ No newline at end of file