X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=reactos%2Fntoskrnl%2Fob%2Fntobj.c;h=527ac5d4d8bc9de39bcde84d3a3b806c09ac7409;hp=cd15dd056a88fdea093408cb63122b41346aaa93;hb=1acce99c6102391cbe6c9bb942de2846bade5a07;hpb=de32ec78dc88b5abb832e97cddfc03c3b600ac0e diff --git a/reactos/ntoskrnl/ob/ntobj.c b/reactos/ntoskrnl/ob/ntobj.c index cd15dd056a8..527ac5d4d8b 100644 --- a/reactos/ntoskrnl/ob/ntobj.c +++ b/reactos/ntoskrnl/ob/ntobj.c @@ -1,20 +1,16 @@ -/* $Id: ntobj.c,v 1.22 2004/07/19 12:48:59 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 -#include -#include - +#include #define NDEBUG #include @@ -24,7 +20,7 @@ /********************************************************************** * NAME EXPORTED * NtSetInformationObject - * + * * DESCRIPTION * * ARGUMENTS @@ -42,6 +38,8 @@ NtSetInformationObject (IN HANDLE ObjectHandle, PVOID Object; NTSTATUS Status; + PAGED_CODE(); + if (ObjectInformationClass != ObjectHandleInformation) return STATUS_INVALID_INFO_CLASS; @@ -85,7 +83,7 @@ NtQueryObject (IN HANDLE ObjectHandle, 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; @@ -93,6 +91,8 @@ NtQueryObject (IN HANDLE ObjectHandle, PVOID Object; NTSTATUS Status; + PAGED_CODE(); + Status = ObReferenceObjectByHandle (ObjectHandle, 0, NULL, @@ -122,13 +122,13 @@ NtQueryObject (IN HANDLE ObjectHandle, 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; @@ -169,10 +169,10 @@ NtQueryObject (IN HANDLE ObjectHandle, 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; @@ -202,16 +202,46 @@ NtQueryObject (IN HANDLE ObjectHandle, 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 * @@ -226,10 +256,7 @@ NtQueryObject (IN HANDLE ObjectHandle, VOID STDCALL ObMakeTemporaryObject(IN PVOID ObjectBody) { - POBJECT_HEADER ObjectHeader; - - ObjectHeader = BODY_TO_HEADER(ObjectBody); - ObjectHeader->Permanent = FALSE; + ObpSetPermanentObject (ObjectBody, FALSE); } @@ -246,27 +273,27 @@ ObMakeTemporaryObject(IN PVOID ObjectBody) * 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, (KPROCESSOR_MODE)KeGetPreviousMode(), - &Object, + &ObjectBody, NULL); if (Status != STATUS_SUCCESS) { return Status; } - ObjectHeader = BODY_TO_HEADER(Object); - ObjectHeader->Permanent = FALSE; + ObpSetPermanentObject (ObjectBody, FALSE); - ObDereferenceObject(Object); + ObDereferenceObject(ObjectBody); return STATUS_SUCCESS; } @@ -274,7 +301,7 @@ NtMakeTemporaryObject(IN HANDLE Handle) /********************************************************************** * NAME EXPORTED - * NtMakePermanentObject + * NtMakePermanentObject/1 * * DESCRIPTION * @@ -287,27 +314,27 @@ NtMakeTemporaryObject(IN HANDLE Handle) * @implemented */ NTSTATUS STDCALL -NtMakePermanentObject(IN HANDLE Handle) +NtMakePermanentObject(IN HANDLE ObjectHandle) { - POBJECT_HEADER ObjectHeader; - PVOID Object; + PVOID ObjectBody; NTSTATUS Status; - Status = ObReferenceObjectByHandle(Handle, + PAGED_CODE(); + + Status = ObReferenceObjectByHandle(ObjectHandle, 0, NULL, (KPROCESSOR_MODE)KeGetPreviousMode(), - &Object, + &ObjectBody, NULL); if (Status != STATUS_SUCCESS) { return Status; } - ObjectHeader = BODY_TO_HEADER(Object); - ObjectHeader->Permanent = TRUE; + ObpSetPermanentObject (ObjectBody, TRUE); - ObDereferenceObject(Object); + ObDereferenceObject(ObjectBody); return STATUS_SUCCESS; }