[ros-diffs] [ion] 25403: - Heavy cleanup of locking and lookup macros in ob_x.h. - Add calls to ObpInitializeDirectoryLookup where required. - Fixup calls to ObpAcquireDirectoryLockExclusive, but still keep them stubbed out for now.

ion at svn.reactos.org ion at svn.reactos.org
Tue Jan 9 22:48:27 CET 2007


Author: ion
Date: Wed Jan 10 00:48:26 2007
New Revision: 25403

URL: http://svn.reactos.org/svn/reactos?rev=25403&view=rev
Log:
- Heavy cleanup of locking and lookup macros in ob_x.h.
- Add calls to ObpInitializeDirectoryLookup where required.
- Fixup calls to ObpAcquireDirectoryLockExclusive, but still keep them stubbed out for now.

Modified:
    trunk/reactos/ntoskrnl/include/internal/ob_x.h
    trunk/reactos/ntoskrnl/ob/obhandle.c
    trunk/reactos/ntoskrnl/ob/obinit.c
    trunk/reactos/ntoskrnl/ob/oblife.c
    trunk/reactos/ntoskrnl/ob/obname.c
    trunk/reactos/ntoskrnl/ob/obref.c

Modified: trunk/reactos/ntoskrnl/include/internal/ob_x.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/include/internal/ob_x.h?rev=25403&r1=25402&r2=25403&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/include/internal/ob_x.h (original)
+++ trunk/reactos/ntoskrnl/include/internal/ob_x.h Wed Jan 10 00:48:26 2007
@@ -8,92 +8,12 @@
 
 #include "ex.h"
 
-#if DBG
-VOID
-FORCEINLINE
-ObpCalloutStart(IN PKIRQL CalloutIrql)
-{
-    /* Save the callout IRQL */
-    *CalloutIrql = KeGetCurrentIrql();
-}
-
-VOID
-FORCEINLINE
-ObpCalloutEnd(IN KIRQL CalloutIrql,
-              IN PCHAR Procedure,
-              IN POBJECT_TYPE ObjectType,
-              IN PVOID Object)
-{
-    /* Detect IRQL change */
-    if (CalloutIrql != KeGetCurrentIrql())
-    {
-        /* Print error */
-        DbgPrint("OB: ObjectType: %wZ  Procedure: %s  Object: %08x\n",
-                 &ObjectType->Name, Procedure, Object);
-        DbgPrint("    Returned at %x IRQL, but was called at %x IRQL\n",
-                 KeGetCurrentIrql(), CalloutIrql);
-        DbgBreakPoint();
-    }
-}
-#else
-VOID
-FORCEINLINE
-ObpCalloutStart(IN PKIRQL CalloutIrql)
-{
-    /* No-op */
-    UNREFERENCED_PARAMETER(CalloutIrql);
-}
-
-VOID
-FORCEINLINE
-ObpCalloutEnd(IN KIRQL CalloutIrql,
-              IN PCHAR Procedure,
-              IN POBJECT_TYPE ObjectType,
-              IN PVOID Object)
-{
-    UNREFERENCED_PARAMETER(CalloutIrql);
-}
-#endif
-
-VOID
-FORCEINLINE
-_ObpAcquireDirectoryLockShared(IN POBJECT_DIRECTORY Directory,
-                               IN POBP_LOOKUP_CONTEXT Context)
-{
-    /* It's not, set lock flag */
-    Context->LockStateSignature = 0xBBBB1234;
-
-    /* Lock it */
-    KeEnterCriticalRegion();
-    ExAcquirePushLockShared(&Directory->Lock);
-
-    /* Update lock flag */
-    Context->LockStateSignature = 0xDDDD1234;
-}
-
-VOID
-FORCEINLINE
-_ObpAcquireDirectoryLockExclusive(IN POBJECT_DIRECTORY Directory,
-                                  IN POBP_LOOKUP_CONTEXT Context)
-{
-    /* Update lock flag */
-    Context->LockStateSignature = 0xAAAA1234;
-
-    /* Lock it */
-    KeEnterCriticalRegion();
-    ExAcquirePushLockExclusive(&Directory->Lock);
-}
-
-VOID
-FORCEINLINE
-_ObpReleaseDirectoryLock(IN POBJECT_DIRECTORY Directory,
-                         IN POBP_LOOKUP_CONTEXT Context)
-{
-    /* Release the lock */
-    ExReleasePushLock(&Directory->Lock);
-    Context->LockStateSignature = 0xEEEE1234;
-    KeLeaveCriticalRegion();
-}
+#define OBP_LOCK_STATE_PRE_ACQUISITION_EXCLUSIVE    0xAAAA1234
+#define OBP_LOCK_STATE_PRE_ACQUISITION_SHARED       0xBBBB1234
+#define OBP_LOCK_STATE_POST_ACQUISITION_EXCLUSIVE   0xCCCC1234
+#define OBP_LOCK_STATE_POST_ACQUISITION_SHARED      0xDDDD1234
+#define OBP_LOCK_STATE_RELEASED                     0xEEEE1234
+#define OBP_LOCK_STATE_INITIALIZED                  0xFFFF1234
 
 ULONG
 FORCEINLINE
