From: Connor McAdams <cmcadams@codeweavers.com> Signed-off-by: Connor McAdams <cmcadams@codeweavers.com> --- dlls/ntoskrnl.exe/pnp.c | 18 ++++++++++++++++++ dlls/ntoskrnl.exe/tests/driver_pnp.c | 4 ++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/dlls/ntoskrnl.exe/pnp.c b/dlls/ntoskrnl.exe/pnp.c index 316d21ef8e4..c2de691d982 100644 --- a/dlls/ntoskrnl.exe/pnp.c +++ b/dlls/ntoskrnl.exe/pnp.c @@ -669,6 +669,9 @@ NTSTATUS WINAPI IoGetDevicePropertyData( DEVICE_OBJECT *device, const DEVPROPKEY device, debugstr_propkey( property_key ), lcid, flags, size, data, required_size, property_type ); + if (!(device->Flags & DO_BUS_ENUMERATED_DEVICE)) + ERR( "Passed in non-PDO device, this would crash on native.\n" ); + if (lcid == LOCALE_SYSTEM_DEFAULT || lcid == LOCALE_USER_DEFAULT) return STATUS_INVALID_PARAMETER; if (lcid != LOCALE_NEUTRAL) FIXME( "Only LOCALE_NEUTRAL is supported\n" ); @@ -717,6 +720,12 @@ NTSTATUS WINAPI IoGetDeviceProperty( DEVICE_OBJECT *device, DEVICE_REGISTRY_PROP TRACE("device %p, property %u, length %lu, buffer %p, needed %p.\n", device, property, length, buffer, needed); + if (!(device->Flags & DO_BUS_ENUMERATED_DEVICE)) + { + WARN( "Passed in non-PDO device.\n" ); + return STATUS_INVALID_DEVICE_REQUEST; + } + switch (property) { case DevicePropertyEnumeratorName: @@ -1164,6 +1173,9 @@ NTSTATUS WINAPI IoSetDevicePropertyData( DEVICE_OBJECT *device, const DEVPROPKEY if (lcid != LOCALE_NEUTRAL) FIXME( "only LOCALE_NEUTRAL is supported\n" ); + if (!(device->Flags & DO_BUS_ENUMERATED_DEVICE)) + ERR( "Passed in non-PDO device, this would crash on native.\n" ); + if ((status = get_device_instance_id( device, device_instance_id ))) return status; if ((set = SetupDiCreateDeviceInfoList( &GUID_NULL, NULL )) == INVALID_HANDLE_VALUE) @@ -1344,6 +1356,12 @@ NTSTATUS WINAPI IoOpenDeviceRegistryKey( DEVICE_OBJECT *device, ULONG type, ACCE TRACE("device %p, type %#lx, access %#lx, key %p.\n", device, type, access, key); + if (!(device->Flags & DO_BUS_ENUMERATED_DEVICE)) + { + WARN( "Passed in non-PDO device.\n" ); + return STATUS_INVALID_PARAMETER; + } + if ((status = get_device_instance_id( device, device_instance_id ))) { ERR("Failed to get device instance ID, error %#lx.\n", status); diff --git a/dlls/ntoskrnl.exe/tests/driver_pnp.c b/dlls/ntoskrnl.exe/tests/driver_pnp.c index e3019944604..70295bdc09b 100644 --- a/dlls/ntoskrnl.exe/tests/driver_pnp.c +++ b/dlls/ntoskrnl.exe/tests/driver_pnp.c @@ -854,7 +854,7 @@ static void test_enumerator_name(void) NTSTATUS status; status = IoGetDeviceProperty(bus_fdo, DevicePropertyEnumeratorName, sizeof(buffer), buffer, &req_size); - todo_wine ok(status == STATUS_INVALID_DEVICE_REQUEST, "got unexpected status %#lx\n", status); + ok(status == STATUS_INVALID_DEVICE_REQUEST, "got unexpected status %#lx\n", status); ok(!(bus_fdo->Flags & DO_BUS_ENUMERATED_DEVICE), "Unexpected bus_fdo flags %#lx.\n", bus_fdo->Flags); req_size = 0; @@ -895,7 +895,7 @@ static void test_device_registry_key(void) DWORD size; status = IoOpenDeviceRegistryKey(bus_fdo, PLUGPLAY_REGKEY_DEVICE, KEY_ALL_ACCESS, &hkey); - todo_wine ok(status == STATUS_INVALID_PARAMETER, "got unexpected status %#lx\n", status); + ok(status == STATUS_INVALID_PARAMETER, "got unexpected status %#lx\n", status); ok(!(bus_fdo->Flags & DO_BUS_ENUMERATED_DEVICE), "Unexpected bus_fdo flags %#lx.\n", bus_fdo->Flags); status = IoOpenDeviceRegistryKey(bus_pdo, PLUGPLAY_REGKEY_DEVICE, KEY_ALL_ACCESS, &hkey); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/11263