- Implemented InterlockedBitTestAndReset, InterlockedBitTestAndSet, InterlockedExchan...
[reactos.git] / reactos / ntoskrnl / ob / object.c
index 6bd1b7a..a4ade3b 100644 (file)
@@ -35,7 +35,7 @@ ObpCaptureObjectName(IN OUT PUNICODE_STRING CapturedName,
 {
     NTSTATUS Status = STATUS_SUCCESS;
     ULONG StringLength;
-    PWCHAR StringBuffer;
+    PWCHAR StringBuffer = NULL;
     UNICODE_STRING LocalName = {}; /* <= GCC 4.0 + Optimizer */
     
     /* Initialize the Input String */
@@ -155,7 +155,7 @@ ObpCaptureObjectAttributes(IN POBJECT_ATTRIBUTES ObjectAttributes,
                 Status = STATUS_INVALID_PARAMETER;
                 DPRINT1("Invalid Size: %lx or Attributes: %lx\n",
                        ObjectAttributes->Length, ObjectAttributes->Attributes); 
-                goto Quickie;
+                _SEH_LEAVE;
             }
         
             /* Set some Create Info */
@@ -179,7 +179,7 @@ ObpCaptureObjectAttributes(IN POBJECT_ATTRIBUTES ObjectAttributes,
                 {
                     DPRINT1("Unable to capture the security descriptor!!!\n");
                     ObjectCreateInfo->SecurityDescriptor = NULL;
-                    goto Quickie;
+                    _SEH_LEAVE;
                 }
             
                 DPRINT("Probe done\n");
@@ -212,33 +212,33 @@ ObpCaptureObjectAttributes(IN POBJECT_ATTRIBUTES ObjectAttributes,
     {
         Status = _SEH_GetExceptionCode();
         DPRINT1("Failed\n");
-        goto Quickie;
     }
     _SEH_END;
 
-    /* Now check if the Object Attributes had an Object Name */
-    if (LocalObjectName)
-    {
-        DPRINT("Name Buffer: %wZ\n", LocalObjectName);
-        Status = ObpCaptureObjectName(ObjectName,
-                                      LocalObjectName,
-                                      AccessMode);
-    }
-    else
+    if (NT_SUCCESS(Status))
     {
-        /* Clear the string */
-        RtlInitUnicodeString(ObjectName, NULL);
-
-        /* He can't have specified a Root Directory */
-        if (ObjectCreateInfo->RootDirectory)
+        /* Now check if the Object Attributes had an Object Name */
+        if (LocalObjectName)
+        {
+            DPRINT("Name Buffer: %wZ\n", LocalObjectName);
+            Status = ObpCaptureObjectName(ObjectName,
+                                          LocalObjectName,
+                                          AccessMode);
+        }
+        else
         {
-            DPRINT1("Invalid name\n");
-            Status = STATUS_OBJECT_NAME_INVALID;
+            /* Clear the string */
+            RtlInitUnicodeString(ObjectName, NULL);
+
+            /* He can't have specified a Root Directory */
+            if (ObjectCreateInfo->RootDirectory)
+            {
+                DPRINT1("Invalid name\n");
+                Status = STATUS_OBJECT_NAME_INVALID;
+            }
         }
     }
-    
-Quickie:
-    if (!NT_SUCCESS(Status))
+    else
     {
         DPRINT1("Failed to capture, cleaning up\n");
         ObpReleaseCapturedAttributes(ObjectCreateInfo);
@@ -288,6 +288,7 @@ ObpReleaseCapturedAttributes(IN POBJECT_CREATE_INFORMATION ObjectCreateInfo)
  * RETURN VALUE
  */
 NTSTATUS
+NTAPI
 ObFindObject(POBJECT_CREATE_INFORMATION ObjectCreateInfo,
             PUNICODE_STRING ObjectName,
             PVOID* ReturnedObject,
@@ -315,7 +316,7 @@ ObFindObject(POBJECT_CREATE_INFORMATION ObjectCreateInfo,
       ObReferenceObjectByPointer(NameSpaceRoot,
                                 DIRECTORY_TRAVERSE,
                                 NULL,
-                                UserMode);
+                                ObjectCreateInfo->ProbeMode);
       CurrentObject = NameSpaceRoot;
     }
   else
@@ -323,7 +324,7 @@ ObFindObject(POBJECT_CREATE_INFORMATION ObjectCreateInfo,
       Status = ObReferenceObjectByHandle(ObjectCreateInfo->RootDirectory,
                                         0,
                                         NULL,
-                                        UserMode,
+                                        ObjectCreateInfo->ProbeMode,
                                         &CurrentObject,
                                         NULL);
       if (!NT_SUCCESS(Status))
@@ -397,7 +398,7 @@ ObFindObject(POBJECT_CREATE_INFORMATION ObjectCreateInfo,
             ObReferenceObjectByPointer(NextObject,
                                        DIRECTORY_TRAVERSE,
                                        NULL,
-                                       UserMode);
+                                       ObjectCreateInfo->ProbeMode);
          }
 
        if (NextObject == NULL)
@@ -925,11 +926,10 @@ ObOpenObjectByPointer(IN PVOID Object,
        return Status;
      }
 
-   Status = ObpCreateHandle(PsGetCurrentProcess(),
-                          Object,
-                          DesiredAccess,
-                          (BOOLEAN)(HandleAttributes & OBJ_INHERIT),
-                          Handle);
+   Status = ObpCreateHandle(Object,
+                           DesiredAccess,
+                           HandleAttributes,
+                           Handle);
 
    ObDereferenceObject(Object);
 
@@ -1247,6 +1247,7 @@ ObGetObjectPointerCount(PVOID Object)
  *     Reference count.
  */
 ULONG
+NTAPI
 ObGetObjectHandleCount(PVOID Object)
 {
   POBJECT_HEADER Header;