@@ -159,36 +79,49 @@
 
 VOID
 FORCEINLINE
-_ObpCleanupDirectoryLookup(IN POBP_LOOKUP_CONTEXT Context,
-                           IN BOOLEAN DereferenceObject)
-{
-    POBJECT_HEADER ObjectHeader;
-    POBJECT_HEADER_NAME_INFO HeaderNameInfo;
-
-    /* Check if we came back with the directory locked */
-    if (Context->DirectoryLocked)
-    {
-        /* Release the lock */
-        _ObpReleaseDirectoryLock(Context->Directory, Context);
-    }
-
-    /* Clear the context  */
-    Context->Directory = NULL;
-    Context->DirectoryLocked = FALSE;
-
-    /* Check if we had found an object */
-    if (Context->Object)
-    {
-        /* Get the object name information */
-        ObjectHeader = OBJECT_TO_OBJECT_HEADER(Context->Object);
-        HeaderNameInfo = OBJECT_HEADER_TO_NAME_INFO(ObjectHeader);
-
-        /* Check if we do have name information */
-        if (HeaderNameInfo) _ObpDecrementQueryReference(HeaderNameInfo);
-
-        /* Check if we need to dereference it */
-        if (DereferenceObject) ObDereferenceObject(Context->Object);
-    }
+_ObpAcquireDirectoryLockShared(IN POBJECT_DIRECTORY Directory,
+                               IN POBP_LOOKUP_CONTEXT Context)
+{
+    /* It's not, set lock flag */
+    Context->LockStateSignature = OBP_LOCK_STATE_PRE_ACQUISITION_SHARED;
+
+    /* Lock it */
+    KeEnterCriticalRegion();
+    ExAcquirePushLockShared(&Directory->Lock);
+
+    /* Update lock flag */
+    Context->LockStateSignature = OBP_LOCK_STATE_POST_ACQUISITION_SHARED;
+}
+
+VOID
+FORCEINLINE
+_ObpAcquireDirectoryLockExclusive(IN POBJECT_DIRECTORY Directory,
+                                  IN POBP_LOOKUP_CONTEXT Context)
+{
+    /* Update lock flag */
+    Context->LockStateSignature = OBP_LOCK_STATE_PRE_ACQUISITION_EXCLUSIVE;
+
+    /* Acquire an exclusive directory lock */
+    KeEnterCriticalRegion();
+    ExAcquirePushLockExclusive(&Directory->Lock);
+
+    /* Set the directory */
+    Context->Directory = Directory;
+
+    /* Update lock settings */
+    Context->LockStateSignature = OBP_LOCK_STATE_POST_ACQUISITION_EXCLUSIVE;
+    Context->DirectoryLocked = TRUE;
+}
+
+VOID
+FORCEINLINE
+_ObpReleaseDirectoryLock(IN POBJECT_DIRECTORY Directory,
+                         IN POBP_LOOKUP_CONTEXT Context)
+{
+    /* Release the lock */
+    ExReleasePushLock(&Directory->Lock);
+    Context->LockStateSignature = OBP_LOCK_STATE_RELEASED;
+    KeLeaveCriticalRegion();
 }
 
 VOID
@@ -199,7 +132,47 @@
     Context->Object = NULL;
     Context->Directory = NULL;
     Context->DirectoryLocked = FALSE;
-    Context->LockStateSignature = 0xFFFF1234;
+    Context->LockStateSignature = OBP_LOCK_STATE_INITIALIZED;
+}
+
+VOID
+FORCEINLINE
+_ObpReleaseLookupContextObject(IN POBP_LOOKUP_CONTEXT Context)
+{
+    POBJECT_HEADER ObjectHeader;
+    POBJECT_HEADER_NAME_INFO HeaderNameInfo;
+
+    /* Check if we had found an object */
+    if (Context->Object)
+    {
+        /* Get the object name information */
+        ObjectHeader = OBJECT_TO_OBJECT_HEADER(Context->Object);
+        HeaderNameInfo = OBJECT_HEADER_TO_NAME_INFO(ObjectHeader);
+
+        /* Check if we do have name information */
+        if (HeaderNameInfo) _ObpDecrementQueryReference(HeaderNameInfo);
+
+        /* Dereference the object */
+        ObDereferenceObject(Context->Object);
+        Context->Object = NULL;
+    }
+}
+
+VOID
+FORCEINLINE
+_ObpCleanupDirectoryLookup(IN POBP_LOOKUP_CONTEXT Context)
+{
+    /* Check if we came back with the directory locked */
+    if (Context->DirectoryLocked)
+    {
+        /* Release the lock */
+        _ObpReleaseDirectoryLock(Context->Directory, Context);
+    }
+
+    /* Clear the context  */
+    Context->Directory = NULL;
+    Context->DirectoryLocked = FALSE;
+    _ObpReleaseLookupContextObject(Context);
 }
 
 #if _OB_DEBUG_
