ntoskrnl.exe: Implement IoGetAttachedDevice and IoGetAttachedDeviceReference. (v2)

Sebastian Lackner sebastian at fds-team.de
Wed Sep 7 04:21:22 CDT 2016


From: Aric Stewart <aric at codeweavers.com>

Signed-off-by: Aric Stewart <aric at codeweavers.com>
Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
---

Changes in v2:
* Call ObReferenceObject in IoGetAttachedDeviceReference. So far its a NOOP,
  but otherwise its easy to forget. When the definition for ObReferenceObject
  is later added to the header files (on Windows its just a forward to the
  fastcall version) we can #undef it in ntoskrnl. For some reason, only the
  Dereference function has a public stdcall version.

 dlls/ntoskrnl.exe/ntoskrnl.c        |   31 +++++++++++++++++++++++++++----
 dlls/ntoskrnl.exe/ntoskrnl.exe.spec |    2 +-
 2 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index b671e81..91e08d9 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -1105,13 +1105,19 @@ NTSTATUS  WINAPI IoGetDeviceObjectPointer( UNICODE_STRING *name, ACCESS_MASK acc
 /***********************************************************************
  *           IoGetAttachedDevice   (NTOSKRNL.EXE.@)
  */
-PDEVICE_OBJECT WINAPI IoGetAttachedDevice( PDEVICE_OBJECT device )
+DEVICE_OBJECT* WINAPI IoGetAttachedDevice( DEVICE_OBJECT *device )
 {
-    FIXME( "stub: %p\n", device );
+    DEVICE_OBJECT *result = device;
 
-    return device;
+    TRACE( "(%p)\n", device );
+
+    while (result->AttachedDevice)
+        result = result->AttachedDevice;
+
+    return result;
 }
 
+
 /***********************************************************************
  *           IoGetDeviceProperty   (NTOSKRNL.EXE.@)
  */
@@ -2121,6 +2127,12 @@ NTSTATUS WINAPI ObReferenceObjectByName( UNICODE_STRING *ObjectName,
 }
 
 
+static void ObReferenceObject( void *obj )
+{
+    TRACE( "(%p): stub\n", obj );
+}
+
+
 /***********************************************************************
  *           ObDereferenceObject   (NTOSKRNL.EXE.@)
  */
@@ -2140,7 +2152,7 @@ void WINAPI __regs_ObfReferenceObject( void *obj )
 void WINAPI ObfReferenceObject( void *obj )
 #endif
 {
-    FIXME( "(%p): stub\n", obj );
+    ObReferenceObject( obj );
 }
 
 
@@ -2159,6 +2171,17 @@ void WINAPI ObfDereferenceObject( void *obj )
 
 
 /***********************************************************************
+ *           IoGetAttachedDeviceReference   (NTOSKRNL.EXE.@)
+ */
+DEVICE_OBJECT* WINAPI IoGetAttachedDeviceReference( DEVICE_OBJECT *device )
+{
+    DEVICE_OBJECT *result = IoGetAttachedDevice( device );
+    ObReferenceObject( result );
+    return result;
+}
+
+
+/***********************************************************************
  *           PsCreateSystemThread   (NTOSKRNL.EXE.@)
  */
 NTSTATUS WINAPI PsCreateSystemThread(PHANDLE ThreadHandle, ULONG DesiredAccess,
diff --git a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
index c94b902..c1b5749 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
+++ b/dlls/ntoskrnl.exe/ntoskrnl.exe.spec
@@ -374,7 +374,7 @@
 @ stdcall IoFreeMdl(ptr)
 @ stub IoFreeWorkItem
 @ stdcall IoGetAttachedDevice(ptr)
-@ stub IoGetAttachedDeviceReference
+@ stdcall IoGetAttachedDeviceReference(ptr)
 @ stub IoGetBaseFileSystemDeviceObject
 @ stub IoGetBootDiskInformation
 @ stdcall IoGetConfigurationInformation()
-- 
2.9.0



More information about the wine-patches mailing list