Zebediah Figura : ntoskrnl.exe: Implement many more properties in IoGetDeviceProperty().
Alexandre Julliard
julliard at winehq.org
Wed Nov 6 16:54:28 CST 2019
Module: wine
Branch: master
Commit: c4ec69adceb6ea60d91d3f723d3a2ad959fb0761
URL: https://source.winehq.org/git/wine.git/?a=commit;h=c4ec69adceb6ea60d91d3f723d3a2ad959fb0761
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Wed Nov 6 00:13:14 2019 -0600
ntoskrnl.exe: Implement many more properties in IoGetDeviceProperty().
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntoskrnl.exe/pnp.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 78 insertions(+), 3 deletions(-)
diff --git a/dlls/ntoskrnl.exe/pnp.c b/dlls/ntoskrnl.exe/pnp.c
index 17d61a096a..5b5acd2b34 100644
--- a/dlls/ntoskrnl.exe/pnp.c
+++ b/dlls/ntoskrnl.exe/pnp.c
@@ -402,7 +402,12 @@ void WINAPI IoInvalidateDeviceRelations( DEVICE_OBJECT *device_object, DEVICE_RE
NTSTATUS WINAPI IoGetDeviceProperty( DEVICE_OBJECT *device, DEVICE_REGISTRY_PROPERTY property,
ULONG length, void *buffer, ULONG *needed )
{
- NTSTATUS status = STATUS_NOT_IMPLEMENTED;
+ SP_DEVINFO_DATA sp_device = {sizeof(sp_device)};
+ WCHAR device_instance_id[MAX_DEVICE_ID_LEN];
+ DWORD sp_property = -1;
+ NTSTATUS status;
+ HDEVINFO set;
+
TRACE("device %p, property %u, length %u, buffer %p, needed %p.\n",
device, property, length, buffer, needed);
@@ -430,7 +435,7 @@ NTSTATUS WINAPI IoGetDeviceProperty( DEVICE_OBJECT *device, DEVICE_REGISTRY_PROP
status = STATUS_BUFFER_TOO_SMALL;
ExFreePool( id );
- break;
+ return status;
}
case DevicePropertyPhysicalDeviceObjectName:
{
@@ -465,11 +470,81 @@ NTSTATUS WINAPI IoGetDeviceProperty( DEVICE_OBJECT *device, DEVICE_REGISTRY_PROP
*needed = 0;
}
HeapFree(GetProcessHeap(), 0, name);
- break;
+ return status;
}
+ case DevicePropertyDeviceDescription:
+ sp_property = SPDRP_DEVICEDESC;
+ break;
+ case DevicePropertyHardwareID:
+ sp_property = SPDRP_HARDWAREID;
+ break;
+ case DevicePropertyCompatibleIDs:
+ sp_property = SPDRP_COMPATIBLEIDS;
+ break;
+ case DevicePropertyClassName:
+ sp_property = SPDRP_CLASS;
+ break;
+ case DevicePropertyClassGuid:
+ sp_property = SPDRP_CLASSGUID;
+ break;
+ case DevicePropertyManufacturer:
+ sp_property = SPDRP_MFG;
+ break;
+ case DevicePropertyFriendlyName:
+ sp_property = SPDRP_FRIENDLYNAME;
+ break;
+ case DevicePropertyLocationInformation:
+ sp_property = SPDRP_LOCATION_INFORMATION;
+ break;
+ case DevicePropertyBusTypeGuid:
+ sp_property = SPDRP_BUSTYPEGUID;
+ break;
+ case DevicePropertyLegacyBusType:
+ sp_property = SPDRP_LEGACYBUSTYPE;
+ break;
+ case DevicePropertyBusNumber:
+ sp_property = SPDRP_BUSNUMBER;
+ break;
+ case DevicePropertyAddress:
+ sp_property = SPDRP_ADDRESS;
+ break;
+ case DevicePropertyUINumber:
+ sp_property = SPDRP_UI_NUMBER;
+ break;
+ case DevicePropertyInstallState:
+ sp_property = SPDRP_INSTALL_STATE;
+ break;
+ case DevicePropertyRemovalPolicy:
+ sp_property = SPDRP_REMOVAL_POLICY;
+ break;
default:
FIXME("Unhandled property %u.\n", property);
+ return STATUS_NOT_IMPLEMENTED;
+ }
+
+ if ((status = get_device_instance_id( device, device_instance_id )))
+ return status;
+
+ if ((set = SetupDiCreateDeviceInfoList( &GUID_NULL, NULL )) == INVALID_HANDLE_VALUE)
+ {
+ ERR("Failed to create device list, error %#x.\n", GetLastError());
+ return GetLastError();
}
+
+ if (!SetupDiOpenDeviceInfoW( set, device_instance_id, NULL, 0, &sp_device))
+ {
+ ERR("Failed to open device, error %#x.\n", GetLastError());
+ SetupDiDestroyDeviceInfoList( set );
+ return GetLastError();
+ }
+
+ if (SetupDiGetDeviceRegistryPropertyW( set, &sp_device, sp_property, NULL, buffer, length, needed ))
+ status = STATUS_SUCCESS;
+ else
+ status = GetLastError();
+
+ SetupDiDestroyDeviceInfoList( set );
+
return status;
}
More information about the wine-cvs
mailing list