-/* $Id: object.c,v 1.43 2002/02/22 13:35:50 ekohl Exp $
+/* $Id: object.c,v 1.46 2002/03/05 00:19:28 ekohl Exp $
*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS kernel
* RETURN VALUE
*/
NTSTATUS STDCALL
-ObCreateObject(PHANDLE Handle,
- ACCESS_MASK DesiredAccess,
- POBJECT_ATTRIBUTES ObjectAttributes,
- POBJECT_TYPE Type,
- PVOID *Object)
+ObCreateObject(OUT PHANDLE Handle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ IN POBJECT_TYPE Type,
+ OUT PVOID *Object)
{
PVOID Parent = NULL;
UNICODE_STRING RemainingPath;
POBJECT_HEADER Header;
POBJECT_HEADER ParentHeader = NULL;
NTSTATUS Status;
+ BOOLEAN ObjectAttached = FALSE;
assert_irql(APC_LEVEL);
ObpAddEntryDirectory(Parent,
Header,
RemainingPath.Buffer+1);
+ ObjectAttached = TRUE;
}
if ((Header->ObjectType != NULL) &&
ObjectAttributes);
if (!NT_SUCCESS(Status))
{
+ if (ObjectAttached == TRUE)
+ {
+ ObpRemoveEntryDirectory(Header);
+ }
if (Parent)
{
ObDereferenceObject(Parent);
NTSTATUS STDCALL
-ObReferenceObjectByPointer(PVOID ObjectBody,
- ACCESS_MASK DesiredAccess,
- POBJECT_TYPE ObjectType,
- KPROCESSOR_MODE AccessMode)
+ObReferenceObjectByPointer(IN PVOID Object,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_TYPE ObjectType,
+ IN KPROCESSOR_MODE AccessMode)
/*
* FUNCTION: Increments the pointer reference count for a given object
* ARGUMENTS:
* RETURNS: Status
*/
{
- POBJECT_HEADER ObjectHeader;
+ POBJECT_HEADER Header;
-// DPRINT("ObReferenceObjectByPointer(ObjectBody %x, ObjectType %x)\n",
-// ObjectBody,ObjectType);
+// DPRINT("ObReferenceObjectByPointer(Object %x, ObjectType %x)\n",
+// Object,ObjectType);
- ObjectHeader = BODY_TO_HEADER(ObjectBody);
+ Header = BODY_TO_HEADER(Object);
- if (ObjectType != NULL && ObjectHeader->ObjectType != ObjectType)
+ if (ObjectType != NULL && Header->ObjectType != ObjectType)
{
DPRINT("Failed %x (type was %x %S) should be %x %S\n",
- ObjectHeader,
- ObjectHeader->ObjectType,
- ObjectHeader->ObjectType->TypeName.Buffer,
+ Header,
+ Header->ObjectType,
+ Header->ObjectType->TypeName.Buffer,
ObjectType,
ObjectType->TypeName.Buffer);
return(STATUS_UNSUCCESSFUL);
}
- if (ObjectHeader->ObjectType == PsProcessType)
+ if (Header->ObjectType == PsProcessType)
{
DPRINT("Ref p 0x%x refcount %d type %x ",
- ObjectBody, ObjectHeader->RefCount, PsProcessType);
- DPRINT("eip %x\n", ((PULONG)&ObjectBody)[-1]);
+ Object, Header->RefCount, PsProcessType);
+ DPRINT("eip %x\n", ((PULONG)&Object)[-1]);
}
- if (ObjectHeader->ObjectType == PsThreadType)
+ if (Header->ObjectType == PsThreadType)
{
DPRINT("Deref t 0x%x with refcount %d type %x ",
- ObjectBody, ObjectHeader->RefCount, PsThreadType);
- DPRINT("eip %x\n", ((PULONG)&ObjectBody)[-1]);
+ Object, Header->RefCount, PsThreadType);
+ DPRINT("eip %x\n", ((PULONG)&Object)[-1]);
}
- ObjectHeader->RefCount++;
+ Header->RefCount++;
return(STATUS_SUCCESS);
}
}
-NTSTATUS ObPerformRetentionChecks(POBJECT_HEADER Header)
-{
-// DPRINT("ObPerformRetentionChecks(Header %x), RefCount %d, HandleCount %d\n",
-// Header,Header->RefCount,Header->HandleCount);
-
- if (Header->RefCount < 0)
- {
- CPRINT("Object %x/%x has invalid reference count (%d)\n",
- Header, HEADER_TO_BODY(Header), Header->RefCount);
- 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);
- }
-
- if (Header->RefCount == 0 && Header->HandleCount == 0 &&
- !Header->Permanent)
- {
- if (Header->ObjectType != NULL &&
- Header->ObjectType->Delete != NULL)
- {
- Header->ObjectType->Delete(HEADER_TO_BODY(Header));
- }
- if (Header->Name.Buffer != NULL)
- {
- ObpRemoveEntryDirectory(Header);
- RtlFreeUnicodeString( &Header->Name );
- }
- DPRINT("ObPerformRetentionChecks() = Freeing object\n");
- ExFreePool(Header);
- }
- return(STATUS_SUCCESS);
-}
-
-
-ULONG ObGetReferenceCount(PVOID ObjectBody)
+static NTSTATUS
+ObpPerformRetentionChecks(POBJECT_HEADER Header)
{
- POBJECT_HEADER Header = BODY_TO_HEADER(ObjectBody);
-
- return(Header->RefCount);
-}
-
-ULONG ObGetHandleCount(PVOID ObjectBody)
-{
- POBJECT_HEADER Header = BODY_TO_HEADER(ObjectBody);
-
- return(Header->HandleCount);
+// DPRINT("ObPerformRetentionChecks(Header %x), RefCount %d, HandleCount %d\n",
+// Header,Header->RefCount,Header->HandleCount);
+
+ if (Header->RefCount < 0)
+ {
+ CPRINT("Object %x/%x has invalid reference count (%d)\n",
+ Header, HEADER_TO_BODY(Header), Header->RefCount);
+ 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);
+ }
+
+ if (Header->RefCount == 0 &&
+ Header->HandleCount == 0 &&
+ Header->Permanent == FALSE)
+ {
+ if (Header->ObjectType != NULL &&
+ Header->ObjectType->Delete != NULL)
+ {
+ Header->ObjectType->Delete(HEADER_TO_BODY(Header));
+ }
+ if (Header->Name.Buffer != NULL)
+ {
+ ObpRemoveEntryDirectory(Header);
+ RtlFreeUnicodeString(&Header->Name);
+ }
+ DPRINT("ObPerformRetentionChecks() = Freeing object\n");
+ ExFreePool(Header);
+ }
+ return(STATUS_SUCCESS);
}
* RETURN VALUE
* None.
*/
-VOID FASTCALL ObfReferenceObject(PVOID Object)
+VOID FASTCALL
+ObfReferenceObject(IN PVOID Object)
{
- POBJECT_HEADER Header;
+ POBJECT_HEADER Header;
- assert (Object);
+ assert(Object);
- Header = BODY_TO_HEADER(Object);
+ Header = BODY_TO_HEADER(Object);
- Header->RefCount++;
+ Header->RefCount++;
- ObPerformRetentionChecks (Header);
+ ObpPerformRetentionChecks(Header);
}
-VOID FASTCALL ObfDereferenceObject (PVOID Object)
-/*
- * FUNCTION: Decrements a given object's reference count and performs
- * retention checks
- * ARGUMENTS:
- * Object = Body of the object
+/**********************************************************************
+ * NAME EXPORTED
+ * ObfDereferenceObject@4
+ *
+ * DESCRIPTION
+ * Decrements a given object's reference count and performs
+ * retention checks.
+ *
+ * ARGUMENTS
+ * ObjectBody = Body of the object.
+ *
+ * RETURN VALUE
+ * None.
*/
+VOID FASTCALL
+ObfDereferenceObject(IN PVOID Object)
{
- POBJECT_HEADER Header;
- extern POBJECT_TYPE PsProcessType;
+ POBJECT_HEADER Header;
+ extern POBJECT_TYPE PsProcessType;
- assert (Object);
+ assert(Object);
- Header = BODY_TO_HEADER(Object);
+ Header = BODY_TO_HEADER(Object);
- if (Header->ObjectType == PsProcessType)
- {
- DPRINT("Deref p 0x%x with refcount %d type %x ",
- Object, Header->RefCount, PsProcessType);
- DPRINT("eip %x\n", ((PULONG)&Object)[-1]);
- }
- if (Header->ObjectType == PsThreadType)
- {
- DPRINT("Deref t 0x%x with refcount %d type %x ",
- Object, Header->RefCount, PsThreadType);
- DPRINT("eip %x\n", ((PULONG)&Object)[-1]);
- }
-
- Header->RefCount--;
-
- ObPerformRetentionChecks(Header);
+ if (Header->ObjectType == PsProcessType)
+ {
+ DPRINT("Deref p 0x%x with refcount %d type %x ",
+ Object, Header->RefCount, PsProcessType);
+ DPRINT("eip %x\n", ((PULONG)&Object)[-1]);
+ }
+ if (Header->ObjectType == PsThreadType)
+ {
+ DPRINT("Deref t 0x%x with refcount %d type %x ",
+ Object, Header->RefCount, PsThreadType);
+ DPRINT("eip %x\n", ((PULONG)&Object)[-1]);
+ }
+
+ Header->RefCount--;
+
+ ObpPerformRetentionChecks(Header);
}
+/**********************************************************************
+ * NAME EXPORTED
+ * ObGetObjectPointerCount@4
+ *
+ * DESCRIPTION
+ * Retrieves the pointer(reference) count of the given object.
+ *
+ * ARGUMENTS
+ * ObjectBody = Body of the object.
+ *
+ * RETURN VALUE
+ * Reference count.
+ */
ULONG STDCALL
ObGetObjectPointerCount(PVOID Object)
{
return(Header->RefCount);
}
+
+/**********************************************************************
+ * NAME INTERNAL
+ * ObGetObjectHandleCount@4
+ *
+ * DESCRIPTION
+ * Retrieves the handle count of the given object.
+ *
+ * ARGUMENTS
+ * ObjectBody = Body of the object.
+ *
+ * RETURN VALUE
+ * Reference count.
+ */
+ULONG
+ObGetObjectHandleCount(PVOID Object)
+{
+ POBJECT_HEADER Header;
+
+ assert(Object);
+ Header = BODY_TO_HEADER(Object);
+
+ return(Header->HandleCount);
+}
+
/* EOF */