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