From: Connor McAdams <cmcadams@codeweavers.com> Signed-off-by: Connor McAdams <cmcadams@codeweavers.com> --- dlls/ntoskrnl.exe/ntoskrnl.c | 5 ++++ dlls/ntoskrnl.exe/ntoskrnl_private.h | 1 + dlls/ntoskrnl.exe/tests/driver.c | 36 ++++++++++------------------ 3 files changed, 19 insertions(+), 23 deletions(-) diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c index bf6554debe1..b2078e51b8b 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl.c +++ b/dlls/ntoskrnl.exe/ntoskrnl.c @@ -1355,6 +1355,8 @@ DEVICE_OBJECT* WINAPI IoGetAttachedDevice( DEVICE_OBJECT *device ) void WINAPI IoDetachDevice( DEVICE_OBJECT *device ) { + if (device->AttachedDevice) + device->AttachedDevice->DeviceObjectExtension->AttachedTo = NULL; device->AttachedDevice = NULL; } @@ -1367,6 +1369,7 @@ PDEVICE_OBJECT WINAPI IoAttachDeviceToDeviceStack( DEVICE_OBJECT *source, TRACE( "%p, %p\n", source, target ); target = IoGetAttachedDevice( target ); target->AttachedDevice = source; + source->DeviceObjectExtension->AttachedTo = target; source->StackSize = target->StackSize + 1; return target; } @@ -1679,6 +1682,8 @@ NTSTATUS WINAPI IoCreateDevice( DRIVER_OBJECT *driver, ULONG ext_size, device->DeviceExtension = wine_device + 1; device->DeviceType = type; device->StackSize = 1; + device->DeviceObjectExtension = &wine_device->devobj_ext; + device->DeviceObjectExtension->DeviceObject = device; if (characteristics & FILE_AUTOGENERATED_DEVICE_NAME) { diff --git a/dlls/ntoskrnl.exe/ntoskrnl_private.h b/dlls/ntoskrnl.exe/ntoskrnl_private.h index 5f3fa69ecf3..760ceb24751 100644 --- a/dlls/ntoskrnl.exe/ntoskrnl_private.h +++ b/dlls/ntoskrnl.exe/ntoskrnl_private.h @@ -119,6 +119,7 @@ static const WCHAR servicesW[] = {'\\','R','e','g','i','s','t','r','y', struct wine_device { DEVICE_OBJECT device_obj; + DEVOBJ_EXTENSION devobj_ext; DEVICE_RELATIONS *children; HKEY dyn_data_key; }; diff --git a/dlls/ntoskrnl.exe/tests/driver.c b/dlls/ntoskrnl.exe/tests/driver.c index 882af32eaa7..6cf88cdf203 100644 --- a/dlls/ntoskrnl.exe/tests/driver.c +++ b/dlls/ntoskrnl.exe/tests/driver.c @@ -1861,24 +1861,21 @@ static void test_IoAttachDeviceToDeviceStack(void) status = IoCreateDevice(driver_obj, 0, NULL, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &dev1); ok(status == STATUS_SUCCESS, "IoCreateDevice failed\n"); - todo_wine ok(!!dev1->DeviceObjectExtension, "Got NULL DeviceObjectExtension.\n"); + ok(!!dev1->DeviceObjectExtension, "Got NULL DeviceObjectExtension.\n"); ext1 = dev1->DeviceObjectExtension; status = IoCreateDevice(driver_obj, 0, NULL, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &dev2); ok(status == STATUS_SUCCESS, "IoCreateDevice failed\n"); - todo_wine ok(!!dev2->DeviceObjectExtension, "Got NULL DeviceObjectExtension.\n"); + ok(!!dev2->DeviceObjectExtension, "Got NULL DeviceObjectExtension.\n"); ext2 = dev2->DeviceObjectExtension; status = IoCreateDevice(driver_obj, 0, NULL, FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &dev3); ok(status == STATUS_SUCCESS, "IoCreateDevice failed\n"); - todo_wine ok(!!dev3->DeviceObjectExtension, "Got NULL DeviceObjectExtension.\n"); + ok(!!dev3->DeviceObjectExtension, "Got NULL DeviceObjectExtension.\n"); ext3 = dev3->DeviceObjectExtension; - if (ext1) - { - ok(!ext1->AttachedTo, "Unexpected AttachedTo %p.\n", ext1->AttachedTo); - ok(!ext2->AttachedTo, "Unexpected AttachedTo %p.\n", ext2->AttachedTo); - ok(!ext3->AttachedTo, "Unexpected AttachedTo %p.\n", ext3->AttachedTo); - } + ok(!ext1->AttachedTo, "Unexpected AttachedTo %p.\n", ext1->AttachedTo); + ok(!ext2->AttachedTo, "Unexpected AttachedTo %p.\n", ext2->AttachedTo); + ok(!ext3->AttachedTo, "Unexpected AttachedTo %p.\n", ext3->AttachedTo); /* TODO: initialize devices properly */ dev1->Flags &= ~DO_DEVICE_INITIALIZING; @@ -1888,11 +1885,9 @@ static void test_IoAttachDeviceToDeviceStack(void) ok(ret == dev1, "IoAttachDeviceToDeviceStack returned %p, expected %p\n", ret, dev1); ok(dev1->AttachedDevice == dev2, "dev1->AttachedDevice = %p, expected %p\n", dev1->AttachedDevice, dev2); - if (ext1) - ok(!ext1->AttachedTo, "Unexpected AttachedTo %p.\n", ext1->AttachedTo); + ok(!ext1->AttachedTo, "Unexpected AttachedTo %p.\n", ext1->AttachedTo); ok(!dev2->AttachedDevice, "dev2->AttachedDevice = %p\n", dev2->AttachedDevice); - if (ext2) - ok(ext2->AttachedTo == dev1, "Unexpected AttachedTo %p.\n", ext2->AttachedTo); + ok(ext2->AttachedTo == dev1, "Unexpected AttachedTo %p.\n", ext2->AttachedTo); ok(dev1->StackSize == 1, "dev1->StackSize = %d\n", dev1->StackSize); ok(dev2->StackSize == 2, "dev2->StackSize = %d\n", dev2->StackSize); @@ -1900,15 +1895,12 @@ static void test_IoAttachDeviceToDeviceStack(void) ok(ret == dev2, "IoAttachDeviceToDeviceStack returned %p, expected %p\n", ret, dev2); ok(dev1->AttachedDevice == dev2, "dev1->AttachedDevice = %p, expected %p\n", dev1->AttachedDevice, dev2); - if (ext1) - ok(!ext1->AttachedTo, "Unexpected AttachedTo %p.\n", ext1->AttachedTo); + ok(!ext1->AttachedTo, "Unexpected AttachedTo %p.\n", ext1->AttachedTo); ok(dev2->AttachedDevice == dev3, "dev2->AttachedDevice = %p, expected %p\n", dev2->AttachedDevice, dev3); - if (ext2) - ok(ext2->AttachedTo == dev1, "Unexpected AttachedTo %p.\n", ext2->AttachedTo); + ok(ext2->AttachedTo == dev1, "Unexpected AttachedTo %p.\n", ext2->AttachedTo); ok(!dev3->AttachedDevice, "dev3->AttachedDevice = %p\n", dev3->AttachedDevice); - if (ext3) - ok(ext3->AttachedTo == dev2, "Unexpected AttachedTo %p.\n", ext3->AttachedTo); + ok(ext3->AttachedTo == dev2, "Unexpected AttachedTo %p.\n", ext3->AttachedTo); ok(dev1->StackSize == 1, "dev1->StackSize = %d\n", dev1->StackSize); ok(dev2->StackSize == 2, "dev2->StackSize = %d\n", dev2->StackSize); ok(dev3->StackSize == 3, "dev3->StackSize = %d\n", dev3->StackSize); @@ -1916,13 +1908,11 @@ static void test_IoAttachDeviceToDeviceStack(void) IoDetachDevice(dev1); ok(!dev1->AttachedDevice, "dev1->AttachedDevice = %p\n", dev1->AttachedDevice); ok(dev2->AttachedDevice == dev3, "dev2->AttachedDevice = %p\n", dev2->AttachedDevice); - if (ext2) - ok(!ext2->AttachedTo, "Unexpected AttachedTo %p.\n", ext2->AttachedTo); + ok(!ext2->AttachedTo, "Unexpected AttachedTo %p.\n", ext2->AttachedTo); IoDetachDevice(dev2); ok(!dev2->AttachedDevice, "dev2->AttachedDevice = %p\n", dev2->AttachedDevice); - if (ext3) - ok(!ext3->AttachedTo, "Unexpected AttachedTo %p.\n", ext3->AttachedTo); + ok(!ext3->AttachedTo, "Unexpected AttachedTo %p.\n", ext3->AttachedTo); ok(dev1->StackSize == 1, "dev1->StackSize = %d\n", dev1->StackSize); ok(dev2->StackSize == 2, "dev2->StackSize = %d\n", dev2->StackSize); ok(dev3->StackSize == 3, "dev3->StackSize = %d\n", dev3->StackSize); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11263