@@ -365,5 +338,49 @@
     ObpFreeCapturedAttributes(ObjectCreateInfo, LookasideCreateInfoList);
 }
 
-
-
+#if DBG
+VOID
+FORCEINLINE
+ObpCalloutStart(IN PKIRQL CalloutIrql)
+{
+    /* Save the callout IRQL */
+    *CalloutIrql = KeGetCurrentIrql();
+}
+
+VOID
+FORCEINLINE
+ObpCalloutEnd(IN KIRQL CalloutIrql,
+              IN PCHAR Procedure,
+              IN POBJECT_TYPE ObjectType,
+              IN PVOID Object)
+{
+    /* Detect IRQL change */
+    if (CalloutIrql != KeGetCurrentIrql())
+    {
+        /* Print error */
+        DbgPrint("OB: ObjectType: %wZ  Procedure: %s  Object: %08x\n",
+                 &ObjectType->Name, Procedure, Object);
+        DbgPrint("    Returned at %x IRQL, but was called at %x IRQL\n",
+                 KeGetCurrentIrql(), CalloutIrql);
+        DbgBreakPoint();
+    }
+}
+#else
+VOID
+FORCEINLINE
+ObpCalloutStart(IN PKIRQL CalloutIrql)
+{
+    /* No-op */
+    UNREFERENCED_PARAMETER(CalloutIrql);
+}
+
+VOID
+FORCEINLINE
+ObpCalloutEnd(IN KIRQL CalloutIrql,
+              IN PCHAR Procedure,
+              IN POBJECT_TYPE ObjectType,
+              IN PVOID Object)
+{
+    UNREFERENCED_PARAMETER(CalloutIrql);
+}
+#endif

