Jacek Caban : ntoskrnl.exe: Implement ObReferenceObject and ObDereferenceObject.

Alexandre Julliard julliard at winehq.org
Tue Feb 26 15:13:56 CST 2019


Module: wine
Branch: master
Commit: 855314449be7f7bfb22b7b049e4c0fab212dd3b4
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=855314449be7f7bfb22b7b049e4c0fab212dd3b4

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Feb 26 13:39:51 2019 +0100

ntoskrnl.exe: Implement ObReferenceObject and ObDereferenceObject.

NULL checks are meant to prevent regressions in applications trying to
reference NULL objects returned from stubs.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ntoskrnl.exe/ntoskrnl.c | 64 +++++++++++++++++++++++++-------------------
 1 file changed, 37 insertions(+), 27 deletions(-)

diff --git a/dlls/ntoskrnl.exe/ntoskrnl.c b/dlls/ntoskrnl.exe/ntoskrnl.c
index 66ad3e3..1a8a433 100644
--- a/dlls/ntoskrnl.exe/ntoskrnl.c
+++ b/dlls/ntoskrnl.exe/ntoskrnl.c
@@ -275,24 +275,43 @@ void *alloc_kernel_object( POBJECT_TYPE type, SIZE_T size, LONG ref )
     return header + 1;
 }
 
-/* FIXME: Use ObReferenceObject instead. */
-static void reference_kernel_object( void *obj )
-{
-    struct object_header *header = (struct object_header*)obj - 1;
-    InterlockedIncrement( &header->ref );
-}
 
-/* FIXME: Use ObDereferenceObject instead. */
-static void dereference_kernel_object( void *obj )
+/***********************************************************************
+ *           ObDereferenceObject   (NTOSKRNL.EXE.@)
+ */
+void WINAPI ObDereferenceObject( void *obj )
 {
     struct object_header *header = (struct object_header*)obj - 1;
-    if (!InterlockedDecrement( &header->ref ) && header->type->release)
-        header->type->release( obj );
+    LONG ref;
+
+    if (!obj)
+    {
+        FIXME("NULL obj\n");
+        return;
+    }
+
+    ref = InterlockedDecrement( &header->ref );
+    TRACE( "(%p) ref=%u\n", obj, ref );
+    if (!ref)
+    {
+        if (header->type->release) header->type->release( obj );
+        else FIXME( "no destructor\n" );
+    }
 }
 
 static void ObReferenceObject( void *obj )
 {
-    TRACE( "(%p): stub\n", obj );
+    struct object_header *header = (struct object_header*)obj - 1;
+    LONG ref;
+
+    if (!obj)
+    {
+        FIXME("NULL obj\n");
+        return;
+    }
+
+    ref = InterlockedIncrement( &header->ref );
+    TRACE( "(%p) ref=%u\n", obj, ref );
 }
 
 static NTSTATUS kernel_object_from_handle( HANDLE handle, POBJECT_TYPE type, void **ret )
@@ -345,7 +364,7 @@ NTSTATUS WINAPI ObReferenceObjectByHandle( HANDLE handle, ACCESS_MASK access,
     }
 
     status = kernel_object_from_handle( handle, type, ptr );
-    if (!status) reference_kernel_object( *ptr );
+    if (!status) ObReferenceObject( *ptr );
     return status;
 }
 
@@ -387,7 +406,7 @@ static NTSTATUS WINAPI dispatch_irp_completion( DEVICE_OBJECT *device, IRP *irp,
 
     if (irp->Flags & IRP_CLOSE_OPERATION)
     {
-        dereference_kernel_object( file );
+        ObDereferenceObject( file );
         irp->Tail.Overlay.OriginalFileObject = NULL;
     }
 
@@ -430,7 +449,7 @@ static NTSTATUS dispatch_create( const irp_params_t *params, void *in_buff, ULON
 
     if (!(irp = IoAllocateIrp( device->StackSize, FALSE )))
     {
-        dereference_kernel_object( file );
+        ObDereferenceObject( file );
         return STATUS_NO_MEMORY;
     }
 
@@ -475,7 +494,7 @@ static NTSTATUS dispatch_close( const irp_params_t *params, void *in_buff, ULONG
 
     if (!(irp = IoAllocateIrp( device->StackSize, FALSE )))
     {
-        dereference_kernel_object( file );
+        ObDereferenceObject( file );
         return STATUS_NO_MEMORY;
     }
 
@@ -1251,7 +1270,7 @@ NTSTATUS WINAPI IoCreateDriver( UNICODE_STRING *name, PDRIVER_INITIALIZE init )
     status = driver->driver_obj.DriverInit( &driver->driver_obj, &driver->driver_extension.ServiceKeyName );
     if (status)
     {
-        dereference_kernel_object( driver );
+        ObDereferenceObject( driver );
         return status;
     }
 
@@ -1280,7 +1299,7 @@ void WINAPI IoDeleteDriver( DRIVER_OBJECT *driver_object )
     wine_rb_remove_key( &wine_drivers, &driver_object->DriverName );
     LeaveCriticalSection( &drivers_cs );
 
-    dereference_kernel_object( driver_object );
+    ObDereferenceObject( driver_object );
 }
 
 
@@ -1368,7 +1387,7 @@ void WINAPI IoDeleteDevice( DEVICE_OBJECT *device )
         while (*prev && *prev != device) prev = &(*prev)->NextDevice;
         if (*prev) *prev = (*prev)->NextDevice;
         NtClose( device->Reserved );
-        dereference_kernel_object( device );
+        ObDereferenceObject( device );
     }
 }
 
@@ -2705,15 +2724,6 @@ NTSTATUS WINAPI ObReferenceObjectByPointer(void *obj, ACCESS_MASK access,
 
 
 /***********************************************************************
- *           ObDereferenceObject   (NTOSKRNL.EXE.@)
- */
-void WINAPI ObDereferenceObject( void *obj )
-{
-    TRACE( "(%p): stub\n", obj );
-}
-
-
-/***********************************************************************
  *           ObfReferenceObject   (NTOSKRNL.EXE.@)
  */
 #ifdef DEFINE_FASTCALL1_ENTRYPOINT




More information about the wine-cvs mailing list