update for HEAD-2003091401
[reactos.git] / ntoskrnl / ob / object.c
index 52d9ba0..c8b7c18 100644 (file)
@@ -11,7 +11,8 @@
 
 /* INCLUDES *****************************************************************/
 
-#include <ddk/ntddk.h>
+#define NTOS_MODE_KERNEL
+#include <ntos.h>
 #include <roscfg.h>
 #include <internal/ob.h>
 #include <internal/ps.h>
@@ -21,6 +22,7 @@
 #define NDEBUG
 #include <internal/debug.h>
 
+
 /* FUNCTIONS ************************************************************/
 
 PVOID HEADER_TO_BODY(POBJECT_HEADER obj)
@@ -28,6 +30,7 @@ PVOID HEADER_TO_BODY(POBJECT_HEADER obj)
    return(((void *)obj)+sizeof(OBJECT_HEADER)-sizeof(COMMON_BODY_HEADER));
 }
 
+
 POBJECT_HEADER BODY_TO_HEADER(PVOID body)
 {
    PCOMMON_BODY_HEADER chdr = (PCOMMON_BODY_HEADER)body;
@@ -98,21 +101,22 @@ VOID ObInitializeObject(POBJECT_HEADER ObjectHeader,
  *
  * RETURN VALUE
  */
-NTSTATUS ObFindObject(POBJECT_ATTRIBUTES ObjectAttributes,
-                     PVOID* ReturnedObject,
-                     PUNICODE_STRING RemainingPath,
-                     POBJECT_TYPE ObjectType)
+NTSTATUS
+ObFindObject(POBJECT_ATTRIBUTES ObjectAttributes,
+            PVOID* ReturnedObject,
+            PUNICODE_STRING RemainingPath,
+            POBJECT_TYPE ObjectType)
 {
    PVOID NextObject;
    PVOID CurrentObject;
    PVOID RootObject;
    POBJECT_HEADER CurrentHeader;
    NTSTATUS Status;
-   PWSTR Path;
    PWSTR current;
    UNICODE_STRING PathString;
    ULONG Attributes;
-   
+   PUNICODE_STRING ObjectName;
+
    DPRINT("ObFindObject(ObjectAttributes %x, ReturnedObject %x, "
          "RemainingPath %x)\n",ObjectAttributes,ReturnedObject,RemainingPath);
    DPRINT("ObjectAttributes->ObjectName %wZ\n",
@@ -141,31 +145,39 @@ NTSTATUS ObFindObject(POBJECT_ATTRIBUTES ObjectAttributes,
             return(Status);
          }
      }
-   
-   Path = ObjectAttributes->ObjectName->Buffer;
-   
-   if (Path[0] == 0)
-     {
-       *ReturnedObject = CurrentObject;
-       return(STATUS_SUCCESS);
-     }
-   
-   if ((ObjectAttributes->RootDirectory == NULL) && (Path[0] != '\\'))
-     {
-       ObDereferenceObject(CurrentObject);
-       return(STATUS_UNSUCCESSFUL);
-     }
-   
-   if (Path)
-     {
-       RtlCreateUnicodeString (&PathString, Path);
-       current = PathString.Buffer;
-     }
-   else
-     {
-       RtlInitUnicodeString (&PathString, NULL);
-       current = NULL;
-     }
+
+  ObjectName = ObjectAttributes->ObjectName;
+  if (ObjectName->Length == 0 ||
+      ObjectName->Buffer[0] == UNICODE_NULL)
+    {
+      *ReturnedObject = CurrentObject;
+      return STATUS_SUCCESS;
+    }
+
+  if (ObjectAttributes->RootDirectory == NULL &&
+      ObjectName->Buffer[0] != L'\\')
+    {
+      ObDereferenceObject (CurrentObject);
+      return STATUS_UNSUCCESSFUL;
+    }
+
+  /* Create a zero-terminated copy of the object name */
+  PathString.Length = ObjectName->Length;
+  PathString.MaximumLength = ObjectName->Length + sizeof(WCHAR);
+  PathString.Buffer = ExAllocatePool (NonPagedPool,
+                                     PathString.MaximumLength);
+  if (PathString.Buffer == NULL)
+    {
+      ObDereferenceObject (CurrentObject);
+      return STATUS_INSUFFICIENT_RESOURCES;
+    }
+
+  RtlCopyMemory (PathString.Buffer,
+                ObjectName->Buffer,
+                ObjectName->Length);
+  PathString.Buffer[PathString.Length / sizeof(WCHAR)] = UNICODE_NULL;
+
+  current = PathString.Buffer;
 
    RootObject = CurrentObject;
    Attributes = ObjectAttributes->Attributes;
@@ -221,20 +233,138 @@ NTSTATUS ObFindObject(POBJECT_ATTRIBUTES ObjectAttributes,
 
 /**********************************************************************
  * NAME                                                        EXPORTED
- *     ObCreateObject@36
+ *     ObQueryNameString@16
  *
  * DESCRIPTION
  *
  * ARGUMENTS
  *
  * RETURN VALUE
+ *
+ * @implemented
  */
 NTSTATUS STDCALL
-ObCreateObject(OUT PHANDLE Handle,
-              IN ACCESS_MASK DesiredAccess,
-              IN POBJECT_ATTRIBUTES ObjectAttributes,
-              IN POBJECT_TYPE Type,
-              OUT PVOID *Object)
+ObQueryNameString (IN PVOID Object,
+                  OUT POBJECT_NAME_INFORMATION ObjectNameInfo,
+                  IN ULONG Length,
+                  OUT PULONG ReturnLength)
+{
+  POBJECT_NAME_INFORMATION LocalInfo;
+  POBJECT_HEADER ObjectHeader;
+  ULONG LocalReturnLength;
+  NTSTATUS Status;
+
+  *ReturnLength = 0;
+
+  if (Length < sizeof(OBJECT_NAME_INFORMATION) + sizeof(WCHAR))
+    return STATUS_INVALID_BUFFER_SIZE;
+
+  ObjectNameInfo->Name.MaximumLength = Length - sizeof(OBJECT_NAME_INFORMATION);
+  ObjectNameInfo->Name.Length = 0;
+  ObjectNameInfo->Name.Buffer =
+    (PWCHAR)((ULONG_PTR)ObjectNameInfo + sizeof(OBJECT_NAME_INFORMATION));
+  ObjectNameInfo->Name.Buffer[0] = 0;
+
+  ObjectHeader = BODY_TO_HEADER(Object);
+
+  if (ObjectHeader->ObjectType != NULL &&
+      ObjectHeader->ObjectType->QueryName != NULL)
+    {
+      DPRINT ("Calling %x\n", ObjectHeader->ObjectType->QueryName);
+      Status = ObjectHeader->ObjectType->QueryName (Object,
+                                                   ObjectNameInfo,
+                                                   Length,
+                                                   ReturnLength);
+    }
+  else if (ObjectHeader->Name.Length > 0 && ObjectHeader->Name.Buffer != NULL)
+    {
+      DPRINT ("Object does not have a 'QueryName' function\n");
+
+      if (ObjectHeader->Parent == NameSpaceRoot)
+       {
+         DPRINT ("Reached the root directory\n");
+         ObjectNameInfo->Name.Length = 0;
+         ObjectNameInfo->Name.Buffer[0] = 0;
+         Status = STATUS_SUCCESS;
+       }
+      else if (ObjectHeader->Parent != NULL)
+       {
+         LocalInfo = ExAllocatePool (NonPagedPool,
+                                     sizeof(OBJECT_NAME_INFORMATION) +
+                                     MAX_PATH * sizeof(WCHAR));
+         if (LocalInfo == NULL)
+           return STATUS_INSUFFICIENT_RESOURCES;
+
+         Status = ObQueryNameString (ObjectHeader->Parent,
+                                     LocalInfo,
+                                     MAX_PATH * sizeof(WCHAR),
+                                     &LocalReturnLength);
+         if (!NT_SUCCESS (Status))
+           {
+             ExFreePool (LocalInfo);
+             return Status;
+           }
+
+         Status = RtlAppendUnicodeStringToString (&ObjectNameInfo->Name,
+                                                  &LocalInfo->Name);
+
+         ExFreePool (LocalInfo);
+
+         if (!NT_SUCCESS (Status))
+           return Status;
+       }
+
+      DPRINT ("Object path %wZ\n", &ObjectHeader->Name);
+      Status = RtlAppendUnicodeToString (&ObjectNameInfo->Name,
+                                        L"\\");
+      if (!NT_SUCCESS (Status))
+       return Status;
+
+      Status = RtlAppendUnicodeStringToString (&ObjectNameInfo->Name,
+                                              &ObjectHeader->Name);
+    }
+  else
+    {
+      DPRINT ("Object is unnamed\n");
+
+      ObjectNameInfo->Name.MaximumLength = 0;
+      ObjectNameInfo->Name.Length = 0;
+      ObjectNameInfo->Name.Buffer = NULL;
+
+      Status = STATUS_SUCCESS;
+    }
+
+  if (NT_SUCCESS (Status))
+    {
+      ObjectNameInfo->Name.MaximumLength =
+       (ObjectNameInfo->Name.Length) ? ObjectNameInfo->Name.Length + sizeof(WCHAR) : 0;
+      *ReturnLength =
+       sizeof(OBJECT_NAME_INFORMATION) + ObjectNameInfo->Name.MaximumLength;
+      DPRINT ("Returned object path: %wZ\n", &ObjectNameInfo->Name);
+    }
+
+  return Status;
+}
+
+
+/**********************************************************************
+ * NAME                                                        EXPORTED
+ *     ObRosCreateObject@20
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *
+ * NOTE
+ *   Internal ReactOS function
+ * RETURN VALUE
+ */
+NTSTATUS STDCALL
+ObRosCreateObject (OUT PHANDLE Handle,
+               IN ACCESS_MASK DesiredAccess,
+               IN POBJECT_ATTRIBUTES ObjectAttributes,
+               IN POBJECT_TYPE Type,
+               OUT PVOID *Object)
 {
   PVOID Parent = NULL;
   UNICODE_STRING RemainingPath;
@@ -242,10 +372,11 @@ ObCreateObject(OUT PHANDLE Handle,
   POBJECT_HEADER ParentHeader = NULL;
   NTSTATUS Status;
   BOOLEAN ObjectAttached = FALSE;
+  PWCHAR NamePtr;
 
   assert_irql(APC_LEVEL);
 
-  DPRINT("ObCreateObject(Handle %x, ObjectAttributes %x, Type %x)\n",
+  DPRINT("ObRosCreateObject(Handle %x, ObjectAttributes %x, Type %x)\n",
         Handle, ObjectAttributes, Type);
 
   if (ObjectAttributes != NULL &&
@@ -288,9 +419,14 @@ ObCreateObject(OUT PHANDLE Handle,
       ParentHeader->ObjectType == ObDirectoryType &&
       RemainingPath.Buffer != NULL)
     {
+      NamePtr = RemainingPath.Buffer;
+      if (*NamePtr == L'\\')
+       NamePtr++;
+
       ObpAddEntryDirectory(Parent,
                           Header,
-                          RemainingPath.Buffer+1);
+                          NamePtr);
+
       ObjectAttached = TRUE;
     }
 
@@ -337,7 +473,36 @@ ObCreateObject(OUT PHANDLE Handle,
   return(STATUS_SUCCESS);
 }
 
+/**********************************************************************
+ * NAME                                                        EXPORTED
+ *     ObCreateObject@36
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *
+ * RETURN VALUE
+ *
+ * @unimplemented
+ */
+NTSTATUS STDCALL
+ObCreateObject (IN KPROCESSOR_MODE      ObjectAttributesAccessMode OPTIONAL,
+  IN POBJECT_TYPE         ObjectType,
+  IN POBJECT_ATTRIBUTES   ObjectAttributes OPTIONAL,
+  IN KPROCESSOR_MODE      AccessMode,
+  IN OUT PVOID            ParseContext OPTIONAL,
+  IN ULONG                ObjectSize,
+  IN ULONG                PagedPoolCharge OPTIONAL,
+  IN ULONG                NonPagedPoolCharge OPTIONAL,
+  OUT PVOID               *Object)
+{
+  UNIMPLEMENTED
+  return STATUS_NOT_IMPLEMENTED;
+}
 
+/*
+ * @implemented
+ */
 NTSTATUS STDCALL
 ObReferenceObjectByPointer(IN PVOID Object,
                           IN ACCESS_MASK DesiredAccess,
@@ -394,6 +559,9 @@ ObReferenceObjectByPointer(IN PVOID Object,
 }
 
 
+/*
+ * @implemented
+ */
 NTSTATUS STDCALL
 ObOpenObjectByPointer(IN POBJECT Object,
                      IN ULONG HandleAttributes,
@@ -438,13 +606,13 @@ ObpPerformRetentionChecks(POBJECT_HEADER Header)
     {
       CPRINT("Object %x/%x has invalid reference count (%d)\n",
             Header, HEADER_TO_BODY(Header), Header->RefCount);
-      KeBugCheck(0);
+      KEBUGCHECK(0);
     }
   if (Header->HandleCount < 0)
     {
       CPRINT("Object %x/%x has invalid handle count (%d)\n",
             Header, HEADER_TO_BODY(Header), Header->HandleCount);
-      KeBugCheck(0);
+      KEBUGCHECK(0);
     }
   
   if (Header->RefCount == 0 &&
@@ -453,7 +621,7 @@ ObpPerformRetentionChecks(POBJECT_HEADER Header)
     {
       if (Header->CloseInProcess)
       {
-        KeBugCheck(0);
+        KEBUGCHECK(0);
         return STATUS_UNSUCCESSFUL;
       }
       Header->CloseInProcess = TRUE;
@@ -487,6 +655,8 @@ ObpPerformRetentionChecks(POBJECT_HEADER Header)
  *
  * RETURN VALUE
  *     None.
+ *
+ * @implemented
  */
 VOID FASTCALL
 ObfReferenceObject(IN PVOID Object)
@@ -499,7 +669,7 @@ ObfReferenceObject(IN PVOID Object)
 
   if (Header->CloseInProcess)
   {
-      KeBugCheck(0);
+      KEBUGCHECK(0);
   }
   InterlockedIncrement(&Header->RefCount);
 
@@ -520,6 +690,8 @@ ObfReferenceObject(IN PVOID Object)
  *
  * RETURN VALUE
  *     None.
+ *
+ * @implemented
  */
 VOID FASTCALL
 ObfDereferenceObject(IN PVOID Object)
@@ -562,6 +734,8 @@ ObfDereferenceObject(IN PVOID Object)
  *
  * RETURN VALUE
  *     Reference count.
+ *
+ * @implemented
  */
 ULONG STDCALL
 ObGetObjectPointerCount(PVOID Object)