Modified: trunk/reactos/ntoskrnl/ob/obhandle.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ob/obhandle.c?rev=25403&r1=25402&r2=25403&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/ob/obhandle.c (original)
+++ trunk/reactos/ntoskrnl/ob/obhandle.c Wed Jan 10 00:48:26 2007
@@ -1249,7 +1249,7 @@
     if ((Type) && (ObjectType != Type))
     {
         /* They don't, cleanup */
-        //if (Context) ObpCleanupDirectoryLookup(Object, Context);
+        //if (Context) ObpCleanupDirectoryLookup(Context);
         return STATUS_OBJECT_TYPE_MISMATCH;
     }
 
@@ -1287,7 +1287,7 @@
          * We failed (meaning security failure, according to NT Internals)
          * detach and return
          */
-        //if (Context) ObpCleanupDirectoryLookup(Object, Context);
+        //if (Context) ObpCleanupDirectoryLookup(Context);
         if (AttachedToProcess) KeUnstackDetachProcess(&ApcState);
         return Status;
     }
@@ -1327,7 +1327,8 @@
     }
 
     /* Now we can release the object */
-    //if (Context) ObpCleanupDirectoryLookup(Object, Context);
+    //if (Context) ObpCleanupDirectoryLookup(Context);
+    if (Context) Context->Object = NULL;
 
     /* Save the object header */
     NewEntry.Object = ObjectHeader;
@@ -2116,7 +2117,7 @@
     if (!NT_SUCCESS(Status))
     {
         /* Cleanup after lookup */
-        //ObpCleanupDirectoryLookup(&TempBuffer->LookupContext, TRUE);
+        //ObpCleanupDirectoryLookup(&TempBuffer->LookupContext);
         TempBuffer->LookupContext.Object = NULL;
         goto Cleanup;
     }
@@ -2151,7 +2152,8 @@
         Status = STATUS_INVALID_PARAMETER;
 
         /* Cleanup after lookup */
-        //ObpCleanupDirectoryLookup(&TempBuffer->LookupContext, TRUE);
+        //ObpCleanupDirectoryLookup(&TempBuffer->LookupContext);
+        TempBuffer->LookupContext.Object = NULL;
     }
     else
     {

Modified: trunk/reactos/ntoskrnl/ob/obinit.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ob/obinit.c?rev=25403&r1=25402&r2=25403&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/ob/obinit.c (original)
+++ trunk/reactos/ntoskrnl/ob/obinit.c Wed Jan 10 00:48:26 2007
@@ -283,9 +283,6 @@
 
     /* Lock it */
     //ObpAcquireDirectoryLockExclusive(ObpTypeDirectoryObject, &Context);
-
-    /* Setup directory */
-    // FIXME: ObpSetLookupDirectory(Dir);?
     Context.Directory = ObpTypeDirectoryObject;
     Context.DirectoryLocked = TRUE;
     Context.LockStateSignature = 0xCCCC1234;
@@ -326,7 +323,7 @@
     }
 
     /* Cleanup after lookup */
-    //ObpCleanupDirectoryLookup(&Context, TRUE);
+    //ObpCleanupDirectoryLookup(&Context);
     Context.Object = NULL;
 
     /* Initialize DOS Devices Directory and related Symbolic Links */

Modified: trunk/reactos/ntoskrnl/ob/oblife.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ob/oblife.c?rev=25403&r1=25402&r2=25403&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/ob/oblife.c (original)
+++ trunk/reactos/ntoskrnl/ob/oblife.c Wed Jan 10 00:48:26 2007
@@ -958,14 +958,19 @@
         if (*p++ == OBJ_NAME_PATH_SEPARATOR) return STATUS_OBJECT_NAME_INVALID;
     }
 
