-/* $Id: ntobj.c,v 1.18 2003/11/16 13:47:20 ekohl Exp $
+/* $Id$
*
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: ntoskrnl/ob/ntobj.c
- * PURPOSE: User mode interface to object manager
- * PROGRAMMER: David Welch (welch@cwcom.net)
- * UPDATE HISTORY:
- * 10/06/98: Created
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS kernel
+ * FILE: ntoskrnl/ob/ntobj.c
+ * PURPOSE: User mode interface to object manager
+ *
+ * PROGRAMMERS: David Welch (welch@cwcom.net)
*/
/* INCLUDES *****************************************************************/
-#include <ddk/ntddk.h>
-#include <internal/ob.h>
-#include <internal/id.h>
-
+#include <ntoskrnl.h>
#define NDEBUG
#include <internal/debug.h>
/**********************************************************************
* NAME EXPORTED
* NtSetInformationObject
- *
+ *
* DESCRIPTION
*
* ARGUMENTS
PVOID Object;
NTSTATUS Status;
+ PAGED_CODE();
+
if (ObjectInformationClass != ObjectHandleInformation)
return STATUS_INVALID_INFO_CLASS;
Status = ObReferenceObjectByHandle (ObjectHandle,
0,
NULL,
- KeGetPreviousMode (),
+ (KPROCESSOR_MODE)KeGetPreviousMode (),
&Object,
NULL);
if (!NT_SUCCESS (Status))
/**********************************************************************
* NAME EXPORTED
* NtQueryObject
- *
+ *
* DESCRIPTION
*
* ARGUMENTS
IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
OUT PVOID ObjectInformation,
IN ULONG Length,
- OUT PULONG ReturnLength OPTIONAL)
+ OUT PULONG ResultLength OPTIONAL)
{
OBJECT_HANDLE_INFORMATION HandleInfo;
POBJECT_HEADER ObjectHeader;
PVOID Object;
NTSTATUS Status;
+ PAGED_CODE();
+
Status = ObReferenceObjectByHandle (ObjectHandle,
0,
NULL,
- KeGetPreviousMode(),
+ (KPROCESSOR_MODE)KeGetPreviousMode(),
&Object,
&HandleInfo);
if (!NT_SUCCESS (Status))
BasicInfo->Attributes = HandleInfo.HandleAttributes;
BasicInfo->GrantedAccess = HandleInfo.GrantedAccess;
BasicInfo->HandleCount = ObjectHeader->HandleCount;
- BasicInfo->PointerCount = ObjectHeader->RefCount;
+ BasicInfo->PointerCount = ObjectHeader->PointerCount;
BasicInfo->PagedPoolUsage = 0; /* FIXME*/
BasicInfo->NonPagedPoolUsage = 0; /* FIXME*/
BasicInfo->NameInformationLength = 0; /* FIXME*/
BasicInfo->TypeInformationLength = 0; /* FIXME*/
BasicInfo->SecurityDescriptorLength = 0; /* FIXME*/
- if (ObjectHeader->ObjectType == ObSymbolicLinkType)
+ if (ObjectHeader->Type == ObSymbolicLinkType)
{
BasicInfo->CreateTime.QuadPart =
((PSYMLINK_OBJECT)Object)->CreateTime.QuadPart;
}
else
{
- BasicInfo->CreateTime.QuadPart = 0ULL;
+ BasicInfo->CreateTime.QuadPart = (ULONGLONG)0;
}
Status = STATUS_SUCCESS;
}
break;
}
- RtlCopyUnicodeString(&typeinfo->Type,&ObjectHeader->ObjectType->TypeName);
+ RtlCopyUnicodeString(&typeinfo->Type,&ObjectHeader->Type->TypeName);
//This should be info from the object header, not the object type, right?
typeinfo->TotalHandles = ObjectHeader-> HandleCount;
- typeinfo->ReferenceCount = ObjectHeader -> RefCount;
+ typeinfo->ReferenceCount = ObjectHeader -> PointerCount;
}
#endif
Status = STATUS_NOT_IMPLEMENTED;
ObDereferenceObject (Object);
- if (ReturnLength != NULL)
- *ReturnLength = InfoLength;
+ if (ResultLength != NULL)
+ *ResultLength = InfoLength;
return Status;
}
+/**********************************************************************
+ * NAME PRIVATE
+ * ObpSetPermanentObject/2
+ *
+ * DESCRIPTION
+ * Fast general purpose routine to set an object's permanent
+ * attribute, given a pointer to the object's body.
+ */
+VOID FASTCALL
+ObpSetPermanentObject (IN PVOID ObjectBody, IN BOOLEAN Permanent)
+{
+ POBJECT_HEADER ObjectHeader;
+
+ ObjectHeader = BODY_TO_HEADER(ObjectBody);
+ ASSERT (ObjectHeader->PointerCount > 0);
+ if (Permanent)
+ {
+ ObjectHeader->Flags |= OB_FLAG_PERMANENT;
+ }
+ else
+ {
+ ObjectHeader->Flags &= ~OB_FLAG_PERMANENT;
+ if (ObjectHeader->HandleCount == 0 && HEADER_TO_OBJECT_NAME(ObjectHeader)->Directory)
+ {
+ /* Remove the object from the namespace */
+ ObpRemoveEntryDirectory(ObjectHeader);
+ }
+ }
+}
+
/**********************************************************************
* NAME EXPORTED
- * ObMakeTemporaryObject
- *
+ * ObMakeTemporaryObject/1
+ *
* DESCRIPTION
*
* ARGUMENTS
* @implemented
*/
VOID STDCALL
-ObMakeTemporaryObject (IN PVOID ObjectBody)
+ObMakeTemporaryObject(IN PVOID ObjectBody)
{
- POBJECT_HEADER ObjectHeader;
-
- ObjectHeader = BODY_TO_HEADER(ObjectBody);
- ObjectHeader->Permanent = FALSE;
+ ObpSetPermanentObject (ObjectBody, FALSE);
}
/**********************************************************************
* NAME EXPORTED
* NtMakeTemporaryObject
- *
+ *
* DESCRIPTION
*
* ARGUMENTS
* REVISIONS
*/
NTSTATUS STDCALL
-NtMakeTemporaryObject (IN HANDLE Handle)
+NtMakeTemporaryObject(IN HANDLE ObjectHandle)
{
- POBJECT_HEADER ObjectHeader;
- PVOID Object;
+ PVOID ObjectBody;
NTSTATUS Status;
- Status = ObReferenceObjectByHandle(Handle,
+ PAGED_CODE();
+
+ Status = ObReferenceObjectByHandle(ObjectHandle,
0,
NULL,
- KeGetPreviousMode(),
- & Object,
+ (KPROCESSOR_MODE)KeGetPreviousMode(),
+ &ObjectBody,
NULL);
if (Status != STATUS_SUCCESS)
{
return Status;
}
- ObjectHeader = BODY_TO_HEADER(Object);
- ObjectHeader->Permanent = FALSE;
+ ObpSetPermanentObject (ObjectBody, FALSE);
+
+ ObDereferenceObject(ObjectBody);
+
+ return STATUS_SUCCESS;
+}
+
+
+/**********************************************************************
+ * NAME EXPORTED
+ * NtMakePermanentObject/1
+ *
+ * DESCRIPTION
+ *
+ * ARGUMENTS
+ *
+ * RETURN VALUE
+ *
+ * REVISIONS
+ *
+ * @implemented
+ */
+NTSTATUS STDCALL
+NtMakePermanentObject(IN HANDLE ObjectHandle)
+{
+ PVOID ObjectBody;
+ NTSTATUS Status;
+
+ PAGED_CODE();
+
+ Status = ObReferenceObjectByHandle(ObjectHandle,
+ 0,
+ NULL,
+ (KPROCESSOR_MODE)KeGetPreviousMode(),
+ &ObjectBody,
+ NULL);
+ if (Status != STATUS_SUCCESS)
+ {
+ return Status;
+ }
+
+ ObpSetPermanentObject (ObjectBody, TRUE);
- ObDereferenceObject(Object);
+ ObDereferenceObject(ObjectBody);
return STATUS_SUCCESS;
}