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