-    Context.Object = NULL;
+    /* Setup a lookup context */
+    ObpInitializeDirectoryLookup(&Context);
 
     /* Check if we've already created the directory of types */
     if (ObpTypeDirectoryObject)
     {
-        /* Then scan it to figure out if we've already created this type */
+        /* Acquire the directory lock */
+        //ObpAcquireDirectoryLockExclusive(ObpTypeDirectoryObject, &Context);
         Context.Directory = ObpTypeDirectoryObject;
         Context.DirectoryLocked = TRUE;
+        Context.LockStateSignature = 0xCCCC1234;
+
+        /* Do the lookup */
         if (ObpLookupEntryDirectory(ObpTypeDirectoryObject,
                                     TypeName,
                                     OBJ_CASE_INSENSITIVE,

Modified: trunk/reactos/ntoskrnl/ob/obname.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ob/obname.c?rev=25403&r1=25402&r2=25403&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/ob/obname.c (original)
+++ trunk/reactos/ntoskrnl/ob/obname.c Wed Jan 10 00:48:26 2007
@@ -194,12 +194,10 @@
          !(ObjectHeader->Flags & OB_FLAG_PERMANENT))
     {
         /* Setup a lookup context */
-        Context.Object = NULL;
+        ObpInitializeDirectoryLookup(&Context);
 
         /* Lock the directory */
         //ObpAcquireDirectoryLockExclusive(ObjectNameInfo->Directory, &Context);
-
-        /* Set the lookup parameters */
         Context.Directory = ObjectNameInfo->Directory;
         Context.DirectoryLocked = TRUE;
         Context.LockStateSignature = 0xCCCC1234;
@@ -255,7 +253,7 @@
         }
 
         /* Cleanup after lookup */
-        //ObpCleanupDirectoryLookup(&Context, TRUE);
+        //ObpCleanupDirectoryLookup(&Context);
         Context.Object = NULL;
 
         /* Remove another query reference since we added one on top */
@@ -313,7 +311,7 @@
             InsertObject);
 
     /* Initialize starting state */
-    LookupContext->Object = NULL;
+    ObpInitializeDirectoryLookup(LookupContext);
     *FoundObject = NULL;
     Status = STATUS_SUCCESS;
     Object = NULL;
@@ -575,10 +573,7 @@
             if (InsertObject)
             {
                 /* Lock the directory */
-                //ObpAcquireDirectoryLockExclusive(LookupContext, Directory);
-
-                /* Setup the context */
-                // FIXME: ObpSetLookupDirectory(Dir);?
+                //ObpAcquireDirectoryLockExclusive(Directory, LookupContext);
                 LookupContext->Directory = Directory;
                 LookupContext->DirectoryLocked = TRUE;
                 LookupContext->LockStateSignature = 0xCCCC1234;
@@ -701,7 +696,7 @@
             InterlockedExchangeAdd(&ObjectHeader->PointerCount, 1);
 
             /* Cleanup from the first lookup */
-            //ObpCleanupDirectoryLookup(LookupContext, TRUE);
+            //ObpCleanupDirectoryLookup(LookupContext);
             LookupContext->Object = NULL;
 
             /* Check if we have a referenced directory */
@@ -868,7 +863,7 @@
     if (!NT_SUCCESS(Status))
     {
         /* Cleanup after lookup */
-        //ObpCleanupDirectoryLookup(LookupContext, TRUE);
+        //ObpCleanupDirectoryLookup(LookupContext);
         LookupContext->Object = NULL;
     }
 

Modified: trunk/reactos/ntoskrnl/ob/obref.c
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/ntoskrnl/ob/obref.c?rev=25403&r1=25402&r2=25403&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/ob/obref.c (original)
+++ trunk/reactos/ntoskrnl/ob/obref.c Wed Jan 10 00:48:26 2007
@@ -430,7 +430,7 @@
                                  &Object);
 
     /* Cleanup after lookup */
-    //ObpCleanupDirectoryLookup(&Context, TRUE);
+    //ObpCleanupDirectoryLookup(&Context);
     Context.Object = NULL;
 
     /* Check if the lookup succeeded */




More information about the Ros-diffs mailing list