Aric Stewart : ntoskrnl.exe: Implement IoGetDeviceProperty for DevicePropertyPhysicalDeviceObjectName.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Feb 9 10:46:51 CST 2016
Module: wine
Branch: master
Commit: 5dc8dc829af667ab266c6150b9d43b18f991498e
URL: http://source.winehq.org/git/wine.git/?a=commit;h=5dc8dc829af667ab266c6150b9d43b18f991498e
Author: Aric Stewart <aric at codeweavers.com>
Date: Fri Jan 29 09:44:36 2016 -0600
ntoskrnl.exe: Implement IoGetDeviceProperty for DevicePropertyPhysicalDeviceObjectName.
Signed-off-by: Aric Stewart <aric at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ntoskrnl.exe/ntoskrnl.c | 39 +++++++++++++++++++++++++++++++++++++--
1 file changed, 37 insertions(+), 2 deletions(-)
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index 04f0198..7e043be 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -1040,9 +1040,44 @@ PDEVICE_OBJECT WINAPI IoGetAttachedDevice( PDEVICE_OBJECT device )
NTSTATUS WINAPI IoGetDeviceProperty( DEVICE_OBJECT *device, DEVICE_REGISTRY_PROPERTY device_property,
ULONG buffer_length, PVOID property_buffer, PULONG result_length )
{
- FIXME( "%p %d %u %p %p: stub\n", device, device_property, buffer_length,
+ NTSTATUS status = STATUS_NOT_IMPLEMENTED;
+ TRACE( "%p %d %u %p %p\n", device, device_property, buffer_length,
property_buffer, result_length );
- return STATUS_NOT_IMPLEMENTED;
+ switch (device_property)
+ {
+ case DevicePropertyPhysicalDeviceObjectName:
+ {
+ ULONG used_len, len = buffer_length + sizeof(OBJECT_NAME_INFORMATION);
+ OBJECT_NAME_INFORMATION *name = HeapAlloc(GetProcessHeap(), 0, len);
+
+ status = NtQueryObject(device->Reserved, ObjectNameInformation, name, len, &used_len);
+ if (status == STATUS_SUCCESS)
+ {
+ /* Ensure room for NULL termination */
+ if (buffer_length >= name->Name.MaximumLength)
+ memcpy(property_buffer, name->Name.Buffer, name->Name.MaximumLength);
+ else
+ status = STATUS_BUFFER_TOO_SMALL;
+ *result_length = name->Name.MaximumLength;
+ }
+ else
+ {
+ if (status == STATUS_INFO_LENGTH_MISMATCH ||
+ status == STATUS_BUFFER_OVERFLOW)
+ {
+ status = STATUS_BUFFER_TOO_SMALL;
+ *result_length = used_len - sizeof(OBJECT_NAME_INFORMATION);
+ }
+ else
+ *result_length = 0;
+ }
+ HeapFree(GetProcessHeap(), 0, name);
+ break;
+ }
+ default:
+ FIXME("unhandled property %d\n", device_property);
+ }
+ return status;
}
More information about the wine-cvs
mailing list