[ros-diffs] [ion] 22230: - Simplify ObGetObjectPointerCode and ObfReferenceObject. - Fix ObReferenceObjectByPointer to actually work like documented instead of doing random incorrect checks. Also add special case for Symbolic Link objects as documented by Caz Yokoyama at Microsoft.
ion at svn.reactos.org
ion at svn.reactos.org
Mon Jun 5 02:32:27 CEST 2006
Author: ion
Date: Mon Jun 5 04:32:26 2006
New Revision: 22230
URL: http://svn.reactos.ru/svn/reactos?rev=22230&view=rev
Log:
- Simplify ObGetObjectPointerCode and ObfReferenceObject.
- Fix ObReferenceObjectByPointer to actually work like documented instead of doing random incorrect checks. Also add special case for Symbolic Link objects as documented by Caz Yokoyama at Microsoft.
Modified:
trunk/reactos/ntoskrnl/ob/obref.c
Modified: trunk/reactos/ntoskrnl/ob/obref.c
URL: http://svn.reactos.ru/svn/reactos/trunk/reactos/ntoskrnl/ob/obref.c?rev=22230&r1=22229&r2=22230&view=diff
==============================================================================
--- trunk/reactos/ntoskrnl/ob/obref.c (original)
+++ trunk/reactos/ntoskrnl/ob/obref.c Mon Jun 5 04:32:26 2006
@@ -69,34 +69,25 @@
/* PUBLIC FUNCTIONS *********************************************************/
-ULONG STDCALL
+ULONG
+NTAPI
ObGetObjectPointerCount(PVOID Object)
{
- POBJECT_HEADER Header;
-
PAGED_CODE();
-
ASSERT(Object);
- Header = OBJECT_TO_OBJECT_HEADER(Object);
-
- return Header->PointerCount;
-}
-
-VOID FASTCALL
+
+ /* Get the header and return the pointer count */
+ return OBJECT_TO_OBJECT_HEADER(Object)->PointerCount;
+}
+
+VOID
+FASTCALL
ObfReferenceObject(IN PVOID Object)
{
- POBJECT_HEADER Header;
-
ASSERT(Object);
- Header = OBJECT_TO_OBJECT_HEADER(Object);
-
- /* No one should be referencing an object once we are deleting it. */
- if (InterlockedIncrement(&Header->PointerCount) == 1 && !(Header->Flags & OB_FLAG_PERMANENT))
- {
- KEBUGCHECK(0);
- }
-
+ /* Get the header and increment the reference count */
+ InterlockedIncrement(&OBJECT_TO_OBJECT_HEADER(Object)->PointerCount);
}
VOID
@@ -138,7 +129,8 @@
}
}
-NTSTATUS STDCALL
+NTSTATUS
+NTAPI
ObReferenceObjectByPointer(IN PVOID Object,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_TYPE ObjectType,
@@ -146,55 +138,23 @@
{
POBJECT_HEADER Header;
- /* NOTE: should be possible to reference an object above APC_LEVEL! */
-
- DPRINT("ObReferenceObjectByPointer(Object %x, ObjectType %x)\n",
- Object,ObjectType);
-
+ /* Get the header */
Header = OBJECT_TO_OBJECT_HEADER(Object);
- if (ObjectType != NULL && Header->Type != ObjectType)
- {
- DPRINT("Failed %p (type was %x %wZ) should be %x %wZ\n",
- Header,
- Header->Type,
- &OBJECT_HEADER_TO_NAME_INFO(OBJECT_TO_OBJECT_HEADER(Header->Type))->Name,
- ObjectType,
- &OBJECT_HEADER_TO_NAME_INFO(OBJECT_TO_OBJECT_HEADER(ObjectType))->Name);
- return(STATUS_UNSUCCESSFUL);
- }
- if (Header->Type == PsProcessType)
- {
- DPRINT("Ref p 0x%x PointerCount %d type %x ",
- Object, Header->PointerCount, PsProcessType);
- DPRINT("eip %x\n", ((PULONG)&Object)[-1]);
- }
- if (Header->Type == PsThreadType)
- {
- DPRINT("Deref t 0x%x with PointerCount %d type %x ",
- Object, Header->PointerCount, PsThreadType);
- DPRINT("eip %x\n", ((PULONG)&Object)[-1]);
- }
-
- if (Header->PointerCount == 0 && !(Header->Flags & OB_FLAG_PERMANENT))
- {
- if (Header->Type == PsProcessType)
- {
- return STATUS_PROCESS_IS_TERMINATING;
- }
- if (Header->Type == PsThreadType)
- {
- return STATUS_THREAD_IS_TERMINATING;
- }
- return(STATUS_UNSUCCESSFUL);
- }
-
- if (1 == InterlockedIncrement(&Header->PointerCount) && !(Header->Flags & OB_FLAG_PERMANENT))
- {
- KEBUGCHECK(0);
- }
-
- return(STATUS_SUCCESS);
+ /*
+ * Validate object type if the call is for UserMode.
+ * NOTE: Unless it's a symbolic link (Caz Yokoyama [MSFT])
+ */
+ if ((Header->Type != ObjectType) && ((AccessMode != KernelMode) ||
+ (ObjectType == ObSymbolicLinkType)))
+ {
+ /* Invalid type */
+ return STATUS_OBJECT_TYPE_MISMATCH;
+ }
+
+ /* Oncrement the reference count and return success */
+ InterlockedIncrement(&Header->PointerCount);
+ return STATUS_SUCCESS;
}
NTSTATUS
More information about the Ros-diffs
mailing list